
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/desandro-matches-selector/matches-selector.js":[function(require,module,exports){
/**
 * matchesSelector v2.0.2
 * matchesSelector( element, '.selector' )
 * MIT license
 */

/*jshint browser: true, strict: true, undef: true, unused: true */

( function( window, factory ) {
  /*global define: false, module: false */
  'use strict';
  // universal module definition
  if ( typeof define == 'function' && define.amd ) {
    // AMD
    define( factory );
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS
    module.exports = factory();
  } else {
    // browser global
    window.matchesSelector = factory();
  }

}( window, function factory() {
  'use strict';

  var matchesMethod = ( function() {
    var ElemProto = window.Element.prototype;
    // check for the standard method name first
    if ( ElemProto.matches ) {
      return 'matches';
    }
    // check un-prefixed
    if ( ElemProto.matchesSelector ) {
      return 'matchesSelector';
    }
    // check vendor prefixes
    var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];

    for ( var i=0; i < prefixes.length; i++ ) {
      var prefix = prefixes[i];
      var method = prefix + 'MatchesSelector';
      if ( ElemProto[ method ] ) {
        return method;
      }
    }
  })();

  return function matchesSelector( elem, selector ) {
    return elem[ matchesMethod ]( selector );
  };

}));

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/ev-emitter/ev-emitter.js":[function(require,module,exports){
/**
 * EvEmitter v1.1.0
 * Lil' event emitter
 * MIT License
 */

/* jshint unused: true, undef: true, strict: true */

( function( global, factory ) {
  // universal module definition
  /* jshint strict: false */ /* globals define, module, window */
  if ( typeof define == 'function' && define.amd ) {
    // AMD - RequireJS
    define( factory );
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS - Browserify, Webpack
    module.exports = factory();
  } else {
    // Browser globals
    global.EvEmitter = factory();
  }

}( typeof window != 'undefined' ? window : this, function() {

"use strict";

function EvEmitter() {}

var proto = EvEmitter.prototype;

proto.on = function( eventName, listener ) {
  if ( !eventName || !listener ) {
    return;
  }
  // set events hash
  var events = this._events = this._events || {};
  // set listeners array
  var listeners = events[ eventName ] = events[ eventName ] || [];
  // only add once
  if ( listeners.indexOf( listener ) == -1 ) {
    listeners.push( listener );
  }

  return this;
};

proto.once = function( eventName, listener ) {
  if ( !eventName || !listener ) {
    return;
  }
  // add event
  this.on( eventName, listener );
  // set once flag
  // set onceEvents hash
  var onceEvents = this._onceEvents = this._onceEvents || {};
  // set onceListeners object
  var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
  // set flag
  onceListeners[ listener ] = true;

  return this;
};

proto.off = function( eventName, listener ) {
  var listeners = this._events && this._events[ eventName ];
  if ( !listeners || !listeners.length ) {
    return;
  }
  var index = listeners.indexOf( listener );
  if ( index != -1 ) {
    listeners.splice( index, 1 );
  }

  return this;
};

proto.emitEvent = function( eventName, args ) {
  var listeners = this._events && this._events[ eventName ];
  if ( !listeners || !listeners.length ) {
    return;
  }
  // copy over to avoid interference if .off() in listener
  listeners = listeners.slice(0);
  args = args || [];
  // once stuff
  var onceListeners = this._onceEvents && this._onceEvents[ eventName ];

  for ( var i=0; i < listeners.length; i++ ) {
    var listener = listeners[i]
    var isOnce = onceListeners && onceListeners[ listener ];
    if ( isOnce ) {
      // remove listener
      // remove before trigger to prevent recursion
      this.off( eventName, listener );
      // unset once flag
      delete onceListeners[ listener ];
    }
    // trigger listener
    listener.apply( this, args );
  }

  return this;
};

proto.allOff = function() {
  delete this._events;
  delete this._onceEvents;
};

return EvEmitter;

}));

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/fizzy-ui-utils/utils.js":[function(require,module,exports){
/**
 * Fizzy UI utils v2.0.7
 * MIT license
 */

/*jshint browser: true, undef: true, unused: true, strict: true */

( function( window, factory ) {
  // universal module definition
  /*jshint strict: false */ /*globals define, module, require */

  if ( typeof define == 'function' && define.amd ) {
    // AMD
    define( [
      'desandro-matches-selector/matches-selector'
    ], function( matchesSelector ) {
      return factory( window, matchesSelector );
    });
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS
    module.exports = factory(
      window,
      require('desandro-matches-selector')
    );
  } else {
    // browser global
    window.fizzyUIUtils = factory(
      window,
      window.matchesSelector
    );
  }

}( window, function factory( window, matchesSelector ) {

'use strict';

var utils = {};

// ----- extend ----- //

// extends objects
utils.extend = function( a, b ) {
  for ( var prop in b ) {
    a[ prop ] = b[ prop ];
  }
  return a;
};

// ----- modulo ----- //

utils.modulo = function( num, div ) {
  return ( ( num % div ) + div ) % div;
};

// ----- makeArray ----- //

var arraySlice = Array.prototype.slice;

// turn element or nodeList into an array
utils.makeArray = function( obj ) {
  if ( Array.isArray( obj ) ) {
    // use object if already an array
    return obj;
  }
  // return empty array if undefined or null. #6
  if ( obj === null || obj === undefined ) {
    return [];
  }

  var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
  if ( isArrayLike ) {
    // convert nodeList to array
    return arraySlice.call( obj );
  }

  // array of single index
  return [ obj ];
};

// ----- removeFrom ----- //

utils.removeFrom = function( ary, obj ) {
  var index = ary.indexOf( obj );
  if ( index != -1 ) {
    ary.splice( index, 1 );
  }
};

// ----- getParent ----- //

utils.getParent = function( elem, selector ) {
  while ( elem.parentNode && elem != document.body ) {
    elem = elem.parentNode;
    if ( matchesSelector( elem, selector ) ) {
      return elem;
    }
  }
};

// ----- getQueryElement ----- //

// use element as selector string
utils.getQueryElement = function( elem ) {
  if ( typeof elem == 'string' ) {
    return document.querySelector( elem );
  }
  return elem;
};

// ----- handleEvent ----- //

// enable .ontype to trigger from .addEventListener( elem, 'type' )
utils.handleEvent = function( event ) {
  var method = 'on' + event.type;
  if ( this[ method ] ) {
    this[ method ]( event );
  }
};

// ----- filterFindElements ----- //

utils.filterFindElements = function( elems, selector ) {
  // make array of elems
  elems = utils.makeArray( elems );
  var ffElems = [];

  elems.forEach( function( elem ) {
    // check that elem is an actual element
    if ( !( elem instanceof HTMLElement ) ) {
      return;
    }
    // add elem if no selector
    if ( !selector ) {
      ffElems.push( elem );
      return;
    }
    // filter & find items if we have a selector
    // filter
    if ( matchesSelector( elem, selector ) ) {
      ffElems.push( elem );
    }
    // find children
    var childElems = elem.querySelectorAll( selector );
    // concat childElems to filterFound array
    for ( var i=0; i < childElems.length; i++ ) {
      ffElems.push( childElems[i] );
    }
  });

  return ffElems;
};

// ----- debounceMethod ----- //

utils.debounceMethod = function( _class, methodName, threshold ) {
  threshold = threshold || 100;
  // original method
  var method = _class.prototype[ methodName ];
  var timeoutName = methodName + 'Timeout';

  _class.prototype[ methodName ] = function() {
    var timeout = this[ timeoutName ];
    clearTimeout( timeout );

    var args = arguments;
    var _this = this;
    this[ timeoutName ] = setTimeout( function() {
      method.apply( _this, args );
      delete _this[ timeoutName ];
    }, threshold );
  };
};

// ----- docReady ----- //

utils.docReady = function( callback ) {
  var readyState = document.readyState;
  if ( readyState == 'complete' || readyState == 'interactive' ) {
    // do async to allow for other scripts to run. metafizzy/flickity#441
    setTimeout( callback );
  } else {
    document.addEventListener( 'DOMContentLoaded', callback );
  }
};

// ----- htmlInit ----- //

// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/
utils.toDashed = function( str ) {
  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {
    return $1 + '-' + $2;
  }).toLowerCase();
};

var console = window.console;
/**
 * allow user to initialize classes via [data-namespace] or .js-namespace class
 * htmlInit( Widget, 'widgetName' )
 * options are parsed from data-namespace-options
 */
utils.htmlInit = function( WidgetClass, namespace ) {
  utils.docReady( function() {
    var dashedNamespace = utils.toDashed( namespace );
    var dataAttr = 'data-' + dashedNamespace;
    var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );
    var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );
    var elems = utils.makeArray( dataAttrElems )
      .concat( utils.makeArray( jsDashElems ) );
    var dataOptionsAttr = dataAttr + '-options';
    var jQuery = window.jQuery;

    elems.forEach( function( elem ) {
      var attr = elem.getAttribute( dataAttr ) ||
        elem.getAttribute( dataOptionsAttr );
      var options;
      try {
        options = attr && JSON.parse( attr );
      } catch ( error ) {
        // log error, do not initialize
        if ( console ) {
          console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +
          ': ' + error );
        }
        return;
      }
      // initialize
      var instance = new WidgetClass( elem, options );
      // make available via $().data('namespace')
      if ( jQuery ) {
        jQuery.data( elem, namespace, instance );
      }
    });

  });
};

// -----  ----- //

return utils;

}));

},{"desandro-matches-selector":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/desandro-matches-selector/matches-selector.js"}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/get-size/get-size.js":[function(require,module,exports){
/*!
 * getSize v2.0.3
 * measure size of elements
 * MIT license
 */

/* jshint browser: true, strict: true, undef: true, unused: true */
/* globals console: false */

( function( window, factory ) {
  /* jshint strict: false */ /* globals define, module */
  if ( typeof define == 'function' && define.amd ) {
    // AMD
    define( factory );
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS
    module.exports = factory();
  } else {
    // browser global
    window.getSize = factory();
  }

})( window, function factory() {
'use strict';

// -------------------------- helpers -------------------------- //

// get a number from a string, not a percentage
function getStyleSize( value ) {
  var num = parseFloat( value );
  // not a percent like '100%', and a number
  var isValid = value.indexOf('%') == -1 && !isNaN( num );
  return isValid && num;
}

function noop() {}

var logError = typeof console == 'undefined' ? noop :
  function( message ) {
    console.error( message );
  };

// -------------------------- measurements -------------------------- //

var measurements = [
  'paddingLeft',
  'paddingRight',
  'paddingTop',
  'paddingBottom',
  'marginLeft',
  'marginRight',
  'marginTop',
  'marginBottom',
  'borderLeftWidth',
  'borderRightWidth',
  'borderTopWidth',
  'borderBottomWidth'
];

var measurementsLength = measurements.length;

function getZeroSize() {
  var size = {
    width: 0,
    height: 0,
    innerWidth: 0,
    innerHeight: 0,
    outerWidth: 0,
    outerHeight: 0
  };
  for ( var i=0; i < measurementsLength; i++ ) {
    var measurement = measurements[i];
    size[ measurement ] = 0;
  }
  return size;
}

// -------------------------- getStyle -------------------------- //

/**
 * getStyle, get style of element, check for Firefox bug
 * https://bugzilla.mozilla.org/show_bug.cgi?id=548397
 */
function getStyle( elem ) {
  var style = getComputedStyle( elem );
  if ( !style ) {
    logError( 'Style returned ' + style +
      '. Are you running this code in a hidden iframe on Firefox? ' +
      'See https://bit.ly/getsizebug1' );
  }
  return style;
}

// -------------------------- setup -------------------------- //

var isSetup = false;

var isBoxSizeOuter;

/**
 * setup
 * check isBoxSizerOuter
 * do on first getSize() rather than on page load for Firefox bug
 */
function setup() {
  // setup once
  if ( isSetup ) {
    return;
  }
  isSetup = true;

  // -------------------------- box sizing -------------------------- //

  /**
   * Chrome & Safari measure the outer-width on style.width on border-box elems
   * IE11 & Firefox<29 measures the inner-width
   */
  var div = document.createElement('div');
  div.style.width = '200px';
  div.style.padding = '1px 2px 3px 4px';
  div.style.borderStyle = 'solid';
  div.style.borderWidth = '1px 2px 3px 4px';
  div.style.boxSizing = 'border-box';

  var body = document.body || document.documentElement;
  body.appendChild( div );
  var style = getStyle( div );
  // round value for browser zoom. desandro/masonry#928
  isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;
  getSize.isBoxSizeOuter = isBoxSizeOuter;

  body.removeChild( div );
}

// -------------------------- getSize -------------------------- //

function getSize( elem ) {
  setup();

  // use querySeletor if elem is string
  if ( typeof elem == 'string' ) {
    elem = document.querySelector( elem );
  }

  // do not proceed on non-objects
  if ( !elem || typeof elem != 'object' || !elem.nodeType ) {
    return;
  }

  var style = getStyle( elem );

  // if hidden, everything is 0
  if ( style.display == 'none' ) {
    return getZeroSize();
  }

  var size = {};
  size.width = elem.offsetWidth;
  size.height = elem.offsetHeight;

  var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';

  // get all measurements
  for ( var i=0; i < measurementsLength; i++ ) {
    var measurement = measurements[i];
    var value = style[ measurement ];
    var num = parseFloat( value );
    // any 'auto', 'medium' value will be 0
    size[ measurement ] = !isNaN( num ) ? num : 0;
  }

  var paddingWidth = size.paddingLeft + size.paddingRight;
  var paddingHeight = size.paddingTop + size.paddingBottom;
  var marginWidth = size.marginLeft + size.marginRight;
  var marginHeight = size.marginTop + size.marginBottom;
  var borderWidth = size.borderLeftWidth + size.borderRightWidth;
  var borderHeight = size.borderTopWidth + size.borderBottomWidth;

  var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;

  // overwrite width and height if we can get it from style
  var styleWidth = getStyleSize( style.width );
  if ( styleWidth !== false ) {
    size.width = styleWidth +
      // add padding and border unless it's already including it
      ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );
  }

  var styleHeight = getStyleSize( style.height );
  if ( styleHeight !== false ) {
    size.height = styleHeight +
      // add padding and border unless it's already including it
      ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );
  }

  size.innerWidth = size.width - ( paddingWidth + borderWidth );
  size.innerHeight = size.height - ( paddingHeight + borderHeight );

  size.outerWidth = size.width + marginWidth;
  size.outerHeight = size.height + marginHeight;

  return size;
}

return getSize;

});

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/imagesloaded/imagesloaded.js":[function(require,module,exports){
/*!
 * imagesLoaded v4.1.4
 * JavaScript is all like "You images are done yet or what?"
 * MIT License
 */

( function( window, factory ) { 'use strict';
  // universal module definition

  /*global define: false, module: false, require: false */

  if ( typeof define == 'function' && define.amd ) {
    // AMD
    define( [
      'ev-emitter/ev-emitter'
    ], function( EvEmitter ) {
      return factory( window, EvEmitter );
    });
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS
    module.exports = factory(
      window,
      require('ev-emitter')
    );
  } else {
    // browser global
    window.imagesLoaded = factory(
      window,
      window.EvEmitter
    );
  }

})( typeof window !== 'undefined' ? window : this,

// --------------------------  factory -------------------------- //

function factory( window, EvEmitter ) {

'use strict';

var $ = window.jQuery;
var console = window.console;

// -------------------------- helpers -------------------------- //

// extend objects
function extend( a, b ) {
  for ( var prop in b ) {
    a[ prop ] = b[ prop ];
  }
  return a;
}

var arraySlice = Array.prototype.slice;

// turn element or nodeList into an array
function makeArray( obj ) {
  if ( Array.isArray( obj ) ) {
    // use object if already an array
    return obj;
  }

  var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
  if ( isArrayLike ) {
    // convert nodeList to array
    return arraySlice.call( obj );
  }

  // array of single index
  return [ obj ];
}

// -------------------------- imagesLoaded -------------------------- //

/**
 * @param {Array, Element, NodeList, String} elem
 * @param {Object or Function} options - if function, use as callback
 * @param {Function} onAlways - callback function
 */
function ImagesLoaded( elem, options, onAlways ) {
  // coerce ImagesLoaded() without new, to be new ImagesLoaded()
  if ( !( this instanceof ImagesLoaded ) ) {
    return new ImagesLoaded( elem, options, onAlways );
  }
  // use elem as selector string
  var queryElem = elem;
  if ( typeof elem == 'string' ) {
    queryElem = document.querySelectorAll( elem );
  }
  // bail if bad element
  if ( !queryElem ) {
    console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) );
    return;
  }

  this.elements = makeArray( queryElem );
  this.options = extend( {}, this.options );
  // shift arguments if no options set
  if ( typeof options == 'function' ) {
    onAlways = options;
  } else {
    extend( this.options, options );
  }

  if ( onAlways ) {
    this.on( 'always', onAlways );
  }

  this.getImages();

  if ( $ ) {
    // add jQuery Deferred object
    this.jqDeferred = new $.Deferred();
  }

  // HACK check async to allow time to bind listeners
  setTimeout( this.check.bind( this ) );
}

ImagesLoaded.prototype = Object.create( EvEmitter.prototype );

ImagesLoaded.prototype.options = {};

ImagesLoaded.prototype.getImages = function() {
  this.images = [];

  // filter & find items if we have an item selector
  this.elements.forEach( this.addElementImages, this );
};

/**
 * @param {Node} element
 */
ImagesLoaded.prototype.addElementImages = function( elem ) {
  // filter siblings
  if ( elem.nodeName == 'IMG' ) {
    this.addImage( elem );
  }
  // get background image on element
  if ( this.options.background === true ) {
    this.addElementBackgroundImages( elem );
  }

  // find children
  // no non-element nodes, #143
  var nodeType = elem.nodeType;
  if ( !nodeType || !elementNodeTypes[ nodeType ] ) {
    return;
  }
  var childImgs = elem.querySelectorAll('img');
  // concat childElems to filterFound array
  for ( var i=0; i < childImgs.length; i++ ) {
    var img = childImgs[i];
    this.addImage( img );
  }

  // get child background images
  if ( typeof this.options.background == 'string' ) {
    var children = elem.querySelectorAll( this.options.background );
    for ( i=0; i < children.length; i++ ) {
      var child = children[i];
      this.addElementBackgroundImages( child );
    }
  }
};

var elementNodeTypes = {
  1: true,
  9: true,
  11: true
};

ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {
  var style = getComputedStyle( elem );
  if ( !style ) {
    // Firefox returns null if in a hidden iframe https://bugzil.la/548397
    return;
  }
  // get url inside url("...")
  var reURL = /url\((['"])?(.*?)\1\)/gi;
  var matches = reURL.exec( style.backgroundImage );
  while ( matches !== null ) {
    var url = matches && matches[2];
    if ( url ) {
      this.addBackground( url, elem );
    }
    matches = reURL.exec( style.backgroundImage );
  }
};

/**
 * @param {Image} img
 */
ImagesLoaded.prototype.addImage = function( img ) {
  var loadingImage = new LoadingImage( img );
  this.images.push( loadingImage );
};

ImagesLoaded.prototype.addBackground = function( url, elem ) {
  var background = new Background( url, elem );
  this.images.push( background );
};

ImagesLoaded.prototype.check = function() {
  var _this = this;
  this.progressedCount = 0;
  this.hasAnyBroken = false;
  // complete if no images
  if ( !this.images.length ) {
    this.complete();
    return;
  }

  function onProgress( image, elem, message ) {
    // HACK - Chrome triggers event before object properties have changed. #83
    setTimeout( function() {
      _this.progress( image, elem, message );
    });
  }

  this.images.forEach( function( loadingImage ) {
    loadingImage.once( 'progress', onProgress );
    loadingImage.check();
  });
};

ImagesLoaded.prototype.progress = function( image, elem, message ) {
  this.progressedCount++;
  this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;
  // progress event
  this.emitEvent( 'progress', [ this, image, elem ] );
  if ( this.jqDeferred && this.jqDeferred.notify ) {
    this.jqDeferred.notify( this, image );
  }
  // check if completed
  if ( this.progressedCount == this.images.length ) {
    this.complete();
  }

  if ( this.options.debug && console ) {
    console.log( 'progress: ' + message, image, elem );
  }
};

ImagesLoaded.prototype.complete = function() {
  var eventName = this.hasAnyBroken ? 'fail' : 'done';
  this.isComplete = true;
  this.emitEvent( eventName, [ this ] );
  this.emitEvent( 'always', [ this ] );
  if ( this.jqDeferred ) {
    var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';
    this.jqDeferred[ jqMethod ]( this );
  }
};

// --------------------------  -------------------------- //

function LoadingImage( img ) {
  this.img = img;
}

LoadingImage.prototype = Object.create( EvEmitter.prototype );

LoadingImage.prototype.check = function() {
  // If complete is true and browser supports natural sizes,
  // try to check for image status manually.
  var isComplete = this.getIsImageComplete();
  if ( isComplete ) {
    // report based on naturalWidth
    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
    return;
  }

  // If none of the checks above matched, simulate loading on detached element.
  this.proxyImage = new Image();
  this.proxyImage.addEventListener( 'load', this );
  this.proxyImage.addEventListener( 'error', this );
  // bind to image as well for Firefox. #191
  this.img.addEventListener( 'load', this );
  this.img.addEventListener( 'error', this );
  this.proxyImage.src = this.img.src;
};

LoadingImage.prototype.getIsImageComplete = function() {
  // check for non-zero, non-undefined naturalWidth
  // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671
  return this.img.complete && this.img.naturalWidth;
};

LoadingImage.prototype.confirm = function( isLoaded, message ) {
  this.isLoaded = isLoaded;
  this.emitEvent( 'progress', [ this, this.img, message ] );
};

// ----- events ----- //

// trigger specified handler for event type
LoadingImage.prototype.handleEvent = function( event ) {
  var method = 'on' + event.type;
  if ( this[ method ] ) {
    this[ method ]( event );
  }
};

LoadingImage.prototype.onload = function() {
  this.confirm( true, 'onload' );
  this.unbindEvents();
};

LoadingImage.prototype.onerror = function() {
  this.confirm( false, 'onerror' );
  this.unbindEvents();
};

LoadingImage.prototype.unbindEvents = function() {
  this.proxyImage.removeEventListener( 'load', this );
  this.proxyImage.removeEventListener( 'error', this );
  this.img.removeEventListener( 'load', this );
  this.img.removeEventListener( 'error', this );
};

// -------------------------- Background -------------------------- //

function Background( url, element ) {
  this.url = url;
  this.element = element;
  this.img = new Image();
}

// inherit LoadingImage prototype
Background.prototype = Object.create( LoadingImage.prototype );

Background.prototype.check = function() {
  this.img.addEventListener( 'load', this );
  this.img.addEventListener( 'error', this );
  this.img.src = this.url;
  // check if image is already complete
  var isComplete = this.getIsImageComplete();
  if ( isComplete ) {
    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
    this.unbindEvents();
  }
};

Background.prototype.unbindEvents = function() {
  this.img.removeEventListener( 'load', this );
  this.img.removeEventListener( 'error', this );
};

Background.prototype.confirm = function( isLoaded, message ) {
  this.isLoaded = isLoaded;
  this.emitEvent( 'progress', [ this, this.element, message ] );
};

// -------------------------- jQuery -------------------------- //

ImagesLoaded.makeJQueryPlugin = function( jQuery ) {
  jQuery = jQuery || window.jQuery;
  if ( !jQuery ) {
    return;
  }
  // set local variable
  $ = jQuery;
  // $().imagesLoaded()
  $.fn.imagesLoaded = function( options, callback ) {
    var instance = new ImagesLoaded( this, options, callback );
    return instance.jqDeferred.promise( $(this) );
  };
};
// try making plugin
ImagesLoaded.makeJQueryPlugin();

// --------------------------  -------------------------- //

return ImagesLoaded;

});

},{"ev-emitter":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/ev-emitter/ev-emitter.js"}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/masonry.js":[function(require,module,exports){
/*!
 * Masonry v4.2.2
 * Cascading grid layout library
 * https://masonry.desandro.com
 * MIT License
 * by David DeSandro
 */

( function( window, factory ) {
  // universal module definition
  /* jshint strict: false */ /*globals define, module, require */
  if ( typeof define == 'function' && define.amd ) {
    // AMD
    define( [
        'outlayer/outlayer',
        'get-size/get-size'
      ],
      factory );
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS
    module.exports = factory(
      require('outlayer'),
      require('get-size')
    );
  } else {
    // browser global
    window.Masonry = factory(
      window.Outlayer,
      window.getSize
    );
  }

}( window, function factory( Outlayer, getSize ) {

'use strict';

// -------------------------- masonryDefinition -------------------------- //

  // create an Outlayer layout class
  var Masonry = Outlayer.create('masonry');
  // isFitWidth -> fitWidth
  Masonry.compatOptions.fitWidth = 'isFitWidth';

  var proto = Masonry.prototype;

  proto._resetLayout = function() {
    this.getSize();
    this._getMeasurement( 'columnWidth', 'outerWidth' );
    this._getMeasurement( 'gutter', 'outerWidth' );
    this.measureColumns();

    // reset column Y
    this.colYs = [];
    for ( var i=0; i < this.cols; i++ ) {
      this.colYs.push( 0 );
    }

    this.maxY = 0;
    this.horizontalColIndex = 0;
  };

  proto.measureColumns = function() {
    this.getContainerWidth();
    // if columnWidth is 0, default to outerWidth of first item
    if ( !this.columnWidth ) {
      var firstItem = this.items[0];
      var firstItemElem = firstItem && firstItem.element;
      // columnWidth fall back to item of first element
      this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||
        // if first elem has no width, default to size of container
        this.containerWidth;
    }

    var columnWidth = this.columnWidth += this.gutter;

    // calculate columns
    var containerWidth = this.containerWidth + this.gutter;
    var cols = containerWidth / columnWidth;
    // fix rounding errors, typically with gutters
    var excess = columnWidth - containerWidth % columnWidth;
    // if overshoot is less than a pixel, round up, otherwise floor it
    var mathMethod = excess && excess < 1 ? 'round' : 'floor';
    cols = Math[ mathMethod ]( cols );
    this.cols = Math.max( cols, 1 );
  };

  proto.getContainerWidth = function() {
    // container is parent if fit width
    var isFitWidth = this._getOption('fitWidth');
    var container = isFitWidth ? this.element.parentNode : this.element;
    // check that this.size and size are there
    // IE8 triggers resize on body size change, so they might not be
    var size = getSize( container );
    this.containerWidth = size && size.innerWidth;
  };

  proto._getItemLayoutPosition = function( item ) {
    item.getSize();
    // how many columns does this brick span
    var remainder = item.size.outerWidth % this.columnWidth;
    var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';
    // round if off by 1 pixel, otherwise use ceil
    var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );
    colSpan = Math.min( colSpan, this.cols );
    // use horizontal or top column position
    var colPosMethod = this.options.horizontalOrder ?
      '_getHorizontalColPosition' : '_getTopColPosition';
    var colPosition = this[ colPosMethod ]( colSpan, item );
    // position the brick
    var position = {
      x: this.columnWidth * colPosition.col,
      y: colPosition.y
    };
    // apply setHeight to necessary columns
    var setHeight = colPosition.y + item.size.outerHeight;
    var setMax = colSpan + colPosition.col;
    for ( var i = colPosition.col; i < setMax; i++ ) {
      this.colYs[i] = setHeight;
    }

    return position;
  };

  proto._getTopColPosition = function( colSpan ) {
    var colGroup = this._getTopColGroup( colSpan );
    // get the minimum Y value from the columns
    var minimumY = Math.min.apply( Math, colGroup );

    return {
      col: colGroup.indexOf( minimumY ),
      y: minimumY,
    };
  };

  /**
   * @param {Number} colSpan - number of columns the element spans
   * @returns {Array} colGroup
   */
  proto._getTopColGroup = function( colSpan ) {
    if ( colSpan < 2 ) {
      // if brick spans only one column, use all the column Ys
      return this.colYs;
    }

    var colGroup = [];
    // how many different places could this brick fit horizontally
    var groupCount = this.cols + 1 - colSpan;
    // for each group potential horizontal position
    for ( var i = 0; i < groupCount; i++ ) {
      colGroup[i] = this._getColGroupY( i, colSpan );
    }
    return colGroup;
  };

  proto._getColGroupY = function( col, colSpan ) {
    if ( colSpan < 2 ) {
      return this.colYs[ col ];
    }
    // make an array of colY values for that one group
    var groupColYs = this.colYs.slice( col, col + colSpan );
    // and get the max value of the array
    return Math.max.apply( Math, groupColYs );
  };

  // get column position based on horizontal index. #873
  proto._getHorizontalColPosition = function( colSpan, item ) {
    var col = this.horizontalColIndex % this.cols;
    var isOver = colSpan > 1 && col + colSpan > this.cols;
    // shift to next row if item can't fit on current row
    col = isOver ? 0 : col;
    // don't let zero-size items take up space
    var hasSize = item.size.outerWidth && item.size.outerHeight;
    this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;

    return {
      col: col,
      y: this._getColGroupY( col, colSpan ),
    };
  };

  proto._manageStamp = function( stamp ) {
    var stampSize = getSize( stamp );
    var offset = this._getElementOffset( stamp );
    // get the columns that this stamp affects
    var isOriginLeft = this._getOption('originLeft');
    var firstX = isOriginLeft ? offset.left : offset.right;
    var lastX = firstX + stampSize.outerWidth;
    var firstCol = Math.floor( firstX / this.columnWidth );
    firstCol = Math.max( 0, firstCol );
    var lastCol = Math.floor( lastX / this.columnWidth );
    // lastCol should not go over if multiple of columnWidth #425
    lastCol -= lastX % this.columnWidth ? 0 : 1;
    lastCol = Math.min( this.cols - 1, lastCol );
    // set colYs to bottom of the stamp

    var isOriginTop = this._getOption('originTop');
    var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +
      stampSize.outerHeight;
    for ( var i = firstCol; i <= lastCol; i++ ) {
      this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );
    }
  };

  proto._getContainerSize = function() {
    this.maxY = Math.max.apply( Math, this.colYs );
    var size = {
      height: this.maxY
    };

    if ( this._getOption('fitWidth') ) {
      size.width = this._getContainerFitWidth();
    }

    return size;
  };

  proto._getContainerFitWidth = function() {
    var unusedCols = 0;
    // count unused columns
    var i = this.cols;
    while ( --i ) {
      if ( this.colYs[i] !== 0 ) {
        break;
      }
      unusedCols++;
    }
    // fit container to columns that have been used
    return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;
  };

  proto.needsResizeLayout = function() {
    var previousWidth = this.containerWidth;
    this.getContainerWidth();
    return previousWidth != this.containerWidth;
  };

  return Masonry;

}));

},{"get-size":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/get-size/get-size.js","outlayer":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/outlayer/outlayer.js"}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/outlayer/item.js":[function(require,module,exports){
/**
 * Outlayer Item
 */

( function( window, factory ) {
  // universal module definition
  /* jshint strict: false */ /* globals define, module, require */
  if ( typeof define == 'function' && define.amd ) {
    // AMD - RequireJS
    define( [
        'ev-emitter/ev-emitter',
        'get-size/get-size'
      ],
      factory
    );
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS - Browserify, Webpack
    module.exports = factory(
      require('ev-emitter'),
      require('get-size')
    );
  } else {
    // browser global
    window.Outlayer = {};
    window.Outlayer.Item = factory(
      window.EvEmitter,
      window.getSize
    );
  }

}( window, function factory( EvEmitter, getSize ) {
'use strict';

// ----- helpers ----- //

function isEmptyObj( obj ) {
  for ( var prop in obj ) {
    return false;
  }
  prop = null;
  return true;
}

// -------------------------- CSS3 support -------------------------- //


var docElemStyle = document.documentElement.style;

var transitionProperty = typeof docElemStyle.transition == 'string' ?
  'transition' : 'WebkitTransition';
var transformProperty = typeof docElemStyle.transform == 'string' ?
  'transform' : 'WebkitTransform';

var transitionEndEvent = {
  WebkitTransition: 'webkitTransitionEnd',
  transition: 'transitionend'
}[ transitionProperty ];

// cache all vendor properties that could have vendor prefix
var vendorProperties = {
  transform: transformProperty,
  transition: transitionProperty,
  transitionDuration: transitionProperty + 'Duration',
  transitionProperty: transitionProperty + 'Property',
  transitionDelay: transitionProperty + 'Delay'
};

// -------------------------- Item -------------------------- //

function Item( element, layout ) {
  if ( !element ) {
    return;
  }

  this.element = element;
  // parent layout class, i.e. Masonry, Isotope, or Packery
  this.layout = layout;
  this.position = {
    x: 0,
    y: 0
  };

  this._create();
}

// inherit EvEmitter
var proto = Item.prototype = Object.create( EvEmitter.prototype );
proto.constructor = Item;

proto._create = function() {
  // transition objects
  this._transn = {
    ingProperties: {},
    clean: {},
    onEnd: {}
  };

  this.css({
    position: 'absolute'
  });
};

// trigger specified handler for event type
proto.handleEvent = function( event ) {
  var method = 'on' + event.type;
  if ( this[ method ] ) {
    this[ method ]( event );
  }
};

proto.getSize = function() {
  this.size = getSize( this.element );
};

/**
 * apply CSS styles to element
 * @param {Object} style
 */
proto.css = function( style ) {
  var elemStyle = this.element.style;

  for ( var prop in style ) {
    // use vendor property if available
    var supportedProp = vendorProperties[ prop ] || prop;
    elemStyle[ supportedProp ] = style[ prop ];
  }
};

 // measure position, and sets it
proto.getPosition = function() {
  var style = getComputedStyle( this.element );
  var isOriginLeft = this.layout._getOption('originLeft');
  var isOriginTop = this.layout._getOption('originTop');
  var xValue = style[ isOriginLeft ? 'left' : 'right' ];
  var yValue = style[ isOriginTop ? 'top' : 'bottom' ];
  var x = parseFloat( xValue );
  var y = parseFloat( yValue );
  // convert percent to pixels
  var layoutSize = this.layout.size;
  if ( xValue.indexOf('%') != -1 ) {
    x = ( x / 100 ) * layoutSize.width;
  }
  if ( yValue.indexOf('%') != -1 ) {
    y = ( y / 100 ) * layoutSize.height;
  }
  // clean up 'auto' or other non-integer values
  x = isNaN( x ) ? 0 : x;
  y = isNaN( y ) ? 0 : y;
  // remove padding from measurement
  x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;
  y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;

  this.position.x = x;
  this.position.y = y;
};

// set settled position, apply padding
proto.layoutPosition = function() {
  var layoutSize = this.layout.size;
  var style = {};
  var isOriginLeft = this.layout._getOption('originLeft');
  var isOriginTop = this.layout._getOption('originTop');

  // x
  var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';
  var xProperty = isOriginLeft ? 'left' : 'right';
  var xResetProperty = isOriginLeft ? 'right' : 'left';

  var x = this.position.x + layoutSize[ xPadding ];
  // set in percentage or pixels
  style[ xProperty ] = this.getXValue( x );
  // reset other property
  style[ xResetProperty ] = '';

  // y
  var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';
  var yProperty = isOriginTop ? 'top' : 'bottom';
  var yResetProperty = isOriginTop ? 'bottom' : 'top';

  var y = this.position.y + layoutSize[ yPadding ];
  // set in percentage or pixels
  style[ yProperty ] = this.getYValue( y );
  // reset other property
  style[ yResetProperty ] = '';

  this.css( style );
  this.emitEvent( 'layout', [ this ] );
};

proto.getXValue = function( x ) {
  var isHorizontal = this.layout._getOption('horizontal');
  return this.layout.options.percentPosition && !isHorizontal ?
    ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';
};

proto.getYValue = function( y ) {
  var isHorizontal = this.layout._getOption('horizontal');
  return this.layout.options.percentPosition && isHorizontal ?
    ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';
};

proto._transitionTo = function( x, y ) {
  this.getPosition();
  // get current x & y from top/left
  var curX = this.position.x;
  var curY = this.position.y;

  var didNotMove = x == this.position.x && y == this.position.y;

  // save end position
  this.setPosition( x, y );

  // if did not move and not transitioning, just go to layout
  if ( didNotMove && !this.isTransitioning ) {
    this.layoutPosition();
    return;
  }

  var transX = x - curX;
  var transY = y - curY;
  var transitionStyle = {};
  transitionStyle.transform = this.getTranslate( transX, transY );

  this.transition({
    to: transitionStyle,
    onTransitionEnd: {
      transform: this.layoutPosition
    },
    isCleaning: true
  });
};

proto.getTranslate = function( x, y ) {
  // flip cooridinates if origin on right or bottom
  var isOriginLeft = this.layout._getOption('originLeft');
  var isOriginTop = this.layout._getOption('originTop');
  x = isOriginLeft ? x : -x;
  y = isOriginTop ? y : -y;
  return 'translate3d(' + x + 'px, ' + y + 'px, 0)';
};

// non transition + transform support
proto.goTo = function( x, y ) {
  this.setPosition( x, y );
  this.layoutPosition();
};

proto.moveTo = proto._transitionTo;

proto.setPosition = function( x, y ) {
  this.position.x = parseFloat( x );
  this.position.y = parseFloat( y );
};

// ----- transition ----- //

/**
 * @param {Object} style - CSS
 * @param {Function} onTransitionEnd
 */

// non transition, just trigger callback
proto._nonTransition = function( args ) {
  this.css( args.to );
  if ( args.isCleaning ) {
    this._removeStyles( args.to );
  }
  for ( var prop in args.onTransitionEnd ) {
    args.onTransitionEnd[ prop ].call( this );
  }
};

/**
 * proper transition
 * @param {Object} args - arguments
 *   @param {Object} to - style to transition to
 *   @param {Object} from - style to start transition from
 *   @param {Boolean} isCleaning - removes transition styles after transition
 *   @param {Function} onTransitionEnd - callback
 */
proto.transition = function( args ) {
  // redirect to nonTransition if no transition duration
  if ( !parseFloat( this.layout.options.transitionDuration ) ) {
    this._nonTransition( args );
    return;
  }

  var _transition = this._transn;
  // keep track of onTransitionEnd callback by css property
  for ( var prop in args.onTransitionEnd ) {
    _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];
  }
  // keep track of properties that are transitioning
  for ( prop in args.to ) {
    _transition.ingProperties[ prop ] = true;
    // keep track of properties to clean up when transition is done
    if ( args.isCleaning ) {
      _transition.clean[ prop ] = true;
    }
  }

  // set from styles
  if ( args.from ) {
    this.css( args.from );
    // force redraw. http://blog.alexmaccaw.com/css-transitions
    var h = this.element.offsetHeight;
    // hack for JSHint to hush about unused var
    h = null;
  }
  // enable transition
  this.enableTransition( args.to );
  // set styles that are transitioning
  this.css( args.to );

  this.isTransitioning = true;

};

// dash before all cap letters, including first for
// WebkitTransform => -webkit-transform
function toDashedAll( str ) {
  return str.replace( /([A-Z])/g, function( $1 ) {
    return '-' + $1.toLowerCase();
  });
}

var transitionProps = 'opacity,' + toDashedAll( transformProperty );

proto.enableTransition = function(/* style */) {
  // HACK changing transitionProperty during a transition
  // will cause transition to jump
  if ( this.isTransitioning ) {
    return;
  }

  // make `transition: foo, bar, baz` from style object
  // HACK un-comment this when enableTransition can work
  // while a transition is happening
  // var transitionValues = [];
  // for ( var prop in style ) {
  //   // dash-ify camelCased properties like WebkitTransition
  //   prop = vendorProperties[ prop ] || prop;
  //   transitionValues.push( toDashedAll( prop ) );
  // }
  // munge number to millisecond, to match stagger
  var duration = this.layout.options.transitionDuration;
  duration = typeof duration == 'number' ? duration + 'ms' : duration;
  // enable transition styles
  this.css({
    transitionProperty: transitionProps,
    transitionDuration: duration,
    transitionDelay: this.staggerDelay || 0
  });
  // listen for transition end event
  this.element.addEventListener( transitionEndEvent, this, false );
};

// ----- events ----- //

proto.onwebkitTransitionEnd = function( event ) {
  this.ontransitionend( event );
};

proto.onotransitionend = function( event ) {
  this.ontransitionend( event );
};

// properties that I munge to make my life easier
var dashedVendorProperties = {
  '-webkit-transform': 'transform'
};

proto.ontransitionend = function( event ) {
  // disregard bubbled events from children
  if ( event.target !== this.element ) {
    return;
  }
  var _transition = this._transn;
  // get property name of transitioned property, convert to prefix-free
  var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;

  // remove property that has completed transitioning
  delete _transition.ingProperties[ propertyName ];
  // check if any properties are still transitioning
  if ( isEmptyObj( _transition.ingProperties ) ) {
    // all properties have completed transitioning
    this.disableTransition();
  }
  // clean style
  if ( propertyName in _transition.clean ) {
    // clean up style
    this.element.style[ event.propertyName ] = '';
    delete _transition.clean[ propertyName ];
  }
  // trigger onTransitionEnd callback
  if ( propertyName in _transition.onEnd ) {
    var onTransitionEnd = _transition.onEnd[ propertyName ];
    onTransitionEnd.call( this );
    delete _transition.onEnd[ propertyName ];
  }

  this.emitEvent( 'transitionEnd', [ this ] );
};

proto.disableTransition = function() {
  this.removeTransitionStyles();
  this.element.removeEventListener( transitionEndEvent, this, false );
  this.isTransitioning = false;
};

/**
 * removes style property from element
 * @param {Object} style
**/
proto._removeStyles = function( style ) {
  // clean up transition styles
  var cleanStyle = {};
  for ( var prop in style ) {
    cleanStyle[ prop ] = '';
  }
  this.css( cleanStyle );
};

var cleanTransitionStyle = {
  transitionProperty: '',
  transitionDuration: '',
  transitionDelay: ''
};

proto.removeTransitionStyles = function() {
  // remove transition
  this.css( cleanTransitionStyle );
};

// ----- stagger ----- //

proto.stagger = function( delay ) {
  delay = isNaN( delay ) ? 0 : delay;
  this.staggerDelay = delay + 'ms';
};

// ----- show/hide/remove ----- //

// remove element from DOM
proto.removeElem = function() {
  this.element.parentNode.removeChild( this.element );
  // remove display: none
  this.css({ display: '' });
  this.emitEvent( 'remove', [ this ] );
};

proto.remove = function() {
  // just remove element if no transition support or no transition
  if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {
    this.removeElem();
    return;
  }

  // start transition
  this.once( 'transitionEnd', function() {
    this.removeElem();
  });
  this.hide();
};

proto.reveal = function() {
  delete this.isHidden;
  // remove display: none
  this.css({ display: '' });

  var options = this.layout.options;

  var onTransitionEnd = {};
  var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');
  onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;

  this.transition({
    from: options.hiddenStyle,
    to: options.visibleStyle,
    isCleaning: true,
    onTransitionEnd: onTransitionEnd
  });
};

proto.onRevealTransitionEnd = function() {
  // check if still visible
  // during transition, item may have been hidden
  if ( !this.isHidden ) {
    this.emitEvent('reveal');
  }
};

/**
 * get style property use for hide/reveal transition end
 * @param {String} styleProperty - hiddenStyle/visibleStyle
 * @returns {String}
 */
proto.getHideRevealTransitionEndProperty = function( styleProperty ) {
  var optionStyle = this.layout.options[ styleProperty ];
  // use opacity
  if ( optionStyle.opacity ) {
    return 'opacity';
  }
  // get first property
  for ( var prop in optionStyle ) {
    return prop;
  }
};

proto.hide = function() {
  // set flag
  this.isHidden = true;
  // remove display: none
  this.css({ display: '' });

  var options = this.layout.options;

  var onTransitionEnd = {};
  var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');
  onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;

  this.transition({
    from: options.visibleStyle,
    to: options.hiddenStyle,
    // keep hidden stuff hidden
    isCleaning: true,
    onTransitionEnd: onTransitionEnd
  });
};

proto.onHideTransitionEnd = function() {
  // check if still hidden
  // during transition, item may have been un-hidden
  if ( this.isHidden ) {
    this.css({ display: 'none' });
    this.emitEvent('hide');
  }
};

proto.destroy = function() {
  this.css({
    position: '',
    left: '',
    right: '',
    top: '',
    bottom: '',
    transition: '',
    transform: ''
  });
};

return Item;

}));

},{"ev-emitter":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/ev-emitter/ev-emitter.js","get-size":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/get-size/get-size.js"}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/outlayer/outlayer.js":[function(require,module,exports){
/*!
 * Outlayer v2.1.1
 * the brains and guts of a layout library
 * MIT license
 */

( function( window, factory ) {
  'use strict';
  // universal module definition
  /* jshint strict: false */ /* globals define, module, require */
  if ( typeof define == 'function' && define.amd ) {
    // AMD - RequireJS
    define( [
        'ev-emitter/ev-emitter',
        'get-size/get-size',
        'fizzy-ui-utils/utils',
        './item'
      ],
      function( EvEmitter, getSize, utils, Item ) {
        return factory( window, EvEmitter, getSize, utils, Item);
      }
    );
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS - Browserify, Webpack
    module.exports = factory(
      window,
      require('ev-emitter'),
      require('get-size'),
      require('fizzy-ui-utils'),
      require('./item')
    );
  } else {
    // browser global
    window.Outlayer = factory(
      window,
      window.EvEmitter,
      window.getSize,
      window.fizzyUIUtils,
      window.Outlayer.Item
    );
  }

}( window, function factory( window, EvEmitter, getSize, utils, Item ) {
'use strict';

// ----- vars ----- //

var console = window.console;
var jQuery = window.jQuery;
var noop = function() {};

// -------------------------- Outlayer -------------------------- //

// globally unique identifiers
var GUID = 0;
// internal store of all Outlayer intances
var instances = {};


/**
 * @param {Element, String} element
 * @param {Object} options
 * @constructor
 */
function Outlayer( element, options ) {
  var queryElement = utils.getQueryElement( element );
  if ( !queryElement ) {
    if ( console ) {
      console.error( 'Bad element for ' + this.constructor.namespace +
        ': ' + ( queryElement || element ) );
    }
    return;
  }
  this.element = queryElement;
  // add jQuery
  if ( jQuery ) {
    this.$element = jQuery( this.element );
  }

  // options
  this.options = utils.extend( {}, this.constructor.defaults );
  this.option( options );

  // add id for Outlayer.getFromElement
  var id = ++GUID;
  this.element.outlayerGUID = id; // expando
  instances[ id ] = this; // associate via id

  // kick it off
  this._create();

  var isInitLayout = this._getOption('initLayout');
  if ( isInitLayout ) {
    this.layout();
  }
}

// settings are for internal use only
Outlayer.namespace = 'outlayer';
Outlayer.Item = Item;

// default options
Outlayer.defaults = {
  containerStyle: {
    position: 'relative'
  },
  initLayout: true,
  originLeft: true,
  originTop: true,
  resize: true,
  resizeContainer: true,
  // item options
  transitionDuration: '0.4s',
  hiddenStyle: {
    opacity: 0,
    transform: 'scale(0.001)'
  },
  visibleStyle: {
    opacity: 1,
    transform: 'scale(1)'
  }
};

var proto = Outlayer.prototype;
// inherit EvEmitter
utils.extend( proto, EvEmitter.prototype );

/**
 * set options
 * @param {Object} opts
 */
proto.option = function( opts ) {
  utils.extend( this.options, opts );
};

/**
 * get backwards compatible option value, check old name
 */
proto._getOption = function( option ) {
  var oldOption = this.constructor.compatOptions[ option ];
  return oldOption && this.options[ oldOption ] !== undefined ?
    this.options[ oldOption ] : this.options[ option ];
};

Outlayer.compatOptions = {
  // currentName: oldName
  initLayout: 'isInitLayout',
  horizontal: 'isHorizontal',
  layoutInstant: 'isLayoutInstant',
  originLeft: 'isOriginLeft',
  originTop: 'isOriginTop',
  resize: 'isResizeBound',
  resizeContainer: 'isResizingContainer'
};

proto._create = function() {
  // get items from children
  this.reloadItems();
  // elements that affect layout, but are not laid out
  this.stamps = [];
  this.stamp( this.options.stamp );
  // set container style
  utils.extend( this.element.style, this.options.containerStyle );

  // bind resize method
  var canBindResize = this._getOption('resize');
  if ( canBindResize ) {
    this.bindResize();
  }
};

// goes through all children again and gets bricks in proper order
proto.reloadItems = function() {
  // collection of item elements
  this.items = this._itemize( this.element.children );
};


/**
 * turn elements into Outlayer.Items to be used in layout
 * @param {Array or NodeList or HTMLElement} elems
 * @returns {Array} items - collection of new Outlayer Items
 */
proto._itemize = function( elems ) {

  var itemElems = this._filterFindItemElements( elems );
  var Item = this.constructor.Item;

  // create new Outlayer Items for collection
  var items = [];
  for ( var i=0; i < itemElems.length; i++ ) {
    var elem = itemElems[i];
    var item = new Item( elem, this );
    items.push( item );
  }

  return items;
};

/**
 * get item elements to be used in layout
 * @param {Array or NodeList or HTMLElement} elems
 * @returns {Array} items - item elements
 */
proto._filterFindItemElements = function( elems ) {
  return utils.filterFindElements( elems, this.options.itemSelector );
};

/**
 * getter method for getting item elements
 * @returns {Array} elems - collection of item elements
 */
proto.getItemElements = function() {
  return this.items.map( function( item ) {
    return item.element;
  });
};

// ----- init & layout ----- //

/**
 * lays out all items
 */
proto.layout = function() {
  this._resetLayout();
  this._manageStamps();

  // don't animate first layout
  var layoutInstant = this._getOption('layoutInstant');
  var isInstant = layoutInstant !== undefined ?
    layoutInstant : !this._isLayoutInited;
  this.layoutItems( this.items, isInstant );

  // flag for initalized
  this._isLayoutInited = true;
};

// _init is alias for layout
proto._init = proto.layout;

/**
 * logic before any new layout
 */
proto._resetLayout = function() {
  this.getSize();
};


proto.getSize = function() {
  this.size = getSize( this.element );
};

/**
 * get measurement from option, for columnWidth, rowHeight, gutter
 * if option is String -> get element from selector string, & get size of element
 * if option is Element -> get size of element
 * else use option as a number
 *
 * @param {String} measurement
 * @param {String} size - width or height
 * @private
 */
proto._getMeasurement = function( measurement, size ) {
  var option = this.options[ measurement ];
  var elem;
  if ( !option ) {
    // default to 0
    this[ measurement ] = 0;
  } else {
    // use option as an element
    if ( typeof option == 'string' ) {
      elem = this.element.querySelector( option );
    } else if ( option instanceof HTMLElement ) {
      elem = option;
    }
    // use size of element, if element
    this[ measurement ] = elem ? getSize( elem )[ size ] : option;
  }
};

/**
 * layout a collection of item elements
 * @api public
 */
proto.layoutItems = function( items, isInstant ) {
  items = this._getItemsForLayout( items );

  this._layoutItems( items, isInstant );

  this._postLayout();
};

/**
 * get the items to be laid out
 * you may want to skip over some items
 * @param {Array} items
 * @returns {Array} items
 */
proto._getItemsForLayout = function( items ) {
  return items.filter( function( item ) {
    return !item.isIgnored;
  });
};

/**
 * layout items
 * @param {Array} items
 * @param {Boolean} isInstant
 */
proto._layoutItems = function( items, isInstant ) {
  this._emitCompleteOnItems( 'layout', items );

  if ( !items || !items.length ) {
    // no items, emit event with empty array
    return;
  }

  var queue = [];

  items.forEach( function( item ) {
    // get x/y object from method
    var position = this._getItemLayoutPosition( item );
    // enqueue
    position.item = item;
    position.isInstant = isInstant || item.isLayoutInstant;
    queue.push( position );
  }, this );

  this._processLayoutQueue( queue );
};

/**
 * get item layout position
 * @param {Outlayer.Item} item
 * @returns {Object} x and y position
 */
proto._getItemLayoutPosition = function( /* item */ ) {
  return {
    x: 0,
    y: 0
  };
};

/**
 * iterate over array and position each item
 * Reason being - separating this logic prevents 'layout invalidation'
 * thx @paul_irish
 * @param {Array} queue
 */
proto._processLayoutQueue = function( queue ) {
  this.updateStagger();
  queue.forEach( function( obj, i ) {
    this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );
  }, this );
};

// set stagger from option in milliseconds number
proto.updateStagger = function() {
  var stagger = this.options.stagger;
  if ( stagger === null || stagger === undefined ) {
    this.stagger = 0;
    return;
  }
  this.stagger = getMilliseconds( stagger );
  return this.stagger;
};

/**
 * Sets position of item in DOM
 * @param {Outlayer.Item} item
 * @param {Number} x - horizontal position
 * @param {Number} y - vertical position
 * @param {Boolean} isInstant - disables transitions
 */
proto._positionItem = function( item, x, y, isInstant, i ) {
  if ( isInstant ) {
    // if not transition, just set CSS
    item.goTo( x, y );
  } else {
    item.stagger( i * this.stagger );
    item.moveTo( x, y );
  }
};

/**
 * Any logic you want to do after each layout,
 * i.e. size the container
 */
proto._postLayout = function() {
  this.resizeContainer();
};

proto.resizeContainer = function() {
  var isResizingContainer = this._getOption('resizeContainer');
  if ( !isResizingContainer ) {
    return;
  }
  var size = this._getContainerSize();
  if ( size ) {
    this._setContainerMeasure( size.width, true );
    this._setContainerMeasure( size.height, false );
  }
};

/**
 * Sets width or height of container if returned
 * @returns {Object} size
 *   @param {Number} width
 *   @param {Number} height
 */
proto._getContainerSize = noop;

/**
 * @param {Number} measure - size of width or height
 * @param {Boolean} isWidth
 */
proto._setContainerMeasure = function( measure, isWidth ) {
  if ( measure === undefined ) {
    return;
  }

  var elemSize = this.size;
  // add padding and border width if border box
  if ( elemSize.isBorderBox ) {
    measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +
      elemSize.borderLeftWidth + elemSize.borderRightWidth :
      elemSize.paddingBottom + elemSize.paddingTop +
      elemSize.borderTopWidth + elemSize.borderBottomWidth;
  }

  measure = Math.max( measure, 0 );
  this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';
};

/**
 * emit eventComplete on a collection of items events
 * @param {String} eventName
 * @param {Array} items - Outlayer.Items
 */
proto._emitCompleteOnItems = function( eventName, items ) {
  var _this = this;
  function onComplete() {
    _this.dispatchEvent( eventName + 'Complete', null, [ items ] );
  }

  var count = items.length;
  if ( !items || !count ) {
    onComplete();
    return;
  }

  var doneCount = 0;
  function tick() {
    doneCount++;
    if ( doneCount == count ) {
      onComplete();
    }
  }

  // bind callback
  items.forEach( function( item ) {
    item.once( eventName, tick );
  });
};

/**
 * emits events via EvEmitter and jQuery events
 * @param {String} type - name of event
 * @param {Event} event - original event
 * @param {Array} args - extra arguments
 */
proto.dispatchEvent = function( type, event, args ) {
  // add original event to arguments
  var emitArgs = event ? [ event ].concat( args ) : args;
  this.emitEvent( type, emitArgs );

  if ( jQuery ) {
    // set this.$element
    this.$element = this.$element || jQuery( this.element );
    if ( event ) {
      // create jQuery event
      var $event = jQuery.Event( event );
      $event.type = type;
      this.$element.trigger( $event, args );
    } else {
      // just trigger with type if no event available
      this.$element.trigger( type, args );
    }
  }
};

// -------------------------- ignore & stamps -------------------------- //


/**
 * keep item in collection, but do not lay it out
 * ignored items do not get skipped in layout
 * @param {Element} elem
 */
proto.ignore = function( elem ) {
  var item = this.getItem( elem );
  if ( item ) {
    item.isIgnored = true;
  }
};

/**
 * return item to layout collection
 * @param {Element} elem
 */
proto.unignore = function( elem ) {
  var item = this.getItem( elem );
  if ( item ) {
    delete item.isIgnored;
  }
};

/**
 * adds elements to stamps
 * @param {NodeList, Array, Element, or String} elems
 */
proto.stamp = function( elems ) {
  elems = this._find( elems );
  if ( !elems ) {
    return;
  }

  this.stamps = this.stamps.concat( elems );
  // ignore
  elems.forEach( this.ignore, this );
};

/**
 * removes elements to stamps
 * @param {NodeList, Array, or Element} elems
 */
proto.unstamp = function( elems ) {
  elems = this._find( elems );
  if ( !elems ){
    return;
  }

  elems.forEach( function( elem ) {
    // filter out removed stamp elements
    utils.removeFrom( this.stamps, elem );
    this.unignore( elem );
  }, this );
};

/**
 * finds child elements
 * @param {NodeList, Array, Element, or String} elems
 * @returns {Array} elems
 */
proto._find = function( elems ) {
  if ( !elems ) {
    return;
  }
  // if string, use argument as selector string
  if ( typeof elems == 'string' ) {
    elems = this.element.querySelectorAll( elems );
  }
  elems = utils.makeArray( elems );
  return elems;
};

proto._manageStamps = function() {
  if ( !this.stamps || !this.stamps.length ) {
    return;
  }

  this._getBoundingRect();

  this.stamps.forEach( this._manageStamp, this );
};

// update boundingLeft / Top
proto._getBoundingRect = function() {
  // get bounding rect for container element
  var boundingRect = this.element.getBoundingClientRect();
  var size = this.size;
  this._boundingRect = {
    left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,
    top: boundingRect.top + size.paddingTop + size.borderTopWidth,
    right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),
    bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )
  };
};

/**
 * @param {Element} stamp
**/
proto._manageStamp = noop;

/**
 * get x/y position of element relative to container element
 * @param {Element} elem
 * @returns {Object} offset - has left, top, right, bottom
 */
proto._getElementOffset = function( elem ) {
  var boundingRect = elem.getBoundingClientRect();
  var thisRect = this._boundingRect;
  var size = getSize( elem );
  var offset = {
    left: boundingRect.left - thisRect.left - size.marginLeft,
    top: boundingRect.top - thisRect.top - size.marginTop,
    right: thisRect.right - boundingRect.right - size.marginRight,
    bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom
  };
  return offset;
};

// -------------------------- resize -------------------------- //

// enable event handlers for listeners
// i.e. resize -> onresize
proto.handleEvent = utils.handleEvent;

/**
 * Bind layout to window resizing
 */
proto.bindResize = function() {
  window.addEventListener( 'resize', this );
  this.isResizeBound = true;
};

/**
 * Unbind layout to window resizing
 */
proto.unbindResize = function() {
  window.removeEventListener( 'resize', this );
  this.isResizeBound = false;
};

proto.onresize = function() {
  this.resize();
};

utils.debounceMethod( Outlayer, 'onresize', 100 );

proto.resize = function() {
  // don't trigger if size did not change
  // or if resize was unbound. See #9
  if ( !this.isResizeBound || !this.needsResizeLayout() ) {
    return;
  }

  this.layout();
};

/**
 * check if layout is needed post layout
 * @returns Boolean
 */
proto.needsResizeLayout = function() {
  var size = getSize( this.element );
  // check that this.size and size are there
  // IE8 triggers resize on body size change, so they might not be
  var hasSizes = this.size && size;
  return hasSizes && size.innerWidth !== this.size.innerWidth;
};

// -------------------------- methods -------------------------- //

/**
 * add items to Outlayer instance
 * @param {Array or NodeList or Element} elems
 * @returns {Array} items - Outlayer.Items
**/
proto.addItems = function( elems ) {
  var items = this._itemize( elems );
  // add items to collection
  if ( items.length ) {
    this.items = this.items.concat( items );
  }
  return items;
};

/**
 * Layout newly-appended item elements
 * @param {Array or NodeList or Element} elems
 */
proto.appended = function( elems ) {
  var items = this.addItems( elems );
  if ( !items.length ) {
    return;
  }
  // layout and reveal just the new items
  this.layoutItems( items, true );
  this.reveal( items );
};

/**
 * Layout prepended elements
 * @param {Array or NodeList or Element} elems
 */
proto.prepended = function( elems ) {
  var items = this._itemize( elems );
  if ( !items.length ) {
    return;
  }
  // add items to beginning of collection
  var previousItems = this.items.slice(0);
  this.items = items.concat( previousItems );
  // start new layout
  this._resetLayout();
  this._manageStamps();
  // layout new stuff without transition
  this.layoutItems( items, true );
  this.reveal( items );
  // layout previous items
  this.layoutItems( previousItems );
};

/**
 * reveal a collection of items
 * @param {Array of Outlayer.Items} items
 */
proto.reveal = function( items ) {
  this._emitCompleteOnItems( 'reveal', items );
  if ( !items || !items.length ) {
    return;
  }
  var stagger = this.updateStagger();
  items.forEach( function( item, i ) {
    item.stagger( i * stagger );
    item.reveal();
  });
};

/**
 * hide a collection of items
 * @param {Array of Outlayer.Items} items
 */
proto.hide = function( items ) {
  this._emitCompleteOnItems( 'hide', items );
  if ( !items || !items.length ) {
    return;
  }
  var stagger = this.updateStagger();
  items.forEach( function( item, i ) {
    item.stagger( i * stagger );
    item.hide();
  });
};

/**
 * reveal item elements
 * @param {Array}, {Element}, {NodeList} items
 */
proto.revealItemElements = function( elems ) {
  var items = this.getItems( elems );
  this.reveal( items );
};

/**
 * hide item elements
 * @param {Array}, {Element}, {NodeList} items
 */
proto.hideItemElements = function( elems ) {
  var items = this.getItems( elems );
  this.hide( items );
};

/**
 * get Outlayer.Item, given an Element
 * @param {Element} elem
 * @param {Function} callback
 * @returns {Outlayer.Item} item
 */
proto.getItem = function( elem ) {
  // loop through items to get the one that matches
  for ( var i=0; i < this.items.length; i++ ) {
    var item = this.items[i];
    if ( item.element == elem ) {
      // return item
      return item;
    }
  }
};

/**
 * get collection of Outlayer.Items, given Elements
 * @param {Array} elems
 * @returns {Array} items - Outlayer.Items
 */
proto.getItems = function( elems ) {
  elems = utils.makeArray( elems );
  var items = [];
  elems.forEach( function( elem ) {
    var item = this.getItem( elem );
    if ( item ) {
      items.push( item );
    }
  }, this );

  return items;
};

/**
 * remove element(s) from instance and DOM
 * @param {Array or NodeList or Element} elems
 */
proto.remove = function( elems ) {
  var removeItems = this.getItems( elems );

  this._emitCompleteOnItems( 'remove', removeItems );

  // bail if no items to remove
  if ( !removeItems || !removeItems.length ) {
    return;
  }

  removeItems.forEach( function( item ) {
    item.remove();
    // remove item from collection
    utils.removeFrom( this.items, item );
  }, this );
};

// ----- destroy ----- //

// remove and disable Outlayer instance
proto.destroy = function() {
  // clean up dynamic styles
  var style = this.element.style;
  style.height = '';
  style.position = '';
  style.width = '';
  // destroy items
  this.items.forEach( function( item ) {
    item.destroy();
  });

  this.unbindResize();

  var id = this.element.outlayerGUID;
  delete instances[ id ]; // remove reference to instance by id
  delete this.element.outlayerGUID;
  // remove data for jQuery
  if ( jQuery ) {
    jQuery.removeData( this.element, this.constructor.namespace );
  }

};

// -------------------------- data -------------------------- //

/**
 * get Outlayer instance from element
 * @param {Element} elem
 * @returns {Outlayer}
 */
Outlayer.data = function( elem ) {
  elem = utils.getQueryElement( elem );
  var id = elem && elem.outlayerGUID;
  return id && instances[ id ];
};


// -------------------------- create Outlayer class -------------------------- //

/**
 * create a layout class
 * @param {String} namespace
 */
Outlayer.create = function( namespace, options ) {
  // sub-class Outlayer
  var Layout = subclass( Outlayer );
  // apply new options and compatOptions
  Layout.defaults = utils.extend( {}, Outlayer.defaults );
  utils.extend( Layout.defaults, options );
  Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions  );

  Layout.namespace = namespace;

  Layout.data = Outlayer.data;

  // sub-class Item
  Layout.Item = subclass( Item );

  // -------------------------- declarative -------------------------- //

  utils.htmlInit( Layout, namespace );

  // -------------------------- jQuery bridge -------------------------- //

  // make into jQuery plugin
  if ( jQuery && jQuery.bridget ) {
    jQuery.bridget( namespace, Layout );
  }

  return Layout;
};

function subclass( Parent ) {
  function SubClass() {
    Parent.apply( this, arguments );
  }

  SubClass.prototype = Object.create( Parent.prototype );
  SubClass.prototype.constructor = SubClass;

  return SubClass;
}

// ----- helpers ----- //

// how many milliseconds are in each unit
var msUnits = {
  ms: 1,
  s: 1000
};

// munge time-like parameter into millisecond number
// '0.4s' -> 40
function getMilliseconds( time ) {
  if ( typeof time == 'number' ) {
    return time;
  }
  var matches = time.match( /(^\d*\.?\d*)(\w*)/ );
  var num = matches && matches[1];
  var unit = matches && matches[2];
  if ( !num.length ) {
    return 0;
  }
  num = parseFloat( num );
  var mult = msUnits[ unit ] || 1;
  return num * mult;
}

// ----- fin ----- //

// back in global
Outlayer.Item = Item;

return Outlayer;

}));

},{"./item":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/outlayer/item.js","ev-emitter":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/ev-emitter/ev-emitter.js","fizzy-ui-utils":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/fizzy-ui-utils/utils.js","get-size":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/get-size/get-size.js"}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/svg4everybody/dist/svg4everybody.js":[function(require,module,exports){
!function(root, factory) {
    "function" == typeof define && define.amd ? // AMD. Register as an anonymous module unless amdModuleId is set
    define([], function() {
        return root.svg4everybody = factory();
    }) : "object" == typeof module && module.exports ? // Node. Does not work with strict CommonJS, but
    // only CommonJS-like environments that support module.exports,
    // like Node.
    module.exports = factory() : root.svg4everybody = factory();
}(this, function() {
    /*! svg4everybody v2.1.9 | github.com/jonathantneal/svg4everybody */
    function embed(parent, svg, target) {
        // if the target exists
        if (target) {
            // create a document fragment to hold the contents of the target
            var fragment = document.createDocumentFragment(), viewBox = !svg.hasAttribute("viewBox") && target.getAttribute("viewBox");
            // conditionally set the viewBox on the svg
            viewBox && svg.setAttribute("viewBox", viewBox);
            // copy the contents of the clone into the fragment
            for (// clone the target
            var clone = target.cloneNode(!0); clone.childNodes.length; ) {
                fragment.appendChild(clone.firstChild);
            }
            // append the fragment into the svg
            parent.appendChild(fragment);
        }
    }
    function loadreadystatechange(xhr) {
        // listen to changes in the request
        xhr.onreadystatechange = function() {
            // if the request is ready
            if (4 === xhr.readyState) {
                // get the cached html document
                var cachedDocument = xhr._cachedDocument;
                // ensure the cached html document based on the xhr response
                cachedDocument || (cachedDocument = xhr._cachedDocument = document.implementation.createHTMLDocument(""), 
                cachedDocument.body.innerHTML = xhr.responseText, xhr._cachedTarget = {}), // clear the xhr embeds list and embed each item
                xhr._embeds.splice(0).map(function(item) {
                    // get the cached target
                    var target = xhr._cachedTarget[item.id];
                    // ensure the cached target
                    target || (target = xhr._cachedTarget[item.id] = cachedDocument.getElementById(item.id)), 
                    // embed the target into the svg
                    embed(item.parent, item.svg, target);
                });
            }
        }, // test the ready state change immediately
        xhr.onreadystatechange();
    }
    function svg4everybody(rawopts) {
        function oninterval() {
            // while the index exists in the live <use> collection
            for (// get the cached <use> index
            var index = 0; index < uses.length; ) {
                // get the current <use>
                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 <use> element
                            parent.removeChild(use);
                            // parse the src and get the url and id
                            var srcSplit = src.split("#"), url = srcSplit.shift(), id = srcSplit.join("#");
                            // if the link is external
                            if (url.length) {
                                // get the cached xhr request
                                var xhr = requests[url];
                                // ensure the xhr request exists
                                xhr || (xhr = requests[url] = new XMLHttpRequest(), xhr.open("GET", url), xhr.send(), 
                                xhr._embeds = []), // add the svg and id as an item to the xhr embeds list
                                xhr._embeds.push({
                                    parent: parent,
                                    svg: svg,
                                    id: id
                                }), // prepare the xhr ready state change event
                                loadreadystatechange(xhr);
                            } else {
                                // embed the local id into the svg
                                embed(parent, svg, document.getElementById(id));
                            }
                        } else {
                            // increase the index when the previous value was not "valid"
                            ++index, ++numberOfSvgUseElementsToBypass;
                        }
                    }
                } else {
                    // increase the index when the previous value was not "valid"
                    ++index;
                }
            }
            // continue the interval
            (!uses.length || uses.length - numberOfSvgUseElementsToBypass > 0) && requestAnimationFrame(oninterval, 67);
        }
        var polyfill, opts = Object(rawopts), newerIEUA = /\bTrident\/[567]\b|\bMSIE (?:9|10)\.0\b/, webkitUA = /\bAppleWebKit\/(\d+)\b/, olderEdgeUA = /\bEdge\/12\.(\d+)\b/, edgeUA = /\bEdge\/.(\d+)\b/, inIframe = window.top !== window.self;
        polyfill = "polyfill" in opts ? opts.polyfill : newerIEUA.test(navigator.userAgent) || (navigator.userAgent.match(olderEdgeUA) || [])[1] < 10547 || (navigator.userAgent.match(webkitUA) || [])[1] < 537 || edgeUA.test(navigator.userAgent) && inIframe;
        // create xhr requests object
        var requests = {}, requestAnimationFrame = window.requestAnimationFrame || setTimeout, uses = document.getElementsByTagName("use"), numberOfSvgUseElementsToBypass = 0;
        // conditionally start the interval if the polyfill is active
        polyfill && oninterval();
    }
    function getSVGAncestor(node) {
        for (var svg = node; "svg" !== svg.nodeName.toLowerCase() && (svg = svg.parentNode); ) {}
        return svg;
    }
    return svg4everybody;
});
},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/uikit/dist/js/uikit.js":[function(require,module,exports){
/*! UIkit 2.27.4 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
(function(core) {

    var uikit;

    if (!window.jQuery) {
        throw new Error('UIkit 2.x requires jQuery');
    } else {
        uikit = core(window.jQuery);
    }

    if (typeof define == 'function' && define.amd) { // AMD

        define('uikit', function(){

            uikit.load = function(res, req, onload, config) {

                var resources = res.split(','), load = [], i, base = (config.config && config.config.uikit && config.config.uikit.base ? config.config.uikit.base : '').replace(/\/+$/g, '');

                if (!base) {
                    throw new Error('Please define base path to UIkit in the requirejs config.');
                }

                for (i = 0; i < resources.length; i += 1) {
                    var resource = resources[i].replace(/\./g, '/');
                    load.push(base+'/components/'+resource);
                }

                req(load, function() {
                    onload(uikit);
                });
            };

            return uikit;
        });
    }

})(function($) {

    "use strict";

    if (window.UIkit2) {
        return window.UIkit2;
    }

    var UI = {}, _UI = window.UIkit || undefined;

    UI.version = '2.27.4';

    UI.noConflict = function() {
        // restore UIkit version
        if (_UI) {
            window.UIkit = _UI;
            $.UIkit      = _UI;
            $.fn.uk      = _UI.fn;
        }

        return UI;
    };

    window.UIkit2 = UI;

    if (!_UI) {
        window.UIkit = UI;
    }

    // cache jQuery
    UI.$ = $;

    UI.$doc  = UI.$(document);
    UI.$win  = UI.$(window);
    UI.$html = UI.$('html');

    UI.support = {};
    UI.support.transition = (function() {

        var transitionEnd = (function() {

            var element = document.body || document.documentElement,
                transEndEventNames = {
                    WebkitTransition : 'webkitTransitionEnd',
                    MozTransition    : 'transitionend',
                    OTransition      : 'oTransitionEnd otransitionend',
                    transition       : 'transitionend'
                }, name;

            for (name in transEndEventNames) {
                if (element.style[name] !== undefined) return transEndEventNames[name];
            }
        }());

        return transitionEnd && { end: transitionEnd };
    })();

    UI.support.animation = (function() {

        var animationEnd = (function() {

            var element = document.body || document.documentElement,
                animEndEventNames = {
                    WebkitAnimation : 'webkitAnimationEnd',
                    MozAnimation    : 'animationend',
                    OAnimation      : 'oAnimationEnd oanimationend',
                    animation       : 'animationend'
                }, name;

            for (name in animEndEventNames) {
                if (element.style[name] !== undefined) return animEndEventNames[name];
            }
        }());

        return animationEnd && { end: animationEnd };
    })();

    // requestAnimationFrame polyfill
    //https://github.com/darius/requestAnimationFrame
    (function() {

        Date.now = Date.now || function() { return new Date().getTime(); };

        var vendors = ['webkit', 'moz'];
        for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
            var vp = vendors[i];
            window.requestAnimationFrame = window[vp+'RequestAnimationFrame'];
            window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame']
                                       || window[vp+'CancelRequestAnimationFrame']);
        }
        if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) // iOS6 is buggy
            || !window.requestAnimationFrame || !window.cancelAnimationFrame) {
            var lastTime = 0;
            window.requestAnimationFrame = function(callback) {
                var now = Date.now();
                var nextTime = Math.max(lastTime + 16, now);
                return setTimeout(function() { callback(lastTime = nextTime); },
                                  nextTime - now);
            };
            window.cancelAnimationFrame = clearTimeout;
        }
    }());

    UI.support.touch = (
        ('ontouchstart' in document) ||
        (window.DocumentTouch && document instanceof window.DocumentTouch)  ||
        (window.navigator.msPointerEnabled && window.navigator.msMaxTouchPoints > 0) || //IE 10
        (window.navigator.pointerEnabled && window.navigator.maxTouchPoints > 0) || //IE >=11
        false
    );

    UI.support.mutationobserver = (window.MutationObserver || window.WebKitMutationObserver || null);

    UI.Utils = {};

    UI.Utils.isFullscreen = function() {
        return document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement || document.fullscreenElement || false;
    };

    UI.Utils.str2json = function(str, notevil) {
        try {
            if (notevil) {
                return JSON.parse(str
                    // wrap keys without quote with valid double quote
                    .replace(/([\$\w]+)\s*:/g, function(_, $1){return '"'+$1+'":';})
                    // replacing single quote wrapped ones to double quote
                    .replace(/'([^']+)'/g, function(_, $1){return '"'+$1+'"';})
                );
            } else {
                return (new Function('', 'var json = ' + str + '; return JSON.parse(JSON.stringify(json));'))();
            }
        } catch(e) { return false; }
    };

    UI.Utils.debounce = function(func, wait, immediate) {
        var timeout;
        return function() {
            var context = this, args = arguments;
            var later = function() {
                timeout = null;
                if (!immediate) func.apply(context, args);
            };
            var callNow = immediate && !timeout;
            clearTimeout(timeout);
            timeout = setTimeout(later, wait);
            if (callNow) func.apply(context, args);
        };
    };

    UI.Utils.throttle = function (func, limit) {
        var wait = false;
        return function () {
            if (!wait) {
                func.call();
                wait = true;
                setTimeout(function () {
                    wait = false;
                }, limit);
            }
        }
    };

    UI.Utils.removeCssRules = function(selectorRegEx) {
        var idx, idxs, stylesheet, _i, _j, _k, _len, _len1, _len2, _ref;

        if(!selectorRegEx) return;

        setTimeout(function(){
            try {
              _ref = document.styleSheets;
              for (_i = 0, _len = _ref.length; _i < _len; _i++) {
                stylesheet = _ref[_i];
                idxs = [];
                stylesheet.cssRules = stylesheet.cssRules;
                for (idx = _j = 0, _len1 = stylesheet.cssRules.length; _j < _len1; idx = ++_j) {
                  if (stylesheet.cssRules[idx].type === CSSRule.STYLE_RULE && selectorRegEx.test(stylesheet.cssRules[idx].selectorText)) {
                    idxs.unshift(idx);
                  }
                }
                for (_k = 0, _len2 = idxs.length; _k < _len2; _k++) {
                  stylesheet.deleteRule(idxs[_k]);
                }
              }
            } catch (_error) {}
        }, 0);
    };

    UI.Utils.isInView = function(element, options) {

        var $element = $(element);

        if (!$element.is(':visible')) {
            return false;
        }

        var window_left = UI.$win.scrollLeft(), window_top = UI.$win.scrollTop(), offset = $element.offset(), left = offset.left, top = offset.top;

        options = $.extend({topoffset:0, leftoffset:0}, options);

        if (top + $element.height() >= window_top && top - options.topoffset <= window_top + UI.$win.height() &&
            left + $element.width() >= window_left && left - options.leftoffset <= window_left + UI.$win.width()) {
          return true;
        } else {
          return false;
        }
    };

    UI.Utils.checkDisplay = function(context, initanimation) {

        var elements = UI.$('[data-uk-margin], [data-uk-grid-match], [data-uk-grid-margin], [data-uk-check-display]', context || document), animated;

        if (context && !elements.length) {
            elements = $(context);
        }

        elements.trigger('display.uk.check');

        // fix firefox / IE animations
        if (initanimation) {

            if (typeof(initanimation)!='string') {
                initanimation = '[class*="uk-animation-"]';
            }

            elements.find(initanimation).each(function(){

                var ele  = UI.$(this),
                    cls  = ele.attr('class'),
                    anim = cls.match(/uk-animation-(.+)/);

                ele.removeClass(anim[0]).width();

                ele.addClass(anim[0]);
            });
        }

        return elements;
    };

    UI.Utils.options = function(string) {

        if ($.type(string)!='string') return string;

        if (string.indexOf(':') != -1 && string.trim().substr(-1) != '}') {
            string = '{'+string+'}';
        }

        var start = (string ? string.indexOf("{") : -1), options = {};

        if (start != -1) {
            try {
                options = UI.Utils.str2json(string.substr(start));
            } catch (e) {}
        }

        return options;
    };

    UI.Utils.animate = function(element, cls) {

        var d = $.Deferred();

        element = UI.$(element);

        element.css('display', 'none').addClass(cls).one(UI.support.animation.end, function() {
            element.removeClass(cls);
            d.resolve();
        });

        element.css('display', '');

        return d.promise();
    };

    UI.Utils.uid = function(prefix) {
        return (prefix || 'id') + (new Date().getTime())+"RAND"+(Math.ceil(Math.random() * 100000));
    };

    UI.Utils.template = function(str, data) {

        var tokens = str.replace(/\n/g, '\\n').replace(/\{\{\{\s*(.+?)\s*\}\}\}/g, "{{!$1}}").split(/(\{\{\s*(.+?)\s*\}\})/g),
            i=0, toc, cmd, prop, val, fn, output = [], openblocks = 0;

        while(i < tokens.length) {

            toc = tokens[i];

            if(toc.match(/\{\{\s*(.+?)\s*\}\}/)) {
                i = i + 1;
                toc  = tokens[i];
                cmd  = toc[0];
                prop = toc.substring(toc.match(/^(\^|\#|\!|\~|\:)/) ? 1:0);

                switch(cmd) {
                    case '~':
                        output.push('for(var $i=0;$i<'+prop+'.length;$i++) { var $item = '+prop+'[$i];');
                        openblocks++;
                        break;
                    case ':':
                        output.push('for(var $key in '+prop+') { var $val = '+prop+'[$key];');
                        openblocks++;
                        break;
                    case '#':
                        output.push('if('+prop+') {');
                        openblocks++;
                        break;
                    case '^':
                        output.push('if(!'+prop+') {');
                        openblocks++;
                        break;
                    case '/':
                        output.push('}');
                        openblocks--;
                        break;
                    case '!':
                        output.push('__ret.push('+prop+');');
                        break;
                    default:
                        output.push('__ret.push(escape('+prop+'));');
                        break;
                }
            } else {
                output.push("__ret.push('"+toc.replace(/\'/g, "\\'")+"');");
            }
            i = i + 1;
        }

        fn  = new Function('$data', [
            'var __ret = [];',
            'try {',
            'with($data){', (!openblocks ? output.join('') : '__ret = ["Not all blocks are closed correctly."]'), '};',
            '}catch(e){__ret = [e.message];}',
            'return __ret.join("").replace(/\\n\\n/g, "\\n");',
            "function escape(html) { return String(html).replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');}"
        ].join("\n"));

        return data ? fn(data) : fn;
    };

    UI.Utils.focus = function(element, extra) {

        element = $(element);

        if (!element.length) {
            return element;
        }

        var autofocus = element.find('[autofocus]:first'), tabidx;

        if (autofocus.length) {
            return autofocus.focus();
        }

        autofocus = element.find(':input'+(extra && (','+extra) || '')).first();

        if (autofocus.length) {
            return autofocus.focus();
        }

        if (!element.attr('tabindex')) {
            tabidx = 1000;
            element.attr('tabindex', tabidx);
        }

        element[0].focus();

        if (tabidx) {
            element.attr('tabindex', '');
        }

        return element;
    }

    UI.Utils.events       = {};
    UI.Utils.events.click = UI.support.touch ? 'tap' : 'click';

    // deprecated

    UI.fn = function(command, options) {

        var args = arguments, cmd = command.match(/^([a-z\-]+)(?:\.([a-z]+))?/i), component = cmd[1], method = cmd[2];

        if (!UI[component]) {
            $.error('UIkit component [' + component + '] does not exist.');
            return this;
        }

        return this.each(function() {
            var $this = $(this), data = $this.data(component);
            if (!data) $this.data(component, (data = UI[component](this, method ? undefined : options)));
            if (method) data[method].apply(data, Array.prototype.slice.call(args, 1));
        });
    };

    $.UIkit          = UI;
    $.fn.uk          = UI.fn;

    UI.langdirection = UI.$html.attr("dir") == "rtl" ? "right" : "left";

    UI.components    = {};

    UI.component = function(name, def, override) {

        if (UI.components[name] && !override) {
            return UI.components[name];
        }

        var fn = function(element, options) {

            var $this = this;

            this.UIkit   = UI;
            this.element = element ? UI.$(element) : null;
            this.options = $.extend(true, {}, this.defaults, options);
            this.plugins = {};

            if (this.element) {
                this.element.data(name, this);
            }

            this.init();

            (this.options.plugins.length ? this.options.plugins : Object.keys(fn.plugins)).forEach(function(plugin) {

                if (fn.plugins[plugin].init) {
                    fn.plugins[plugin].init($this);
                    $this.plugins[plugin] = true;
                }

            });

            this.trigger('init.uk.component', [name, this]);

            return this;
        };

        fn.plugins = {};

        $.extend(true, fn.prototype, {

            defaults : {plugins: []},

            boot: function(){},
            init: function(){},

            on: function(a1,a2,a3){
                return UI.$(this.element || this).on(a1,a2,a3);
            },

            one: function(a1,a2,a3){
                return UI.$(this.element || this).one(a1,a2,a3);
            },

            off: function(evt){
                return UI.$(this.element || this).off(evt);
            },

            trigger: function(evt, params) {
                return UI.$(this.element || this).trigger(evt, params);
            },

            find: function(selector) {
                return UI.$(this.element ? this.element: []).find(selector);
            },

            proxy: function(obj, methods) {

                var $this = this;

                methods.split(' ').forEach(function(method) {
                    if (!$this[method]) $this[method] = function() { return obj[method].apply(obj, arguments); };
                });
            },

            mixin: function(obj, methods) {

                var $this = this;

                methods.split(' ').forEach(function(method) {
                    if (!$this[method]) $this[method] = obj[method].bind($this);
                });
            },

            option: function() {

                if (arguments.length == 1) {
                    return this.options[arguments[0]] || undefined;
                } else if (arguments.length == 2) {
                    this.options[arguments[0]] = arguments[1];
                }
            }

        }, def);

        this.components[name] = fn;

        this[name] = function() {

            var element, options;

            if (arguments.length) {

                switch(arguments.length) {
                    case 1:

                        if (typeof arguments[0] === 'string' || arguments[0].nodeType || arguments[0] instanceof jQuery) {
                            element = $(arguments[0]);
                        } else {
                            options = arguments[0];
                        }

                        break;
                    case 2:

                        element = $(arguments[0]);
                        options = arguments[1];
                        break;
                }
            }

            if (element && element.data(name)) {
                return element.data(name);
            }

            return (new UI.components[name](element, options));
        };

        if (UI.domready) {
            UI.component.boot(name);
        }

        return fn;
    };

    UI.plugin = function(component, name, def) {
        this.components[component].plugins[name] = def;
    };

    UI.component.boot = function(name) {

        if (UI.components[name].prototype && UI.components[name].prototype.boot && !UI.components[name].booted) {
            UI.components[name].prototype.boot.apply(UI, []);
            UI.components[name].booted = true;
        }
    };

    UI.component.bootComponents = function() {

        for (var component in UI.components) {
            UI.component.boot(component);
        }
    };


    // DOM mutation save ready helper function

    UI.domObservers = [];
    UI.domready     = false;

    UI.ready = function(fn) {

        UI.domObservers.push(fn);

        if (UI.domready) {
            fn(document);
        }
    };

    UI.on = function(a1,a2,a3){

        if (a1 && a1.indexOf('ready.uk.dom') > -1 && UI.domready) {
            a2.apply(UI.$doc);
        }

        return UI.$doc.on(a1,a2,a3);
    };

    UI.one = function(a1,a2,a3){

        if (a1 && a1.indexOf('ready.uk.dom') > -1 && UI.domready) {
            a2.apply(UI.$doc);
            return UI.$doc;
        }

        return UI.$doc.one(a1,a2,a3);
    };

    UI.trigger = function(evt, params) {
        return UI.$doc.trigger(evt, params);
    };

    UI.domObserve = function(selector, fn) {

        if(!UI.support.mutationobserver) return;

        fn = fn || function() {};

        UI.$(selector).each(function() {

            var element  = this,
                $element = UI.$(element);

            if ($element.data('observer')) {
                return;
            }

            try {

                var observer = new UI.support.mutationobserver(UI.Utils.debounce(function(mutations) {
                    fn.apply(element, [$element]);
                    $element.trigger('changed.uk.dom');
                }, 50), {childList: true, subtree: true});

                // pass in the target node, as well as the observer options
                observer.observe(element, { childList: true, subtree: true });

                $element.data('observer', observer);

            } catch(e) {}
        });
    };

    UI.init = function(root) {

        root = root || document;

        UI.domObservers.forEach(function(fn){
            fn(root);
        });
    };

    UI.on('domready.uk.dom', function(){

        UI.init();

        if (UI.domready) UI.Utils.checkDisplay();
    });

    document.addEventListener('DOMContentLoaded', function(){

        var domReady = function() {

            UI.$body = UI.$('body');

            UI.trigger('beforeready.uk.dom');

            UI.component.bootComponents();

            // custom scroll observer
            var rafToken = requestAnimationFrame((function(){

                var memory = {dir: {x:0, y:0}, x: window.pageXOffset, y:window.pageYOffset};

                var fn = function(){
                    // reading this (window.page[X|Y]Offset) causes a full page recalc of the layout in Chrome,
                    // so we only want to do this once
                    var wpxo = window.pageXOffset;
                    var wpyo = window.pageYOffset;

                    // Did the scroll position change since the last time we were here?
                    if (memory.x != wpxo || memory.y != wpyo) {

                        // Set the direction of the scroll and store the new position
                        if (wpxo != memory.x) {memory.dir.x = wpxo > memory.x ? 1:-1; } else { memory.dir.x = 0; }
                        if (wpyo != memory.y) {memory.dir.y = wpyo > memory.y ? 1:-1; } else { memory.dir.y = 0; }

                        memory.x = wpxo;
                        memory.y = wpyo;

                        // Trigger the scroll event, this could probably be sent using memory.clone() but this is
                        // more explicit and easier to see exactly what is being sent in the event.
                        UI.$doc.trigger('scrolling.uk.document', [{
                            dir: {x: memory.dir.x, y: memory.dir.y}, x: wpxo, y: wpyo
                        }]);
                    }

                    cancelAnimationFrame(rafToken);
                    rafToken = requestAnimationFrame(fn);
                };

                if (UI.support.touch) {
                    UI.$html.on('touchmove touchend MSPointerMove MSPointerUp pointermove pointerup', fn);
                }

                if (memory.x || memory.y) fn();

                return fn;

            })());

            // run component init functions on dom
            UI.trigger('domready.uk.dom');

            if (UI.support.touch) {

                // remove css hover rules for touch devices
                // UI.Utils.removeCssRules(/\.uk-(?!navbar).*:hover/);

                // viewport unit fix for uk-height-viewport - should be fixed in iOS 8
                if (navigator.userAgent.match(/(iPad|iPhone|iPod)/g)) {

                    UI.$win.on('load orientationchange resize', UI.Utils.debounce((function(){

                        var fn = function() {
                            $('.uk-height-viewport').css('height', window.innerHeight);
                            return fn;
                        };

                        return fn();

                    })(), 100));
                }
            }

            UI.trigger('afterready.uk.dom');

            // mark that domready is left behind
            UI.domready = true;

            // auto init js components
            if (UI.support.mutationobserver) {

                var initFn = UI.Utils.debounce(function(){
                    requestAnimationFrame(function(){ UI.init(document.body);});
                }, 10);

                (new UI.support.mutationobserver(function(mutations) {

                    var init = false;

                    mutations.every(function(mutation){

                        if (mutation.type != 'childList') return true;

                        for (var i = 0, node; i < mutation.addedNodes.length; ++i) {

                            node = mutation.addedNodes[i];

                            if (node.outerHTML && node.outerHTML.indexOf('data-uk-') !== -1) {
                                return (init = true) && false;
                            }
                        }
                        return true;
                    });

                    if (init) initFn();

                })).observe(document.body, {childList: true, subtree: true});
            }
        };

        if (document.readyState == 'complete' || document.readyState == 'interactive') {
            setTimeout(domReady);
        }

        return domReady;

    }());

    // add touch identifier class
    UI.$html.addClass(UI.support.touch ? 'uk-touch' : 'uk-notouch');

    // add uk-hover class on tap to support overlays on touch devices
    if (UI.support.touch) {

        var hoverset = false,
            exclude,
            hovercls = 'uk-hover',
            selector = '.uk-overlay, .uk-overlay-hover, .uk-overlay-toggle, .uk-animation-hover, .uk-has-hover';

        UI.$html.on('mouseenter touchstart MSPointerDown pointerdown', selector, function() {

            if (hoverset) $('.'+hovercls).removeClass(hovercls);

            hoverset = $(this).addClass(hovercls);

        }).on('mouseleave touchend MSPointerUp pointerup', function(e) {

            exclude = $(e.target).parents(selector);

            if (hoverset) {
                hoverset.not(exclude).removeClass(hovercls);
            }
        });
    }

    return UI;
});

//  Based on Zeptos touch.js
//  https://raw.github.com/madrobby/zepto/master/src/touch.js
//  Zepto.js may be freely distributed under the MIT license.

;(function($){

  if ($.fn.swipeLeft) {
    return;
  }


  var touch = {}, touchTimeout, tapTimeout, swipeTimeout, longTapTimeout, longTapDelay = 750, gesture;
  var hasTouchEvents = 'ontouchstart' in window,
      hasPointerEvents = window.PointerEvent,
      hasTouch = hasTouchEvents
      || window.DocumentTouch && document instanceof DocumentTouch
      || navigator.msPointerEnabled && navigator.msMaxTouchPoints > 0 // IE 10
      || navigator.pointerEnabled && navigator.maxTouchPoints > 0; // IE >=11

  function swipeDirection(x1, x2, y1, y2) {
    return Math.abs(x1 - x2) >= Math.abs(y1 - y2) ? (x1 - x2 > 0 ? 'Left' : 'Right') : (y1 - y2 > 0 ? 'Up' : 'Down');
  }

  function longTap() {
    longTapTimeout = null;
    if (touch.last) {
      if ( touch.el !== undefined ) touch.el.trigger('longTap');
      touch = {};
    }
  }

  function cancelLongTap() {
    if (longTapTimeout) clearTimeout(longTapTimeout);
    longTapTimeout = null;
  }

  function cancelAll() {
    if (touchTimeout)   clearTimeout(touchTimeout);
    if (tapTimeout)     clearTimeout(tapTimeout);
    if (swipeTimeout)   clearTimeout(swipeTimeout);
    if (longTapTimeout) clearTimeout(longTapTimeout);
    touchTimeout = tapTimeout = swipeTimeout = longTapTimeout = null;
    touch = {};
  }

  function isPrimaryTouch(event){
    return event.pointerType == event.MSPOINTER_TYPE_TOUCH && event.isPrimary;
  }

  $(function(){
    var now, delta, deltaX = 0, deltaY = 0, firstTouch;

    if ('MSGesture' in window) {
      gesture = new MSGesture();
      gesture.target = document.body;
    }

    $(document)
      .on('MSGestureEnd gestureend', function(e){

        var swipeDirectionFromVelocity = e.originalEvent.velocityX > 1 ? 'Right' : e.originalEvent.velocityX < -1 ? 'Left' : e.originalEvent.velocityY > 1 ? 'Down' : e.originalEvent.velocityY < -1 ? 'Up' : null;

        if (swipeDirectionFromVelocity && touch.el !== undefined) {
          touch.el.trigger('swipe');
          touch.el.trigger('swipe'+ swipeDirectionFromVelocity);
        }
      })
      // MSPointerDown: for IE10
      // pointerdown: for IE11
      .on('touchstart MSPointerDown pointerdown', function(e){

        if(e.type == 'MSPointerDown' && !isPrimaryTouch(e.originalEvent)) return;

        firstTouch = (e.type == 'MSPointerDown' || e.type == 'pointerdown') ? e : e.originalEvent.touches[0];

        now      = Date.now();
        delta    = now - (touch.last || now);
        touch.el = $('tagName' in firstTouch.target ? firstTouch.target : firstTouch.target.parentNode);

        if(touchTimeout) clearTimeout(touchTimeout);

        touch.x1 = firstTouch.pageX;
        touch.y1 = firstTouch.pageY;

        if (delta > 0 && delta <= 250) touch.isDoubleTap = true;

        touch.last = now;
        longTapTimeout = setTimeout(longTap, longTapDelay);

        // adds the current touch contact for IE gesture recognition
        if (e.originalEvent && e.originalEvent.pointerId && gesture && ( e.type == 'MSPointerDown' || e.type == 'pointerdown' || e.type == 'touchstart' ) ) {
          gesture.addPointer(e.originalEvent.pointerId);
        }

      })
      // MSPointerMove: for IE10
      // pointermove: for IE11
      .on('touchmove MSPointerMove pointermove', function(e){

        if (e.type == 'MSPointerMove' && !isPrimaryTouch(e.originalEvent)) return;

        firstTouch = (e.type == 'MSPointerMove' || e.type == 'pointermove') ? e : e.originalEvent.touches[0];

        cancelLongTap();
        touch.x2 = firstTouch.pageX;
        touch.y2 = firstTouch.pageY;

        deltaX += Math.abs(touch.x1 - touch.x2);
        deltaY += Math.abs(touch.y1 - touch.y2);
      })
      // MSPointerUp: for IE10
      // pointerup: for IE11
      .on('touchend MSPointerUp pointerup', function(e){

        if (e.type == 'MSPointerUp' && !isPrimaryTouch(e.originalEvent)) return;

        cancelLongTap();

        // swipe
        if ((touch.x2 && Math.abs(touch.x1 - touch.x2) > 30) || (touch.y2 && Math.abs(touch.y1 - touch.y2) > 30)){

          swipeTimeout = setTimeout(function() {
            if ( touch.el !== undefined ) {
              touch.el.trigger('swipe');
              touch.el.trigger('swipe' + (swipeDirection(touch.x1, touch.x2, touch.y1, touch.y2)));
            }
            touch = {};
          }, 0);

        // normal tap
        } else if ('last' in touch) {

          // don't fire tap when delta position changed by more than 30 pixels,
          // for instance when moving to a point and back to origin
          if (isNaN(deltaX) || (deltaX < 30 && deltaY < 30)) {
            // delay by one tick so we can cancel the 'tap' event if 'scroll' fires
            // ('tap' fires before 'scroll')
            tapTimeout = setTimeout(function() {

              // trigger universal 'tap' with the option to cancelTouch()
              // (cancelTouch cancels processing of single vs double taps for faster 'tap' response)
              var event = $.Event('tap');
              event.cancelTouch = cancelAll;
              if ( touch.el !== undefined ) touch.el.trigger(event);

              // trigger double tap immediately
              if (touch.isDoubleTap) {
                if ( touch.el !== undefined ) touch.el.trigger('doubleTap');
                touch = {};
              }

              // trigger single tap after 250ms of inactivity
              else {
                touchTimeout = setTimeout(function(){
                  touchTimeout = null;
                  if ( touch.el !== undefined ) touch.el.trigger('singleTap');
                  touch = {};
                }, 250);
              }
            }, 0);
          } else {
            touch = {};
          }
          deltaX = deltaY = 0;
        }
      })
      // when the browser window loses focus,
      // for example when a modal dialog is shown,
      // cancel all ongoing events
      .on('touchcancel MSPointerCancel pointercancel', function(e){

        // Ignore pointercancel if the event supports touch events, to prevent pointercancel in swipe gesture
        if ((e.type == 'touchcancel' && hasTouchEvents && hasTouch) || (!hasTouchEvents && e.type == 'pointercancel' && hasPointerEvents)) {
          cancelAll();
        }

    });

    // scrolling the window indicates intention of the user
    // to scroll, not tap or swipe, so cancel all ongoing events
    $(window).on('scroll', cancelAll);
  });

  ['swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown', 'doubleTap', 'tap', 'singleTap', 'longTap'].forEach(function(eventName){
    $.fn[eventName] = function(callback){ return $(this).on(eventName, callback); };
  });
})(jQuery);

(function(UI) {

    "use strict";

    var stacks = [];

    UI.component('stackMargin', {

        defaults: {
            cls: 'uk-margin-small-top',
            rowfirst: false,
            observe: false
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-margin]', context).each(function() {

                    var ele = UI.$(this);

                    if (!ele.data('stackMargin')) {
                        UI.stackMargin(ele, UI.Utils.options(ele.attr('data-uk-margin')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            UI.$win.on('resize orientationchange', (function() {

                var fn = function() {
                    $this.process();
                };

                UI.$(function() {
                    fn();
                    UI.$win.on('load', fn);
                });

                return UI.Utils.debounce(fn, 20);
            })());

            this.on('display.uk.check', function(e) {
                if (this.element.is(':visible')) this.process();
            }.bind(this));

            if (this.options.observe) {

                UI.domObserve(this.element, function(e) {
                    if ($this.element.is(':visible')) $this.process();
                });
            }

            stacks.push(this);
        },

        process: function() {

            var $this = this, columns = this.element.children();

            UI.Utils.stackMargin(columns, this.options);

            if (!this.options.rowfirst || !columns.length) {
                return this;
            }

            // Mark first column elements
            var group = {}, minleft = false;

            columns.removeClass(this.options.rowfirst).each(function(offset, $ele){

                $ele = UI.$(this);

                if (this.style.display != 'none') {
                    offset = $ele.offset().left;
                    ((group[offset] = group[offset] || []) && group[offset]).push(this);
                    minleft = minleft === false ? offset : Math.min(minleft, offset);
                }
            });

            UI.$(group[minleft]).addClass(this.options.rowfirst);

            return this;
        }

    });


    // responsive element e.g. iframes

    (function(){

        var elements = [], check = function(ele) {

            if (!ele.is(':visible')) return;

            var width  = ele.parent().width(),
                iwidth = ele.data('width'),
                ratio  = (width / iwidth),
                height = Math.floor(ratio * ele.data('height'));

            ele.css({height: (width < iwidth) ? height : ele.data('height')});
        };

        UI.component('responsiveElement', {

            defaults: {},

            boot: function() {

                // init code
                UI.ready(function(context) {

                    UI.$('iframe.uk-responsive-width, [data-uk-responsive]', context).each(function() {

                        var ele = UI.$(this), obj;

                        if (!ele.data('responsiveElement')) {
                            obj = UI.responsiveElement(ele, {});
                        }
                    });
                });
            },

            init: function() {

                var ele = this.element;

                if (ele.attr('width') && ele.attr('height')) {

                    ele.data({
                        width : ele.attr('width'),
                        height: ele.attr('height')
                    }).on('display.uk.check', function(){
                        check(ele);
                    });

                    check(ele);

                    elements.push(ele);
                }
            }
        });

        UI.$win.on('resize load', UI.Utils.debounce(function(){

            elements.forEach(function(ele){
                check(ele);
            });

        }, 15));

    })();


    // helper

    UI.Utils.stackMargin = function(elements, options) {

        options = UI.$.extend({
            cls: 'uk-margin-small-top'
        }, options);

        elements = UI.$(elements).removeClass(options.cls);

        var min = false;

        elements.each(function(offset, height, pos, $ele){

            $ele   = UI.$(this);

            if ($ele.css('display') != 'none') {

                offset = $ele.offset();
                height = $ele.outerHeight();
                pos    = offset.top + height;

                $ele.data({
                    ukMarginPos: pos,
                    ukMarginTop: offset.top
                });

                if (min === false || (offset.top < min.top) ) {

                    min = {
                        top  : offset.top,
                        left : offset.left,
                        pos  : pos
                    };
                }
            }

        }).each(function($ele) {

            $ele   = UI.$(this);

            if ($ele.css('display') != 'none' && $ele.data('ukMarginTop') > min.top && $ele.data('ukMarginPos') > min.pos) {
                $ele.addClass(options.cls);
            }
        });
    };

    UI.Utils.matchHeights = function(elements, options) {

        elements = UI.$(elements).css('min-height', '');
        options  = UI.$.extend({ row : true }, options);

        var matchHeights = function(group){

            if (group.length < 2) return;

            var max = 0;

            group.each(function() {
                max = Math.max(max, UI.$(this).outerHeight());
            }).each(function() {

                var element = UI.$(this),
                    height  = max - (element.css('box-sizing') == 'border-box' ? 0 : (element.outerHeight() - element.height()));

                element.css('min-height', height + 'px');
            });
        };

        if (options.row) {

            elements.first().width(); // force redraw

            setTimeout(function(){

                var lastoffset = false, group = [];

                elements.each(function() {

                    var ele = UI.$(this), offset = ele.offset().top;

                    if (offset != lastoffset && group.length) {

                        matchHeights(UI.$(group));
                        group  = [];
                        offset = ele.offset().top;
                    }

                    group.push(ele);
                    lastoffset = offset;
                });

                if (group.length) {
                    matchHeights(UI.$(group));
                }

            }, 0);

        } else {
            matchHeights(elements);
        }
    };

    (function(cacheSvgs){

        UI.Utils.inlineSvg = function(selector, root) {

            var images = UI.$(selector || 'img[src$=".svg"]', root || document).each(function(){

                var img = UI.$(this),
                    src = img.attr('src');

                if (!cacheSvgs[src]) {

                    var d = UI.$.Deferred();

                    UI.$.get(src, {nc: Math.random()}, function(data){
                        d.resolve(UI.$(data).find('svg'));
                    });

                    cacheSvgs[src] = d.promise();
                }

                cacheSvgs[src].then(function(svg) {

                    var $svg = UI.$(svg).clone();

                    if (img.attr('id')) $svg.attr('id', img.attr('id'));
                    if (img.attr('class')) $svg.attr('class', img.attr('class'));
                    if (img.attr('style')) $svg.attr('style', img.attr('style'));

                    if (img.attr('width')) {
                        $svg.attr('width', img.attr('width'));
                        if (!img.attr('height'))  $svg.removeAttr('height');
                    }

                    if (img.attr('height')){
                        $svg.attr('height', img.attr('height'));
                        if (!img.attr('width')) $svg.removeAttr('width');
                    }

                    img.replaceWith($svg);
                });
            });
        };

        // init code
        UI.ready(function(context) {
            UI.Utils.inlineSvg('[data-uk-svg]', context);
        });

    })({});

    UI.Utils.getCssVar = function(name) {

        /* usage in css:  .var-name:before { content:"xyz" } */

        var val, doc = document.documentElement, element = doc.appendChild(document.createElement('div'));

        element.classList.add('var-'+name);

        try {
            val = JSON.parse(val = getComputedStyle(element, ':before').content.replace(/^["'](.*)["']$/, '$1'));
        } catch (e) {
            val = undefined;
        }

        doc.removeChild(element);

        return val;
    }

})(UIkit2);

(function(UI) {

    "use strict";

    UI.component('smoothScroll', {

        boot: function() {

            // init code
            UI.$html.on('click.smooth-scroll.uikit', '[data-uk-smooth-scroll]', function(e) {
                var ele = UI.$(this);

                if (!ele.data('smoothScroll')) {
                    var obj = UI.smoothScroll(ele, UI.Utils.options(ele.attr('data-uk-smooth-scroll')));
                    ele.trigger('click');
                }

                return false;
            });
        },

        init: function() {

            var $this = this;

            this.on('click', function(e) {
                e.preventDefault();
                scrollToElement(UI.$(this.hash).length ? UI.$(this.hash) : UI.$('body'), $this.options);
            });
        }
    });

    function scrollToElement(ele, options) {

        options = UI.$.extend({
            duration: 1000,
            transition: 'easeOutExpo',
            offset: 0,
            complete: function(){}
        }, options);

        // get / set parameters
        var target    = ele.offset().top - options.offset,
            docheight = UI.$doc.height(),
            winheight = window.innerHeight;

        if ((target + winheight) > docheight) {
            target = docheight - winheight;
        }

        // animate to target, fire callback when done
        UI.$('html,body').stop().animate({scrollTop: target}, options.duration, options.transition).promise().done(options.complete);
    }

    UI.Utils.scrollToElement = scrollToElement;

    if (!UI.$.easing.easeOutExpo) {
        UI.$.easing.easeOutExpo = function(x, t, b, c, d) { return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b; };
    }

})(UIkit2);

(function(UI) {

    "use strict";

    var $win           = UI.$win,
        $doc           = UI.$doc,
        scrollspies    = [],
        checkScrollSpy = function() {
            for(var i=0; i < scrollspies.length; i++) {
                window.requestAnimationFrame.apply(window, [scrollspies[i].check]);
            }
        };

    UI.component('scrollspy', {

        defaults: {
            target     : false,
            cls        : 'uk-scrollspy-inview',
            initcls    : 'uk-scrollspy-init-inview',
            topoffset  : 0,
            leftoffset : 0,
            repeat     : false,
            delay      : 0
        },

        boot: function() {

            // listen to scroll and resize
            $doc.on('scrolling.uk.document', checkScrollSpy);
            $win.on('load resize orientationchange', UI.Utils.debounce(checkScrollSpy, 50));

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-scrollspy]', context).each(function() {

                    var element = UI.$(this);

                    if (!element.data('scrollspy')) {
                        var obj = UI.scrollspy(element, UI.Utils.options(element.attr('data-uk-scrollspy')));
                    }
                });
            });
        },

        init: function() {

            var $this = this, inviewstate, initinview, togglecls = this.options.cls.split(/,/), fn = function(){

                var elements     = $this.options.target ? $this.element.find($this.options.target) : $this.element,
                    delayIdx     = elements.length === 1 ? 1 : 0,
                    toggleclsIdx = 0;

                elements.each(function(idx){

                    var element     = UI.$(this),
                        inviewstate = element.data('inviewstate'),
                        inview      = UI.Utils.isInView(element, $this.options),
                        toggle      = element.attr('data-uk-scrollspy-cls') || togglecls[toggleclsIdx].trim();

                    if (inview && !inviewstate && !element.data('scrollspy-idle')) {

                        if (!initinview) {
                            element.addClass($this.options.initcls);
                            $this.offset = element.offset();
                            initinview = true;

                            element.trigger('init.uk.scrollspy');
                        }

                        element.data('scrollspy-idle', setTimeout(function(){

                            element.addClass('uk-scrollspy-inview').toggleClass(toggle).width();
                            element.trigger('inview.uk.scrollspy');

                            element.data('scrollspy-idle', false);
                            element.data('inviewstate', true);

                        }, $this.options.delay * delayIdx));

                        delayIdx++;
                    }

                    if (!inview && inviewstate && $this.options.repeat) {

                        if (element.data('scrollspy-idle')) {
                            clearTimeout(element.data('scrollspy-idle'));
                            element.data('scrollspy-idle', false);
                        }

                        element.removeClass('uk-scrollspy-inview').toggleClass(toggle);
                        element.data('inviewstate', false);

                        element.trigger('outview.uk.scrollspy');
                    }

                    toggleclsIdx = togglecls[toggleclsIdx + 1] ? (toggleclsIdx + 1) : 0;

                });
            };

            fn();

            this.check = fn;

            scrollspies.push(this);
        }
    });


    var scrollspynavs = [],
        checkScrollSpyNavs = function() {
            for(var i=0; i < scrollspynavs.length; i++) {
                window.requestAnimationFrame.apply(window, [scrollspynavs[i].check]);
            }
        };

    UI.component('scrollspynav', {

        defaults: {
            cls          : 'uk-active',
            closest      : false,
            topoffset    : 0,
            leftoffset   : 0,
            smoothscroll : false
        },

        boot: function() {

            // listen to scroll and resize
            $doc.on('scrolling.uk.document', checkScrollSpyNavs);
            $win.on('resize orientationchange', UI.Utils.debounce(checkScrollSpyNavs, 50));

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-scrollspy-nav]', context).each(function() {

                    var element = UI.$(this);

                    if (!element.data('scrollspynav')) {
                        var obj = UI.scrollspynav(element, UI.Utils.options(element.attr('data-uk-scrollspy-nav')));
                    }
                });
            });
        },

        init: function() {

            var ids     = [],
                links   = this.find("a[href^='#']").each(function(){ if(this.getAttribute('href').trim()!=='#') ids.push(this.getAttribute('href')); }),
                targets = UI.$(ids.join(",")),

                clsActive  = this.options.cls,
                clsClosest = this.options.closest || this.options.closest;

            var $this = this, inviews, fn = function(){

                inviews = [];

                for (var i=0 ; i < targets.length ; i++) {
                    if (UI.Utils.isInView(targets.eq(i), $this.options)) {
                        inviews.push(targets.eq(i));
                    }
                }

                if (inviews.length) {

                    var navitems,
                        scrollTop = $win.scrollTop(),
                        target = (function(){
                            for(var i=0; i< inviews.length;i++){
                                if (inviews[i].offset().top - $this.options.topoffset >= scrollTop){
                                    return inviews[i];
                                }
                            }
                        })();

                    if (!target) return;

                    if ($this.options.closest) {
                        links.blur().closest(clsClosest).removeClass(clsActive);
                        navitems = links.filter("a[href='#"+target.attr('id')+"']").closest(clsClosest).addClass(clsActive);
                    } else {
                        navitems = links.removeClass(clsActive).filter("a[href='#"+target.attr("id")+"']").addClass(clsActive);
                    }

                    $this.element.trigger('inview.uk.scrollspynav', [target, navitems]);
                }
            };

            if (this.options.smoothscroll && UI.smoothScroll) {
                links.each(function(){
                    UI.smoothScroll(this, $this.options.smoothscroll);
                });
            }

            fn();

            this.element.data('scrollspynav', this);

            this.check = fn;
            scrollspynavs.push(this);

        }
    });

})(UIkit2);

(function(UI){

    "use strict";

    var toggles = [];

    UI.component('toggle', {

        defaults: {
            target    : false,
            cls       : 'uk-hidden',
            animation : false,
            duration  : 200
        },

        boot: function(){

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-toggle]', context).each(function() {
                    var ele = UI.$(this);

                    if (!ele.data('toggle')) {
                        var obj = UI.toggle(ele, UI.Utils.options(ele.attr('data-uk-toggle')));
                    }
                });

                setTimeout(function(){

                    toggles.forEach(function(toggle){
                        toggle.getToggles();
                    });

                }, 0);
            });
        },

        init: function() {

            var $this = this;

            this.aria = (this.options.cls.indexOf('uk-hidden') !== -1);

            this.on('click', function(e) {

                if ($this.element.is('a[href="#"]')) {
                    e.preventDefault();
                }

                $this.toggle();
            });

            toggles.push(this);
        },

        toggle: function() {

            this.getToggles();

            if(!this.totoggle.length) return;

            if (this.options.animation && UI.support.animation) {

                var $this = this, animations = this.options.animation.split(',');

                if (animations.length == 1) {
                    animations[1] = animations[0];
                }

                animations[0] = animations[0].trim();
                animations[1] = animations[1].trim();

                this.totoggle.css('animation-duration', this.options.duration+'ms');

                this.totoggle.each(function(){

                    var ele = UI.$(this);

                    if (ele.hasClass($this.options.cls)) {

                        ele.toggleClass($this.options.cls);

                        UI.Utils.animate(ele, animations[0]).then(function(){
                            ele.css('animation-duration', '');
                            UI.Utils.checkDisplay(ele);
                        });

                    } else {

                        UI.Utils.animate(this, animations[1]+' uk-animation-reverse').then(function(){
                            ele.toggleClass($this.options.cls).css('animation-duration', '');
                            UI.Utils.checkDisplay(ele);
                        });

                    }

                });

            } else {
                this.totoggle.toggleClass(this.options.cls);
                UI.Utils.checkDisplay(this.totoggle);
            }

            this.updateAria();

        },

        getToggles: function() {
            this.totoggle = this.options.target ? UI.$(this.options.target):[];
            this.updateAria();
        },

        updateAria: function() {
            if (this.aria && this.totoggle.length) {
                this.totoggle.not('[aria-hidden]').each(function(){
                    UI.$(this).attr('aria-hidden', UI.$(this).hasClass('uk-hidden'));
                });
            }
        }
    });

})(UIkit2);

(function(UI) {

    "use strict";

    UI.component('alert', {

        defaults: {
            fade: true,
            duration: 200,
            trigger: '.uk-alert-close'
        },

        boot: function() {

            // init code
            UI.$html.on('click.alert.uikit', '[data-uk-alert]', function(e) {

                var ele = UI.$(this);

                if (!ele.data('alert')) {

                    var alert = UI.alert(ele, UI.Utils.options(ele.attr('data-uk-alert')));

                    if (UI.$(e.target).is(alert.options.trigger)) {
                        e.preventDefault();
                        alert.close();
                    }
                }
            });
        },

        init: function() {

            var $this = this;

            this.on('click', this.options.trigger, function(e) {
                e.preventDefault();
                $this.close();
            });
        },

        close: function() {

            var element       = this.trigger('close.uk.alert'),
                removeElement = function () {
                    this.trigger('closed.uk.alert').remove();
                }.bind(this);

            if (this.options.fade) {
                element.css('overflow', 'hidden').css("max-height", element.height()).animate({
                    height         : 0,
                    opacity        : 0,
                    paddingTop    : 0,
                    paddingBottom : 0,
                    marginTop     : 0,
                    marginBottom  : 0
                }, this.options.duration, removeElement);
            } else {
                removeElement();
            }
        }

    });

})(UIkit2);

(function(UI) {

    "use strict";

    UI.component('buttonRadio', {

        defaults: {
            activeClass: 'uk-active',
            target: '.uk-button'
        },

        boot: function() {

            // init code
            UI.$html.on('click.buttonradio.uikit', '[data-uk-button-radio]', function(e) {

                var ele = UI.$(this);

                if (!ele.data('buttonRadio')) {

                    var obj    = UI.buttonRadio(ele, UI.Utils.options(ele.attr('data-uk-button-radio'))),
                        target = UI.$(e.target);

                    if (target.is(obj.options.target)) {
                        target.trigger('click');
                    }
                }
            });
        },

        init: function() {

            var $this = this;

            // Init ARIA
            this.find($this.options.target).attr('aria-checked', 'false').filter('.' + $this.options.activeClass).attr('aria-checked', 'true');

            this.on('click', this.options.target, function(e) {

                var ele = UI.$(this);

                if (ele.is('a[href="#"]')) e.preventDefault();

                $this.find($this.options.target).not(ele).removeClass($this.options.activeClass).blur();
                ele.addClass($this.options.activeClass);

                // Update ARIA
                $this.find($this.options.target).not(ele).attr('aria-checked', 'false');
                ele.attr('aria-checked', 'true');

                $this.trigger('change.uk.button', [ele]);
            });

        },

        getSelected: function() {
            return this.find('.' + this.options.activeClass);
        }
    });

    UI.component('buttonCheckbox', {

        defaults: {
            activeClass: 'uk-active',
            target: '.uk-button'
        },

        boot: function() {

            UI.$html.on('click.buttoncheckbox.uikit', '[data-uk-button-checkbox]', function(e) {
                var ele = UI.$(this);

                if (!ele.data('buttonCheckbox')) {

                    var obj    = UI.buttonCheckbox(ele, UI.Utils.options(ele.attr('data-uk-button-checkbox'))),
                        target = UI.$(e.target);

                    if (target.is(obj.options.target)) {
                        target.trigger('click');
                    }
                }
            });
        },

        init: function() {

            var $this = this;

            // Init ARIA
            this.find($this.options.target).attr('aria-checked', 'false').filter('.' + $this.options.activeClass).attr('aria-checked', 'true');

            this.on('click', this.options.target, function(e) {
                var ele = UI.$(this);

                if (ele.is('a[href="#"]')) e.preventDefault();

                ele.toggleClass($this.options.activeClass).blur();

                // Update ARIA
                ele.attr('aria-checked', ele.hasClass($this.options.activeClass));

                $this.trigger('change.uk.button', [ele]);
            });

        },

        getSelected: function() {
            return this.find('.' + this.options.activeClass);
        }
    });


    UI.component('button', {

        defaults: {},

        boot: function() {

            UI.$html.on('click.button.uikit', '[data-uk-button]', function(e) {
                var ele = UI.$(this);

                if (!ele.data('button')) {

                    var obj = UI.button(ele, UI.Utils.options(ele.attr('data-uk-button')));
                    ele.trigger('click');
                }
            });
        },

        init: function() {

            var $this = this;

            // Init ARIA
            this.element.attr('aria-pressed', this.element.hasClass("uk-active"));

            this.on('click', function(e) {

                if ($this.element.is('a[href="#"]')) e.preventDefault();

                $this.toggle();
                $this.trigger('change.uk.button', [$this.element.blur().hasClass('uk-active')]);
            });

        },

        toggle: function() {
            this.element.toggleClass('uk-active');

            // Update ARIA
            this.element.attr('aria-pressed', this.element.hasClass('uk-active'));
        }
    });

})(UIkit2);

(function(UI) {

    "use strict";

    var active = false, hoverIdle, flips = {
        x: {
            'bottom-left'   : 'bottom-right',
            'bottom-right'  : 'bottom-left',
            'bottom-center' : 'bottom-center',
            'top-left'      : 'top-right',
            'top-right'     : 'top-left',
            'top-center'    : 'top-center',
            'left-top'      : 'right-top',
            'left-bottom'   : 'right-bottom',
            'left-center'   : 'right-center',
            'right-top'     : 'left-top',
            'right-bottom'  : 'left-bottom',
            'right-center'  : 'left-center'
        },
        y: {
            'bottom-left'   : 'top-left',
            'bottom-right'  : 'top-right',
            'bottom-center' : 'top-center',
            'top-left'      : 'bottom-left',
            'top-right'     : 'bottom-right',
            'top-center'    : 'bottom-center',
            'left-top'      : 'left-bottom',
            'left-bottom'   : 'left-top',
            'left-center'   : 'left-center',
            'right-top'     : 'right-bottom',
            'right-bottom'  : 'right-top',
            'right-center'  : 'right-center'
        },
        xy: {
            'bottom-left'   : 'top-right',
            'bottom-right'  : 'top-left',
            'bottom-center' : 'top-center',
            'top-left'      : 'bottom-right',
            'top-right'     : 'bottom-left',
            'top-center'    : 'bottom-center',
            'left-top'      : 'right-bottom',
            'left-bottom'   : 'right-top',
            'left-center'   : 'right-center',
            'right-top'     : 'left-bottom',
            'right-bottom'  : 'left-top',
            'right-center'  : 'left-center'
        }
    };

    UI.component('dropdown', {

        defaults: {
           mode            : 'hover',
           pos             : 'bottom-left',
           offset          : 0,
           remaintime      : 800,
           justify         : false,
           boundary        : UI.$win,
           delay           : 0,
           dropdownSelector: '.uk-dropdown,.uk-dropdown-blank',
           hoverDelayIdle  : 250,
           preventflip     : false
        },

        remainIdle: false,

        boot: function() {

            var triggerevent = UI.support.touch ? 'click' : 'mouseenter';

            // init code
            UI.$html.on(triggerevent+'.dropdown.uikit focus pointerdown', '[data-uk-dropdown]', function(e) {

                var ele = UI.$(this);

                if (!ele.data('dropdown')) {

                    var dropdown = UI.dropdown(ele, UI.Utils.options(ele.attr('data-uk-dropdown')));

                    if (e.type=='click' || (e.type=='mouseenter' && dropdown.options.mode=='hover')) {
                        dropdown.element.trigger(triggerevent);
                    }

                    if (dropdown.dropdown.length) {
                        e.preventDefault();
                    }
                }
            });
        },

        init: function() {

            var $this = this;

            this.dropdown     = this.find(this.options.dropdownSelector);
            this.offsetParent = this.dropdown.parents().filter(function() {
                return UI.$.inArray(UI.$(this).css('position'), ['relative', 'fixed', 'absolute']) !== -1;
            }).slice(0,1);

            if (!this.offsetParent.length) {
                this.offsetParent = this.element;
            }

            this.centered  = this.dropdown.hasClass('uk-dropdown-center');
            this.justified = this.options.justify ? UI.$(this.options.justify) : false;

            this.boundary  = UI.$(this.options.boundary);

            if (!this.boundary.length) {
                this.boundary = UI.$win;
            }

            // legacy DEPRECATED!
            if (this.dropdown.hasClass('uk-dropdown-up')) {
                this.options.pos = 'top-left';
            }
            if (this.dropdown.hasClass('uk-dropdown-flip')) {
                this.options.pos = this.options.pos.replace('left','right');
            }
            if (this.dropdown.hasClass('uk-dropdown-center')) {
                this.options.pos = this.options.pos.replace(/(left|right)/,'center');
            }
            //-- end legacy

            // Init ARIA
            this.element.attr('aria-haspopup', 'true');
            this.element.attr('aria-expanded', this.element.hasClass('uk-open'));
            this.dropdown.attr('aria-hidden', 'true');

            if (this.options.mode == 'click' || UI.support.touch) {

                this.on('click.uk.dropdown', function(e) {

                    var $target = UI.$(e.target);

                    if (!$target.parents($this.options.dropdownSelector).length) {

                        if ($target.is("a[href='#']") || $target.parent().is("a[href='#']") || ($this.dropdown.length && !$this.dropdown.is(':visible')) ){
                            e.preventDefault();
                        }

                        $target.blur();
                    }

                    if (!$this.element.hasClass('uk-open')) {

                        $this.show();

                    } else {

                        if (!$this.dropdown.find(e.target).length || $target.is('.uk-dropdown-close') || $target.parents('.uk-dropdown-close').length) {
                            $this.hide();
                        }
                    }
                });

            } else {

                this.on('mouseenter', function(e) {

                    $this.trigger('pointerenter.uk.dropdown', [$this]);

                    if ($this.remainIdle) {
                        clearTimeout($this.remainIdle);
                    }

                    if (hoverIdle) {
                        clearTimeout(hoverIdle);
                    }

                    if (active && active == $this) {
                        return;
                    }

                    // pseudo manuAim
                    if (active && active != $this) {

                        hoverIdle = setTimeout(function() {
                            hoverIdle = setTimeout($this.show.bind($this), $this.options.delay);
                        }, $this.options.hoverDelayIdle);

                    } else {

                        hoverIdle = setTimeout($this.show.bind($this), $this.options.delay);
                    }

                }).on('mouseleave', function() {

                    if (hoverIdle) {
                        clearTimeout(hoverIdle);
                    }

                    $this.remainIdle = setTimeout(function() {
                        if (active && active == $this) $this.hide();
                    }, $this.options.remaintime);

                    $this.trigger('pointerleave.uk.dropdown', [$this]);

                }).on('click', function(e){

                    var $target = UI.$(e.target);

                    if ($this.remainIdle) {
                        clearTimeout($this.remainIdle);
                    }

                    if (active && active == $this) {
                        if (!$this.dropdown.find(e.target).length || $target.is('.uk-dropdown-close') || $target.parents('.uk-dropdown-close').length) {
                            $this.hide();
                        }
                        return;
                    }

                    if ($target.is("a[href='#']") || $target.parent().is("a[href='#']")){
                        e.preventDefault();
                    }

                    $this.show();
                });
            }
        },

        show: function(){

            UI.$html.off('click.outer.dropdown');

            if (active && active != this) {
                active.hide(true);
            }

            if (hoverIdle) {
                clearTimeout(hoverIdle);
            }

            this.trigger('beforeshow.uk.dropdown', [this]);

            this.checkDimensions();
            this.element.addClass('uk-open');

            // Update ARIA
            this.element.attr('aria-expanded', 'true');
            this.dropdown.attr('aria-hidden', 'false');

            this.trigger('show.uk.dropdown', [this]);

            UI.Utils.checkDisplay(this.dropdown, true);
            UI.Utils.focus(this.dropdown);
            active = this;

            this.registerOuterClick();
        },

        hide: function(force) {

            this.trigger('beforehide.uk.dropdown', [this, force]);

            this.element.removeClass('uk-open');

            if (this.remainIdle) {
                clearTimeout(this.remainIdle);
            }

            this.remainIdle = false;

            // Update ARIA
            this.element.attr('aria-expanded', 'false');
            this.dropdown.attr('aria-hidden', 'true');

            this.trigger('hide.uk.dropdown', [this, force]);

            if (active == this) active = false;
        },

        registerOuterClick: function(){

            var $this = this;

            UI.$html.off('click.outer.dropdown');

            setTimeout(function() {

                UI.$html.on('click.outer.dropdown', function(e) {

                    if (hoverIdle) {
                        clearTimeout(hoverIdle);
                    }

                    var $target = UI.$(e.target);

                    if (active == $this && !$this.element.find(e.target).length) {
                        $this.hide(true);
                        UI.$html.off('click.outer.dropdown');
                    }
                });
            }, 10);
        },

        checkDimensions: function() {

            if (!this.dropdown.length) return;

            // reset
            this.dropdown.removeClass('uk-dropdown-top uk-dropdown-bottom uk-dropdown-left uk-dropdown-right uk-dropdown-stack uk-dropdown-autoflip').css({
                topLeft :'',
                left :'',
                marginLeft :'',
                marginRight :''
            });

            if (this.justified && this.justified.length) {
                this.dropdown.css('min-width', '');
            }

            var $this          = this,
                pos            = UI.$.extend({}, this.offsetParent.offset(), {width: this.offsetParent[0].offsetWidth, height: this.offsetParent[0].offsetHeight}),
                posoffset      = this.options.offset,
                dropdown       = this.dropdown,
                offset         = dropdown.show().offset() || {left: 0, top: 0},
                width          = dropdown.outerWidth(),
                height         = dropdown.outerHeight(),
                boundarywidth  = this.boundary.width(),
                boundaryoffset = this.boundary[0] !== window && this.boundary.offset() ? this.boundary.offset(): {top:0, left:0},
                dpos           = this.options.pos;

            var variants =  {
                    'bottom-left'   : {top: 0 + pos.height + posoffset, left: 0},
                    'bottom-right'  : {top: 0 + pos.height + posoffset, left: 0 + pos.width - width},
                    'bottom-center' : {top: 0 + pos.height + posoffset, left: 0 + pos.width / 2 - width / 2},
                    'top-left'      : {top: 0 - height - posoffset, left: 0},
                    'top-right'     : {top: 0 - height - posoffset, left: 0 + pos.width - width},
                    'top-center'    : {top: 0 - height - posoffset, left: 0 + pos.width / 2 - width / 2},
                    'left-top'      : {top: 0, left: 0 - width - posoffset},
                    'left-bottom'   : {top: 0 + pos.height - height, left: 0 - width - posoffset},
                    'left-center'   : {top: 0 + pos.height / 2 - height / 2, left: 0 - width - posoffset},
                    'right-top'     : {top: 0, left: 0 + pos.width + posoffset},
                    'right-bottom'  : {top: 0 + pos.height - height, left: 0 + pos.width + posoffset},
                    'right-center'  : {top: 0 + pos.height / 2 - height / 2, left: 0 + pos.width + posoffset}
                },
                css = {},
                pp;

            pp = dpos.split('-');
            css = variants[dpos] ? variants[dpos] : variants['bottom-left'];

            // justify dropdown
            if (this.justified && this.justified.length) {
                justify(dropdown.css({left:0}), this.justified, boundarywidth);
            } else {

                if (this.options.preventflip !== true) {

                    var fdpos;

                    switch(this.checkBoundary(pos.left + css.left, pos.top + css.top, width, height, boundarywidth)) {
                        case "x":
                            if(this.options.preventflip !=='x') fdpos = flips['x'][dpos] || 'right-top';
                            break;
                        case "y":
                            if(this.options.preventflip !=='y') fdpos = flips['y'][dpos] || 'top-left';
                            break;
                        case "xy":
                            if(!this.options.preventflip) fdpos = flips['xy'][dpos] || 'right-bottom';
                            break;
                    }

                    if (fdpos) {

                        pp  = fdpos.split('-');
                        css = variants[fdpos] ? variants[fdpos] : variants['bottom-left'];
                        dropdown.addClass('uk-dropdown-autoflip');

                        // check flipped
                        if (this.checkBoundary(pos.left + css.left, pos.top + css.top, width, height, boundarywidth)) {
                            pp  = dpos.split('-');
                            css = variants[dpos] ? variants[dpos] : variants['bottom-left'];
                        }
                    }
                }
            }

            if (width > boundarywidth) {
                dropdown.addClass('uk-dropdown-stack');
                this.trigger('stack.uk.dropdown', [this]);
            }

            dropdown.css(css).css('display', '').addClass('uk-dropdown-'+pp[0]);
        },

        checkBoundary: function(left, top, width, height, boundarywidth) {

            var axis = "";

            if (left < 0 || ((left - UI.$win.scrollLeft())+width) > boundarywidth) {
               axis += "x";
            }

            if ((top - UI.$win.scrollTop()) < 0 || ((top - UI.$win.scrollTop())+height) > window.innerHeight) {
               axis += "y";
            }

            return axis;
        }
    });


    UI.component('dropdownOverlay', {

        defaults: {
           justify : false,
           cls     : '',
           duration: 200
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-dropdown-overlay]', context).each(function() {
                    var ele = UI.$(this);

                    if (!ele.data('dropdownOverlay')) {
                        UI.dropdownOverlay(ele, UI.Utils.options(ele.attr('data-uk-dropdown-overlay')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            this.justified = this.options.justify ? UI.$(this.options.justify) : false;
            this.overlay   = this.element.find('uk-dropdown-overlay');

            if (!this.overlay.length) {
                this.overlay = UI.$('<div class="uk-dropdown-overlay"></div>').appendTo(this.element);
            }

            this.overlay.addClass(this.options.cls);

            this.on({

                'beforeshow.uk.dropdown': function(e, dropdown) {
                    $this.dropdown = dropdown;

                    if ($this.justified && $this.justified.length) {
                        justify($this.overlay.css({display:'block', marginLeft:'', marginRight:''}), $this.justified, $this.justified.outerWidth());
                    }
                },

                'show.uk.dropdown': function(e, dropdown) {

                    var h = $this.dropdown.dropdown.outerHeight(true);

                    $this.dropdown.element.removeClass('uk-open');

                    $this.overlay.stop().css('display', 'block').animate({height: h}, $this.options.duration, function() {

                       $this.dropdown.dropdown.css('visibility', '');
                       $this.dropdown.element.addClass('uk-open');

                       UI.Utils.checkDisplay($this.dropdown.dropdown, true);
                    });

                    $this.pointerleave = false;
                },

                'hide.uk.dropdown': function() {
                    $this.overlay.stop().animate({height: 0}, $this.options.duration);
                },

                'pointerenter.uk.dropdown': function(e, dropdown) {
                    clearTimeout($this.remainIdle);
                },

                'pointerleave.uk.dropdown': function(e, dropdown) {
                    $this.pointerleave = true;
                }
            });


            this.overlay.on({

                'mouseenter': function() {
                    if ($this.remainIdle) {
                        clearTimeout($this.dropdown.remainIdle);
                        clearTimeout($this.remainIdle);
                    }
                },

                'mouseleave': function(){

                    if ($this.pointerleave && active) {

                        $this.remainIdle = setTimeout(function() {
                           if(active) active.hide();
                        }, active.options.remaintime);
                    }
                }
            })
        }

    });


    function justify(ele, justifyTo, boundarywidth, offset) {

        ele           = UI.$(ele);
        justifyTo     = UI.$(justifyTo);
        boundarywidth = boundarywidth || window.innerWidth;
        offset        = offset || ele.offset();

        if (justifyTo.length) {

            var jwidth = justifyTo.outerWidth();

            ele.css('min-width', jwidth);

            if (UI.langdirection == 'right') {

                var right1   = boundarywidth - (justifyTo.offset().left + jwidth),
                    right2   = boundarywidth - (ele.offset().left + ele.outerWidth());

                ele.css('margin-right', right1 - right2);

            } else {
                ele.css('margin-left', justifyTo.offset().left - offset.left);
            }
        }
    }

})(UIkit2);

(function(UI) {

    "use strict";

    var grids = [];

    UI.component('gridMatchHeight', {

        defaults: {
            target        : false,
            row           : true,
            ignorestacked : false,
            observe       : false
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-grid-match]', context).each(function() {
                    var grid = UI.$(this), obj;

                    if (!grid.data('gridMatchHeight')) {
                        obj = UI.gridMatchHeight(grid, UI.Utils.options(grid.attr('data-uk-grid-match')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            this.columns  = this.element.children();
            this.elements = this.options.target ? this.find(this.options.target) : this.columns;

            if (!this.columns.length) return;

            UI.$win.on('load resize orientationchange', (function() {

                var fn = function() {
                    if ($this.element.is(':visible')) $this.match();
                };

                UI.$(function() { fn(); });

                return UI.Utils.debounce(fn, 50);
            })());

            if (this.options.observe) {

                UI.domObserve(this.element, function(e) {
                    if ($this.element.is(':visible')) $this.match();
                });
            }

            this.on('display.uk.check', function(e) {
                if(this.element.is(':visible')) this.match();
            }.bind(this));

            grids.push(this);
        },

        match: function() {

            var firstvisible = this.columns.filter(':visible:first');

            if (!firstvisible.length) return;

            var stacked = Math.ceil(100 * parseFloat(firstvisible.css('width')) / parseFloat(firstvisible.parent().css('width'))) >= 100;

            if (stacked && !this.options.ignorestacked) {
                this.revert();
            } else {
                UI.Utils.matchHeights(this.elements, this.options);
            }

            return this;
        },

        revert: function() {
            this.elements.css('min-height', '');
            return this;
        }
    });

    UI.component('gridMargin', {

        defaults: {
            cls      : 'uk-grid-margin',
            rowfirst : 'uk-row-first'
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-grid-margin]', context).each(function() {
                    var grid = UI.$(this), obj;

                    if (!grid.data('gridMargin')) {
                        obj = UI.gridMargin(grid, UI.Utils.options(grid.attr('data-uk-grid-margin')));
                    }
                });
            });
        },

        init: function() {

            var stackMargin = UI.stackMargin(this.element, this.options);
        }
    });

})(UIkit2);

(function(UI) {

    "use strict";

    var active = false, activeCount = 0, $html = UI.$html, body;

    UI.$win.on('resize orientationchange', UI.Utils.debounce(function(){
        UI.$('.uk-modal.uk-open').each(function(){
            return UI.$(this).data('modal') && UI.$(this).data('modal').resize();
        });
    }, 150));

    UI.component('modal', {

        defaults: {
            keyboard: true,
            bgclose: true,
            minScrollHeight: 150,
            center: false,
            modal: true
        },

        scrollable: false,
        transition: false,
        hasTransitioned: true,

        init: function() {

            if (!body) body = UI.$('body');

            if (!this.element.length) return;

            var $this = this;

            this.paddingdir = 'padding-' + (UI.langdirection == 'left' ? 'right':'left');
            this.dialog     = this.find('.uk-modal-dialog');

            this.active     = false;

            // Update ARIA
            this.element.attr('aria-hidden', this.element.hasClass('uk-open'));

            this.on('click', '.uk-modal-close', function(e) {
                e.preventDefault();
                $this.hide();
            }).on('click', function(e) {

                var target = UI.$(e.target);

                if (target[0] == $this.element[0] && $this.options.bgclose) {
                    $this.hide();
                }
            });

            UI.domObserve(this.element, function(e) { $this.resize(); });
        },

        toggle: function() {
            return this[this.isActive() ? 'hide' : 'show']();
        },

        show: function() {

            if (!this.element.length) return;

            var $this = this;

            if (this.isActive()) return;

            if (this.options.modal && active) {
                active.hide(true);
            }

            this.element.removeClass('uk-open').show();
            this.resize(true);

            if (this.options.modal) {
                active = this;
            }

            this.active = true;

            activeCount++;

            if (UI.support.transition) {
                this.hasTransitioned = false;
                this.element.one(UI.support.transition.end, function(){
                    $this.hasTransitioned = true;
                    UI.Utils.focus($this.dialog, 'a[href]');
                }).addClass('uk-open');
            } else {
                this.element.addClass('uk-open');
                UI.Utils.focus(this.dialog, 'a[href]');
            }

            $html.addClass('uk-modal-page').height(); // force browser engine redraw

            // Update ARIA
            this.element.attr('aria-hidden', 'false');

            this.element.trigger('show.uk.modal');

            UI.Utils.checkDisplay(this.dialog, true);

            return this;
        },

        hide: function(force) {

            if (!force && UI.support.transition && this.hasTransitioned) {

                var $this = this;

                this.one(UI.support.transition.end, function() {
                    $this._hide();
                }).removeClass('uk-open');

            } else {

                this._hide();
            }

            return this;
        },

        resize: function(force) {

            if (!this.isActive() && !force) return;

            var bodywidth  = body.width();

            this.scrollbarwidth = window.innerWidth - bodywidth;

            body.css(this.paddingdir, this.scrollbarwidth);

            this.element.css('overflow-y', this.scrollbarwidth ? 'scroll' : 'auto');

            if (!this.updateScrollable() && this.options.center) {

                var dh  = this.dialog.outerHeight(),
                pad = parseInt(this.dialog.css('margin-top'), 10) + parseInt(this.dialog.css('margin-bottom'), 10);

                if ((dh + pad) < window.innerHeight) {
                    this.dialog.css({top: (window.innerHeight/2 - dh/2) - pad });
                } else {
                    this.dialog.css({top: ''});
                }
            }
        },

        updateScrollable: function() {

            // has scrollable?
            var scrollable = this.dialog.find('.uk-overflow-container:visible:first');

            if (scrollable.length) {

                scrollable.css('height', 0);

                var offset = Math.abs(parseInt(this.dialog.css('margin-top'), 10)),
                dh     = this.dialog.outerHeight(),
                wh     = window.innerHeight,
                h      = wh - 2*(offset < 20 ? 20:offset) - dh;

                scrollable.css({
                    maxHeight: (h < this.options.minScrollHeight ? '':h),
                    height:''
                });

                return true;
            }

            return false;
        },

        _hide: function() {

            this.active = false;
            if (activeCount > 0) activeCount--;
            else activeCount = 0;

            this.element.hide().removeClass('uk-open');

            // Update ARIA
            this.element.attr('aria-hidden', 'true');

            if (!activeCount) {
                $html.removeClass('uk-modal-page');
                body.css(this.paddingdir, "");
            }

            if (active===this) active = false;

            this.trigger('hide.uk.modal');
        },

        isActive: function() {
            return this.element.hasClass('uk-open');
        }

    });

    UI.component('modalTrigger', {

        boot: function() {

            // init code
            UI.$html.on('click.modal.uikit', '[data-uk-modal]', function(e) {

                var ele = UI.$(this);

                if (ele.is('a')) {
                    e.preventDefault();
                }

                if (!ele.data('modalTrigger')) {
                    var modal = UI.modalTrigger(ele, UI.Utils.options(ele.attr('data-uk-modal')));
                    modal.show();
                }

            });

            // close modal on esc button
            UI.$html.on('keydown.modal.uikit', function (e) {

                if (active && e.keyCode === 27 && active.options.keyboard) { // ESC
                    e.preventDefault();
                    active.hide();
                }
            });
        },

        init: function() {

            var $this = this;

            this.options = UI.$.extend({
                target: $this.element.is('a') ? $this.element.attr('href') : false
            }, this.options);

            this.modal = UI.modal(this.options.target, this.options);

            this.on("click", function(e) {
                e.preventDefault();
                $this.show();
            });

            //methods
            this.proxy(this.modal, 'show hide isActive');
        }
    });

    UI.modal.dialog = function(content, options) {

        var modal = UI.modal(UI.$(UI.modal.dialog.template).appendTo('body'), options);

        modal.on('hide.uk.modal', function(){
            if (modal.persist) {
                modal.persist.appendTo(modal.persist.data('modalPersistParent'));
                modal.persist = false;
            }
            modal.element.remove();
        });

        setContent(content, modal);

        return modal;
    };

    UI.modal.dialog.template = '<div class="uk-modal"><div class="uk-modal-dialog" style="min-height:0;"></div></div>';

    UI.modal.alert = function(content, options) {

        options = UI.$.extend(true, {bgclose:false, keyboard:false, modal:false, labels:UI.modal.labels}, options);

        var modal = UI.modal.dialog(([
            '<div class="uk-margin uk-modal-content">'+String(content)+'</div>',
            '<div class="uk-modal-footer uk-text-right"><button class="uk-button uk-button-primary uk-modal-close">'+options.labels.Ok+'</button></div>'
        ]).join(""), options);

        modal.on('show.uk.modal', function(){
            setTimeout(function(){
                modal.element.find('button:first').focus();
            }, 50);
        });

        return modal.show();
    };

    UI.modal.confirm = function(content, onconfirm, oncancel) {

        var options = arguments.length > 1 && arguments[arguments.length-1] ? arguments[arguments.length-1] : {};

        onconfirm = UI.$.isFunction(onconfirm) ? onconfirm : function(){};
        oncancel  = UI.$.isFunction(oncancel) ? oncancel : function(){};
        options   = UI.$.extend(true, {bgclose:false, keyboard:false, modal:false, labels:UI.modal.labels}, UI.$.isFunction(options) ? {}:options);

        var modal = UI.modal.dialog(([
            '<div class="uk-margin uk-modal-content">'+String(content)+'</div>',
            '<div class="uk-modal-footer uk-text-right"><button class="uk-button js-modal-confirm-cancel">'+options.labels.Cancel+'</button> <button class="uk-button uk-button-primary js-modal-confirm">'+options.labels.Ok+'</button></div>'
        ]).join(""), options);

        modal.element.find(".js-modal-confirm, .js-modal-confirm-cancel").on("click", function(){
            UI.$(this).is('.js-modal-confirm') ? onconfirm() : oncancel();
            modal.hide();
        });

        modal.on('show.uk.modal', function(){
            setTimeout(function(){
                modal.element.find('.js-modal-confirm').focus();
            }, 50);
        });

        return modal.show();
    };

    UI.modal.prompt = function(text, value, onsubmit, options) {

        onsubmit = UI.$.isFunction(onsubmit) ? onsubmit : function(value){};
        options  = UI.$.extend(true, {bgclose:false, keyboard:false, modal:false, labels:UI.modal.labels}, options);

        var modal = UI.modal.dialog(([
            text ? '<div class="uk-modal-content uk-form">'+String(text)+'</div>':'',
            '<div class="uk-margin-small-top uk-modal-content uk-form"><p><input type="text" class="uk-width-1-1"></p></div>',
            '<div class="uk-modal-footer uk-text-right"><button class="uk-button uk-modal-close">'+options.labels.Cancel+'</button> <button class="uk-button uk-button-primary js-modal-ok">'+options.labels.Ok+'</button></div>'
        ]).join(""), options),

        input = modal.element.find("input[type='text']").val(value || '').on('keyup', function(e){
            if (e.keyCode == 13) {
                modal.element.find('.js-modal-ok').trigger('click');
            }
        });

        modal.element.find('.js-modal-ok').on('click', function(){
            if (onsubmit(input.val())!==false){
                modal.hide();
            }
        });

        return modal.show();
    };

    UI.modal.blockUI = function(content, options) {

        var modal = UI.modal.dialog(([
            '<div class="uk-margin uk-modal-content">'+String(content || '<div class="uk-text-center">...</div>')+'</div>'
        ]).join(""), UI.$.extend({bgclose:false, keyboard:false, modal:false}, options));

        modal.content = modal.element.find('.uk-modal-content:first');

        return modal.show();
    };

    UI.modal.labels = {
        Ok: 'Ok',
        Cancel: 'Cancel'
    };

    // helper functions
    function setContent(content, modal){

        if(!modal) return;

        if (typeof content === 'object') {

            // convert DOM object to a jQuery object
            content = content instanceof jQuery ? content : UI.$(content);

            if(content.parent().length) {
                modal.persist = content;
                modal.persist.data('modalPersistParent', content.parent());
            }
        }else if (typeof content === 'string' || typeof content === 'number') {
                // just insert the data as innerHTML
                content = UI.$('<div></div>').html(content);
        }else {
                // unsupported data type!
                content = UI.$('<div></div>').html('UIkit2.modal Error: Unsupported data type: ' + typeof content);
        }

        content.appendTo(modal.element.find('.uk-modal-dialog'));

        return modal;
    }

})(UIkit2);

(function(UI) {

    "use strict";

    UI.component('nav', {

        defaults: {
            toggle: '>li.uk-parent > a[href="#"]',
            lists: '>li.uk-parent > ul',
            multiple: false
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-nav]', context).each(function() {
                    var nav = UI.$(this);

                    if (!nav.data('nav')) {
                        var obj = UI.nav(nav, UI.Utils.options(nav.attr('data-uk-nav')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            this.on('click.uk.nav', this.options.toggle, function(e) {
                e.preventDefault();
                var ele = UI.$(this);
                $this.open(ele.parent()[0] == $this.element[0] ? ele : ele.parent("li"));
            });

            this.update();

            UI.domObserve(this.element, function(e) {
                if ($this.element.find($this.options.lists).not('[role]').length) {
                    $this.update();
                }
            });
        },

        update: function() {

            var $this = this;

            this.find(this.options.lists).each(function() {

                var $ele   = UI.$(this).attr('role', 'menu'),
                    parent = $ele.closest('li'),
                    active = parent.hasClass("uk-active");

                if (!parent.data('list-container')) {
                    $ele.wrap('<div style="overflow:hidden;height:0;position:relative;"></div>');
                    parent.data('list-container', $ele.parent()[active ? 'removeClass':'addClass']('uk-hidden'));
                }

                // Init ARIA
                parent.attr('aria-expanded', parent.hasClass("uk-open"));

                if (active) $this.open(parent, true);
            });
        },

        open: function(li, noanimation) {

            var $this = this, element = this.element, $li = UI.$(li), $container = $li.data('list-container');

            if (!this.options.multiple) {

                element.children('.uk-open').not(li).each(function() {

                    var ele = UI.$(this);

                    if (ele.data('list-container')) {
                        ele.data('list-container').stop().animate({height: 0}, function() {
                            UI.$(this).parent().removeClass('uk-open').end().addClass('uk-hidden');
                        });
                    }
                });
            }

            $li.toggleClass('uk-open');

            // Update ARIA
            $li.attr('aria-expanded', $li.hasClass('uk-open'));

            if ($container) {

                if ($li.hasClass('uk-open')) {
                    $container.removeClass('uk-hidden');
                }

                if (noanimation) {

                    $container.stop().height($li.hasClass('uk-open') ? 'auto' : 0);

                    if (!$li.hasClass('uk-open')) {
                        $container.addClass('uk-hidden');
                    }

                    this.trigger('display.uk.check');

                } else {

                    $container.stop().animate({
                        height: ($li.hasClass('uk-open') ? getHeight($container.find('ul:first')) : 0)
                    }, function() {

                        if (!$li.hasClass('uk-open')) {
                            $container.addClass('uk-hidden');
                        } else {
                            $container.css('height', '');
                        }

                        $this.trigger('display.uk.check');
                    });
                }
            }
        }
    });


    // helper

    function getHeight(ele) {

        var $ele = UI.$(ele), height = 'auto';

        if ($ele.is(':visible')) {
            height = $ele.outerHeight();
        } else {

            var tmp = {
                position: $ele.css('position'),
                visibility: $ele.css('visibility'),
                display: $ele.css('display')
            };

            height = $ele.css({position: 'absolute', visibility: 'hidden', display: 'block'}).outerHeight();

            $ele.css(tmp); // reset element
        }

        return height;
    }

})(UIkit2);

(function(UI) {

    "use strict";

    var scrollpos = {x: window.scrollX, y: window.scrollY},
        $win      = UI.$win,
        $doc      = UI.$doc,
        $html     = UI.$html,
        Offcanvas = {

        show: function(element, options) {

            element = UI.$(element);

            if (!element.length) return;

            options = UI.$.extend({mode: 'push'}, options);

            var $body     = UI.$('body'),
                bar       = element.find('.uk-offcanvas-bar:first'),
                rtl       = (UI.langdirection == 'right'),
                flip      = bar.hasClass('uk-offcanvas-bar-flip') ? -1:1,
                dir       = flip * (rtl ? -1 : 1),

                scrollbarwidth =  window.innerWidth - $body.width();

            scrollpos = {x: window.pageXOffset, y: window.pageYOffset};

            bar.attr('mode', options.mode);
            element.addClass('uk-active');

            $body.css({width: window.innerWidth - scrollbarwidth, height: window.innerHeight}).addClass('uk-offcanvas-page');

            if (options.mode == 'push' || options.mode == 'reveal') {
                $body.css((rtl ? 'margin-right' : 'margin-left'), (rtl ? -1 : 1) * (bar.outerWidth() * dir));
            }

            if (options.mode == 'reveal') {
                bar.css('clip', 'rect(0, '+bar.outerWidth()+'px, 100vh, 0)');
            }

            $html.css('margin-top', scrollpos.y * -1).width(); // .width() - force redraw


            bar.addClass('uk-offcanvas-bar-show');

            this._initElement(element);

            bar.trigger('show.uk.offcanvas', [element, bar]);

            // Update ARIA
            element.attr('aria-hidden', 'false');
        },

        hide: function(force) {

            var $body = UI.$('body'),
                panel = UI.$('.uk-offcanvas.uk-active'),
                rtl   = (UI.langdirection == 'right'),
                bar   = panel.find('.uk-offcanvas-bar:first'),
                finalize = function() {
                    $body.removeClass('uk-offcanvas-page').css({width: '', height: '', marginLeft: '', marginRight: ''});
                    panel.removeClass('uk-active');

                    bar.removeClass('uk-offcanvas-bar-show');
                    $html.css('margin-top', '');
                    window.scrollTo(scrollpos.x, scrollpos.y);
                    bar.trigger('hide.uk.offcanvas', [panel, bar]);

                    // Update ARIA
                    panel.attr('aria-hidden', 'true');
                };

            if (!panel.length) return;
            if (bar.attr('mode') == 'none') force = true;

            if (UI.support.transition && !force) {

                $body.one(UI.support.transition.end, function() {
                    finalize();
                }).css((rtl ? 'margin-right' : 'margin-left'), '');

                if (bar.attr('mode') == 'reveal') {
                    bar.css('clip', '');
                }

                setTimeout(function(){
                    bar.removeClass('uk-offcanvas-bar-show');
                }, 0);

            } else {
                finalize();
            }
        },

        _initElement: function(element) {

            if (element.data('OffcanvasInit')) return;

            element.on('click.uk.offcanvas swipeRight.uk.offcanvas swipeLeft.uk.offcanvas', function(e) {

                var target = UI.$(e.target);

                if (!e.type.match(/swipe/)) {

                    if (!target.hasClass('uk-offcanvas-close')) {
                        if (target.hasClass('uk-offcanvas-bar')) return;
                        if (target.parents('.uk-offcanvas-bar:first').length) return;
                    }
                }

                e.stopImmediatePropagation();
                Offcanvas.hide();
            });

            element.on('click', 'a[href*="#"]', function(e){

                var link = UI.$(this),
                    href = link.attr('href');

                if (href == '#') {
                    return;
                }

                UI.$doc.one('hide.uk.offcanvas', function() {

                    var target;

                    try {
                        target = UI.$(link[0].hash);
                    } catch (e){
                        target = '';
                    }

                    if (!target.length) {
                        target = UI.$('[name="'+link[0].hash.replace('#','')+'"]');
                    }

                    if (target.length && UI.Utils.scrollToElement) {
                        UI.Utils.scrollToElement(target, UI.Utils.options(link.attr('data-uk-smooth-scroll') || '{}'));
                    } else {
                        window.location.href = href;
                    }
                });

                Offcanvas.hide();
            });

            element.data('OffcanvasInit', true);
        }
    };

    UI.component('offcanvasTrigger', {

        boot: function() {

            // init code
            $html.on('click.offcanvas.uikit', '[data-uk-offcanvas]', function(e) {

                e.preventDefault();

                var ele = UI.$(this);

                if (!ele.data('offcanvasTrigger')) {
                    var obj = UI.offcanvasTrigger(ele, UI.Utils.options(ele.attr('data-uk-offcanvas')));
                    ele.trigger("click");
                }
            });

            $html.on('keydown.uk.offcanvas', function(e) {

                if (e.keyCode === 27) { // ESC
                    Offcanvas.hide();
                }
            });
        },

        init: function() {

            var $this = this;

            this.options = UI.$.extend({
                target: $this.element.is('a') ? $this.element.attr('href') : false,
                mode: 'push'
            }, this.options);

            this.on('click', function(e) {
                e.preventDefault();
                Offcanvas.show($this.options.target, $this.options);
            });
        }
    });

    UI.offcanvas = Offcanvas;

})(UIkit2);

(function(UI) {

    "use strict";

    var Animations;

    UI.component('switcher', {

        defaults: {
            connect   : false,
            toggle    : '>*',
            active    : 0,
            animation : false,
            duration  : 200,
            swiping   : true
        },

        animating: false,

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-switcher]', context).each(function() {
                    var switcher = UI.$(this);

                    if (!switcher.data('switcher')) {
                        var obj = UI.switcher(switcher, UI.Utils.options(switcher.attr('data-uk-switcher')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            this.on('click.uk.switcher', this.options.toggle, function(e) {
                e.preventDefault();
                $this.show(this);
            });

            if (!this.options.connect) {
                return;
            }

            this.connect = UI.$(this.options.connect);

            if (!this.connect.length) {
                return;
            }

            this.connect.on('click.uk.switcher', '[data-uk-switcher-item]', function(e) {

                e.preventDefault();

                var item = UI.$(this).attr('data-uk-switcher-item');

                if ($this.index == item) return;

                switch(item) {
                    case 'next':
                    case 'previous':
                        $this.show($this.index + (item=='next' ? 1:-1));
                        break;
                    default:
                        $this.show(parseInt(item, 10));
                }
            });

            if (this.options.swiping) {

                this.connect.on('swipeRight swipeLeft', function(e) {
                    e.preventDefault();
                    if (!window.getSelection().toString()) {
                        $this.show($this.index + (e.type == 'swipeLeft' ? 1 : -1));
                    }
                });
            }

            this.update();
        },

        update: function() {

            this.connect.children().removeClass('uk-active').attr('aria-hidden', 'true');

            var toggles = this.find(this.options.toggle),
                active  = toggles.filter('.uk-active');

            if (active.length) {
                this.show(active, false);
            } else {

                if (this.options.active===false) return;

                active = toggles.eq(this.options.active);
                this.show(active.length ? active : toggles.eq(0), false);
            }

            // Init ARIA for toggles
            toggles.not(active).attr('aria-expanded', 'false');
            active.attr('aria-expanded', 'true');
        },

        show: function(tab, animate) {

            if (this.animating) {
                return;
            }

            var toggles = this.find(this.options.toggle);

            if (isNaN(tab)) {
                tab = UI.$(tab);
            } else {
                tab = tab < 0 ? toggles.length-1 : tab;
                tab = toggles.eq(toggles[tab] ? tab : 0);
            }

            var $this     = this,
                active    = UI.$(tab),
                animation = Animations[this.options.animation] || function(current, next) {

                    if (!$this.options.animation) {
                        return Animations.none.apply($this);
                    }

                    var anim = $this.options.animation.split(',');

                    if (anim.length == 1) {
                        anim[1] = anim[0];
                    }

                    anim[0] = anim[0].trim();
                    anim[1] = anim[1].trim();

                    return coreAnimation.apply($this, [anim, current, next]);
                };

            if (animate===false || !UI.support.animation) {
                animation = Animations.none;
            }

            if (active.hasClass("uk-disabled")) return;

            // Update ARIA for Toggles
            toggles.attr('aria-expanded', 'false');
            active.attr('aria-expanded', 'true');

            toggles.filter(".uk-active").removeClass("uk-active");
            active.addClass("uk-active");

            if (this.options.connect && this.connect.length) {

                this.index = this.find(this.options.toggle).index(active);

                if (this.index == -1 ) {
                    this.index = 0;
                }

                this.connect.each(function() {

                    var container = UI.$(this),
                        children  = UI.$(container.children()),
                        current   = UI.$(children.filter('.uk-active')),
                        next      = UI.$(children.eq($this.index));

                        $this.animating = true;

                        animation.apply($this, [current, next]).then(function(){

                            current.removeClass("uk-active");
                            next.addClass("uk-active");

                            // Update ARIA for connect
                            current.attr('aria-hidden', 'true');
                            next.attr('aria-hidden', 'false');

                            UI.Utils.checkDisplay(next, true);

                            $this.animating = false;

                        });
                });
            }

            this.trigger("show.uk.switcher", [active]);
        }
    });

    Animations = {

        'none': function() {
            var d = UI.$.Deferred();
            d.resolve();
            return d.promise();
        },

        'fade': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-fade', current, next]);
        },

        'slide-bottom': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-slide-bottom', current, next]);
        },

        'slide-top': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-slide-top', current, next]);
        },

        'slide-vertical': function(current, next, dir) {

            var anim = ['uk-animation-slide-top', 'uk-animation-slide-bottom'];

            if (current && current.index() > next.index()) {
                anim.reverse();
            }

            return coreAnimation.apply(this, [anim, current, next]);
        },

        'slide-left': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-slide-left', current, next]);
        },

        'slide-right': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-slide-right', current, next]);
        },

        'slide-horizontal': function(current, next, dir) {

            var anim = ['uk-animation-slide-right', 'uk-animation-slide-left'];

            if (current && current.index() > next.index()) {
                anim.reverse();
            }

            return coreAnimation.apply(this, [anim, current, next]);
        },

        'scale': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-scale-up', current, next]);
        }
    };

    UI.switcher.animations = Animations;


    // helpers

    function coreAnimation(cls, current, next) {

        var d = UI.$.Deferred(), clsIn = cls, clsOut = cls, release;

        if (next[0]===current[0]) {
            d.resolve();
            return d.promise();
        }

        if (typeof(cls) == 'object') {
            clsIn  = cls[0];
            clsOut = cls[1] || cls[0];
        }

        UI.$body.css('overflow-x', 'hidden'); // fix scroll jumping in iOS

        release = function() {

            if (current) current.hide().removeClass('uk-active '+clsOut+' uk-animation-reverse');

            next.addClass(clsIn).one(UI.support.animation.end, function() {

                setTimeout(function () {
                    next.removeClass(''+clsIn+'').css({opacity:'', display:''});
                }, 0);

                d.resolve();

                UI.$body.css('overflow-x', '');

                if (current) current.css({opacity:'', display:''});

            }.bind(this)).show();
        };

        next.css('animation-duration', this.options.duration+'ms');

        if (current && current.length) {

            current.css('animation-duration', this.options.duration+'ms');

            current.css('display', 'none').addClass(clsOut+' uk-animation-reverse').one(UI.support.animation.end, function() {
                release();
            }.bind(this)).css('display', '');

        } else {
            next.addClass('uk-active');
            release();
        }

        return d.promise();
    }

})(UIkit2);

(function(UI) {

    "use strict";

    UI.component('tab', {

        defaults: {
            target    : '>li:not(.uk-tab-responsive, .uk-disabled)',
            connect   : false,
            active    : 0,
            animation : false,
            duration  : 200,
            swiping   : true
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-tab]', context).each(function() {

                    var tab = UI.$(this);

                    if (!tab.data('tab')) {
                        var obj = UI.tab(tab, UI.Utils.options(tab.attr('data-uk-tab')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            this.current = false;

            this.on('click.uk.tab', this.options.target, function(e) {

                e.preventDefault();

                if ($this.switcher && $this.switcher.animating) {
                    return;
                }

                var current = $this.find($this.options.target).not(this);

                current.removeClass('uk-active').blur();

                $this.trigger('change.uk.tab', [UI.$(this).addClass('uk-active'), $this.current]);

                $this.current = UI.$(this);

                // Update ARIA
                if (!$this.options.connect) {
                    current.attr('aria-expanded', 'false');
                    UI.$(this).attr('aria-expanded', 'true');
                }
            });

            if (this.options.connect) {
                this.connect = UI.$(this.options.connect);
            }

            // init responsive tab
            this.responsivetab = UI.$('<li class="uk-tab-responsive uk-active"><a></a></li>').append('<div class="uk-dropdown uk-dropdown-small"><ul class="uk-nav uk-nav-dropdown"></ul><div>');

            this.responsivetab.dropdown = this.responsivetab.find('.uk-dropdown');
            this.responsivetab.lst      = this.responsivetab.dropdown.find('ul');
            this.responsivetab.caption  = this.responsivetab.find('a:first');

            if (this.element.hasClass('uk-tab-bottom')) this.responsivetab.dropdown.addClass('uk-dropdown-up');

            // handle click
            this.responsivetab.lst.on('click.uk.tab', 'a', function(e) {

                e.preventDefault();
                e.stopPropagation();

                var link = UI.$(this);

                $this.element.children('li:not(.uk-tab-responsive)').eq(link.data('index')).trigger('click');
            });

            this.on('show.uk.switcher change.uk.tab', function(e, tab) {
                $this.responsivetab.caption.html(tab.text());
            });

            this.element.append(this.responsivetab);

            // init UIkit components
            if (this.options.connect) {

                this.switcher = UI.switcher(this.element, {
                    toggle    : '>li:not(.uk-tab-responsive)',
                    connect   : this.options.connect,
                    active    : this.options.active,
                    animation : this.options.animation,
                    duration  : this.options.duration,
                    swiping   : this.options.swiping
                });
            }

            UI.dropdown(this.responsivetab, {mode: 'click', preventflip: 'y'});

            // init
            $this.trigger('change.uk.tab', [this.element.find(this.options.target).not('.uk-tab-responsive').filter('.uk-active')]);

            this.check();

            UI.$win.on('resize orientationchange', UI.Utils.debounce(function(){
                if ($this.element.is(':visible'))  $this.check();
            }, 100));

            this.on('display.uk.check', function(){
                if ($this.element.is(':visible'))  $this.check();
            });
        },

        check: function() {

            var children = this.element.children('li:not(.uk-tab-responsive)').removeClass('uk-hidden');

            if (!children.length) {
                this.responsivetab.addClass('uk-hidden');
                return;
            }

            var top          = (children.eq(0).offset().top + Math.ceil(children.eq(0).height()/2)),
                doresponsive = false,
                item, link, clone;

            this.responsivetab.lst.empty();

            children.each(function(){

                if (UI.$(this).offset().top > top) {
                    doresponsive = true;
                }
            });

            if (doresponsive) {

                for (var i = 0; i < children.length; i++) {

                    item  = UI.$(children.eq(i));
                    link  = item.find('a');

                    if (item.css('float') != 'none' && !item.attr('uk-dropdown')) {

                        if (!item.hasClass('uk-disabled')) {

                            clone = UI.$(item[0].outerHTML);
                            clone.find('a').data('index', i);

                            this.responsivetab.lst.append(clone);
                        }

                        item.addClass('uk-hidden');
                    }
                }
            }

            this.responsivetab[this.responsivetab.lst.children('li').length ? 'removeClass':'addClass']('uk-hidden');
        }
    });

})(UIkit2);

(function(UI){

    "use strict";

    UI.component('cover', {

        defaults: {
            automute : true
        },

        boot: function() {

            // auto init
            UI.ready(function(context) {

                UI.$('[data-uk-cover]', context).each(function(){

                    var ele = UI.$(this);

                    if(!ele.data('cover')) {
                        var plugin = UI.cover(ele, UI.Utils.options(ele.attr('data-uk-cover')));
                    }
                });
            });
        },

        init: function() {

            this.parent = this.element.parent();

            UI.$win.on('load resize orientationchange', UI.Utils.debounce(function(){
                this.check();
            }.bind(this), 100));

            this.on('display.uk.check', function(e) {
                if (this.element.is(':visible')) this.check();
            }.bind(this));

            this.check();

            if (this.element.is('iframe') && this.options.automute) {

                var src = this.element.attr('src');

                this.element.attr('src', '').on('load', function(){
                    this.contentWindow.postMessage('{ "event": "command", "func": "mute", "method":"setVolume", "value":0}', '*');
                }).attr('src', [src, (src.indexOf('?') > -1 ? '&':'?'), 'enablejsapi=1&api=1'].join(''));
            }
        },

        check: function() {

            this.element.css({ width  : '', height : '' });

            this.dimension = {w: this.element.width(), h: this.element.height()};

            if (this.element.attr('width') && !isNaN(this.element.attr('width'))) {
                this.dimension.w = this.element.attr('width');
            }

            if (this.element.attr('height') && !isNaN(this.element.attr('height'))) {
                this.dimension.h = this.element.attr('height');
            }

            this.ratio = this.dimension.w / this.dimension.h;

            var w = this.parent.width(), h = this.parent.height(), width, height;

            // if element height < parent height (gap underneath)
            if ((w / this.ratio) < h) {

                width  = Math.ceil(h * this.ratio);
                height = h;

            // element width < parent width (gap to right)
            } else {

                width  = w;
                height = Math.ceil(w / this.ratio);
            }

            this.element.css({ width  : width, height : height });
        }
    });

})(UIkit2);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/app.js":[function(require,module,exports){
window.$ = window.jQuery = require('./vendor/jquery');

// vendor
require('svg4everybody')();
require('uikit');

// require('./vendor/uikit/uikit.min');
require('./vendor/uikit/modal.min');
require('./vendor/uikit/lightbox.min');
require('./vendor/uikit/accordion.min');
require('./vendor/uikit/slider.min');
require('./vendor/uikit/slideset.min');
require('./vendor/uikit/slideshow.min');
require('./vendor/uikit/sticky.min');
require('./vendor/uikit/tooltip.min');

require('./vendor/owl.carousel');
// require('select2');
require('./vendor/picturefill.min');

// modules
require('./components/changer');
require('./components/slideshow');
require('./components/video');
require('./components/filter-accordion');
require('./components/sticky-header');
require('./components/sticky-submenu');
require('./components/onepager');
require('./components/smooth-scroll');
require('./components/clearable-input');
require('./components/OwlControl');
require('./components/events');
require('./components/formhandler');
require('./components/sharer');
require('./components/table');
require('./components/toggle-download-button');
require('./components/masonry-layout');

// don't upload!
// require('./vendor/configurator');


// needs refactor
require('./shame');

},{"./components/OwlControl":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/OwlControl.js","./components/changer":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/changer.js","./components/clearable-input":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/clearable-input.js","./components/events":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/events.js","./components/filter-accordion":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/filter-accordion.js","./components/formhandler":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/formhandler.js","./components/masonry-layout":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/masonry-layout.js","./components/onepager":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/onepager.js","./components/sharer":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sharer.js","./components/slideshow":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/slideshow.js","./components/smooth-scroll":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/smooth-scroll.js","./components/sticky-header":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sticky-header.js","./components/sticky-submenu":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sticky-submenu.js","./components/table":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/table.js","./components/toggle-download-button":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/toggle-download-button.js","./components/video":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/video.js","./shame":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/shame.js","./vendor/jquery":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/jquery.js","./vendor/owl.carousel":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/owl.carousel.js","./vendor/picturefill.min":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/picturefill.min.js","./vendor/uikit/accordion.min":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/accordion.min.js","./vendor/uikit/lightbox.min":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/lightbox.min.js","./vendor/uikit/modal.min":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/modal.min.js","./vendor/uikit/slider.min":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slider.min.js","./vendor/uikit/slideset.min":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slideset.min.js","./vendor/uikit/slideshow.min":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slideshow.min.js","./vendor/uikit/sticky.min":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/sticky.min.js","./vendor/uikit/tooltip.min":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/tooltip.min.js","svg4everybody":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/svg4everybody/dist/svg4everybody.js","uikit":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/uikit/dist/js/uikit.js"}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/OwlControl.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    /*
     * Constructor
     */

    var OwlControl = function (element, options) {

        this.element = element;

        this.$element = $(element);

        this.options = options;

        this.metaOptions = this.$element.data('owlcontrol');

        this.settings = $.extend({}, OwlControl.Defaults, this.options, this.metaOptions);
    };

    /*
     * Defaults
     */
    OwlControl.Defaults = {};

    /*
     * Initialize
     */
    OwlControl.prototype.initialize = function () {
        // console.log('initializing OwlControl');

        // console.log(this.settings);

        this.$element.owlCarousel(this.settings);
    };

    /*
     * jQuery Plugin Register
     */
    $.fn.owlControl = function (options) {
        return this.each(function () {
            new OwlControl(this, options).initialize();
        });
    };
})(jQuery, window, window.document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/changer.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var Changer = function (element, options) {
        var $this = $(this),
            _this = this;

        this.element = $(element);
        this.options = $.extend({}, this.defaults, options);

        this.element.on('mouseenter', function (e) {
            _this.changeMedia();
        });
    };

    $.extend(Changer.prototype, {

        defaults: {},

        changeMedia: function () {
            this.element.parents('.js-panel-story').find('picture source:first-child').attr('srcset', this.options.src);
        }

    });

    // init
    $(function () {
        $('[data-changer]').each(function () {
            var changer = $(this);
            new Changer(changer, transformOptions(changer.data('changer')));
        });
    });

    // helper
    var transformOptions = function (string) {

        if ($.isPlainObject(string)) return string;

        var start = string.indexOf("{"),
            options = {};

        if (start != -1) {
            try {
                options = new Function("", "var json = " + string.substr(start) + "; return JSON.parse(JSON.stringify(json));")();
            } catch (e) {}
        }

        return options;
    };
})(jQuery, window, window.document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/clearable-input.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var $element = $('.js-clearable-input'),
        defaults = {
        "submitonclick": false
    };

    $element.each(function () {
        var $this = $(this),
            options = $this.attr('data-clearable') ? JSON.parse($this.attr('data-clearable')) : {},
            settings = $.extend(true, {}, defaults, options);

        $this.wrap('<span class="tm-input tm-input--with-clear-icon" />').after($('<span />').on('click', function () {
            $(this).prev('input').val('').focus();

            if (settings.submitonclick) {
                var $form = $this.closest('form');

                if ($form.length) {
                    $form.submit();
                }
            }
        }));
    });
})(jQuery, window, window.document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/events.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var $eventsContainer = $('.js-event-list-container');
    var $filterButton = $('.js-filter-event-list');
    var buttonActive = 'tm-button-basic--active';

    var $eventsCategory = $('[data-filter-type="category"]');
    var $eventsLocation = $('[data-filter-type="location"]');

    //var filterUrl = 'http://kisk-mennekes-www-20151019-relaunch.10.6.0.109.xip.io:8888/schulungen/filter/';
    var filterUrlController = '?tx_sfeventmgt_pievent[action]=list&tx_sfeventmgt_pievent[controller]=Event';
    var filterUrlDemandCategory = '&tx_sfeventmgt_pievent[overwriteDemand][category]=';
    var filterUrlDemandLocation = '&tx_sfeventmgt_pievent[overwriteDemand][location]=';

    function handleEvents() {

        $('.js-tm-form-set-label').on('blur', function () {
            if ($(this).val()) {
                $(this).removeClass('is-empty');
            } else {
                $(this).addClass('is-empty');
            }
        });

        $('.js-filter-event-list-mobile').on('select2:select', function (e) {
            var url = filterUrl + filterUrlController;

            var demandCategory = $('.js-filter-event-list-mobile[data-filter-type="category"]').select2().find(":selected").data("uid");
            if (demandCategory) {
                url += filterUrlDemandCategory + demandCategory;
            }

            var demandLocation = $('.js-filter-event-list-mobile[data-filter-type="category"]').select2().find(":selected").data("uid");
            if (demandLocation) {
                url += filterUrlDemandLocation + demandLocation;
            }

            getData(url);
        });

        $('.js-filter-event-list').on('click', function filterButton(e) {
            e.preventDefault();
            var button = $(this);
            var url = filterUrl + filterUrlController;
            var arrDemandCategory = [];
            var arrDemandLocation = [];

            if (button.parents('[data-filter-type]').data('filterType') == 'category') {
                $eventsCategory.find('a').removeClass(buttonActive);
                button.addClass(buttonActive);
            }

            if (button.parents('[data-filter-type]').data('filterType') == 'location') {
                $eventsLocation.find('a').not($(this)).removeClass(buttonActive);
                button.toggleClass(buttonActive);
            }

            $eventsCategory.find('.' + buttonActive).each(function (i, e) {
                if ($(e).data('id')) {
                    arrDemandCategory[i] = $(e).data('id');
                }
            });

            $eventsLocation.find('.' + buttonActive).each(function (i, e) {
                if ($(e).data('id')) {
                    arrDemandLocation[i] = $(e).data('id');
                }
            });

            if (arrDemandCategory.length > 0) {
                url += filterUrlDemandCategory + arrDemandCategory.join(',');
            }

            if (arrDemandLocation.length > 0) {
                url += filterUrlDemandLocation + arrDemandLocation.join(',');
            }

            if (arrDemandCategory.length == 0 && arrDemandLocation.length > 0) {
                $('.js-filter-event-list-all').removeClass(buttonActive);
            }

            if (arrDemandCategory.length == 0 && arrDemandLocation.length == 0) {
                $('.js-filter-event-list-all').trigger('click');
                return;
            }

            getData(url);
        });

        $('.js-filter-event-list-all').on('click', function filterButton(e) {
            e.preventDefault();
            var url = $(this).attr('href');

            $filterButton.removeClass(buttonActive);
            $(this).addClass(buttonActive);

            getData(url);
        });

        if ($('.tm-block--mobile-sticky').length) {

            var scrollTimeout;
            var throttle = 100;
            $(window).on('scroll resize', function () {
                if (!scrollTimeout) {
                    if ($(window).width() < 768) {

                        scrollTimeout = setTimeout(function () {
                            if (isInViewport($('.js-events-sticky-trigger'))) {
                                $('.tm-block--mobile-sticky').addClass('tm-block--mobile-sticky--unset');
                            } else {
                                $('.tm-block--mobile-sticky').removeClass('tm-block--mobile-sticky--unset');
                            }
                            scrollTimeout = null;
                        }, throttle);
                    } else {
                        $('.tm-block--mobile-sticky').addClass('tm-block--mobile-sticky--unset');
                    }
                }
            });
        }

        if ($('.js-scroll-to-error').find('.f3-form-error').length > 0) {

            setTimeout(function scrollToError() {
                var scrollToErrorPosition = $('.js-scroll-to-error').first('.f3-form-error').offset().top;
                $('html, body').animate({
                    scrollTop: scrollToErrorPosition
                }, 1000);
            }, 750);
        }
    }

    function getData(url) {
        var _this = this;

        ajaxData(url).then(function (data) {

            var firstRun = 1;

            $eventsContainer.addClass('tm-events-overview__container--fade-out');
            $eventsContainer.one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function (e) {
                if (!firstRun) {
                    return;
                }

                var events = $(data).find('.js-event-list');
                firstRun = 0;

                $('.js-event-list').remove();
                $eventsContainer.append(events);

                $(this).removeClass('tm-events-overview__container--fade-out');
            });

            window.history.pushState(null, null, $(_this).attr('href'));
        }).catch(function (err) {});
    }

    function ajaxData(url) {
        return new Promise(function (resolve, reject) {
            var req = new XMLHttpRequest();
            req.open('GET', url);
            req.onload = function () {
                return req.status === 200 ? resolve(req.response) : reject(Error(req.statusText));
            };
            req.onerror = function (e) {
                return reject(Error('Network Error: ' + e));
            };
            req.send();
        });
    }

    function setButtonState(button) {
        $filterButton.removeClass(buttonActive);
        button.addClass(buttonActive);
    }

    function isInViewport(element) {
        var elementTop = $(element).offset().top;
        var elementBottom = elementTop + $(element).outerHeight();
        var viewportTop = $(window).scrollTop();
        var viewportBottom = viewportTop + $(window).height();
        return elementBottom > viewportTop && elementTop < viewportBottom;
    }

    handleEvents();
})(jQuery, window, window.document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/filter-accordion.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var accordionEnabled = false;
    var accordion = null;

    function checkMediaQuery() {
        return window.matchMedia("(min-width: 768px)").matches;
    }

    function checkAccordion() {
        if (checkMediaQuery()) {
            disableAccordion();
        } else {
            enableAccordion();
        }
    }

    function disableAccordion() {

        // console.log('disableAccordion because min-width is 768px');

        if (accordionEnabled) {
            $('.js-filter-accordion').off('click.uk.accordion');
            $('.js-filter-accordion .uk-accordion-title').removeClass('uk-active');
            $('.js-filter-accordion .uk-accordion-content').unwrap().removeClass('uk-active');

            accordion = null;
            accordionEnabled = false;
        }
    }

    function enableAccordion() {
        // console.log('enableAccordion because max-width is 767px');

        if (!accordionEnabled) {
            accordion = UIkit.accordion($('.js-filter-accordion'), { collapse: false });
            accordionEnabled = true;

            // console.log(accordion);
        }
    }

    $('.js-filter-accordion').find('.tm-tooltip-icon').on('click', function (e) {
        e.preventDefault();
        return false;
    });

    UIkit.on('afterready.uk.dom', function () {
        if ($('.js-filter-accordion').length) {
            checkAccordion();
        }

        $(window).on('resize orientationchange', UIkit.Utils.debounce(function (event) {
            if ($('.js-filter-accordion').length) {
                checkAccordion();
            }
        }, 100));

        $('html').on('update.filter.accordion', function () {
            // console.log('update.filter.accordion');

            if ($('.js-filter-accordion').length) {
                accordionEnabled = false; // reinit after ajax
                checkAccordion();
            }
        });
    });
})(jQuery, window, window.document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/formhandler.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var scrollToFormError = function () {

        var container = $('.js-scroll-to-error');
        var anchor = $('.js-scroll-to-anchor');
        var error = '.invalid';

        function init() {
            if (container.find(error).length > 0) {
                setTimeout(function () {
                    $('body, html').animate({
                        scrollTop: anchor.offset().top
                    }, 500);
                }, 300);
            }
        }

        return {
            init: init
        };
    }();

    var validateContactForm = function () {

        var container = $('#contact-form');
        var errorClass = 'invalid';

        function init() {

            container.find('.js-submit-form').on('click', function (e) {
                e.preventDefault();

                container.find('.validationWrapper').removeClass(errorClass);

                var required = container.find('.required');
                $.each(required, function () {
                    if (!$(this).val()) {
                        $(this).parents('.validationWrapper').addClass(errorClass);
                    }
                });

                if (container.find('.' + errorClass).length < 1) {
                    grecaptcha.execute();
                }
            });
        }

        return {
            init: init
        };
    }();

    scrollToFormError.init();
    validateContactForm.init();
})(jQuery, window, window.document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/masonry-layout.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var imagesLoaded = require('imagesloaded');
    var Masonry = require('masonry-layout');
    var grid = document.querySelector('.js-msnry-grid');
    var msnry;

    if (!grid) {
        return;
    }

    imagesLoaded(grid, function () {
        msnry = new Masonry(grid, {
            gutter: 10,
            itemSelector: '.msnry-grid__item',
            columnWidth: '.msnry-grid__sizer',
            percentPosition: true
        });
    });
})(jQuery, window, window.document);

},{"imagesloaded":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/imagesloaded/imagesloaded.js","masonry-layout":"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/masonry.js"}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/onepager.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var init = null;
    var $element = $('.js-sticky-cta');

    function stickyCTA() {

        function init() {
            return UIkit.sticky($element, { top: 200 });
        }

        $element.on({
            'active.uk.sticky': function () {
                $element.css({ top: 'inherit', bottom: 0 });
                $('body').addClass('sticky-cta');
            },
            'inactive.uk.sticky': function () {
                $element.css({ top: '', bottom: '' });
                $('body').removeClass('sticky-cta');
            }
        });

        $(window).on('scroll load', function (event) {

            var top = $(document).scrollTop() + $(window).height();
            var footer = $(document).outerHeight() - $('.tm-footer').outerHeight();

            if (!$element.hasClass('uk-active')) {
                $element.css({ top: '', position: '' });
                return;
            }

            if (top >= footer) {
                $element.css({
                    top: footer - $element.outerHeight() - $('.js-sticky-header').outerHeight(),
                    bottom: '',
                    position: 'absolute'
                });
            } else {
                $element.css({
                    bottom: 0,
                    top: 'inherit',
                    // top: $(window).height() - $element.outerHeight(),
                    position: 'fixed'
                });
            }
        });

        init = init();
    }

    /*
     * Tabs sizer
    **/
    function tmTabs() {
        var container = $('.js-tm-tabs-inner');
        var elems = container.find('.tm-tabs-card');
        var containerW = 0;

        elems.each(function (i, e) {
            containerW += $(e).outerWidth(true);
        });
        container.css({ width: containerW });
        container.parents('.uk-sticky-placeholder').css({ height: container.find('.tm-tabs-card').first().outerHeight(true) });
    }

    $(window).on('resize', function () {
        var container = $('.js-tm-tabs-inner');
        var elems = container.find('.tm-tabs-card');
        var containerW = 0;
        container.css({ width: 1400 });

        setTimeout(function () {
            elems.each(function (i, e) {
                containerW += $(e).outerWidth(true);
            });
            container.css({ width: containerW });
        }, 250);
    });

    var stickyCTA = stickyCTA();
    var tmTabs = tmTabs();
})(jQuery, window, window.document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sharer.js":[function(require,module,exports){
/*
Possible Fields:
	uri     Alias: url, Fallback: location.href
	title   Fallback: og:title, <title>
	message Fallback: field title
	image   Fallback: og:image

All fields can be defined at a specific sharer or at the parent element as data tag:
<ul class="sharer" data-title="Sharer title" data-message="Full sharing message">
	<li class="twitter" data-message="Short twitter message"></li>
	<li class="facebook"></li>
</ul>

Sharers with used fields:
	facebook:   title, uri
	twitter:    message, uri
	googleplus: uri
	pinterest:  uri, image, message
	mail:       title, message, uri	- use &#10; für line breaks in message

*/
(function ($, window, document, undefined) {
  'use strict';

  var getter = {};

  getter.uri = function getUri(el) {
    var uri;

    uri = uri || el.data('uri');
    uri = uri || el.data('url');
    uri = uri || el.closest('.sharer').data('uri');
    uri = uri || el.closest('.sharer').data('url');
    uri = uri || location.href;

    return uri;
  };

  getter.title = function getTitle(el) {
    var title;

    title = title || el.data('title');
    title = title || el.closest('.sharer').data('title');
    title = title || $('meta[property="og:title"]').prop('content');
    title = title || $('title').text();

    return title;
  };

  getter.message = function getMessage(el) {
    var message;

    message = message || el.data('message');
    message = message || el.closest('.sharer').data('message');
    message = message || getter.title(el);

    return message;
  };

  getter.image = function getMessage(el) {
    var image;

    image = image || el.data('image');
    image = image || el.closest('.sharer').data('image');
    image = image || $('meta[property="og:image"]').prop('content');

    return image;
  };

  function popup(uri, width, height) {
    open(uri, 'sharer', 'width=' + width + ',height=' + height);
  }

  var shareHandlers = {
    facebook: {
      uri: 'https://www.facebook.com/sharer/sharer.php?u=%uri%&p[title]=%title%&display=popup',
      replacements: ['title', 'uri'],
      width: 650,
      height: 320
    },
    twitter: {
      uri: 'https://twitter.com/intent/tweet?text=%message%&url=%uri%',
      replacements: ['message', 'uri'],
      width: 520,
      height: 260
    },
    googleplus: {
      uri: 'https://plus.google.com/share?url=%uri%',
      replacements: ['uri'],
      width: 510,
      height: 390
    },
    pinterest: {
      uri: 'http://pinterest.com/pin/create/button/?url=%uri%&media=%image%&description=%message%',
      replacements: ['uri', 'image', 'message'],
      width: 510,
      height: 390
    },
    mail: {
      uri: 'mailto:?subject=%title%&body=%message% %uri%',
      replacements: ['title', 'message', 'uri'],
      handler: function (uri) {
        location.href = uri;
      }
    }
  };

  var init = function initSharer() {
    $.each(shareHandlers, function (name, values) {
      $('body').on('click touchend', '.sharer .' + name, function (e) {
        e.preventDefault();
        var el = $(this);
        var uri = values.uri;
        $.each(values.replacements, function (k, v) {
          uri = uri.replace(new RegExp('%' + v + '%'), encodeURIComponent(getter[v](el)));
        });
        var handler = values.handler || popup;
        handler(uri, values.width, values.height);
      });
    });
  };

  var self = {
    init: init,
    getter: getter,
    popup: popup,
    handlers: shareHandlers
  };

  self.init();
})(jQuery, window, window.document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/slideshow.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    // on slide change reset video inside last slide

    $('[data-uk-slideshow]').on('show.uk.slideshow', function (event, nextSlide, currentSlide) {
        var $slide = $(currentSlide),
            $video = $slide.find('video'),
            $videoContainer = $slide.find('.js-video'),
            $playControl = $slide.find('.js-video-play'),
            $pauseControl = $slide.find('.js-video-pause'),
            $muteControl = $slide.find('.js-video-mute');

        if ($video.length > 0) {
            $video.css('display', 'none');
            $video[0].pause();
            $videoContainer.removeClass('tm-video--is-playing');

            $pauseControl.css('display', 'none');
            $muteControl.css('display', 'none');
            $playControl.css('display', 'inline-block');

            $video[0].currentTime = 0;
        }
    });

    function capitalizeHeadlines() {
        var headlines = document.querySelectorAll('.fancy-headline');

        headlines.forEach(function (element) {

            var str = element.innerHTML;
            var letters = str.split('');
            var output = '';

            for (var i = 0; i < letters.length; i++) {

                if (isUpperCase(letters[i])) {
                    output += '<span class="cap">' + letters[i] + '</span>';
                } else {
                    output += letters[i];
                }
            }

            element.innerHTML = output;
        });
    }

    function isUpperCase(char) {
        return char == char.toUpperCase() && char != char.toLowerCase();
    }

    capitalizeHeadlines();
})(jQuery, window, window.document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/smooth-scroll.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var smoothScroller = null,
        $element = $('.js-smooth-scroll');

    $element.each(function () {
        var $this = $(this);

        $this.on('click', function () {
            var offsetAdd = 0;

            if ($(window).width() < 960) {
                offsetAdd = $('#tm-header').outerHeight();
            } else {
                offsetAdd = $('#tm-header').outerHeight() / 2;
            }

            var offset = $this.parents('.tm-block').outerHeight() + offsetAdd;

            $("html,body").stop().animate({ scrollTop: offset }, 1000, 'easeOutExpo');
        });
    });
})(jQuery, window, window.document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sticky-header.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var stickyHeader = null,
        $element = $('.js-sticky-header'),
        $header = $element.find('.tm-header'),
        $mobileMenu = $('#tm-menu-mobile'),
        $mobileMenuHook = $('.js-sticky-mobile-menu'),
        mobileMenuIsClosed = $mobileMenu.hasClass('tm-menu-mobile--is-closed'),
        shrinkTriggerOffset = 108,
        placeholderMinHeight = 62;

    function isMobile() {
        return !window.matchMedia('(min-width: 960px)').matches;
    }

    function onScrollShrink() {
        var scrollTop = $(window).scrollTop(),
            shrinkOn = shrinkTriggerOffset,
            clsactive = 'tm-header--small';

        if (scrollTop > shrinkOn) {
            $header.addClass(clsactive);
        } else {
            $header.removeClass(clsactive);
        }
    }

    function onMobileMenuClick() {
        // console.log('onMobileMenuClick');
        mobileMenuIsClosed = !mobileMenuIsClosed;

        $element.css({
            'position': 'fixed',
            'top': 0,
            'width': $(window).width()
        }).addClass('uk-active');

        if (mobileMenuIsClosed) {
            $element.css({
                'height': 'auto',
                'overflow-y': 'visible'
            });

            $('body, html').removeClass('js-disabled-scrolling');
        } else {
            $element.css({
                'height': '100%',
                'overflow-y': 'scroll'
            });

            $('body, html').addClass('js-disabled-scrolling');
        }

        stickyHeader.sticky.options.showup = mobileMenuIsClosed;
    }

    function recalcWrapperHeight() {
        var placeholderHeight = $element.outerHeight() > placeholderMinHeight ? $element.outerHeight() : placeholderMinHeight;
        $element.parent().height(placeholderHeight);
    }

    function initSticky() {
        var options = {
            animation: 'uk-animation-slide-top'
        };

        if (!isMobile()) {
            $(window).on('scroll', onScrollShrink);
        }

        $mobileMenuHook.on('click', onMobileMenuClick);

        return UIkit.sticky($element, options);
    }

    $(window).on('resize', UIkit.Utils.debounce(function (event) {

        // console.log('stateIsMobile', isMobile());
        // console.log('stickyHeader.options.showup', stickyHeader.options.showup);
        // console.log('stickyHeader.options.showup !== stateIsMobile', stickyHeader.options.showup !== isMobile());

        // if mobile (< 960px), remove listener for header shrinking and activate showup feature
        if (isMobile()) {
            $(window).off('scroll', onScrollShrink);

            if ($header.hasClass('tm-header--small')) {
                $header.removeClass('tm-header--small');
            }
        } else {
            $(window).on('scroll', onScrollShrink);
            onScrollShrink();
        }

        recalcWrapperHeight();
    }, 200));

    stickyHeader = initSticky();

    $(document).on('touchmove', '.js-disabled-scrolling', function (event) {
        var menuHeight = $mobileMenu.outerHeight() + $('#tm-header').outerHeight(),
            viewportHeight = $(window).outerHeight();

        if (menuHeight < viewportHeight) {
            event.preventDefault();
        }
    });
})(jQuery, window, window.document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sticky-submenu.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var init = null;
    var offsetTop = null;
    var $submenu = $('.js-sticky-submenu');
    var $tabmenu = $('.js-sticky-tabmenu');
    var $header = $('.js-sticky-header .tm-header');
    var offsetTopMedium = 102;
    var offsetTopSmall = 62;

    // Slide to anchor
    $('.js-section-menu a').on('click', function (e) {
        e.preventDefault();

        var href = $(this).attr('href');

        if ($(this).hasClass('js-link') || href.indexOf('#') == '-1') {
            window.location = $(this).attr('href');
        } else {
            var aTag = $($(this).attr('href'));

            $(this).closest('ul').find('.active').removeClass('active');
            $(this).closest('li').addClass('active');

            scrollTop(aTag);
        }
    });

    $('.js-section-menu-mobile').on('select2:selecting', function (e) {
        var aTag = $($('.js-section-menu-mobile').find('option:selected').attr('data-href'));

        if ($(this).find(":selected").hasClass('js-link')) {
            window.location = $(this).find(":selected").data('href');
        } else {
            scrollTop(aTag);
        }
    });

    function scrollTop(aTag) {
        if (!aTag.offset()) {
            return;
        }

        var offset = setOffsetTop() + $submenu.outerHeight(true);
        $('html,body').animate({ scrollTop: aTag.offset().top, ease: 'easeinout' }, 500);
    }

    function isMobile() {
        return !window.matchMedia('(min-width: 1220px)').matches;
    }

    function setOffsetTop() {

        var offsetTop = offsetTopSmall;

        if (!isMobile()) {
            offsetTop = offsetTopMedium;
        }

        return offsetTop;
    }

    function setOffsetTopTabs() {

        var offsetTop = offsetTopSmall;

        if (!isMobile()) {
            offsetTop = offsetTopMedium;
        }

        return offsetTop;
    }

    function stickySubmenu() {

        function init() {
            var options = {
                top: setOffsetTop(),
                animation: 'uk-animation-slide-top'
            };

            return UIkit.sticky($submenu, options);
        }

        $submenu.on({
            'active.uk.sticky': function () {
                $('body').addClass('sticky-submenu');
            },
            'inactive.uk.sticky': function () {
                $('body').removeClass('sticky-submenu');
            }
        });

        $(window).on('resize', UIkit.Utils.debounce(function (event) {

            UIkit.sticky($submenu).options.top = setOffsetTop();
        }, 200));

        init = init();
    }

    var stickySubmenu = stickySubmenu();

    function stickyTabmenu() {
        var elem = $('.js-sticky-tabmenu');

        function init() {
            var options = {
                top: setOffsetTopTabs(),
                animation: 'uk-animation-slide-top',
                boundary: '#boundary'
            };

            return UIkit.sticky(elem, options);
        }

        elem.on({
            'active.uk.sticky': function () {
                $('body').addClass('sticky-tabmenu');
            },
            'inactive.uk.sticky': function () {
                $('body').removeClass('sticky-tabmenu');
            }
        });

        $(window).on('resize', UIkit.Utils.debounce(function (event) {

            UIkit.sticky(elem).options.top = setOffsetTopTabs();
        }, 200));

        init = init();
    }

    var stickyTabmenu = stickyTabmenu();

    $('.js-sticky-tabmenu').on('show.uk.switcher', function () {

        setTimeout(function () {
            var offset = $('.js-tabs-content').offset().top - $('.js-sticky-tabmenu').outerHeight(true) - setOffsetTop();
            $('html,body').animate({ scrollTop: offset, ease: 'easeinout' }, 0);
        }, 50);
    });
})(jQuery, window, window.document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/table.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    // Fill Table with empty items if needed

    function fillTable() {
        var container = $('.js-tm-table');
        var empty = '<div class="tm-table__grid tm-table__grid__item tm-table__grid--empty"></div>';
        var itemsArray = [];
        var maxRows = [];
        var fill = 0;

        $.each(container, function getItems(i) {
            itemsArray[i] = [];
            $(this).find('.tm-table-item').each(function getItemsInner(f) {
                var items = $(this).data('items');
                var cols = $(this).data('cols');
                var rows = Math.ceil(items / cols);

                itemsArray[i][f] = [items, cols, rows];

                if (maxRows[i] < rows || maxRows[i] === undefined) {
                    maxRows[i] = rows;
                }
            });
        });

        $.each(itemsArray, function setItems(i, e) {

            $.each(e, function setItemsInner(f, g) {

                if (g[1] == 1) {
                    if (g[3] != maxRows[i]) {
                        fill = maxRows[i] - g[0];

                        for (var m = 0; m < fill; m++) {
                            $('.js-tm-table:eq(' + i + ')').find('.tm-table-item:eq(' + f + ')').append($(empty));
                        }
                    }
                }

                if (g[1] == 3) {
                    if (g[3] != maxRows[i]) {
                        fill = maxRows[i] * g[1] - g[0];

                        for (var m = 0; m < fill; m++) {
                            $('.js-tm-table:eq(' + i + ')').find('.tm-table-item:eq(' + f + ')').find('.tm-table__grid__container').append($(empty));
                        }
                    }
                }
            });
        });
    }

    fillTable();
})(jQuery, window, window.document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/toggle-download-button.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var selector = $('.js-download-toggle input[type=checkbox]');
    var target = $('.js-download-button');

    selector.on('change', function toggleDownloadButton() {

        if (target.hasClass('panel-download--hidden')) {
            $(this).closest('div').fadeOut(function buttonFadeIn() {
                target.fadeIn().removeClass('panel-download--hidden');
            });
        }
    });
})(jQuery, window, window.document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/video.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var videoHover = function () {

        function init() {
            $('.js-video-hover').hover(function () {
                $(this).find('video')[0].play();
            }, function () {
                $(this).find('video')[0].pause();
                $(this).find('video')[0].currentTime = 0;
            });
        }

        return {
            init: init
        };
    }();

    var videoLinks = function () {

        function init() {
            $('.js-video-links').each(function () {
                var $links = $(this).find('.tm-panel-story__links li');
                var numberOfLinks = $links.length;

                // break if less than 2 links
                if (numberOfLinks <= 1) return;

                $links.each(function (index) {
                    var $link = $(this);
                    var $parentPanel = $link.parents('.js-panel-story');
                    var $videoElement = $parentPanel.find('video').eq(index);

                    $link.hover(function () {
                        // hide all videos
                        $parentPanel.find('video').css('display', 'none');
                        // show the correct video
                        $videoElement.css('display', 'inline');
                        // start playing
                        $videoElement[0].play();
                    }, function () {
                        // stop playing
                        $videoElement[0].pause();
                        // reset video
                        $videoElement[0].currentTime = 0;
                    });
                });
            });
        }

        return {
            init: init
        };
    }();

    var videoSwitchPoster = function () {

        function init() {

            //$(window).on('resize', function (e) {
            //    checkWindowWidth();
            //});

            checkWindowWidth();
        }

        function checkWindowWidth() {
            var wWidth = $(window).width();

            if (wWidth > 767) {
                changeVideoPoster('large');
            } else if (wWidth > 320) {
                changeVideoPoster('medium');
            } else {
                changeVideoPoster('small');
            }
        }

        function changeVideoPoster(posterSize) {

            $('video').each(function (i, element) {
                var posterUrl = $(element).data('poster-' + posterSize);
                $(element).attr('poster', posterUrl);
            });
        }

        return {
            init: init
        };
    }();

    var videoControls = function () {
        var $videoContainer = $('.js-video'),
            $video = $videoContainer.find('video'),
            $playControl = $('.js-video-play'),
            $pauseControl = $('.js-video-pause'),
            $muteControl = $('.js-video-mute');

        function init() {

            $playControl.on('click', function () {
                var $this = $(this),
                    video = $this.parents('.js-video').find('video')[0];

                $(video).css('display', 'block');

                video.play();

                if ($('html').hasClass('uk-touch') && window.matchMedia('(max-width: 1024px)').matches) {
                    handleFullScreen(video);

                    try {
                        if (video.requestFullscreen) {
                            video.requestFullscreen();
                        } else if (video.mozRequestFullScreen) {
                            video.mozRequestFullScreen();
                        } else if (video.webkitRequestFullscreen) {
                            video.webkitRequestFullscreen();
                        } else if (video.webkitEnterFullscreen) {
                            video.webkitEnterFullScreen();
                        }
                    } catch (e) {}
                } else {
                    $this.css('display', 'none');
                    $pauseControl.css('display', 'inline-block');
                    $muteControl.css('display', 'inline-block');

                    if (!$videoContainer.hasClass('tm-video---is-playing')) {
                        $videoContainer.addClass('tm-video--is-playing');
                    }
                }

                // if video ended hide it and show image
                $(video).on('ended', function (e) {
                    $(video).css('display', 'none');
                    video.currentTime = 0;
                    $videoContainer.removeClass('tm-video--is-playing');

                    $pauseControl.css('display', 'none');
                    $muteControl.css('display', 'none');
                    $playControl.css('display', 'inline-block');
                });
            });

            $pauseControl.on('click', function () {
                var element = this;
                handlePause(element);
            });

            $muteControl.on('click', function () {
                var $this = $(this),
                    video = $this.parents('.js-video').find('video')[0];

                video.muted ? video.muted = false : video.muted = true;

                $this.toggleClass('tm-video-controls__mute--is-muted');
            });
        }

        function handlePause(element) {
            var $this = $(element) || $(this),
                video = $this.parents('.js-video').find('video')[0];

            $this.css('display', 'none');
            $muteControl.css('display', 'none');
            $playControl.css('display', 'inline-block');

            video.pause();
            $videoContainer.removeClass('tm-video--is-playing');

            // console.log("$('html').hasClass('uk-touch') || window.matchMedia('(max-width: 768px)').matches", $('html').hasClass('uk-touch') || window.matchMedia('(max-width: 768px)').matches);

            if ($('html').hasClass('uk-touch') || window.matchMedia('(max-width: 768px)').matches) {
                $(video).css('display', 'none');
            }
        }

        function handleFullScreen(video) {
            var isFullScreen;

            // desktop chrome/safari/opera/firefox / mobile chrome
            $(document).on('webkitfullscreenchange mozfullscreenchange fullscreenchange ', function (event) {
                isFullScreen = checkFullScreen(video);

                if (!isFullScreen) {
                    handlePause(video);
                }
            });

            // ios safari
            $(video).on('webkitbeginfullscreen webkitendfullscreen', function (event) {
                isFullScreen = checkFullScreen(video);

                if (!isFullScreen) {
                    handlePause(video);
                }
            });
        }

        function checkFullScreen(video) {
            var isFullScreen;

            if (document.fullscreen) {
                isFullScreen = document.fullscreen;
            } else if (document.mozFullScreen) {
                isFullScreen = document.mozFullScreen;
            } else if (document.webkitIsFullScreen) {
                isFullScreen = document.webkitIsFullScreen;
            } else if (video.webkitDisplayingFullscreen) {
                isFullScreen = video.webkitDisplayingFullscreen;
            } else {
                isFullScreen = false;
            }

            // console.log(isFullScreen);

            return isFullScreen;
        }

        return {
            init: init
        };
    }();

    videoHover.init();
    videoLinks.init();
    videoSwitchPoster.init();
    videoControls.init();
})(jQuery, window, window.document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/shame.js":[function(require,module,exports){
$(function () {
    'use strict';

    var UtilsMatchHeights = function () {

        function matchHeights(selector) {
            UIkit.Utils.matchHeights(selector);
        }

        return {
            match: matchHeights
        };
    }();

    if ($('.js-panel-story > .tm-panel-story__bottom').length > 1) {
        $(window).on('load resize orientationchange', function () {
            UIkit.Utils.debounce(UtilsMatchHeights.match('.js-panel-story > .tm-panel-story__bottom'), 50);
        }());
    }

    $('.tm-header [data-uk-dropdown]').on('show.uk.dropdown', function () {

        var $sliderElement = $(this).find('.js-menu-desktop');
        var $sliderElements = $sliderElement.find('li');
        var sliderConf = { infinite: false };

        if ($sliderElement.length) {

            if ($sliderElements.length >= 4) {
                sliderConf = { infinite: true };
            }

            UIkit.slider($sliderElement, sliderConf);

            setTimeout(function () {
                // $(window).trigger('resize');
                //console.log('trigger window resize');
            }, 200);
        }

        setTimeout(function () {
            UtilsMatchHeights.match('.js-panel-story > .tm-panel-story__bottom');
            UtilsMatchHeights.match('.js-menu-desktop-dropdown-nav__item');

            // $(window).trigger('resize');
        }, 100);
    });

    $('select').select2({
        placeholder: '',
        minimumResultsForSearch: Infinity
    });

    $('[data-owlcontrol]').each(function () {
        $(this).owlControl();
    });
});

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/jquery.js":[function(require,module,exports){
/*!
 * jQuery JavaScript Library v2.2.4
 * http://jquery.com/
 *
 * Includes Sizzle.js
 * http://sizzlejs.com/
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license
 * http://jquery.org/license
 *
 * Date: 2016-05-20T17:23Z
 */

(function (global, factory) {

	if (typeof module === "object" && typeof module.exports === "object") {
		// For CommonJS and CommonJS-like environments where a proper `window`
		// is present, execute the factory and get jQuery.
		// For environments that do not have a `window` with a `document`
		// (such as Node.js), expose a factory as module.exports.
		// This accentuates the need for the creation of a real `window`.
		// e.g. var jQuery = require("jquery")(window);
		// See ticket #14549 for more info.
		module.exports = global.document ? factory(global, true) : function (w) {
			if (!w.document) {
				throw new Error("jQuery requires a window with a document");
			}
			return factory(w);
		};
	} else {
		factory(global);
	}

	// Pass this if window is not defined yet
})(typeof window !== "undefined" ? window : this, function (window, noGlobal) {

	// Support: Firefox 18+
	// Can't be in strict mode, several libs including ASP.NET trace
	// the stack via arguments.caller.callee and Firefox dies if
	// you try to trace through "use strict" call chains. (#13335)
	//"use strict";
	var arr = [];

	var document = window.document;

	var slice = arr.slice;

	var concat = arr.concat;

	var push = arr.push;

	var indexOf = arr.indexOf;

	var class2type = {};

	var toString = class2type.toString;

	var hasOwn = class2type.hasOwnProperty;

	var support = {};

	var version = "2.2.4",


	// Define a local copy of jQuery
	jQuery = function (selector, context) {

		// The jQuery object is actually just the init constructor 'enhanced'
		// Need init if jQuery is called (just allow error to be thrown if not included)
		return new jQuery.fn.init(selector, context);
	},


	// Support: Android<4.1
	// Make sure we trim BOM and NBSP
	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,


	// Matches dashed string for camelizing
	rmsPrefix = /^-ms-/,
	    rdashAlpha = /-([\da-z])/gi,


	// Used by jQuery.camelCase as callback to replace()
	fcamelCase = function (all, letter) {
		return letter.toUpperCase();
	};

	jQuery.fn = jQuery.prototype = {

		// The current version of jQuery being used
		jquery: version,

		constructor: jQuery,

		// Start with an empty selector
		selector: "",

		// The default length of a jQuery object is 0
		length: 0,

		toArray: function () {
			return slice.call(this);
		},

		// Get the Nth element in the matched element set OR
		// Get the whole matched element set as a clean array
		get: function (num) {
			return num != null ?

			// Return just the one element from the set
			num < 0 ? this[num + this.length] : this[num] :

			// Return all the elements in a clean array
			slice.call(this);
		},

		// Take an array of elements and push it onto the stack
		// (returning the new matched element set)
		pushStack: function (elems) {

			// Build a new jQuery matched element set
			var ret = jQuery.merge(this.constructor(), elems);

			// Add the old object onto the stack (as a reference)
			ret.prevObject = this;
			ret.context = this.context;

			// Return the newly-formed element set
			return ret;
		},

		// Execute a callback for every element in the matched set.
		each: function (callback) {
			return jQuery.each(this, callback);
		},

		map: function (callback) {
			return this.pushStack(jQuery.map(this, function (elem, i) {
				return callback.call(elem, i, elem);
			}));
		},

		slice: function () {
			return this.pushStack(slice.apply(this, arguments));
		},

		first: function () {
			return this.eq(0);
		},

		last: function () {
			return this.eq(-1);
		},

		eq: function (i) {
			var len = this.length,
			    j = +i + (i < 0 ? len : 0);
			return this.pushStack(j >= 0 && j < len ? [this[j]] : []);
		},

		end: function () {
			return this.prevObject || this.constructor();
		},

		// For internal use only.
		// Behaves like an Array's method, not like a jQuery method.
		push: push,
		sort: arr.sort,
		splice: arr.splice
	};

	jQuery.extend = jQuery.fn.extend = function () {
		var options,
		    name,
		    src,
		    copy,
		    copyIsArray,
		    clone,
		    target = arguments[0] || {},
		    i = 1,
		    length = arguments.length,
		    deep = false;

		// Handle a deep copy situation
		if (typeof target === "boolean") {
			deep = target;

			// Skip the boolean and the target
			target = arguments[i] || {};
			i++;
		}

		// Handle case when target is a string or something (possible in deep copy)
		if (typeof target !== "object" && !jQuery.isFunction(target)) {
			target = {};
		}

		// Extend jQuery itself if only one argument is passed
		if (i === length) {
			target = this;
			i--;
		}

		for (; i < length; i++) {

			// Only deal with non-null/undefined values
			if ((options = arguments[i]) != null) {

				// Extend the base object
				for (name in options) {
					src = target[name];
					copy = options[name];

					// Prevent never-ending loop
					if (target === copy) {
						continue;
					}

					// Recurse if we're merging plain objects or arrays
					if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {

						if (copyIsArray) {
							copyIsArray = false;
							clone = src && jQuery.isArray(src) ? src : [];
						} else {
							clone = src && jQuery.isPlainObject(src) ? src : {};
						}

						// Never move original objects, clone them
						target[name] = jQuery.extend(deep, clone, copy);

						// Don't bring in undefined values
					} else if (copy !== undefined) {
						target[name] = copy;
					}
				}
			}
		}

		// Return the modified object
		return target;
	};

	jQuery.extend({

		// Unique for each copy of jQuery on the page
		expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""),

		// Assume jQuery is ready without the ready module
		isReady: true,

		error: function (msg) {
			throw new Error(msg);
		},

		noop: function () {},

		isFunction: function (obj) {
			return jQuery.type(obj) === "function";
		},

		isArray: Array.isArray,

		isWindow: function (obj) {
			return obj != null && obj === obj.window;
		},

		isNumeric: function (obj) {

			// parseFloat NaNs numeric-cast false positives (null|true|false|"")
			// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
			// subtraction forces infinities to NaN
			// adding 1 corrects loss of precision from parseFloat (#15100)
			var realStringObj = obj && obj.toString();
			return !jQuery.isArray(obj) && realStringObj - parseFloat(realStringObj) + 1 >= 0;
		},

		isPlainObject: function (obj) {
			var key;

			// Not plain objects:
			// - Any object or value whose internal [[Class]] property is not "[object Object]"
			// - DOM nodes
			// - window
			if (jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) {
				return false;
			}

			// Not own constructor property must be Object
			if (obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype || {}, "isPrototypeOf")) {
				return false;
			}

			// Own properties are enumerated firstly, so to speed up,
			// if last one is own, then all properties are own
			for (key in obj) {}

			return key === undefined || hasOwn.call(obj, key);
		},

		isEmptyObject: function (obj) {
			var name;
			for (name in obj) {
				return false;
			}
			return true;
		},

		type: function (obj) {
			if (obj == null) {
				return obj + "";
			}

			// Support: Android<4.0, iOS<6 (functionish RegExp)
			return typeof obj === "object" || typeof obj === "function" ? class2type[toString.call(obj)] || "object" : typeof obj;
		},

		// Evaluates a script in a global context
		globalEval: function (code) {
			var script,
			    indirect = eval;

			code = jQuery.trim(code);

			if (code) {

				// If the code includes a valid, prologue position
				// strict mode pragma, execute code by injecting a
				// script tag into the document.
				if (code.indexOf("use strict") === 1) {
					script = document.createElement("script");
					script.text = code;
					document.head.appendChild(script).parentNode.removeChild(script);
				} else {

					// Otherwise, avoid the DOM node creation, insertion
					// and removal by using an indirect global eval

					indirect(code);
				}
			}
		},

		// Convert dashed to camelCase; used by the css and data modules
		// Support: IE9-11+
		// Microsoft forgot to hump their vendor prefix (#9572)
		camelCase: function (string) {
			return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);
		},

		nodeName: function (elem, name) {
			return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
		},

		each: function (obj, callback) {
			var length,
			    i = 0;

			if (isArrayLike(obj)) {
				length = obj.length;
				for (; i < length; i++) {
					if (callback.call(obj[i], i, obj[i]) === false) {
						break;
					}
				}
			} else {
				for (i in obj) {
					if (callback.call(obj[i], i, obj[i]) === false) {
						break;
					}
				}
			}

			return obj;
		},

		// Support: Android<4.1
		trim: function (text) {
			return text == null ? "" : (text + "").replace(rtrim, "");
		},

		// results is for internal usage only
		makeArray: function (arr, results) {
			var ret = results || [];

			if (arr != null) {
				if (isArrayLike(Object(arr))) {
					jQuery.merge(ret, typeof arr === "string" ? [arr] : arr);
				} else {
					push.call(ret, arr);
				}
			}

			return ret;
		},

		inArray: function (elem, arr, i) {
			return arr == null ? -1 : indexOf.call(arr, elem, i);
		},

		merge: function (first, second) {
			var len = +second.length,
			    j = 0,
			    i = first.length;

			for (; j < len; j++) {
				first[i++] = second[j];
			}

			first.length = i;

			return first;
		},

		grep: function (elems, callback, invert) {
			var callbackInverse,
			    matches = [],
			    i = 0,
			    length = elems.length,
			    callbackExpect = !invert;

			// Go through the array, only saving the items
			// that pass the validator function
			for (; i < length; i++) {
				callbackInverse = !callback(elems[i], i);
				if (callbackInverse !== callbackExpect) {
					matches.push(elems[i]);
				}
			}

			return matches;
		},

		// arg is for internal usage only
		map: function (elems, callback, arg) {
			var length,
			    value,
			    i = 0,
			    ret = [];

			// Go through the array, translating each of the items to their new values
			if (isArrayLike(elems)) {
				length = elems.length;
				for (; i < length; i++) {
					value = callback(elems[i], i, arg);

					if (value != null) {
						ret.push(value);
					}
				}

				// Go through every key on the object,
			} else {
				for (i in elems) {
					value = callback(elems[i], i, arg);

					if (value != null) {
						ret.push(value);
					}
				}
			}

			// Flatten any nested arrays
			return concat.apply([], ret);
		},

		// A global GUID counter for objects
		guid: 1,

		// Bind a function to a context, optionally partially applying any
		// arguments.
		proxy: function (fn, context) {
			var tmp, args, proxy;

			if (typeof context === "string") {
				tmp = fn[context];
				context = fn;
				fn = tmp;
			}

			// Quick check to determine if target is callable, in the spec
			// this throws a TypeError, but we will just return undefined.
			if (!jQuery.isFunction(fn)) {
				return undefined;
			}

			// Simulated bind
			args = slice.call(arguments, 2);
			proxy = function () {
				return fn.apply(context || this, args.concat(slice.call(arguments)));
			};

			// Set the guid of unique handler to the same of original handler, so it can be removed
			proxy.guid = fn.guid = fn.guid || jQuery.guid++;

			return proxy;
		},

		now: Date.now,

		// jQuery.support is not used in Core but other projects attach their
		// properties to it so it needs to exist.
		support: support
	});

	// JSHint would error on this code due to the Symbol not being defined in ES5.
	// Defining this global in .jshintrc would create a danger of using the global
	// unguarded in another place, it seems safer to just disable JSHint for these
	// three lines.
	/* jshint ignore: start */
	if (typeof Symbol === "function") {
		jQuery.fn[Symbol.iterator] = arr[Symbol.iterator];
	}
	/* jshint ignore: end */

	// Populate the class2type map
	jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (i, name) {
		class2type["[object " + name + "]"] = name.toLowerCase();
	});

	function isArrayLike(obj) {

		// Support: iOS 8.2 (not reproducible in simulator)
		// `in` check used to prevent JIT error (gh-2145)
		// hasOwn isn't used here due to false negatives
		// regarding Nodelist length in IE
		var length = !!obj && "length" in obj && obj.length,
		    type = jQuery.type(obj);

		if (type === "function" || jQuery.isWindow(obj)) {
			return false;
		}

		return type === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj;
	}
	var Sizzle =
	/*!
  * Sizzle CSS Selector Engine v2.2.1
  * http://sizzlejs.com/
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license
  * http://jquery.org/license
  *
  * Date: 2015-10-17
  */
	function (window) {

		var i,
		    support,
		    Expr,
		    getText,
		    isXML,
		    tokenize,
		    compile,
		    select,
		    outermostContext,
		    sortInput,
		    hasDuplicate,


		// Local document vars
		setDocument,
		    document,
		    docElem,
		    documentIsHTML,
		    rbuggyQSA,
		    rbuggyMatches,
		    matches,
		    contains,


		// Instance-specific data
		expando = "sizzle" + 1 * new Date(),
		    preferredDoc = window.document,
		    dirruns = 0,
		    done = 0,
		    classCache = createCache(),
		    tokenCache = createCache(),
		    compilerCache = createCache(),
		    sortOrder = function (a, b) {
			if (a === b) {
				hasDuplicate = true;
			}
			return 0;
		},


		// General-purpose constants
		MAX_NEGATIVE = 1 << 31,


		// Instance methods
		hasOwn = {}.hasOwnProperty,
		    arr = [],
		    pop = arr.pop,
		    push_native = arr.push,
		    push = arr.push,
		    slice = arr.slice,

		// Use a stripped-down indexOf as it's faster than native
		// http://jsperf.com/thor-indexof-vs-for/5
		indexOf = function (list, elem) {
			var i = 0,
			    len = list.length;
			for (; i < len; i++) {
				if (list[i] === elem) {
					return i;
				}
			}
			return -1;
		},
		    booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",


		// Regular expressions

		// http://www.w3.org/TR/css3-selectors/#whitespace
		whitespace = "[\\x20\\t\\r\\n\\f]",


		// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
		identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",


		// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
		attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
		// Operator (capture 2)
		"*([*^$|!~]?=)" + whitespace +
		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]",
		    pseudos = ":(" + identifier + ")(?:\\((" +
		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
		// 1. quoted (capture 3; capture 4 or capture 5)
		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
		// 2. simple (capture 6)
		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
		// 3. anything else (capture 2)
		".*" + ")\\)|)",


		// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
		rwhitespace = new RegExp(whitespace + "+", "g"),
		    rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"),
		    rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"),
		    rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"),
		    rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g"),
		    rpseudo = new RegExp(pseudos),
		    ridentifier = new RegExp("^" + identifier + "$"),
		    matchExpr = {
			"ID": new RegExp("^#(" + identifier + ")"),
			"CLASS": new RegExp("^\\.(" + identifier + ")"),
			"TAG": new RegExp("^(" + identifier + "|[*])"),
			"ATTR": new RegExp("^" + attributes),
			"PSEUDO": new RegExp("^" + pseudos),
			"CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
			"bool": new RegExp("^(?:" + booleans + ")$", "i"),
			// For use in libraries implementing .is()
			// We use this for POS matching in `select`
			"needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
		},
		    rinputs = /^(?:input|select|textarea|button)$/i,
		    rheader = /^h\d$/i,
		    rnative = /^[^{]+\{\s*\[native \w/,


		// Easily-parseable/retrievable ID or TAG or CLASS selectors
		rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
		    rsibling = /[+~]/,
		    rescape = /'|\\/g,


		// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
		runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig"),
		    funescape = function (_, escaped, escapedWhitespace) {
			var high = "0x" + escaped - 0x10000;
			// NaN means non-codepoint
			// Support: Firefox<24
			// Workaround erroneous numeric interpretation of +"0x"
			return high !== high || escapedWhitespace ? escaped : high < 0 ?
			// BMP codepoint
			String.fromCharCode(high + 0x10000) :
			// Supplemental Plane codepoint (surrogate pair)
			String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00);
		},


		// Used for iframes
		// See setDocument()
		// Removing the function wrapper causes a "Permission Denied"
		// error in IE
		unloadHandler = function () {
			setDocument();
		};

		// Optimize for push.apply( _, NodeList )
		try {
			push.apply(arr = slice.call(preferredDoc.childNodes), preferredDoc.childNodes);
			// Support: Android<4.0
			// Detect silently failing push.apply
			arr[preferredDoc.childNodes.length].nodeType;
		} catch (e) {
			push = { apply: arr.length ?

				// Leverage slice if possible
				function (target, els) {
					push_native.apply(target, slice.call(els));
				} :

				// Support: IE<9
				// Otherwise append directly
				function (target, els) {
					var j = target.length,
					    i = 0;
					// Can't trust NodeList.length
					while (target[j++] = els[i++]) {}
					target.length = j - 1;
				}
			};
		}

		function Sizzle(selector, context, results, seed) {
			var m,
			    i,
			    elem,
			    nid,
			    nidselect,
			    match,
			    groups,
			    newSelector,
			    newContext = context && context.ownerDocument,


			// nodeType defaults to 9, since context defaults to document
			nodeType = context ? context.nodeType : 9;

			results = results || [];

			// Return early from calls with invalid selector or context
			if (typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11) {

				return results;
			}

			// Try to shortcut find operations (as opposed to filters) in HTML documents
			if (!seed) {

				if ((context ? context.ownerDocument || context : preferredDoc) !== document) {
					setDocument(context);
				}
				context = context || document;

				if (documentIsHTML) {

					// If the selector is sufficiently simple, try using a "get*By*" DOM method
					// (excepting DocumentFragment context, where the methods don't exist)
					if (nodeType !== 11 && (match = rquickExpr.exec(selector))) {

						// ID selector
						if (m = match[1]) {

							// Document context
							if (nodeType === 9) {
								if (elem = context.getElementById(m)) {

									// Support: IE, Opera, Webkit
									// TODO: identify versions
									// getElementById can match elements by name instead of ID
									if (elem.id === m) {
										results.push(elem);
										return results;
									}
								} else {
									return results;
								}

								// Element context
							} else {

								// Support: IE, Opera, Webkit
								// TODO: identify versions
								// getElementById can match elements by name instead of ID
								if (newContext && (elem = newContext.getElementById(m)) && contains(context, elem) && elem.id === m) {

									results.push(elem);
									return results;
								}
							}

							// Type selector
						} else if (match[2]) {
							push.apply(results, context.getElementsByTagName(selector));
							return results;

							// Class selector
						} else if ((m = match[3]) && support.getElementsByClassName && context.getElementsByClassName) {

							push.apply(results, context.getElementsByClassName(m));
							return results;
						}
					}

					// Take advantage of querySelectorAll
					if (support.qsa && !compilerCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector))) {

						if (nodeType !== 1) {
							newContext = context;
							newSelector = selector;

							// qSA looks outside Element context, which is not what we want
							// Thanks to Andrew Dupont for this workaround technique
							// Support: IE <=8
							// Exclude object elements
						} else if (context.nodeName.toLowerCase() !== "object") {

							// Capture the context ID, setting it first if necessary
							if (nid = context.getAttribute("id")) {
								nid = nid.replace(rescape, "\\$&");
							} else {
								context.setAttribute("id", nid = expando);
							}

							// Prefix every selector in the list
							groups = tokenize(selector);
							i = groups.length;
							nidselect = ridentifier.test(nid) ? "#" + nid : "[id='" + nid + "']";
							while (i--) {
								groups[i] = nidselect + " " + toSelector(groups[i]);
							}
							newSelector = groups.join(",");

							// Expand context for sibling selectors
							newContext = rsibling.test(selector) && testContext(context.parentNode) || context;
						}

						if (newSelector) {
							try {
								push.apply(results, newContext.querySelectorAll(newSelector));
								return results;
							} catch (qsaError) {} finally {
								if (nid === expando) {
									context.removeAttribute("id");
								}
							}
						}
					}
				}
			}

			// All others
			return select(selector.replace(rtrim, "$1"), context, results, seed);
		}

		/**
   * Create key-value caches of limited size
   * @returns {function(string, object)} Returns the Object data after storing it on itself with
   *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
   *	deleting the oldest entry
   */
		function createCache() {
			var keys = [];

			function cache(key, value) {
				// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
				if (keys.push(key + " ") > Expr.cacheLength) {
					// Only keep the most recent entries
					delete cache[keys.shift()];
				}
				return cache[key + " "] = value;
			}
			return cache;
		}

		/**
   * Mark a function for special use by Sizzle
   * @param {Function} fn The function to mark
   */
		function markFunction(fn) {
			fn[expando] = true;
			return fn;
		}

		/**
   * Support testing using an element
   * @param {Function} fn Passed the created div and expects a boolean result
   */
		function assert(fn) {
			var div = document.createElement("div");

			try {
				return !!fn(div);
			} catch (e) {
				return false;
			} finally {
				// Remove from its parent by default
				if (div.parentNode) {
					div.parentNode.removeChild(div);
				}
				// release memory in IE
				div = null;
			}
		}

		/**
   * Adds the same handler for all of the specified attrs
   * @param {String} attrs Pipe-separated list of attributes
   * @param {Function} handler The method that will be applied
   */
		function addHandle(attrs, handler) {
			var arr = attrs.split("|"),
			    i = arr.length;

			while (i--) {
				Expr.attrHandle[arr[i]] = handler;
			}
		}

		/**
   * Checks document order of two siblings
   * @param {Element} a
   * @param {Element} b
   * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
   */
		function siblingCheck(a, b) {
			var cur = b && a,
			    diff = cur && a.nodeType === 1 && b.nodeType === 1 && (~b.sourceIndex || MAX_NEGATIVE) - (~a.sourceIndex || MAX_NEGATIVE);

			// Use IE sourceIndex if available on both nodes
			if (diff) {
				return diff;
			}

			// Check if b follows a
			if (cur) {
				while (cur = cur.nextSibling) {
					if (cur === b) {
						return -1;
					}
				}
			}

			return a ? 1 : -1;
		}

		/**
   * Returns a function to use in pseudos for input types
   * @param {String} type
   */
		function createInputPseudo(type) {
			return function (elem) {
				var name = elem.nodeName.toLowerCase();
				return name === "input" && elem.type === type;
			};
		}

		/**
   * Returns a function to use in pseudos for buttons
   * @param {String} type
   */
		function createButtonPseudo(type) {
			return function (elem) {
				var name = elem.nodeName.toLowerCase();
				return (name === "input" || name === "button") && elem.type === type;
			};
		}

		/**
   * Returns a function to use in pseudos for positionals
   * @param {Function} fn
   */
		function createPositionalPseudo(fn) {
			return markFunction(function (argument) {
				argument = +argument;
				return markFunction(function (seed, matches) {
					var j,
					    matchIndexes = fn([], seed.length, argument),
					    i = matchIndexes.length;

					// Match elements found at the specified indexes
					while (i--) {
						if (seed[j = matchIndexes[i]]) {
							seed[j] = !(matches[j] = seed[j]);
						}
					}
				});
			});
		}

		/**
   * Checks a node for validity as a Sizzle context
   * @param {Element|Object=} context
   * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
   */
		function testContext(context) {
			return context && typeof context.getElementsByTagName !== "undefined" && context;
		}

		// Expose support vars for convenience
		support = Sizzle.support = {};

		/**
   * Detects XML nodes
   * @param {Element|Object} elem An element or a document
   * @returns {Boolean} True iff elem is a non-HTML XML node
   */
		isXML = Sizzle.isXML = function (elem) {
			// documentElement is verified for cases where it doesn't yet exist
			// (such as loading iframes in IE - #4833)
			var documentElement = elem && (elem.ownerDocument || elem).documentElement;
			return documentElement ? documentElement.nodeName !== "HTML" : false;
		};

		/**
   * Sets document-related variables once based on the current document
   * @param {Element|Object} [doc] An element or document object to use to set the document
   * @returns {Object} Returns the current document
   */
		setDocument = Sizzle.setDocument = function (node) {
			var hasCompare,
			    parent,
			    doc = node ? node.ownerDocument || node : preferredDoc;

			// Return early if doc is invalid or already selected
			if (doc === document || doc.nodeType !== 9 || !doc.documentElement) {
				return document;
			}

			// Update global variables
			document = doc;
			docElem = document.documentElement;
			documentIsHTML = !isXML(document);

			// Support: IE 9-11, Edge
			// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
			if ((parent = document.defaultView) && parent.top !== parent) {
				// Support: IE 11
				if (parent.addEventListener) {
					parent.addEventListener("unload", unloadHandler, false);

					// Support: IE 9 - 10 only
				} else if (parent.attachEvent) {
					parent.attachEvent("onunload", unloadHandler);
				}
			}

			/* Attributes
   ---------------------------------------------------------------------- */

			// Support: IE<8
			// Verify that getAttribute really returns attributes and not properties
			// (excepting IE8 booleans)
			support.attributes = assert(function (div) {
				div.className = "i";
				return !div.getAttribute("className");
			});

			/* getElement(s)By*
   ---------------------------------------------------------------------- */

			// Check if getElementsByTagName("*") returns only elements
			support.getElementsByTagName = assert(function (div) {
				div.appendChild(document.createComment(""));
				return !div.getElementsByTagName("*").length;
			});

			// Support: IE<9
			support.getElementsByClassName = rnative.test(document.getElementsByClassName);

			// Support: IE<10
			// Check if getElementById returns elements by name
			// The broken getElementById methods don't pick up programatically-set names,
			// so use a roundabout getElementsByName test
			support.getById = assert(function (div) {
				docElem.appendChild(div).id = expando;
				return !document.getElementsByName || !document.getElementsByName(expando).length;
			});

			// ID find and filter
			if (support.getById) {
				Expr.find["ID"] = function (id, context) {
					if (typeof context.getElementById !== "undefined" && documentIsHTML) {
						var m = context.getElementById(id);
						return m ? [m] : [];
					}
				};
				Expr.filter["ID"] = function (id) {
					var attrId = id.replace(runescape, funescape);
					return function (elem) {
						return elem.getAttribute("id") === attrId;
					};
				};
			} else {
				// Support: IE6/7
				// getElementById is not reliable as a find shortcut
				delete Expr.find["ID"];

				Expr.filter["ID"] = function (id) {
					var attrId = id.replace(runescape, funescape);
					return function (elem) {
						var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
						return node && node.value === attrId;
					};
				};
			}

			// Tag
			Expr.find["TAG"] = support.getElementsByTagName ? function (tag, context) {
				if (typeof context.getElementsByTagName !== "undefined") {
					return context.getElementsByTagName(tag);

					// DocumentFragment nodes don't have gEBTN
				} else if (support.qsa) {
					return context.querySelectorAll(tag);
				}
			} : function (tag, context) {
				var elem,
				    tmp = [],
				    i = 0,

				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
				results = context.getElementsByTagName(tag);

				// Filter out possible comments
				if (tag === "*") {
					while (elem = results[i++]) {
						if (elem.nodeType === 1) {
							tmp.push(elem);
						}
					}

					return tmp;
				}
				return results;
			};

			// Class
			Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) {
				if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) {
					return context.getElementsByClassName(className);
				}
			};

			/* QSA/matchesSelector
   ---------------------------------------------------------------------- */

			// QSA and matchesSelector support

			// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
			rbuggyMatches = [];

			// qSa(:focus) reports false when true (Chrome 21)
			// We allow this because of a bug in IE8/9 that throws an error
			// whenever `document.activeElement` is accessed on an iframe
			// So, we allow :focus to pass through QSA all the time to avoid the IE error
			// See http://bugs.jquery.com/ticket/13378
			rbuggyQSA = [];

			if (support.qsa = rnative.test(document.querySelectorAll)) {
				// Build QSA regex
				// Regex strategy adopted from Diego Perini
				assert(function (div) {
					// Select is set to empty string on purpose
					// This is to test IE's treatment of not explicitly
					// setting a boolean content attribute,
					// since its presence should be enough
					// http://bugs.jquery.com/ticket/12359
					docElem.appendChild(div).innerHTML = "<a id='" + expando + "'></a>" + "<select id='" + expando + "-\r\\' msallowcapture=''>" + "<option selected=''></option></select>";

					// Support: IE8, Opera 11-12.16
					// Nothing should be selected when empty strings follow ^= or $= or *=
					// The test attribute must be unknown in Opera but "safe" for WinRT
					// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
					if (div.querySelectorAll("[msallowcapture^='']").length) {
						rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")");
					}

					// Support: IE8
					// Boolean attributes and "value" are not treated correctly
					if (!div.querySelectorAll("[selected]").length) {
						rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");
					}

					// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
					if (!div.querySelectorAll("[id~=" + expando + "-]").length) {
						rbuggyQSA.push("~=");
					}

					// Webkit/Opera - :checked should return selected option elements
					// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
					// IE8 throws error here and will not see later tests
					if (!div.querySelectorAll(":checked").length) {
						rbuggyQSA.push(":checked");
					}

					// Support: Safari 8+, iOS 8+
					// https://bugs.webkit.org/show_bug.cgi?id=136851
					// In-page `selector#id sibing-combinator selector` fails
					if (!div.querySelectorAll("a#" + expando + "+*").length) {
						rbuggyQSA.push(".#.+[+~]");
					}
				});

				assert(function (div) {
					// Support: Windows 8 Native Apps
					// The type and name attributes are restricted during .innerHTML assignment
					var input = document.createElement("input");
					input.setAttribute("type", "hidden");
					div.appendChild(input).setAttribute("name", "D");

					// Support: IE8
					// Enforce case-sensitivity of name attribute
					if (div.querySelectorAll("[name=d]").length) {
						rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?=");
					}

					// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
					// IE8 throws error here and will not see later tests
					if (!div.querySelectorAll(":enabled").length) {
						rbuggyQSA.push(":enabled", ":disabled");
					}

					// Opera 10-11 does not throw on post-comma invalid pseudos
					div.querySelectorAll("*,:x");
					rbuggyQSA.push(",.*:");
				});
			}

			if (support.matchesSelector = rnative.test(matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector)) {

				assert(function (div) {
					// Check to see if it's possible to do matchesSelector
					// on a disconnected node (IE 9)
					support.disconnectedMatch = matches.call(div, "div");

					// This should fail with an exception
					// Gecko does not error, returns false instead
					matches.call(div, "[s!='']:x");
					rbuggyMatches.push("!=", pseudos);
				});
			}

			rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));
			rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|"));

			/* Contains
   ---------------------------------------------------------------------- */
			hasCompare = rnative.test(docElem.compareDocumentPosition);

			// Element contains another
			// Purposefully self-exclusive
			// As in, an element does not contain itself
			contains = hasCompare || rnative.test(docElem.contains) ? function (a, b) {
				var adown = a.nodeType === 9 ? a.documentElement : a,
				    bup = b && b.parentNode;
				return a === bup || !!(bup && bup.nodeType === 1 && (adown.contains ? adown.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16));
			} : function (a, b) {
				if (b) {
					while (b = b.parentNode) {
						if (b === a) {
							return true;
						}
					}
				}
				return false;
			};

			/* Sorting
   ---------------------------------------------------------------------- */

			// Document order sorting
			sortOrder = hasCompare ? function (a, b) {

				// Flag for duplicate removal
				if (a === b) {
					hasDuplicate = true;
					return 0;
				}

				// Sort on method existence if only one input has compareDocumentPosition
				var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
				if (compare) {
					return compare;
				}

				// Calculate position if both inputs belong to the same document
				compare = (a.ownerDocument || a) === (b.ownerDocument || b) ? a.compareDocumentPosition(b) :

				// Otherwise we know they are disconnected
				1;

				// Disconnected nodes
				if (compare & 1 || !support.sortDetached && b.compareDocumentPosition(a) === compare) {

					// Choose the first element that is related to our preferred document
					if (a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a)) {
						return -1;
					}
					if (b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b)) {
						return 1;
					}

					// Maintain original order
					return sortInput ? indexOf(sortInput, a) - indexOf(sortInput, b) : 0;
				}

				return compare & 4 ? -1 : 1;
			} : function (a, b) {
				// Exit early if the nodes are identical
				if (a === b) {
					hasDuplicate = true;
					return 0;
				}

				var cur,
				    i = 0,
				    aup = a.parentNode,
				    bup = b.parentNode,
				    ap = [a],
				    bp = [b];

				// Parentless nodes are either documents or disconnected
				if (!aup || !bup) {
					return a === document ? -1 : b === document ? 1 : aup ? -1 : bup ? 1 : sortInput ? indexOf(sortInput, a) - indexOf(sortInput, b) : 0;

					// If the nodes are siblings, we can do a quick check
				} else if (aup === bup) {
					return siblingCheck(a, b);
				}

				// Otherwise we need full lists of their ancestors for comparison
				cur = a;
				while (cur = cur.parentNode) {
					ap.unshift(cur);
				}
				cur = b;
				while (cur = cur.parentNode) {
					bp.unshift(cur);
				}

				// Walk down the tree looking for a discrepancy
				while (ap[i] === bp[i]) {
					i++;
				}

				return i ?
				// Do a sibling check if the nodes have a common ancestor
				siblingCheck(ap[i], bp[i]) :

				// Otherwise nodes in our document sort first
				ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0;
			};

			return document;
		};

		Sizzle.matches = function (expr, elements) {
			return Sizzle(expr, null, null, elements);
		};

		Sizzle.matchesSelector = function (elem, expr) {
			// Set document vars if needed
			if ((elem.ownerDocument || elem) !== document) {
				setDocument(elem);
			}

			// Make sure that attribute selectors are quoted
			expr = expr.replace(rattributeQuotes, "='$1']");

			if (support.matchesSelector && documentIsHTML && !compilerCache[expr + " "] && (!rbuggyMatches || !rbuggyMatches.test(expr)) && (!rbuggyQSA || !rbuggyQSA.test(expr))) {

				try {
					var ret = matches.call(elem, expr);

					// IE 9's matchesSelector returns false on disconnected nodes
					if (ret || support.disconnectedMatch ||
					// As well, disconnected nodes are said to be in a document
					// fragment in IE 9
					elem.document && elem.document.nodeType !== 11) {
						return ret;
					}
				} catch (e) {}
			}

			return Sizzle(expr, document, null, [elem]).length > 0;
		};

		Sizzle.contains = function (context, elem) {
			// Set document vars if needed
			if ((context.ownerDocument || context) !== document) {
				setDocument(context);
			}
			return contains(context, elem);
		};

		Sizzle.attr = function (elem, name) {
			// Set document vars if needed
			if ((elem.ownerDocument || elem) !== document) {
				setDocument(elem);
			}

			var fn = Expr.attrHandle[name.toLowerCase()],

			// Don't get fooled by Object.prototype properties (jQuery #13807)
			val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn(elem, name, !documentIsHTML) : undefined;

			return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute(name) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
		};

		Sizzle.error = function (msg) {
			throw new Error("Syntax error, unrecognized expression: " + msg);
		};

		/**
   * Document sorting and removing duplicates
   * @param {ArrayLike} results
   */
		Sizzle.uniqueSort = function (results) {
			var elem,
			    duplicates = [],
			    j = 0,
			    i = 0;

			// Unless we *know* we can detect duplicates, assume their presence
			hasDuplicate = !support.detectDuplicates;
			sortInput = !support.sortStable && results.slice(0);
			results.sort(sortOrder);

			if (hasDuplicate) {
				while (elem = results[i++]) {
					if (elem === results[i]) {
						j = duplicates.push(i);
					}
				}
				while (j--) {
					results.splice(duplicates[j], 1);
				}
			}

			// Clear input after sorting to release objects
			// See https://github.com/jquery/sizzle/pull/225
			sortInput = null;

			return results;
		};

		/**
   * Utility function for retrieving the text value of an array of DOM nodes
   * @param {Array|Element} elem
   */
		getText = Sizzle.getText = function (elem) {
			var node,
			    ret = "",
			    i = 0,
			    nodeType = elem.nodeType;

			if (!nodeType) {
				// If no nodeType, this is expected to be an array
				while (node = elem[i++]) {
					// Do not traverse comment nodes
					ret += getText(node);
				}
			} else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
				// Use textContent for elements
				// innerText usage removed for consistency of new lines (jQuery #11153)
				if (typeof elem.textContent === "string") {
					return elem.textContent;
				} else {
					// Traverse its children
					for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
						ret += getText(elem);
					}
				}
			} else if (nodeType === 3 || nodeType === 4) {
				return elem.nodeValue;
			}
			// Do not include comment or processing instruction nodes

			return ret;
		};

		Expr = Sizzle.selectors = {

			// Can be adjusted by the user
			cacheLength: 50,

			createPseudo: markFunction,

			match: matchExpr,

			attrHandle: {},

			find: {},

			relative: {
				">": { dir: "parentNode", first: true },
				" ": { dir: "parentNode" },
				"+": { dir: "previousSibling", first: true },
				"~": { dir: "previousSibling" }
			},

			preFilter: {
				"ATTR": function (match) {
					match[1] = match[1].replace(runescape, funescape);

					// Move the given value to match[3] whether quoted or unquoted
					match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape);

					if (match[2] === "~=") {
						match[3] = " " + match[3] + " ";
					}

					return match.slice(0, 4);
				},

				"CHILD": function (match) {
					/* matches from matchExpr["CHILD"]
     	1 type (only|nth|...)
     	2 what (child|of-type)
     	3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
     	4 xn-component of xn+y argument ([+-]?\d*n|)
     	5 sign of xn-component
     	6 x of xn-component
     	7 sign of y-component
     	8 y of y-component
     */
					match[1] = match[1].toLowerCase();

					if (match[1].slice(0, 3) === "nth") {
						// nth-* requires argument
						if (!match[3]) {
							Sizzle.error(match[0]);
						}

						// numeric x and y parameters for Expr.filter.CHILD
						// remember that false/true cast respectively to 0/1
						match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd"));
						match[5] = +(match[7] + match[8] || match[3] === "odd");

						// other types prohibit arguments
					} else if (match[3]) {
						Sizzle.error(match[0]);
					}

					return match;
				},

				"PSEUDO": function (match) {
					var excess,
					    unquoted = !match[6] && match[2];

					if (matchExpr["CHILD"].test(match[0])) {
						return null;
					}

					// Accept quoted arguments as-is
					if (match[3]) {
						match[2] = match[4] || match[5] || "";

						// Strip excess characters from unquoted arguments
					} else if (unquoted && rpseudo.test(unquoted) && (
					// Get excess from tokenize (recursively)
					excess = tokenize(unquoted, true)) && (
					// advance to the next closing parenthesis
					excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {

						// excess is a negative index
						match[0] = match[0].slice(0, excess);
						match[2] = unquoted.slice(0, excess);
					}

					// Return only captures needed by the pseudo filter method (type and argument)
					return match.slice(0, 3);
				}
			},

			filter: {

				"TAG": function (nodeNameSelector) {
					var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();
					return nodeNameSelector === "*" ? function () {
						return true;
					} : function (elem) {
						return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
					};
				},

				"CLASS": function (className) {
					var pattern = classCache[className + " "];

					return pattern || (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && classCache(className, function (elem) {
						return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "");
					});
				},

				"ATTR": function (name, operator, check) {
					return function (elem) {
						var result = Sizzle.attr(elem, name);

						if (result == null) {
							return operator === "!=";
						}
						if (!operator) {
							return true;
						}

						result += "";

						return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf(check) === 0 : operator === "*=" ? check && result.indexOf(check) > -1 : operator === "$=" ? check && result.slice(-check.length) === check : operator === "~=" ? (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1 : operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" : false;
					};
				},

				"CHILD": function (type, what, argument, first, last) {
					var simple = type.slice(0, 3) !== "nth",
					    forward = type.slice(-4) !== "last",
					    ofType = what === "of-type";

					return first === 1 && last === 0 ?

					// Shortcut for :nth-*(n)
					function (elem) {
						return !!elem.parentNode;
					} : function (elem, context, xml) {
						var cache,
						    uniqueCache,
						    outerCache,
						    node,
						    nodeIndex,
						    start,
						    dir = simple !== forward ? "nextSibling" : "previousSibling",
						    parent = elem.parentNode,
						    name = ofType && elem.nodeName.toLowerCase(),
						    useCache = !xml && !ofType,
						    diff = false;

						if (parent) {

							// :(first|last|only)-(child|of-type)
							if (simple) {
								while (dir) {
									node = elem;
									while (node = node[dir]) {
										if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) {

											return false;
										}
									}
									// Reverse direction for :only-* (if we haven't yet done so)
									start = dir = type === "only" && !start && "nextSibling";
								}
								return true;
							}

							start = [forward ? parent.firstChild : parent.lastChild];

							// non-xml :nth-child(...) stores cache data on `parent`
							if (forward && useCache) {

								// Seek `elem` from a previously-cached index

								// ...in a gzip-friendly way
								node = parent;
								outerCache = node[expando] || (node[expando] = {});

								// Support: IE <9 only
								// Defend against cloned attroperties (jQuery gh-1709)
								uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});

								cache = uniqueCache[type] || [];
								nodeIndex = cache[0] === dirruns && cache[1];
								diff = nodeIndex && cache[2];
								node = nodeIndex && parent.childNodes[nodeIndex];

								while (node = ++nodeIndex && node && node[dir] || (

								// Fallback to seeking `elem` from the start
								diff = nodeIndex = 0) || start.pop()) {

									// When found, cache indexes on `parent` and break
									if (node.nodeType === 1 && ++diff && node === elem) {
										uniqueCache[type] = [dirruns, nodeIndex, diff];
										break;
									}
								}
							} else {
								// Use previously-cached element index if available
								if (useCache) {
									// ...in a gzip-friendly way
									node = elem;
									outerCache = node[expando] || (node[expando] = {});

									// Support: IE <9 only
									// Defend against cloned attroperties (jQuery gh-1709)
									uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});

									cache = uniqueCache[type] || [];
									nodeIndex = cache[0] === dirruns && cache[1];
									diff = nodeIndex;
								}

								// xml :nth-child(...)
								// or :nth-last-child(...) or :nth(-last)?-of-type(...)
								if (diff === false) {
									// Use the same loop as above to seek `elem` from the start
									while (node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) {

										if ((ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) && ++diff) {

											// Cache the index of each encountered element
											if (useCache) {
												outerCache = node[expando] || (node[expando] = {});

												// Support: IE <9 only
												// Defend against cloned attroperties (jQuery gh-1709)
												uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});

												uniqueCache[type] = [dirruns, diff];
											}

											if (node === elem) {
												break;
											}
										}
									}
								}
							}

							// Incorporate the offset, then check against cycle size
							diff -= last;
							return diff === first || diff % first === 0 && diff / first >= 0;
						}
					};
				},

				"PSEUDO": function (pseudo, argument) {
					// pseudo-class names are case-insensitive
					// http://www.w3.org/TR/selectors/#pseudo-classes
					// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
					// Remember that setFilters inherits from pseudos
					var args,
					    fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || Sizzle.error("unsupported pseudo: " + pseudo);

					// The user may use createPseudo to indicate that
					// arguments are needed to create the filter function
					// just as Sizzle does
					if (fn[expando]) {
						return fn(argument);
					}

					// But maintain support for old signatures
					if (fn.length > 1) {
						args = [pseudo, pseudo, "", argument];
						return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function (seed, matches) {
							var idx,
							    matched = fn(seed, argument),
							    i = matched.length;
							while (i--) {
								idx = indexOf(seed, matched[i]);
								seed[idx] = !(matches[idx] = matched[i]);
							}
						}) : function (elem) {
							return fn(elem, 0, args);
						};
					}

					return fn;
				}
			},

			pseudos: {
				// Potentially complex pseudos
				"not": markFunction(function (selector) {
					// Trim the selector passed to compile
					// to avoid treating leading and trailing
					// spaces as combinators
					var input = [],
					    results = [],
					    matcher = compile(selector.replace(rtrim, "$1"));

					return matcher[expando] ? markFunction(function (seed, matches, context, xml) {
						var elem,
						    unmatched = matcher(seed, null, xml, []),
						    i = seed.length;

						// Match elements unmatched by `matcher`
						while (i--) {
							if (elem = unmatched[i]) {
								seed[i] = !(matches[i] = elem);
							}
						}
					}) : function (elem, context, xml) {
						input[0] = elem;
						matcher(input, null, xml, results);
						// Don't keep the element (issue #299)
						input[0] = null;
						return !results.pop();
					};
				}),

				"has": markFunction(function (selector) {
					return function (elem) {
						return Sizzle(selector, elem).length > 0;
					};
				}),

				"contains": markFunction(function (text) {
					text = text.replace(runescape, funescape);
					return function (elem) {
						return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1;
					};
				}),

				// "Whether an element is represented by a :lang() selector
				// is based solely on the element's language value
				// being equal to the identifier C,
				// or beginning with the identifier C immediately followed by "-".
				// The matching of C against the element's language value is performed case-insensitively.
				// The identifier C does not have to be a valid language name."
				// http://www.w3.org/TR/selectors/#lang-pseudo
				"lang": markFunction(function (lang) {
					// lang value must be a valid identifier
					if (!ridentifier.test(lang || "")) {
						Sizzle.error("unsupported lang: " + lang);
					}
					lang = lang.replace(runescape, funescape).toLowerCase();
					return function (elem) {
						var elemLang;
						do {
							if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) {

								elemLang = elemLang.toLowerCase();
								return elemLang === lang || elemLang.indexOf(lang + "-") === 0;
							}
						} while ((elem = elem.parentNode) && elem.nodeType === 1);
						return false;
					};
				}),

				// Miscellaneous
				"target": function (elem) {
					var hash = window.location && window.location.hash;
					return hash && hash.slice(1) === elem.id;
				},

				"root": function (elem) {
					return elem === docElem;
				},

				"focus": function (elem) {
					return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
				},

				// Boolean properties
				"enabled": function (elem) {
					return elem.disabled === false;
				},

				"disabled": function (elem) {
					return elem.disabled === true;
				},

				"checked": function (elem) {
					// In CSS3, :checked should return both checked and selected elements
					// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
					var nodeName = elem.nodeName.toLowerCase();
					return nodeName === "input" && !!elem.checked || nodeName === "option" && !!elem.selected;
				},

				"selected": function (elem) {
					// Accessing this property makes selected-by-default
					// options in Safari work properly
					if (elem.parentNode) {
						elem.parentNode.selectedIndex;
					}

					return elem.selected === true;
				},

				// Contents
				"empty": function (elem) {
					// http://www.w3.org/TR/selectors/#empty-pseudo
					// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
					//   but not by others (comment: 8; processing instruction: 7; etc.)
					// nodeType < 6 works because attributes (2) do not appear as children
					for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
						if (elem.nodeType < 6) {
							return false;
						}
					}
					return true;
				},

				"parent": function (elem) {
					return !Expr.pseudos["empty"](elem);
				},

				// Element/input types
				"header": function (elem) {
					return rheader.test(elem.nodeName);
				},

				"input": function (elem) {
					return rinputs.test(elem.nodeName);
				},

				"button": function (elem) {
					var name = elem.nodeName.toLowerCase();
					return name === "input" && elem.type === "button" || name === "button";
				},

				"text": function (elem) {
					var attr;
					return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && (

					// Support: IE<8
					// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
					(attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text");
				},

				// Position-in-collection
				"first": createPositionalPseudo(function () {
					return [0];
				}),

				"last": createPositionalPseudo(function (matchIndexes, length) {
					return [length - 1];
				}),

				"eq": createPositionalPseudo(function (matchIndexes, length, argument) {
					return [argument < 0 ? argument + length : argument];
				}),

				"even": createPositionalPseudo(function (matchIndexes, length) {
					var i = 0;
					for (; i < length; i += 2) {
						matchIndexes.push(i);
					}
					return matchIndexes;
				}),

				"odd": createPositionalPseudo(function (matchIndexes, length) {
					var i = 1;
					for (; i < length; i += 2) {
						matchIndexes.push(i);
					}
					return matchIndexes;
				}),

				"lt": createPositionalPseudo(function (matchIndexes, length, argument) {
					var i = argument < 0 ? argument + length : argument;
					for (; --i >= 0;) {
						matchIndexes.push(i);
					}
					return matchIndexes;
				}),

				"gt": createPositionalPseudo(function (matchIndexes, length, argument) {
					var i = argument < 0 ? argument + length : argument;
					for (; ++i < length;) {
						matchIndexes.push(i);
					}
					return matchIndexes;
				})
			}
		};

		Expr.pseudos["nth"] = Expr.pseudos["eq"];

		// Add button/input type pseudos
		for (i in { radio: true, checkbox: true, file: true, password: true, image: true }) {
			Expr.pseudos[i] = createInputPseudo(i);
		}
		for (i in { submit: true, reset: true }) {
			Expr.pseudos[i] = createButtonPseudo(i);
		}

		// Easy API for creating new setFilters
		function setFilters() {}
		setFilters.prototype = Expr.filters = Expr.pseudos;
		Expr.setFilters = new setFilters();

		tokenize = Sizzle.tokenize = function (selector, parseOnly) {
			var matched,
			    match,
			    tokens,
			    type,
			    soFar,
			    groups,
			    preFilters,
			    cached = tokenCache[selector + " "];

			if (cached) {
				return parseOnly ? 0 : cached.slice(0);
			}

			soFar = selector;
			groups = [];
			preFilters = Expr.preFilter;

			while (soFar) {

				// Comma and first run
				if (!matched || (match = rcomma.exec(soFar))) {
					if (match) {
						// Don't consume trailing commas as valid
						soFar = soFar.slice(match[0].length) || soFar;
					}
					groups.push(tokens = []);
				}

				matched = false;

				// Combinators
				if (match = rcombinators.exec(soFar)) {
					matched = match.shift();
					tokens.push({
						value: matched,
						// Cast descendant combinators to space
						type: match[0].replace(rtrim, " ")
					});
					soFar = soFar.slice(matched.length);
				}

				// Filters
				for (type in Expr.filter) {
					if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) {
						matched = match.shift();
						tokens.push({
							value: matched,
							type: type,
							matches: match
						});
						soFar = soFar.slice(matched.length);
					}
				}

				if (!matched) {
					break;
				}
			}

			// Return the length of the invalid excess
			// if we're just parsing
			// Otherwise, throw an error or return tokens
			return parseOnly ? soFar.length : soFar ? Sizzle.error(selector) :
			// Cache the tokens
			tokenCache(selector, groups).slice(0);
		};

		function toSelector(tokens) {
			var i = 0,
			    len = tokens.length,
			    selector = "";
			for (; i < len; i++) {
				selector += tokens[i].value;
			}
			return selector;
		}

		function addCombinator(matcher, combinator, base) {
			var dir = combinator.dir,
			    checkNonElements = base && dir === "parentNode",
			    doneName = done++;

			return combinator.first ?
			// Check against closest ancestor/preceding element
			function (elem, context, xml) {
				while (elem = elem[dir]) {
					if (elem.nodeType === 1 || checkNonElements) {
						return matcher(elem, context, xml);
					}
				}
			} :

			// Check against all ancestor/preceding elements
			function (elem, context, xml) {
				var oldCache,
				    uniqueCache,
				    outerCache,
				    newCache = [dirruns, doneName];

				// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
				if (xml) {
					while (elem = elem[dir]) {
						if (elem.nodeType === 1 || checkNonElements) {
							if (matcher(elem, context, xml)) {
								return true;
							}
						}
					}
				} else {
					while (elem = elem[dir]) {
						if (elem.nodeType === 1 || checkNonElements) {
							outerCache = elem[expando] || (elem[expando] = {});

							// Support: IE <9 only
							// Defend against cloned attroperties (jQuery gh-1709)
							uniqueCache = outerCache[elem.uniqueID] || (outerCache[elem.uniqueID] = {});

							if ((oldCache = uniqueCache[dir]) && oldCache[0] === dirruns && oldCache[1] === doneName) {

								// Assign to newCache so results back-propagate to previous elements
								return newCache[2] = oldCache[2];
							} else {
								// Reuse newcache so results back-propagate to previous elements
								uniqueCache[dir] = newCache;

								// A match means we're done; a fail means we have to keep checking
								if (newCache[2] = matcher(elem, context, xml)) {
									return true;
								}
							}
						}
					}
				}
			};
		}

		function elementMatcher(matchers) {
			return matchers.length > 1 ? function (elem, context, xml) {
				var i = matchers.length;
				while (i--) {
					if (!matchers[i](elem, context, xml)) {
						return false;
					}
				}
				return true;
			} : matchers[0];
		}

		function multipleContexts(selector, contexts, results) {
			var i = 0,
			    len = contexts.length;
			for (; i < len; i++) {
				Sizzle(selector, contexts[i], results);
			}
			return results;
		}

		function condense(unmatched, map, filter, context, xml) {
			var elem,
			    newUnmatched = [],
			    i = 0,
			    len = unmatched.length,
			    mapped = map != null;

			for (; i < len; i++) {
				if (elem = unmatched[i]) {
					if (!filter || filter(elem, context, xml)) {
						newUnmatched.push(elem);
						if (mapped) {
							map.push(i);
						}
					}
				}
			}

			return newUnmatched;
		}

		function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
			if (postFilter && !postFilter[expando]) {
				postFilter = setMatcher(postFilter);
			}
			if (postFinder && !postFinder[expando]) {
				postFinder = setMatcher(postFinder, postSelector);
			}
			return markFunction(function (seed, results, context, xml) {
				var temp,
				    i,
				    elem,
				    preMap = [],
				    postMap = [],
				    preexisting = results.length,


				// Get initial elements from seed or context
				elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []),


				// Prefilter to get matcher input, preserving a map for seed-results synchronization
				matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems,
				    matcherOut = matcher ?
				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
				postFinder || (seed ? preFilter : preexisting || postFilter) ?

				// ...intermediate processing is necessary
				[] :

				// ...otherwise use results directly
				results : matcherIn;

				// Find primary matches
				if (matcher) {
					matcher(matcherIn, matcherOut, context, xml);
				}

				// Apply postFilter
				if (postFilter) {
					temp = condense(matcherOut, postMap);
					postFilter(temp, [], context, xml);

					// Un-match failing elements by moving them back to matcherIn
					i = temp.length;
					while (i--) {
						if (elem = temp[i]) {
							matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);
						}
					}
				}

				if (seed) {
					if (postFinder || preFilter) {
						if (postFinder) {
							// Get the final matcherOut by condensing this intermediate into postFinder contexts
							temp = [];
							i = matcherOut.length;
							while (i--) {
								if (elem = matcherOut[i]) {
									// Restore matcherIn since elem is not yet a final match
									temp.push(matcherIn[i] = elem);
								}
							}
							postFinder(null, matcherOut = [], temp, xml);
						}

						// Move matched elements from seed to results to keep them synchronized
						i = matcherOut.length;
						while (i--) {
							if ((elem = matcherOut[i]) && (temp = postFinder ? indexOf(seed, elem) : preMap[i]) > -1) {

								seed[temp] = !(results[temp] = elem);
							}
						}
					}

					// Add elements to results, through postFinder if defined
				} else {
					matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut);
					if (postFinder) {
						postFinder(null, results, matcherOut, xml);
					} else {
						push.apply(results, matcherOut);
					}
				}
			});
		}

		function matcherFromTokens(tokens) {
			var checkContext,
			    matcher,
			    j,
			    len = tokens.length,
			    leadingRelative = Expr.relative[tokens[0].type],
			    implicitRelative = leadingRelative || Expr.relative[" "],
			    i = leadingRelative ? 1 : 0,


			// The foundational matcher ensures that elements are reachable from top-level context(s)
			matchContext = addCombinator(function (elem) {
				return elem === checkContext;
			}, implicitRelative, true),
			    matchAnyContext = addCombinator(function (elem) {
				return indexOf(checkContext, elem) > -1;
			}, implicitRelative, true),
			    matchers = [function (elem, context, xml) {
				var ret = !leadingRelative && (xml || context !== outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml));
				// Avoid hanging onto element (issue #299)
				checkContext = null;
				return ret;
			}];

			for (; i < len; i++) {
				if (matcher = Expr.relative[tokens[i].type]) {
					matchers = [addCombinator(elementMatcher(matchers), matcher)];
				} else {
					matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches);

					// Return special upon seeing a positional matcher
					if (matcher[expando]) {
						// Find the next relative operator (if any) for proper handling
						j = ++i;
						for (; j < len; j++) {
							if (Expr.relative[tokens[j].type]) {
								break;
							}
						}
						return setMatcher(i > 1 && elementMatcher(matchers), i > 1 && toSelector(
						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
						tokens.slice(0, i - 1).concat({ value: tokens[i - 2].type === " " ? "*" : "" })).replace(rtrim, "$1"), matcher, i < j && matcherFromTokens(tokens.slice(i, j)), j < len && matcherFromTokens(tokens = tokens.slice(j)), j < len && toSelector(tokens));
					}
					matchers.push(matcher);
				}
			}

			return elementMatcher(matchers);
		}

		function matcherFromGroupMatchers(elementMatchers, setMatchers) {
			var bySet = setMatchers.length > 0,
			    byElement = elementMatchers.length > 0,
			    superMatcher = function (seed, context, xml, results, outermost) {
				var elem,
				    j,
				    matcher,
				    matchedCount = 0,
				    i = "0",
				    unmatched = seed && [],
				    setMatched = [],
				    contextBackup = outermostContext,

				// We must always have either seed elements or outermost context
				elems = seed || byElement && Expr.find["TAG"]("*", outermost),

				// Use integer dirruns iff this is the outermost matcher
				dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1,
				    len = elems.length;

				if (outermost) {
					outermostContext = context === document || context || outermost;
				}

				// Add elements passing elementMatchers directly to results
				// Support: IE<9, Safari
				// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
				for (; i !== len && (elem = elems[i]) != null; i++) {
					if (byElement && elem) {
						j = 0;
						if (!context && elem.ownerDocument !== document) {
							setDocument(elem);
							xml = !documentIsHTML;
						}
						while (matcher = elementMatchers[j++]) {
							if (matcher(elem, context || document, xml)) {
								results.push(elem);
								break;
							}
						}
						if (outermost) {
							dirruns = dirrunsUnique;
						}
					}

					// Track unmatched elements for set filters
					if (bySet) {
						// They will have gone through all possible matchers
						if (elem = !matcher && elem) {
							matchedCount--;
						}

						// Lengthen the array for every element, matched or not
						if (seed) {
							unmatched.push(elem);
						}
					}
				}

				// `i` is now the count of elements visited above, and adding it to `matchedCount`
				// makes the latter nonnegative.
				matchedCount += i;

				// Apply set filters to unmatched elements
				// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
				// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
				// no element matchers and no seed.
				// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
				// case, which will result in a "00" `matchedCount` that differs from `i` but is also
				// numerically zero.
				if (bySet && i !== matchedCount) {
					j = 0;
					while (matcher = setMatchers[j++]) {
						matcher(unmatched, setMatched, context, xml);
					}

					if (seed) {
						// Reintegrate element matches to eliminate the need for sorting
						if (matchedCount > 0) {
							while (i--) {
								if (!(unmatched[i] || setMatched[i])) {
									setMatched[i] = pop.call(results);
								}
							}
						}

						// Discard index placeholder values to get only actual matches
						setMatched = condense(setMatched);
					}

					// Add matches to results
					push.apply(results, setMatched);

					// Seedless set matches succeeding multiple successful matchers stipulate sorting
					if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) {

						Sizzle.uniqueSort(results);
					}
				}

				// Override manipulation of globals by nested matchers
				if (outermost) {
					dirruns = dirrunsUnique;
					outermostContext = contextBackup;
				}

				return unmatched;
			};

			return bySet ? markFunction(superMatcher) : superMatcher;
		}

		compile = Sizzle.compile = function (selector, match /* Internal Use Only */) {
			var i,
			    setMatchers = [],
			    elementMatchers = [],
			    cached = compilerCache[selector + " "];

			if (!cached) {
				// Generate a function of recursive functions that can be used to check each element
				if (!match) {
					match = tokenize(selector);
				}
				i = match.length;
				while (i--) {
					cached = matcherFromTokens(match[i]);
					if (cached[expando]) {
						setMatchers.push(cached);
					} else {
						elementMatchers.push(cached);
					}
				}

				// Cache the compiled function
				cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers));

				// Save selector and tokenization
				cached.selector = selector;
			}
			return cached;
		};

		/**
   * A low-level selection function that works with Sizzle's compiled
   *  selector functions
   * @param {String|Function} selector A selector or a pre-compiled
   *  selector function built with Sizzle.compile
   * @param {Element} context
   * @param {Array} [results]
   * @param {Array} [seed] A set of elements to match against
   */
		select = Sizzle.select = function (selector, context, results, seed) {
			var i,
			    tokens,
			    token,
			    type,
			    find,
			    compiled = typeof selector === "function" && selector,
			    match = !seed && tokenize(selector = compiled.selector || selector);

			results = results || [];

			// Try to minimize operations if there is only one selector in the list and no seed
			// (the latter of which guarantees us context)
			if (match.length === 1) {

				// Reduce context if the leading compound selector is an ID
				tokens = match[0] = match[0].slice(0);
				if (tokens.length > 2 && (token = tokens[0]).type === "ID" && support.getById && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) {

					context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0];
					if (!context) {
						return results;

						// Precompiled matchers will still verify ancestry, so step up a level
					} else if (compiled) {
						context = context.parentNode;
					}

					selector = selector.slice(tokens.shift().value.length);
				}

				// Fetch a seed set for right-to-left matching
				i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length;
				while (i--) {
					token = tokens[i];

					// Abort if we hit a combinator
					if (Expr.relative[type = token.type]) {
						break;
					}
					if (find = Expr.find[type]) {
						// Search, expanding context for leading sibling combinators
						if (seed = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && testContext(context.parentNode) || context)) {

							// If seed is empty or no tokens remain, we can return early
							tokens.splice(i, 1);
							selector = seed.length && toSelector(tokens);
							if (!selector) {
								push.apply(results, seed);
								return results;
							}

							break;
						}
					}
				}
			}

			// Compile and execute a filtering function if one is not provided
			// Provide `match` to avoid retokenization if we modified the selector above
			(compiled || compile(selector, match))(seed, context, !documentIsHTML, results, !context || rsibling.test(selector) && testContext(context.parentNode) || context);
			return results;
		};

		// One-time assignments

		// Sort stability
		support.sortStable = expando.split("").sort(sortOrder).join("") === expando;

		// Support: Chrome 14-35+
		// Always assume duplicates if they aren't passed to the comparison function
		support.detectDuplicates = !!hasDuplicate;

		// Initialize against the default document
		setDocument();

		// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
		// Detached nodes confoundingly follow *each other*
		support.sortDetached = assert(function (div1) {
			// Should return 1, but returns 4 (following)
			return div1.compareDocumentPosition(document.createElement("div")) & 1;
		});

		// Support: IE<8
		// Prevent attribute/property "interpolation"
		// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
		if (!assert(function (div) {
			div.innerHTML = "<a href='#'></a>";
			return div.firstChild.getAttribute("href") === "#";
		})) {
			addHandle("type|href|height|width", function (elem, name, isXML) {
				if (!isXML) {
					return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2);
				}
			});
		}

		// Support: IE<9
		// Use defaultValue in place of getAttribute("value")
		if (!support.attributes || !assert(function (div) {
			div.innerHTML = "<input/>";
			div.firstChild.setAttribute("value", "");
			return div.firstChild.getAttribute("value") === "";
		})) {
			addHandle("value", function (elem, name, isXML) {
				if (!isXML && elem.nodeName.toLowerCase() === "input") {
					return elem.defaultValue;
				}
			});
		}

		// Support: IE<9
		// Use getAttributeNode to fetch booleans when getAttribute lies
		if (!assert(function (div) {
			return div.getAttribute("disabled") == null;
		})) {
			addHandle(booleans, function (elem, name, isXML) {
				var val;
				if (!isXML) {
					return elem[name] === true ? name.toLowerCase() : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
				}
			});
		}

		return Sizzle;
	}(window);

	jQuery.find = Sizzle;
	jQuery.expr = Sizzle.selectors;
	jQuery.expr[":"] = jQuery.expr.pseudos;
	jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
	jQuery.text = Sizzle.getText;
	jQuery.isXMLDoc = Sizzle.isXML;
	jQuery.contains = Sizzle.contains;

	var dir = function (elem, dir, until) {
		var matched = [],
		    truncate = until !== undefined;

		while ((elem = elem[dir]) && elem.nodeType !== 9) {
			if (elem.nodeType === 1) {
				if (truncate && jQuery(elem).is(until)) {
					break;
				}
				matched.push(elem);
			}
		}
		return matched;
	};

	var siblings = function (n, elem) {
		var matched = [];

		for (; n; n = n.nextSibling) {
			if (n.nodeType === 1 && n !== elem) {
				matched.push(n);
			}
		}

		return matched;
	};

	var rneedsContext = jQuery.expr.match.needsContext;

	var rsingleTag = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/;

	var risSimple = /^.[^:#\[\.,]*$/;

	// Implement the identical functionality for filter and not
	function winnow(elements, qualifier, not) {
		if (jQuery.isFunction(qualifier)) {
			return jQuery.grep(elements, function (elem, i) {
				/* jshint -W018 */
				return !!qualifier.call(elem, i, elem) !== not;
			});
		}

		if (qualifier.nodeType) {
			return jQuery.grep(elements, function (elem) {
				return elem === qualifier !== not;
			});
		}

		if (typeof qualifier === "string") {
			if (risSimple.test(qualifier)) {
				return jQuery.filter(qualifier, elements, not);
			}

			qualifier = jQuery.filter(qualifier, elements);
		}

		return jQuery.grep(elements, function (elem) {
			return indexOf.call(qualifier, elem) > -1 !== not;
		});
	}

	jQuery.filter = function (expr, elems, not) {
		var elem = elems[0];

		if (not) {
			expr = ":not(" + expr + ")";
		}

		return elems.length === 1 && elem.nodeType === 1 ? jQuery.find.matchesSelector(elem, expr) ? [elem] : [] : jQuery.find.matches(expr, jQuery.grep(elems, function (elem) {
			return elem.nodeType === 1;
		}));
	};

	jQuery.fn.extend({
		find: function (selector) {
			var i,
			    len = this.length,
			    ret = [],
			    self = this;

			if (typeof selector !== "string") {
				return this.pushStack(jQuery(selector).filter(function () {
					for (i = 0; i < len; i++) {
						if (jQuery.contains(self[i], this)) {
							return true;
						}
					}
				}));
			}

			for (i = 0; i < len; i++) {
				jQuery.find(selector, self[i], ret);
			}

			// Needed because $( selector, context ) becomes $( context ).find( selector )
			ret = this.pushStack(len > 1 ? jQuery.unique(ret) : ret);
			ret.selector = this.selector ? this.selector + " " + selector : selector;
			return ret;
		},
		filter: function (selector) {
			return this.pushStack(winnow(this, selector || [], false));
		},
		not: function (selector) {
			return this.pushStack(winnow(this, selector || [], true));
		},
		is: function (selector) {
			return !!winnow(this,

			// If this is a positional/relative selector, check membership in the returned set
			// so $("p:first").is("p:last") won't return true for a doc with two "p".
			typeof selector === "string" && rneedsContext.test(selector) ? jQuery(selector) : selector || [], false).length;
		}
	});

	// Initialize a jQuery object


	// A central reference to the root jQuery(document)
	var rootjQuery,


	// A simple way to check for HTML strings
	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
	// Strict HTML recognition (#11290: must start with <)
	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
	    init = jQuery.fn.init = function (selector, context, root) {
		var match, elem;

		// HANDLE: $(""), $(null), $(undefined), $(false)
		if (!selector) {
			return this;
		}

		// Method init() accepts an alternate rootjQuery
		// so migrate can support jQuery.sub (gh-2101)
		root = root || rootjQuery;

		// Handle HTML strings
		if (typeof selector === "string") {
			if (selector[0] === "<" && selector[selector.length - 1] === ">" && selector.length >= 3) {

				// Assume that strings that start and end with <> are HTML and skip the regex check
				match = [null, selector, null];
			} else {
				match = rquickExpr.exec(selector);
			}

			// Match html or make sure no context is specified for #id
			if (match && (match[1] || !context)) {

				// HANDLE: $(html) -> $(array)
				if (match[1]) {
					context = context instanceof jQuery ? context[0] : context;

					// Option to run scripts is true for back-compat
					// Intentionally let the error be thrown if parseHTML is not present
					jQuery.merge(this, jQuery.parseHTML(match[1], context && context.nodeType ? context.ownerDocument || context : document, true));

					// HANDLE: $(html, props)
					if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
						for (match in context) {

							// Properties of context are called as methods if possible
							if (jQuery.isFunction(this[match])) {
								this[match](context[match]);

								// ...and otherwise set as attributes
							} else {
								this.attr(match, context[match]);
							}
						}
					}

					return this;

					// HANDLE: $(#id)
				} else {
					elem = document.getElementById(match[2]);

					// Support: Blackberry 4.6
					// gEBID returns nodes no longer in the document (#6963)
					if (elem && elem.parentNode) {

						// Inject the element directly into the jQuery object
						this.length = 1;
						this[0] = elem;
					}

					this.context = document;
					this.selector = selector;
					return this;
				}

				// HANDLE: $(expr, $(...))
			} else if (!context || context.jquery) {
				return (context || root).find(selector);

				// HANDLE: $(expr, context)
				// (which is just equivalent to: $(context).find(expr)
			} else {
				return this.constructor(context).find(selector);
			}

			// HANDLE: $(DOMElement)
		} else if (selector.nodeType) {
			this.context = this[0] = selector;
			this.length = 1;
			return this;

			// HANDLE: $(function)
			// Shortcut for document ready
		} else if (jQuery.isFunction(selector)) {
			return root.ready !== undefined ? root.ready(selector) :

			// Execute immediately if ready is not present
			selector(jQuery);
		}

		if (selector.selector !== undefined) {
			this.selector = selector.selector;
			this.context = selector.context;
		}

		return jQuery.makeArray(selector, this);
	};

	// Give the init function the jQuery prototype for later instantiation
	init.prototype = jQuery.fn;

	// Initialize central reference
	rootjQuery = jQuery(document);

	var rparentsprev = /^(?:parents|prev(?:Until|All))/,


	// Methods guaranteed to produce a unique set when starting from a unique set
	guaranteedUnique = {
		children: true,
		contents: true,
		next: true,
		prev: true
	};

	jQuery.fn.extend({
		has: function (target) {
			var targets = jQuery(target, this),
			    l = targets.length;

			return this.filter(function () {
				var i = 0;
				for (; i < l; i++) {
					if (jQuery.contains(this, targets[i])) {
						return true;
					}
				}
			});
		},

		closest: function (selectors, context) {
			var cur,
			    i = 0,
			    l = this.length,
			    matched = [],
			    pos = rneedsContext.test(selectors) || typeof selectors !== "string" ? jQuery(selectors, context || this.context) : 0;

			for (; i < l; i++) {
				for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {

					// Always skip document fragments
					if (cur.nodeType < 11 && (pos ? pos.index(cur) > -1 :

					// Don't pass non-elements to Sizzle
					cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors))) {

						matched.push(cur);
						break;
					}
				}
			}

			return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched);
		},

		// Determine the position of an element within the set
		index: function (elem) {

			// No argument, return index in parent
			if (!elem) {
				return this[0] && this[0].parentNode ? this.first().prevAll().length : -1;
			}

			// Index in selector
			if (typeof elem === "string") {
				return indexOf.call(jQuery(elem), this[0]);
			}

			// Locate the position of the desired element
			return indexOf.call(this,

			// If it receives a jQuery object, the first element is used
			elem.jquery ? elem[0] : elem);
		},

		add: function (selector, context) {
			return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(), jQuery(selector, context))));
		},

		addBack: function (selector) {
			return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector));
		}
	});

	function sibling(cur, dir) {
		while ((cur = cur[dir]) && cur.nodeType !== 1) {}
		return cur;
	}

	jQuery.each({
		parent: function (elem) {
			var parent = elem.parentNode;
			return parent && parent.nodeType !== 11 ? parent : null;
		},
		parents: function (elem) {
			return dir(elem, "parentNode");
		},
		parentsUntil: function (elem, i, until) {
			return dir(elem, "parentNode", until);
		},
		next: function (elem) {
			return sibling(elem, "nextSibling");
		},
		prev: function (elem) {
			return sibling(elem, "previousSibling");
		},
		nextAll: function (elem) {
			return dir(elem, "nextSibling");
		},
		prevAll: function (elem) {
			return dir(elem, "previousSibling");
		},
		nextUntil: function (elem, i, until) {
			return dir(elem, "nextSibling", until);
		},
		prevUntil: function (elem, i, until) {
			return dir(elem, "previousSibling", until);
		},
		siblings: function (elem) {
			return siblings((elem.parentNode || {}).firstChild, elem);
		},
		children: function (elem) {
			return siblings(elem.firstChild);
		},
		contents: function (elem) {
			return elem.contentDocument || jQuery.merge([], elem.childNodes);
		}
	}, function (name, fn) {
		jQuery.fn[name] = function (until, selector) {
			var matched = jQuery.map(this, fn, until);

			if (name.slice(-5) !== "Until") {
				selector = until;
			}

			if (selector && typeof selector === "string") {
				matched = jQuery.filter(selector, matched);
			}

			if (this.length > 1) {

				// Remove duplicates
				if (!guaranteedUnique[name]) {
					jQuery.uniqueSort(matched);
				}

				// Reverse order for parents* and prev-derivatives
				if (rparentsprev.test(name)) {
					matched.reverse();
				}
			}

			return this.pushStack(matched);
		};
	});
	var rnotwhite = /\S+/g;

	// Convert String-formatted options into Object-formatted ones
	function createOptions(options) {
		var object = {};
		jQuery.each(options.match(rnotwhite) || [], function (_, flag) {
			object[flag] = true;
		});
		return object;
	}

	/*
  * Create a callback list using the following parameters:
  *
  *	options: an optional list of space-separated options that will change how
  *			the callback list behaves or a more traditional option object
  *
  * By default a callback list will act like an event callback list and can be
  * "fired" multiple times.
  *
  * Possible options:
  *
  *	once:			will ensure the callback list can only be fired once (like a Deferred)
  *
  *	memory:			will keep track of previous values and will call any callback added
  *					after the list has been fired right away with the latest "memorized"
  *					values (like a Deferred)
  *
  *	unique:			will ensure a callback can only be added once (no duplicate in the list)
  *
  *	stopOnFalse:	interrupt callings when a callback returns false
  *
  */
	jQuery.Callbacks = function (options) {

		// Convert options from String-formatted to Object-formatted if needed
		// (we check in cache first)
		options = typeof options === "string" ? createOptions(options) : jQuery.extend({}, options);

		var // Flag to know if list is currently firing
		firing,


		// Last fire value for non-forgettable lists
		memory,


		// Flag to know if list was already fired
		fired,


		// Flag to prevent firing
		locked,


		// Actual callback list
		list = [],


		// Queue of execution data for repeatable lists
		queue = [],


		// Index of currently firing callback (modified by add/remove as needed)
		firingIndex = -1,


		// Fire callbacks
		fire = function () {

			// Enforce single-firing
			locked = options.once;

			// Execute callbacks for all pending executions,
			// respecting firingIndex overrides and runtime changes
			fired = firing = true;
			for (; queue.length; firingIndex = -1) {
				memory = queue.shift();
				while (++firingIndex < list.length) {

					// Run callback and check for early termination
					if (list[firingIndex].apply(memory[0], memory[1]) === false && options.stopOnFalse) {

						// Jump to end and forget the data so .add doesn't re-fire
						firingIndex = list.length;
						memory = false;
					}
				}
			}

			// Forget the data if we're done with it
			if (!options.memory) {
				memory = false;
			}

			firing = false;

			// Clean up if we're done firing for good
			if (locked) {

				// Keep an empty list if we have data for future add calls
				if (memory) {
					list = [];

					// Otherwise, this object is spent
				} else {
					list = "";
				}
			}
		},


		// Actual Callbacks object
		self = {

			// Add a callback or a collection of callbacks to the list
			add: function () {
				if (list) {

					// If we have memory from a past run, we should fire after adding
					if (memory && !firing) {
						firingIndex = list.length - 1;
						queue.push(memory);
					}

					(function add(args) {
						jQuery.each(args, function (_, arg) {
							if (jQuery.isFunction(arg)) {
								if (!options.unique || !self.has(arg)) {
									list.push(arg);
								}
							} else if (arg && arg.length && jQuery.type(arg) !== "string") {

								// Inspect recursively
								add(arg);
							}
						});
					})(arguments);

					if (memory && !firing) {
						fire();
					}
				}
				return this;
			},

			// Remove a callback from the list
			remove: function () {
				jQuery.each(arguments, function (_, arg) {
					var index;
					while ((index = jQuery.inArray(arg, list, index)) > -1) {
						list.splice(index, 1);

						// Handle firing indexes
						if (index <= firingIndex) {
							firingIndex--;
						}
					}
				});
				return this;
			},

			// Check if a given callback is in the list.
			// If no argument is given, return whether or not list has callbacks attached.
			has: function (fn) {
				return fn ? jQuery.inArray(fn, list) > -1 : list.length > 0;
			},

			// Remove all callbacks from the list
			empty: function () {
				if (list) {
					list = [];
				}
				return this;
			},

			// Disable .fire and .add
			// Abort any current/pending executions
			// Clear all callbacks and values
			disable: function () {
				locked = queue = [];
				list = memory = "";
				return this;
			},
			disabled: function () {
				return !list;
			},

			// Disable .fire
			// Also disable .add unless we have memory (since it would have no effect)
			// Abort any pending executions
			lock: function () {
				locked = queue = [];
				if (!memory) {
					list = memory = "";
				}
				return this;
			},
			locked: function () {
				return !!locked;
			},

			// Call all callbacks with the given context and arguments
			fireWith: function (context, args) {
				if (!locked) {
					args = args || [];
					args = [context, args.slice ? args.slice() : args];
					queue.push(args);
					if (!firing) {
						fire();
					}
				}
				return this;
			},

			// Call all the callbacks with the given arguments
			fire: function () {
				self.fireWith(this, arguments);
				return this;
			},

			// To know if the callbacks have already been called at least once
			fired: function () {
				return !!fired;
			}
		};

		return self;
	};

	jQuery.extend({

		Deferred: function (func) {
			var tuples = [

			// action, add listener, listener list, final state
			["resolve", "done", jQuery.Callbacks("once memory"), "resolved"], ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"], ["notify", "progress", jQuery.Callbacks("memory")]],
			    state = "pending",
			    promise = {
				state: function () {
					return state;
				},
				always: function () {
					deferred.done(arguments).fail(arguments);
					return this;
				},
				then: function () /* fnDone, fnFail, fnProgress */{
					var fns = arguments;
					return jQuery.Deferred(function (newDefer) {
						jQuery.each(tuples, function (i, tuple) {
							var fn = jQuery.isFunction(fns[i]) && fns[i];

							// deferred[ done | fail | progress ] for forwarding actions to newDefer
							deferred[tuple[1]](function () {
								var returned = fn && fn.apply(this, arguments);
								if (returned && jQuery.isFunction(returned.promise)) {
									returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject);
								} else {
									newDefer[tuple[0] + "With"](this === promise ? newDefer.promise() : this, fn ? [returned] : arguments);
								}
							});
						});
						fns = null;
					}).promise();
				},

				// Get a promise for this deferred
				// If obj is provided, the promise aspect is added to the object
				promise: function (obj) {
					return obj != null ? jQuery.extend(obj, promise) : promise;
				}
			},
			    deferred = {};

			// Keep pipe for back-compat
			promise.pipe = promise.then;

			// Add list-specific methods
			jQuery.each(tuples, function (i, tuple) {
				var list = tuple[2],
				    stateString = tuple[3];

				// promise[ done | fail | progress ] = list.add
				promise[tuple[1]] = list.add;

				// Handle state
				if (stateString) {
					list.add(function () {

						// state = [ resolved | rejected ]
						state = stateString;

						// [ reject_list | resolve_list ].disable; progress_list.lock
					}, tuples[i ^ 1][2].disable, tuples[2][2].lock);
				}

				// deferred[ resolve | reject | notify ]
				deferred[tuple[0]] = function () {
					deferred[tuple[0] + "With"](this === deferred ? promise : this, arguments);
					return this;
				};
				deferred[tuple[0] + "With"] = list.fireWith;
			});

			// Make the deferred a promise
			promise.promise(deferred);

			// Call given func if any
			if (func) {
				func.call(deferred, deferred);
			}

			// All done!
			return deferred;
		},

		// Deferred helper
		when: function (subordinate /* , ..., subordinateN */) {
			var i = 0,
			    resolveValues = slice.call(arguments),
			    length = resolveValues.length,


			// the count of uncompleted subordinates
			remaining = length !== 1 || subordinate && jQuery.isFunction(subordinate.promise) ? length : 0,


			// the master Deferred.
			// If resolveValues consist of only a single Deferred, just use that.
			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),


			// Update function for both resolve and progress values
			updateFunc = function (i, contexts, values) {
				return function (value) {
					contexts[i] = this;
					values[i] = arguments.length > 1 ? slice.call(arguments) : value;
					if (values === progressValues) {
						deferred.notifyWith(contexts, values);
					} else if (! --remaining) {
						deferred.resolveWith(contexts, values);
					}
				};
			},
			    progressValues,
			    progressContexts,
			    resolveContexts;

			// Add listeners to Deferred subordinates; treat others as resolved
			if (length > 1) {
				progressValues = new Array(length);
				progressContexts = new Array(length);
				resolveContexts = new Array(length);
				for (; i < length; i++) {
					if (resolveValues[i] && jQuery.isFunction(resolveValues[i].promise)) {
						resolveValues[i].promise().progress(updateFunc(i, progressContexts, progressValues)).done(updateFunc(i, resolveContexts, resolveValues)).fail(deferred.reject);
					} else {
						--remaining;
					}
				}
			}

			// If we're not waiting on anything, resolve the master
			if (!remaining) {
				deferred.resolveWith(resolveContexts, resolveValues);
			}

			return deferred.promise();
		}
	});

	// The deferred used on DOM ready
	var readyList;

	jQuery.fn.ready = function (fn) {

		// Add the callback
		jQuery.ready.promise().done(fn);

		return this;
	};

	jQuery.extend({

		// Is the DOM ready to be used? Set to true once it occurs.
		isReady: false,

		// A counter to track how many items to wait for before
		// the ready event fires. See #6781
		readyWait: 1,

		// Hold (or release) the ready event
		holdReady: function (hold) {
			if (hold) {
				jQuery.readyWait++;
			} else {
				jQuery.ready(true);
			}
		},

		// Handle when the DOM is ready
		ready: function (wait) {

			// Abort if there are pending holds or we're already ready
			if (wait === true ? --jQuery.readyWait : jQuery.isReady) {
				return;
			}

			// Remember that the DOM is ready
			jQuery.isReady = true;

			// If a normal DOM Ready event fired, decrement, and wait if need be
			if (wait !== true && --jQuery.readyWait > 0) {
				return;
			}

			// If there are functions bound, to execute
			readyList.resolveWith(document, [jQuery]);

			// Trigger any bound ready events
			if (jQuery.fn.triggerHandler) {
				jQuery(document).triggerHandler("ready");
				jQuery(document).off("ready");
			}
		}
	});

	/**
  * The ready event handler and self cleanup method
  */
	function completed() {
		document.removeEventListener("DOMContentLoaded", completed);
		window.removeEventListener("load", completed);
		jQuery.ready();
	}

	jQuery.ready.promise = function (obj) {
		if (!readyList) {

			readyList = jQuery.Deferred();

			// Catch cases where $(document).ready() is called
			// after the browser event has already occurred.
			// Support: IE9-10 only
			// Older IE sometimes signals "interactive" too soon
			if (document.readyState === "complete" || document.readyState !== "loading" && !document.documentElement.doScroll) {

				// Handle it asynchronously to allow scripts the opportunity to delay ready
				window.setTimeout(jQuery.ready);
			} else {

				// Use the handy event callback
				document.addEventListener("DOMContentLoaded", completed);

				// A fallback to window.onload, that will always work
				window.addEventListener("load", completed);
			}
		}
		return readyList.promise(obj);
	};

	// Kick off the DOM ready check even if the user does not
	jQuery.ready.promise();

	// Multifunctional method to get and set values of a collection
	// The value/s can optionally be executed if it's a function
	var access = function (elems, fn, key, value, chainable, emptyGet, raw) {
		var i = 0,
		    len = elems.length,
		    bulk = key == null;

		// Sets many values
		if (jQuery.type(key) === "object") {
			chainable = true;
			for (i in key) {
				access(elems, fn, i, key[i], true, emptyGet, raw);
			}

			// Sets one value
		} else if (value !== undefined) {
			chainable = true;

			if (!jQuery.isFunction(value)) {
				raw = true;
			}

			if (bulk) {

				// Bulk operations run against the entire set
				if (raw) {
					fn.call(elems, value);
					fn = null;

					// ...except when executing function values
				} else {
					bulk = fn;
					fn = function (elem, key, value) {
						return bulk.call(jQuery(elem), value);
					};
				}
			}

			if (fn) {
				for (; i < len; i++) {
					fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key)));
				}
			}
		}

		return chainable ? elems :

		// Gets
		bulk ? fn.call(elems) : len ? fn(elems[0], key) : emptyGet;
	};
	var acceptData = function (owner) {

		// Accepts only:
		//  - Node
		//    - Node.ELEMENT_NODE
		//    - Node.DOCUMENT_NODE
		//  - Object
		//    - Any
		/* jshint -W018 */
		return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType;
	};

	function Data() {
		this.expando = jQuery.expando + Data.uid++;
	}

	Data.uid = 1;

	Data.prototype = {

		register: function (owner, initial) {
			var value = initial || {};

			// If it is a node unlikely to be stringify-ed or looped over
			// use plain assignment
			if (owner.nodeType) {
				owner[this.expando] = value;

				// Otherwise secure it in a non-enumerable, non-writable property
				// configurability must be true to allow the property to be
				// deleted with the delete operator
			} else {
				Object.defineProperty(owner, this.expando, {
					value: value,
					writable: true,
					configurable: true
				});
			}
			return owner[this.expando];
		},
		cache: function (owner) {

			// We can accept data for non-element nodes in modern browsers,
			// but we should not, see #8335.
			// Always return an empty object.
			if (!acceptData(owner)) {
				return {};
			}

			// Check if the owner object already has a cache
			var value = owner[this.expando];

			// If not, create one
			if (!value) {
				value = {};

				// We can accept data for non-element nodes in modern browsers,
				// but we should not, see #8335.
				// Always return an empty object.
				if (acceptData(owner)) {

					// If it is a node unlikely to be stringify-ed or looped over
					// use plain assignment
					if (owner.nodeType) {
						owner[this.expando] = value;

						// Otherwise secure it in a non-enumerable property
						// configurable must be true to allow the property to be
						// deleted when data is removed
					} else {
						Object.defineProperty(owner, this.expando, {
							value: value,
							configurable: true
						});
					}
				}
			}

			return value;
		},
		set: function (owner, data, value) {
			var prop,
			    cache = this.cache(owner);

			// Handle: [ owner, key, value ] args
			if (typeof data === "string") {
				cache[data] = value;

				// Handle: [ owner, { properties } ] args
			} else {

				// Copy the properties one-by-one to the cache object
				for (prop in data) {
					cache[prop] = data[prop];
				}
			}
			return cache;
		},
		get: function (owner, key) {
			return key === undefined ? this.cache(owner) : owner[this.expando] && owner[this.expando][key];
		},
		access: function (owner, key, value) {
			var stored;

			// In cases where either:
			//
			//   1. No key was specified
			//   2. A string key was specified, but no value provided
			//
			// Take the "read" path and allow the get method to determine
			// which value to return, respectively either:
			//
			//   1. The entire cache object
			//   2. The data stored at the key
			//
			if (key === undefined || key && typeof key === "string" && value === undefined) {

				stored = this.get(owner, key);

				return stored !== undefined ? stored : this.get(owner, jQuery.camelCase(key));
			}

			// When the key is not a string, or both a key and value
			// are specified, set or extend (existing objects) with either:
			//
			//   1. An object of properties
			//   2. A key and value
			//
			this.set(owner, key, value);

			// Since the "set" path can have two possible entry points
			// return the expected data based on which path was taken[*]
			return value !== undefined ? value : key;
		},
		remove: function (owner, key) {
			var i,
			    name,
			    camel,
			    cache = owner[this.expando];

			if (cache === undefined) {
				return;
			}

			if (key === undefined) {
				this.register(owner);
			} else {

				// Support array or space separated string of keys
				if (jQuery.isArray(key)) {

					// If "name" is an array of keys...
					// When data is initially created, via ("key", "val") signature,
					// keys will be converted to camelCase.
					// Since there is no way to tell _how_ a key was added, remove
					// both plain key and camelCase key. #12786
					// This will only penalize the array argument path.
					name = key.concat(key.map(jQuery.camelCase));
				} else {
					camel = jQuery.camelCase(key);

					// Try the string as a key before any manipulation
					if (key in cache) {
						name = [key, camel];
					} else {

						// If a key with the spaces exists, use it.
						// Otherwise, create an array by matching non-whitespace
						name = camel;
						name = name in cache ? [name] : name.match(rnotwhite) || [];
					}
				}

				i = name.length;

				while (i--) {
					delete cache[name[i]];
				}
			}

			// Remove the expando if there's no more data
			if (key === undefined || jQuery.isEmptyObject(cache)) {

				// Support: Chrome <= 35-45+
				// Webkit & Blink performance suffers when deleting properties
				// from DOM nodes, so set to undefined instead
				// https://code.google.com/p/chromium/issues/detail?id=378607
				if (owner.nodeType) {
					owner[this.expando] = undefined;
				} else {
					delete owner[this.expando];
				}
			}
		},
		hasData: function (owner) {
			var cache = owner[this.expando];
			return cache !== undefined && !jQuery.isEmptyObject(cache);
		}
	};
	var dataPriv = new Data();

	var dataUser = new Data();

	//	Implementation Summary
	//
	//	1. Enforce API surface and semantic compatibility with 1.9.x branch
	//	2. Improve the module's maintainability by reducing the storage
	//		paths to a single mechanism.
	//	3. Use the same single mechanism to support "private" and "user" data.
	//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
	//	5. Avoid exposing implementation details on user objects (eg. expando properties)
	//	6. Provide a clear path for implementation upgrade to WeakMap in 2014

	var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
	    rmultiDash = /[A-Z]/g;

	function dataAttr(elem, key, data) {
		var name;

		// If nothing was found internally, try to fetch any
		// data from the HTML5 data-* attribute
		if (data === undefined && elem.nodeType === 1) {
			name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase();
			data = elem.getAttribute(name);

			if (typeof data === "string") {
				try {
					data = data === "true" ? true : data === "false" ? false : data === "null" ? null :

					// Only convert to a number if it doesn't change the string
					+data + "" === data ? +data : rbrace.test(data) ? jQuery.parseJSON(data) : data;
				} catch (e) {}

				// Make sure we set the data so it isn't changed later
				dataUser.set(elem, key, data);
			} else {
				data = undefined;
			}
		}
		return data;
	}

	jQuery.extend({
		hasData: function (elem) {
			return dataUser.hasData(elem) || dataPriv.hasData(elem);
		},

		data: function (elem, name, data) {
			return dataUser.access(elem, name, data);
		},

		removeData: function (elem, name) {
			dataUser.remove(elem, name);
		},

		// TODO: Now that all calls to _data and _removeData have been replaced
		// with direct calls to dataPriv methods, these can be deprecated.
		_data: function (elem, name, data) {
			return dataPriv.access(elem, name, data);
		},

		_removeData: function (elem, name) {
			dataPriv.remove(elem, name);
		}
	});

	jQuery.fn.extend({
		data: function (key, value) {
			var i,
			    name,
			    data,
			    elem = this[0],
			    attrs = elem && elem.attributes;

			// Gets all values
			if (key === undefined) {
				if (this.length) {
					data = dataUser.get(elem);

					if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) {
						i = attrs.length;
						while (i--) {

							// Support: IE11+
							// The attrs elements can be null (#14894)
							if (attrs[i]) {
								name = attrs[i].name;
								if (name.indexOf("data-") === 0) {
									name = jQuery.camelCase(name.slice(5));
									dataAttr(elem, name, data[name]);
								}
							}
						}
						dataPriv.set(elem, "hasDataAttrs", true);
					}
				}

				return data;
			}

			// Sets multiple values
			if (typeof key === "object") {
				return this.each(function () {
					dataUser.set(this, key);
				});
			}

			return access(this, function (value) {
				var data, camelKey;

				// The calling jQuery object (element matches) is not empty
				// (and therefore has an element appears at this[ 0 ]) and the
				// `value` parameter was not undefined. An empty jQuery object
				// will result in `undefined` for elem = this[ 0 ] which will
				// throw an exception if an attempt to read a data cache is made.
				if (elem && value === undefined) {

					// Attempt to get data from the cache
					// with the key as-is
					data = dataUser.get(elem, key) ||

					// Try to find dashed key if it exists (gh-2779)
					// This is for 2.2.x only
					dataUser.get(elem, key.replace(rmultiDash, "-$&").toLowerCase());

					if (data !== undefined) {
						return data;
					}

					camelKey = jQuery.camelCase(key);

					// Attempt to get data from the cache
					// with the key camelized
					data = dataUser.get(elem, camelKey);
					if (data !== undefined) {
						return data;
					}

					// Attempt to "discover" the data in
					// HTML5 custom data-* attrs
					data = dataAttr(elem, camelKey, undefined);
					if (data !== undefined) {
						return data;
					}

					// We tried really hard, but the data doesn't exist.
					return;
				}

				// Set the data...
				camelKey = jQuery.camelCase(key);
				this.each(function () {

					// First, attempt to store a copy or reference of any
					// data that might've been store with a camelCased key.
					var data = dataUser.get(this, camelKey);

					// For HTML5 data-* attribute interop, we have to
					// store property names with dashes in a camelCase form.
					// This might not apply to all properties...*
					dataUser.set(this, camelKey, value);

					// *... In the case of properties that might _actually_
					// have dashes, we need to also store a copy of that
					// unchanged property.
					if (key.indexOf("-") > -1 && data !== undefined) {
						dataUser.set(this, key, value);
					}
				});
			}, null, value, arguments.length > 1, null, true);
		},

		removeData: function (key) {
			return this.each(function () {
				dataUser.remove(this, key);
			});
		}
	});

	jQuery.extend({
		queue: function (elem, type, data) {
			var queue;

			if (elem) {
				type = (type || "fx") + "queue";
				queue = dataPriv.get(elem, type);

				// Speed up dequeue by getting out quickly if this is just a lookup
				if (data) {
					if (!queue || jQuery.isArray(data)) {
						queue = dataPriv.access(elem, type, jQuery.makeArray(data));
					} else {
						queue.push(data);
					}
				}
				return queue || [];
			}
		},

		dequeue: function (elem, type) {
			type = type || "fx";

			var queue = jQuery.queue(elem, type),
			    startLength = queue.length,
			    fn = queue.shift(),
			    hooks = jQuery._queueHooks(elem, type),
			    next = function () {
				jQuery.dequeue(elem, type);
			};

			// If the fx queue is dequeued, always remove the progress sentinel
			if (fn === "inprogress") {
				fn = queue.shift();
				startLength--;
			}

			if (fn) {

				// Add a progress sentinel to prevent the fx queue from being
				// automatically dequeued
				if (type === "fx") {
					queue.unshift("inprogress");
				}

				// Clear up the last queue stop function
				delete hooks.stop;
				fn.call(elem, next, hooks);
			}

			if (!startLength && hooks) {
				hooks.empty.fire();
			}
		},

		// Not public - generate a queueHooks object, or return the current one
		_queueHooks: function (elem, type) {
			var key = type + "queueHooks";
			return dataPriv.get(elem, key) || dataPriv.access(elem, key, {
				empty: jQuery.Callbacks("once memory").add(function () {
					dataPriv.remove(elem, [type + "queue", key]);
				})
			});
		}
	});

	jQuery.fn.extend({
		queue: function (type, data) {
			var setter = 2;

			if (typeof type !== "string") {
				data = type;
				type = "fx";
				setter--;
			}

			if (arguments.length < setter) {
				return jQuery.queue(this[0], type);
			}

			return data === undefined ? this : this.each(function () {
				var queue = jQuery.queue(this, type, data);

				// Ensure a hooks for this queue
				jQuery._queueHooks(this, type);

				if (type === "fx" && queue[0] !== "inprogress") {
					jQuery.dequeue(this, type);
				}
			});
		},
		dequeue: function (type) {
			return this.each(function () {
				jQuery.dequeue(this, type);
			});
		},
		clearQueue: function (type) {
			return this.queue(type || "fx", []);
		},

		// Get a promise resolved when queues of a certain type
		// are emptied (fx is the type by default)
		promise: function (type, obj) {
			var tmp,
			    count = 1,
			    defer = jQuery.Deferred(),
			    elements = this,
			    i = this.length,
			    resolve = function () {
				if (! --count) {
					defer.resolveWith(elements, [elements]);
				}
			};

			if (typeof type !== "string") {
				obj = type;
				type = undefined;
			}
			type = type || "fx";

			while (i--) {
				tmp = dataPriv.get(elements[i], type + "queueHooks");
				if (tmp && tmp.empty) {
					count++;
					tmp.empty.add(resolve);
				}
			}
			resolve();
			return defer.promise(obj);
		}
	});
	var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source;

	var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i");

	var cssExpand = ["Top", "Right", "Bottom", "Left"];

	var isHidden = function (elem, el) {

		// isHidden might be called from jQuery#filter function;
		// in that case, element will be second argument
		elem = el || elem;
		return jQuery.css(elem, "display") === "none" || !jQuery.contains(elem.ownerDocument, elem);
	};

	function adjustCSS(elem, prop, valueParts, tween) {
		var adjusted,
		    scale = 1,
		    maxIterations = 20,
		    currentValue = tween ? function () {
			return tween.cur();
		} : function () {
			return jQuery.css(elem, prop, "");
		},
		    initial = currentValue(),
		    unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"),


		// Starting value computation is required for potential unit mismatches
		initialInUnit = (jQuery.cssNumber[prop] || unit !== "px" && +initial) && rcssNum.exec(jQuery.css(elem, prop));

		if (initialInUnit && initialInUnit[3] !== unit) {

			// Trust units reported by jQuery.css
			unit = unit || initialInUnit[3];

			// Make sure we update the tween properties later on
			valueParts = valueParts || [];

			// Iteratively approximate from a nonzero starting point
			initialInUnit = +initial || 1;

			do {

				// If previous iteration zeroed out, double until we get *something*.
				// Use string for doubling so we don't accidentally see scale as unchanged below
				scale = scale || ".5";

				// Adjust and apply
				initialInUnit = initialInUnit / scale;
				jQuery.style(elem, prop, initialInUnit + unit);

				// Update scale, tolerating zero or NaN from tween.cur()
				// Break the loop if scale is unchanged or perfect, or if we've just had enough.
			} while (scale !== (scale = currentValue() / initial) && scale !== 1 && --maxIterations);
		}

		if (valueParts) {
			initialInUnit = +initialInUnit || +initial || 0;

			// Apply relative offset (+=/-=) if specified
			adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2];
			if (tween) {
				tween.unit = unit;
				tween.start = initialInUnit;
				tween.end = adjusted;
			}
		}
		return adjusted;
	}
	var rcheckableType = /^(?:checkbox|radio)$/i;

	var rtagName = /<([\w:-]+)/;

	var rscriptType = /^$|\/(?:java|ecma)script/i;

	// We have to close these tags to support XHTML (#13200)
	var wrapMap = {

		// Support: IE9
		option: [1, "<select multiple='multiple'>", "</select>"],

		// XHTML parsers do not magically insert elements in the
		// same way that tag soup parsers do. So we cannot shorten
		// this by omitting <tbody> or other required elements.
		thead: [1, "<table>", "</table>"],
		col: [2, "<table><colgroup>", "</colgroup></table>"],
		tr: [2, "<table><tbody>", "</tbody></table>"],
		td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],

		_default: [0, "", ""]
	};

	// Support: IE9
	wrapMap.optgroup = wrapMap.option;

	wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
	wrapMap.th = wrapMap.td;

	function getAll(context, tag) {

		// Support: IE9-11+
		// Use typeof to avoid zero-argument method invocation on host objects (#15151)
		var ret = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName(tag || "*") : typeof context.querySelectorAll !== "undefined" ? context.querySelectorAll(tag || "*") : [];

		return tag === undefined || tag && jQuery.nodeName(context, tag) ? jQuery.merge([context], ret) : ret;
	}

	// Mark scripts as having already been evaluated
	function setGlobalEval(elems, refElements) {
		var i = 0,
		    l = elems.length;

		for (; i < l; i++) {
			dataPriv.set(elems[i], "globalEval", !refElements || dataPriv.get(refElements[i], "globalEval"));
		}
	}

	var rhtml = /<|&#?\w+;/;

	function buildFragment(elems, context, scripts, selection, ignored) {
		var elem,
		    tmp,
		    tag,
		    wrap,
		    contains,
		    j,
		    fragment = context.createDocumentFragment(),
		    nodes = [],
		    i = 0,
		    l = elems.length;

		for (; i < l; i++) {
			elem = elems[i];

			if (elem || elem === 0) {

				// Add nodes directly
				if (jQuery.type(elem) === "object") {

					// Support: Android<4.1, PhantomJS<2
					// push.apply(_, arraylike) throws on ancient WebKit
					jQuery.merge(nodes, elem.nodeType ? [elem] : elem);

					// Convert non-html into a text node
				} else if (!rhtml.test(elem)) {
					nodes.push(context.createTextNode(elem));

					// Convert html into DOM nodes
				} else {
					tmp = tmp || fragment.appendChild(context.createElement("div"));

					// Deserialize a standard representation
					tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase();
					wrap = wrapMap[tag] || wrapMap._default;
					tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2];

					// Descend through wrappers to the right content
					j = wrap[0];
					while (j--) {
						tmp = tmp.lastChild;
					}

					// Support: Android<4.1, PhantomJS<2
					// push.apply(_, arraylike) throws on ancient WebKit
					jQuery.merge(nodes, tmp.childNodes);

					// Remember the top-level container
					tmp = fragment.firstChild;

					// Ensure the created nodes are orphaned (#12392)
					tmp.textContent = "";
				}
			}
		}

		// Remove wrapper from fragment
		fragment.textContent = "";

		i = 0;
		while (elem = nodes[i++]) {

			// Skip elements already in the context collection (trac-4087)
			if (selection && jQuery.inArray(elem, selection) > -1) {
				if (ignored) {
					ignored.push(elem);
				}
				continue;
			}

			contains = jQuery.contains(elem.ownerDocument, elem);

			// Append to fragment
			tmp = getAll(fragment.appendChild(elem), "script");

			// Preserve script evaluation history
			if (contains) {
				setGlobalEval(tmp);
			}

			// Capture executables
			if (scripts) {
				j = 0;
				while (elem = tmp[j++]) {
					if (rscriptType.test(elem.type || "")) {
						scripts.push(elem);
					}
				}
			}
		}

		return fragment;
	}

	(function () {
		var fragment = document.createDocumentFragment(),
		    div = fragment.appendChild(document.createElement("div")),
		    input = document.createElement("input");

		// Support: Android 4.0-4.3, Safari<=5.1
		// Check state lost if the name is set (#11217)
		// Support: Windows Web Apps (WWA)
		// `name` and `type` must use .setAttribute for WWA (#14901)
		input.setAttribute("type", "radio");
		input.setAttribute("checked", "checked");
		input.setAttribute("name", "t");

		div.appendChild(input);

		// Support: Safari<=5.1, Android<4.2
		// Older WebKit doesn't clone checked state correctly in fragments
		support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked;

		// Support: IE<=11+
		// Make sure textarea (and checkbox) defaultValue is properly cloned
		div.innerHTML = "<textarea>x</textarea>";
		support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue;
	})();

	var rkeyEvent = /^key/,
	    rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
	    rtypenamespace = /^([^.]*)(?:\.(.+)|)/;

	function returnTrue() {
		return true;
	}

	function returnFalse() {
		return false;
	}

	// Support: IE9
	// See #13393 for more info
	function safeActiveElement() {
		try {
			return document.activeElement;
		} catch (err) {}
	}

	function on(elem, types, selector, data, fn, one) {
		var origFn, type;

		// Types can be a map of types/handlers
		if (typeof types === "object") {

			// ( types-Object, selector, data )
			if (typeof selector !== "string") {

				// ( types-Object, data )
				data = data || selector;
				selector = undefined;
			}
			for (type in types) {
				on(elem, type, selector, data, types[type], one);
			}
			return elem;
		}

		if (data == null && fn == null) {

			// ( types, fn )
			fn = selector;
			data = selector = undefined;
		} else if (fn == null) {
			if (typeof selector === "string") {

				// ( types, selector, fn )
				fn = data;
				data = undefined;
			} else {

				// ( types, data, fn )
				fn = data;
				data = selector;
				selector = undefined;
			}
		}
		if (fn === false) {
			fn = returnFalse;
		} else if (!fn) {
			return elem;
		}

		if (one === 1) {
			origFn = fn;
			fn = function (event) {

				// Can use an empty set, since event contains the info
				jQuery().off(event);
				return origFn.apply(this, arguments);
			};

			// Use same guid so caller can remove using origFn
			fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);
		}
		return elem.each(function () {
			jQuery.event.add(this, types, fn, data, selector);
		});
	}

	/*
  * Helper functions for managing events -- not part of the public interface.
  * Props to Dean Edwards' addEvent library for many of the ideas.
  */
	jQuery.event = {

		global: {},

		add: function (elem, types, handler, data, selector) {

			var handleObjIn,
			    eventHandle,
			    tmp,
			    events,
			    t,
			    handleObj,
			    special,
			    handlers,
			    type,
			    namespaces,
			    origType,
			    elemData = dataPriv.get(elem);

			// Don't attach events to noData or text/comment nodes (but allow plain objects)
			if (!elemData) {
				return;
			}

			// Caller can pass in an object of custom data in lieu of the handler
			if (handler.handler) {
				handleObjIn = handler;
				handler = handleObjIn.handler;
				selector = handleObjIn.selector;
			}

			// Make sure that the handler has a unique ID, used to find/remove it later
			if (!handler.guid) {
				handler.guid = jQuery.guid++;
			}

			// Init the element's event structure and main handler, if this is the first
			if (!(events = elemData.events)) {
				events = elemData.events = {};
			}
			if (!(eventHandle = elemData.handle)) {
				eventHandle = elemData.handle = function (e) {

					// Discard the second event of a jQuery.event.trigger() and
					// when an event is called after a page has unloaded
					return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply(elem, arguments) : undefined;
				};
			}

			// Handle multiple events separated by a space
			types = (types || "").match(rnotwhite) || [""];
			t = types.length;
			while (t--) {
				tmp = rtypenamespace.exec(types[t]) || [];
				type = origType = tmp[1];
				namespaces = (tmp[2] || "").split(".").sort();

				// There *must* be a type, no attaching namespace-only handlers
				if (!type) {
					continue;
				}

				// If event changes its type, use the special event handlers for the changed type
				special = jQuery.event.special[type] || {};

				// If selector defined, determine special event api type, otherwise given type
				type = (selector ? special.delegateType : special.bindType) || type;

				// Update special based on newly reset type
				special = jQuery.event.special[type] || {};

				// handleObj is passed to all event handlers
				handleObj = jQuery.extend({
					type: type,
					origType: origType,
					data: data,
					handler: handler,
					guid: handler.guid,
					selector: selector,
					needsContext: selector && jQuery.expr.match.needsContext.test(selector),
					namespace: namespaces.join(".")
				}, handleObjIn);

				// Init the event handler queue if we're the first
				if (!(handlers = events[type])) {
					handlers = events[type] = [];
					handlers.delegateCount = 0;

					// Only use addEventListener if the special events handler returns false
					if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {

						if (elem.addEventListener) {
							elem.addEventListener(type, eventHandle);
						}
					}
				}

				if (special.add) {
					special.add.call(elem, handleObj);

					if (!handleObj.handler.guid) {
						handleObj.handler.guid = handler.guid;
					}
				}

				// Add to the element's handler list, delegates in front
				if (selector) {
					handlers.splice(handlers.delegateCount++, 0, handleObj);
				} else {
					handlers.push(handleObj);
				}

				// Keep track of which events have ever been used, for event optimization
				jQuery.event.global[type] = true;
			}
		},

		// Detach an event or set of events from an element
		remove: function (elem, types, handler, selector, mappedTypes) {

			var j,
			    origCount,
			    tmp,
			    events,
			    t,
			    handleObj,
			    special,
			    handlers,
			    type,
			    namespaces,
			    origType,
			    elemData = dataPriv.hasData(elem) && dataPriv.get(elem);

			if (!elemData || !(events = elemData.events)) {
				return;
			}

			// Once for each type.namespace in types; type may be omitted
			types = (types || "").match(rnotwhite) || [""];
			t = types.length;
			while (t--) {
				tmp = rtypenamespace.exec(types[t]) || [];
				type = origType = tmp[1];
				namespaces = (tmp[2] || "").split(".").sort();

				// Unbind all events (on this namespace, if provided) for the element
				if (!type) {
					for (type in events) {
						jQuery.event.remove(elem, type + types[t], handler, selector, true);
					}
					continue;
				}

				special = jQuery.event.special[type] || {};
				type = (selector ? special.delegateType : special.bindType) || type;
				handlers = events[type] || [];
				tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)");

				// Remove matching events
				origCount = j = handlers.length;
				while (j--) {
					handleObj = handlers[j];

					if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) {
						handlers.splice(j, 1);

						if (handleObj.selector) {
							handlers.delegateCount--;
						}
						if (special.remove) {
							special.remove.call(elem, handleObj);
						}
					}
				}

				// Remove generic event handler if we removed something and no more handlers exist
				// (avoids potential for endless recursion during removal of special event handlers)
				if (origCount && !handlers.length) {
					if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {

						jQuery.removeEvent(elem, type, elemData.handle);
					}

					delete events[type];
				}
			}

			// Remove data and the expando if it's no longer used
			if (jQuery.isEmptyObject(events)) {
				dataPriv.remove(elem, "handle events");
			}
		},

		dispatch: function (event) {

			// Make a writable jQuery.Event from the native event object
			event = jQuery.event.fix(event);

			var i,
			    j,
			    ret,
			    matched,
			    handleObj,
			    handlerQueue = [],
			    args = slice.call(arguments),
			    handlers = (dataPriv.get(this, "events") || {})[event.type] || [],
			    special = jQuery.event.special[event.type] || {};

			// Use the fix-ed jQuery.Event rather than the (read-only) native event
			args[0] = event;
			event.delegateTarget = this;

			// Call the preDispatch hook for the mapped type, and let it bail if desired
			if (special.preDispatch && special.preDispatch.call(this, event) === false) {
				return;
			}

			// Determine handlers
			handlerQueue = jQuery.event.handlers.call(this, event, handlers);

			// Run delegates first; they may want to stop propagation beneath us
			i = 0;
			while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {
				event.currentTarget = matched.elem;

				j = 0;
				while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) {

					// Triggered event must either 1) have no namespace, or 2) have namespace(s)
					// a subset or equal to those in the bound event (both can have no namespace).
					if (!event.rnamespace || event.rnamespace.test(handleObj.namespace)) {

						event.handleObj = handleObj;
						event.data = handleObj.data;

						ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args);

						if (ret !== undefined) {
							if ((event.result = ret) === false) {
								event.preventDefault();
								event.stopPropagation();
							}
						}
					}
				}
			}

			// Call the postDispatch hook for the mapped type
			if (special.postDispatch) {
				special.postDispatch.call(this, event);
			}

			return event.result;
		},

		handlers: function (event, handlers) {
			var i,
			    matches,
			    sel,
			    handleObj,
			    handlerQueue = [],
			    delegateCount = handlers.delegateCount,
			    cur = event.target;

			// Support (at least): Chrome, IE9
			// Find delegate handlers
			// Black-hole SVG <use> instance trees (#13180)
			//
			// Support: Firefox<=42+
			// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
			if (delegateCount && cur.nodeType && (event.type !== "click" || isNaN(event.button) || event.button < 1)) {

				for (; cur !== this; cur = cur.parentNode || this) {

					// Don't check non-elements (#13208)
					// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
					if (cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click")) {
						matches = [];
						for (i = 0; i < delegateCount; i++) {
							handleObj = handlers[i];

							// Don't conflict with Object.prototype properties (#13203)
							sel = handleObj.selector + " ";

							if (matches[sel] === undefined) {
								matches[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) > -1 : jQuery.find(sel, this, null, [cur]).length;
							}
							if (matches[sel]) {
								matches.push(handleObj);
							}
						}
						if (matches.length) {
							handlerQueue.push({ elem: cur, handlers: matches });
						}
					}
				}
			}

			// Add the remaining (directly-bound) handlers
			if (delegateCount < handlers.length) {
				handlerQueue.push({ elem: this, handlers: handlers.slice(delegateCount) });
			}

			return handlerQueue;
		},

		// Includes some event props shared by KeyEvent and MouseEvent
		props: ("altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + "metaKey relatedTarget shiftKey target timeStamp view which").split(" "),

		fixHooks: {},

		keyHooks: {
			props: "char charCode key keyCode".split(" "),
			filter: function (event, original) {

				// Add which for key events
				if (event.which == null) {
					event.which = original.charCode != null ? original.charCode : original.keyCode;
				}

				return event;
			}
		},

		mouseHooks: {
			props: ("button buttons clientX clientY offsetX offsetY pageX pageY " + "screenX screenY toElement").split(" "),
			filter: function (event, original) {
				var eventDoc,
				    doc,
				    body,
				    button = original.button;

				// Calculate pageX/Y if missing and clientX/Y available
				if (event.pageX == null && original.clientX != null) {
					eventDoc = event.target.ownerDocument || document;
					doc = eventDoc.documentElement;
					body = eventDoc.body;

					event.pageX = original.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
					event.pageY = original.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
				}

				// Add which for click: 1 === left; 2 === middle; 3 === right
				// Note: button is not normalized, so don't use it
				if (!event.which && button !== undefined) {
					event.which = button & 1 ? 1 : button & 2 ? 3 : button & 4 ? 2 : 0;
				}

				return event;
			}
		},

		fix: function (event) {
			if (event[jQuery.expando]) {
				return event;
			}

			// Create a writable copy of the event object and normalize some properties
			var i,
			    prop,
			    copy,
			    type = event.type,
			    originalEvent = event,
			    fixHook = this.fixHooks[type];

			if (!fixHook) {
				this.fixHooks[type] = fixHook = rmouseEvent.test(type) ? this.mouseHooks : rkeyEvent.test(type) ? this.keyHooks : {};
			}
			copy = fixHook.props ? this.props.concat(fixHook.props) : this.props;

			event = new jQuery.Event(originalEvent);

			i = copy.length;
			while (i--) {
				prop = copy[i];
				event[prop] = originalEvent[prop];
			}

			// Support: Cordova 2.5 (WebKit) (#13255)
			// All events should have a target; Cordova deviceready doesn't
			if (!event.target) {
				event.target = document;
			}

			// Support: Safari 6.0+, Chrome<28
			// Target should not be a text node (#504, #13143)
			if (event.target.nodeType === 3) {
				event.target = event.target.parentNode;
			}

			return fixHook.filter ? fixHook.filter(event, originalEvent) : event;
		},

		special: {
			load: {

				// Prevent triggered image.load events from bubbling to window.load
				noBubble: true
			},
			focus: {

				// Fire native event if possible so blur/focus sequence is correct
				trigger: function () {
					if (this !== safeActiveElement() && this.focus) {
						this.focus();
						return false;
					}
				},
				delegateType: "focusin"
			},
			blur: {
				trigger: function () {
					if (this === safeActiveElement() && this.blur) {
						this.blur();
						return false;
					}
				},
				delegateType: "focusout"
			},
			click: {

				// For checkbox, fire native event so checked state will be right
				trigger: function () {
					if (this.type === "checkbox" && this.click && jQuery.nodeName(this, "input")) {
						this.click();
						return false;
					}
				},

				// For cross-browser consistency, don't fire native .click() on links
				_default: function (event) {
					return jQuery.nodeName(event.target, "a");
				}
			},

			beforeunload: {
				postDispatch: function (event) {

					// Support: Firefox 20+
					// Firefox doesn't alert if the returnValue field is not set.
					if (event.result !== undefined && event.originalEvent) {
						event.originalEvent.returnValue = event.result;
					}
				}
			}
		}
	};

	jQuery.removeEvent = function (elem, type, handle) {

		// This "if" is needed for plain objects
		if (elem.removeEventListener) {
			elem.removeEventListener(type, handle);
		}
	};

	jQuery.Event = function (src, props) {

		// Allow instantiation without the 'new' keyword
		if (!(this instanceof jQuery.Event)) {
			return new jQuery.Event(src, props);
		}

		// Event object
		if (src && src.type) {
			this.originalEvent = src;
			this.type = src.type;

			// Events bubbling up the document may have been marked as prevented
			// by a handler lower down the tree; reflect the correct value.
			this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined &&

			// Support: Android<4.0
			src.returnValue === false ? returnTrue : returnFalse;

			// Event type
		} else {
			this.type = src;
		}

		// Put explicitly provided properties onto the event object
		if (props) {
			jQuery.extend(this, props);
		}

		// Create a timestamp if incoming event doesn't have one
		this.timeStamp = src && src.timeStamp || jQuery.now();

		// Mark it as fixed
		this[jQuery.expando] = true;
	};

	// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
	// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
	jQuery.Event.prototype = {
		constructor: jQuery.Event,
		isDefaultPrevented: returnFalse,
		isPropagationStopped: returnFalse,
		isImmediatePropagationStopped: returnFalse,
		isSimulated: false,

		preventDefault: function () {
			var e = this.originalEvent;

			this.isDefaultPrevented = returnTrue;

			if (e && !this.isSimulated) {
				e.preventDefault();
			}
		},
		stopPropagation: function () {
			var e = this.originalEvent;

			this.isPropagationStopped = returnTrue;

			if (e && !this.isSimulated) {
				e.stopPropagation();
			}
		},
		stopImmediatePropagation: function () {
			var e = this.originalEvent;

			this.isImmediatePropagationStopped = returnTrue;

			if (e && !this.isSimulated) {
				e.stopImmediatePropagation();
			}

			this.stopPropagation();
		}
	};

	// Create mouseenter/leave events using mouseover/out and event-time checks
	// so that event delegation works in jQuery.
	// Do the same for pointerenter/pointerleave and pointerover/pointerout
	//
	// Support: Safari 7 only
	// Safari sends mouseenter too often; see:
	// https://code.google.com/p/chromium/issues/detail?id=470258
	// for the description of the bug (it existed in older Chrome versions as well).
	jQuery.each({
		mouseenter: "mouseover",
		mouseleave: "mouseout",
		pointerenter: "pointerover",
		pointerleave: "pointerout"
	}, function (orig, fix) {
		jQuery.event.special[orig] = {
			delegateType: fix,
			bindType: fix,

			handle: function (event) {
				var ret,
				    target = this,
				    related = event.relatedTarget,
				    handleObj = event.handleObj;

				// For mouseenter/leave call the handler if related is outside the target.
				// NB: No relatedTarget if the mouse left/entered the browser window
				if (!related || related !== target && !jQuery.contains(target, related)) {
					event.type = handleObj.origType;
					ret = handleObj.handler.apply(this, arguments);
					event.type = fix;
				}
				return ret;
			}
		};
	});

	jQuery.fn.extend({
		on: function (types, selector, data, fn) {
			return on(this, types, selector, data, fn);
		},
		one: function (types, selector, data, fn) {
			return on(this, types, selector, data, fn, 1);
		},
		off: function (types, selector, fn) {
			var handleObj, type;
			if (types && types.preventDefault && types.handleObj) {

				// ( event )  dispatched jQuery.Event
				handleObj = types.handleObj;
				jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler);
				return this;
			}
			if (typeof types === "object") {

				// ( types-object [, selector] )
				for (type in types) {
					this.off(type, selector, types[type]);
				}
				return this;
			}
			if (selector === false || typeof selector === "function") {

				// ( types [, fn] )
				fn = selector;
				selector = undefined;
			}
			if (fn === false) {
				fn = returnFalse;
			}
			return this.each(function () {
				jQuery.event.remove(this, types, fn, selector);
			});
		}
	});

	var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,


	// Support: IE 10-11, Edge 10240+
	// In IE/Edge using regex groups here causes severe slowdowns.
	// See https://connect.microsoft.com/IE/feedback/details/1736512/
	rnoInnerhtml = /<script|<style|<link/i,


	// checked="checked" or checked
	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
	    rscriptTypeMasked = /^true\/(.*)/,
	    rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;

	// Manipulating tables requires a tbody
	function manipulationTarget(elem, content) {
		return jQuery.nodeName(elem, "table") && jQuery.nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr") ? elem.getElementsByTagName("tbody")[0] || elem.appendChild(elem.ownerDocument.createElement("tbody")) : elem;
	}

	// Replace/restore the type attribute of script elements for safe DOM manipulation
	function disableScript(elem) {
		elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
		return elem;
	}
	function restoreScript(elem) {
		var match = rscriptTypeMasked.exec(elem.type);

		if (match) {
			elem.type = match[1];
		} else {
			elem.removeAttribute("type");
		}

		return elem;
	}

	function cloneCopyEvent(src, dest) {
		var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;

		if (dest.nodeType !== 1) {
			return;
		}

		// 1. Copy private data: events, handlers, etc.
		if (dataPriv.hasData(src)) {
			pdataOld = dataPriv.access(src);
			pdataCur = dataPriv.set(dest, pdataOld);
			events = pdataOld.events;

			if (events) {
				delete pdataCur.handle;
				pdataCur.events = {};

				for (type in events) {
					for (i = 0, l = events[type].length; i < l; i++) {
						jQuery.event.add(dest, type, events[type][i]);
					}
				}
			}
		}

		// 2. Copy user data
		if (dataUser.hasData(src)) {
			udataOld = dataUser.access(src);
			udataCur = jQuery.extend({}, udataOld);

			dataUser.set(dest, udataCur);
		}
	}

	// Fix IE bugs, see support tests
	function fixInput(src, dest) {
		var nodeName = dest.nodeName.toLowerCase();

		// Fails to persist the checked state of a cloned checkbox or radio button.
		if (nodeName === "input" && rcheckableType.test(src.type)) {
			dest.checked = src.checked;

			// Fails to return the selected option to the default selected state when cloning options
		} else if (nodeName === "input" || nodeName === "textarea") {
			dest.defaultValue = src.defaultValue;
		}
	}

	function domManip(collection, args, callback, ignored) {

		// Flatten any nested arrays
		args = concat.apply([], args);

		var fragment,
		    first,
		    scripts,
		    hasScripts,
		    node,
		    doc,
		    i = 0,
		    l = collection.length,
		    iNoClone = l - 1,
		    value = args[0],
		    isFunction = jQuery.isFunction(value);

		// We can't cloneNode fragments that contain checked, in WebKit
		if (isFunction || l > 1 && typeof value === "string" && !support.checkClone && rchecked.test(value)) {
			return collection.each(function (index) {
				var self = collection.eq(index);
				if (isFunction) {
					args[0] = value.call(this, index, self.html());
				}
				domManip(self, args, callback, ignored);
			});
		}

		if (l) {
			fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored);
			first = fragment.firstChild;

			if (fragment.childNodes.length === 1) {
				fragment = first;
			}

			// Require either new content or an interest in ignored elements to invoke the callback
			if (first || ignored) {
				scripts = jQuery.map(getAll(fragment, "script"), disableScript);
				hasScripts = scripts.length;

				// Use the original fragment for the last item
				// instead of the first because it can end up
				// being emptied incorrectly in certain situations (#8070).
				for (; i < l; i++) {
					node = fragment;

					if (i !== iNoClone) {
						node = jQuery.clone(node, true, true);

						// Keep references to cloned scripts for later restoration
						if (hasScripts) {

							// Support: Android<4.1, PhantomJS<2
							// push.apply(_, arraylike) throws on ancient WebKit
							jQuery.merge(scripts, getAll(node, "script"));
						}
					}

					callback.call(collection[i], node, i);
				}

				if (hasScripts) {
					doc = scripts[scripts.length - 1].ownerDocument;

					// Reenable scripts
					jQuery.map(scripts, restoreScript);

					// Evaluate executable scripts on first document insertion
					for (i = 0; i < hasScripts; i++) {
						node = scripts[i];
						if (rscriptType.test(node.type || "") && !dataPriv.access(node, "globalEval") && jQuery.contains(doc, node)) {

							if (node.src) {

								// Optional AJAX dependency, but won't run scripts if not present
								if (jQuery._evalUrl) {
									jQuery._evalUrl(node.src);
								}
							} else {
								jQuery.globalEval(node.textContent.replace(rcleanScript, ""));
							}
						}
					}
				}
			}
		}

		return collection;
	}

	function remove(elem, selector, keepData) {
		var node,
		    nodes = selector ? jQuery.filter(selector, elem) : elem,
		    i = 0;

		for (; (node = nodes[i]) != null; i++) {
			if (!keepData && node.nodeType === 1) {
				jQuery.cleanData(getAll(node));
			}

			if (node.parentNode) {
				if (keepData && jQuery.contains(node.ownerDocument, node)) {
					setGlobalEval(getAll(node, "script"));
				}
				node.parentNode.removeChild(node);
			}
		}

		return elem;
	}

	jQuery.extend({
		htmlPrefilter: function (html) {
			return html.replace(rxhtmlTag, "<$1></$2>");
		},

		clone: function (elem, dataAndEvents, deepDataAndEvents) {
			var i,
			    l,
			    srcElements,
			    destElements,
			    clone = elem.cloneNode(true),
			    inPage = jQuery.contains(elem.ownerDocument, elem);

			// Fix IE cloning issues
			if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) {

				// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
				destElements = getAll(clone);
				srcElements = getAll(elem);

				for (i = 0, l = srcElements.length; i < l; i++) {
					fixInput(srcElements[i], destElements[i]);
				}
			}

			// Copy the events from the original to the clone
			if (dataAndEvents) {
				if (deepDataAndEvents) {
					srcElements = srcElements || getAll(elem);
					destElements = destElements || getAll(clone);

					for (i = 0, l = srcElements.length; i < l; i++) {
						cloneCopyEvent(srcElements[i], destElements[i]);
					}
				} else {
					cloneCopyEvent(elem, clone);
				}
			}

			// Preserve script evaluation history
			destElements = getAll(clone, "script");
			if (destElements.length > 0) {
				setGlobalEval(destElements, !inPage && getAll(elem, "script"));
			}

			// Return the cloned set
			return clone;
		},

		cleanData: function (elems) {
			var data,
			    elem,
			    type,
			    special = jQuery.event.special,
			    i = 0;

			for (; (elem = elems[i]) !== undefined; i++) {
				if (acceptData(elem)) {
					if (data = elem[dataPriv.expando]) {
						if (data.events) {
							for (type in data.events) {
								if (special[type]) {
									jQuery.event.remove(elem, type);

									// This is a shortcut to avoid jQuery.event.remove's overhead
								} else {
									jQuery.removeEvent(elem, type, data.handle);
								}
							}
						}

						// Support: Chrome <= 35-45+
						// Assign undefined instead of using delete, see Data#remove
						elem[dataPriv.expando] = undefined;
					}
					if (elem[dataUser.expando]) {

						// Support: Chrome <= 35-45+
						// Assign undefined instead of using delete, see Data#remove
						elem[dataUser.expando] = undefined;
					}
				}
			}
		}
	});

	jQuery.fn.extend({

		// Keep domManip exposed until 3.0 (gh-2225)
		domManip: domManip,

		detach: function (selector) {
			return remove(this, selector, true);
		},

		remove: function (selector) {
			return remove(this, selector);
		},

		text: function (value) {
			return access(this, function (value) {
				return value === undefined ? jQuery.text(this) : this.empty().each(function () {
					if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
						this.textContent = value;
					}
				});
			}, null, value, arguments.length);
		},

		append: function () {
			return domManip(this, arguments, function (elem) {
				if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
					var target = manipulationTarget(this, elem);
					target.appendChild(elem);
				}
			});
		},

		prepend: function () {
			return domManip(this, arguments, function (elem) {
				if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
					var target = manipulationTarget(this, elem);
					target.insertBefore(elem, target.firstChild);
				}
			});
		},

		before: function () {
			return domManip(this, arguments, function (elem) {
				if (this.parentNode) {
					this.parentNode.insertBefore(elem, this);
				}
			});
		},

		after: function () {
			return domManip(this, arguments, function (elem) {
				if (this.parentNode) {
					this.parentNode.insertBefore(elem, this.nextSibling);
				}
			});
		},

		empty: function () {
			var elem,
			    i = 0;

			for (; (elem = this[i]) != null; i++) {
				if (elem.nodeType === 1) {

					// Prevent memory leaks
					jQuery.cleanData(getAll(elem, false));

					// Remove any remaining nodes
					elem.textContent = "";
				}
			}

			return this;
		},

		clone: function (dataAndEvents, deepDataAndEvents) {
			dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
			deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;

			return this.map(function () {
				return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
			});
		},

		html: function (value) {
			return access(this, function (value) {
				var elem = this[0] || {},
				    i = 0,
				    l = this.length;

				if (value === undefined && elem.nodeType === 1) {
					return elem.innerHTML;
				}

				// See if we can take a shortcut and just use innerHTML
				if (typeof value === "string" && !rnoInnerhtml.test(value) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) {

					value = jQuery.htmlPrefilter(value);

					try {
						for (; i < l; i++) {
							elem = this[i] || {};

							// Remove element nodes and prevent memory leaks
							if (elem.nodeType === 1) {
								jQuery.cleanData(getAll(elem, false));
								elem.innerHTML = value;
							}
						}

						elem = 0;

						// If using innerHTML throws an exception, use the fallback method
					} catch (e) {}
				}

				if (elem) {
					this.empty().append(value);
				}
			}, null, value, arguments.length);
		},

		replaceWith: function () {
			var ignored = [];

			// Make the changes, replacing each non-ignored context element with the new content
			return domManip(this, arguments, function (elem) {
				var parent = this.parentNode;

				if (jQuery.inArray(this, ignored) < 0) {
					jQuery.cleanData(getAll(this));
					if (parent) {
						parent.replaceChild(elem, this);
					}
				}

				// Force callback invocation
			}, ignored);
		}
	});

	jQuery.each({
		appendTo: "append",
		prependTo: "prepend",
		insertBefore: "before",
		insertAfter: "after",
		replaceAll: "replaceWith"
	}, function (name, original) {
		jQuery.fn[name] = function (selector) {
			var elems,
			    ret = [],
			    insert = jQuery(selector),
			    last = insert.length - 1,
			    i = 0;

			for (; i <= last; i++) {
				elems = i === last ? this : this.clone(true);
				jQuery(insert[i])[original](elems);

				// Support: QtWebKit
				// .get() because push.apply(_, arraylike) throws
				push.apply(ret, elems.get());
			}

			return this.pushStack(ret);
		};
	});

	var iframe,
	    elemdisplay = {

		// Support: Firefox
		// We have to pre-define these values for FF (#10227)
		HTML: "block",
		BODY: "block"
	};

	/**
  * Retrieve the actual display of a element
  * @param {String} name nodeName of the element
  * @param {Object} doc Document object
  */

	// Called only from within defaultDisplay
	function actualDisplay(name, doc) {
		var elem = jQuery(doc.createElement(name)).appendTo(doc.body),
		    display = jQuery.css(elem[0], "display");

		// We don't have any data stored on the element,
		// so use "detach" method as fast way to get rid of the element
		elem.detach();

		return display;
	}

	/**
  * Try to determine the default display value of an element
  * @param {String} nodeName
  */
	function defaultDisplay(nodeName) {
		var doc = document,
		    display = elemdisplay[nodeName];

		if (!display) {
			display = actualDisplay(nodeName, doc);

			// If the simple way fails, read from inside an iframe
			if (display === "none" || !display) {

				// Use the already-created iframe if possible
				iframe = (iframe || jQuery("<iframe frameborder='0' width='0' height='0'/>")).appendTo(doc.documentElement);

				// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
				doc = iframe[0].contentDocument;

				// Support: IE
				doc.write();
				doc.close();

				display = actualDisplay(nodeName, doc);
				iframe.detach();
			}

			// Store the correct default display
			elemdisplay[nodeName] = display;
		}

		return display;
	}
	var rmargin = /^margin/;

	var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i");

	var getStyles = function (elem) {

		// Support: IE<=11+, Firefox<=30+ (#15098, #14150)
		// IE throws on elements created in popups
		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
		var view = elem.ownerDocument.defaultView;

		if (!view || !view.opener) {
			view = window;
		}

		return view.getComputedStyle(elem);
	};

	var swap = function (elem, options, callback, args) {
		var ret,
		    name,
		    old = {};

		// Remember the old values, and insert the new ones
		for (name in options) {
			old[name] = elem.style[name];
			elem.style[name] = options[name];
		}

		ret = callback.apply(elem, args || []);

		// Revert the old values
		for (name in options) {
			elem.style[name] = old[name];
		}

		return ret;
	};

	var documentElement = document.documentElement;

	(function () {
		var pixelPositionVal,
		    boxSizingReliableVal,
		    pixelMarginRightVal,
		    reliableMarginLeftVal,
		    container = document.createElement("div"),
		    div = document.createElement("div");

		// Finish early in limited (non-browser) environments
		if (!div.style) {
			return;
		}

		// Support: IE9-11+
		// Style of cloned element affects source element cloned (#8908)
		div.style.backgroundClip = "content-box";
		div.cloneNode(true).style.backgroundClip = "";
		support.clearCloneStyle = div.style.backgroundClip === "content-box";

		container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + "padding:0;margin-top:1px;position:absolute";
		container.appendChild(div);

		// Executing both pixelPosition & boxSizingReliable tests require only one layout
		// so they're executed at the same time to save the second computation.
		function computeStyleTests() {
			div.style.cssText =

			// Support: Firefox<29, Android 2.3
			// Vendor-prefix box-sizing
			"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;" + "position:relative;display:block;" + "margin:auto;border:1px;padding:1px;" + "top:1%;width:50%";
			div.innerHTML = "";
			documentElement.appendChild(container);

			var divStyle = window.getComputedStyle(div);
			pixelPositionVal = divStyle.top !== "1%";
			reliableMarginLeftVal = divStyle.marginLeft === "2px";
			boxSizingReliableVal = divStyle.width === "4px";

			// Support: Android 4.0 - 4.3 only
			// Some styles come back with percentage values, even though they shouldn't
			div.style.marginRight = "50%";
			pixelMarginRightVal = divStyle.marginRight === "4px";

			documentElement.removeChild(container);
		}

		jQuery.extend(support, {
			pixelPosition: function () {

				// This test is executed only once but we still do memoizing
				// since we can use the boxSizingReliable pre-computing.
				// No need to check if the test was already performed, though.
				computeStyleTests();
				return pixelPositionVal;
			},
			boxSizingReliable: function () {
				if (boxSizingReliableVal == null) {
					computeStyleTests();
				}
				return boxSizingReliableVal;
			},
			pixelMarginRight: function () {

				// Support: Android 4.0-4.3
				// We're checking for boxSizingReliableVal here instead of pixelMarginRightVal
				// since that compresses better and they're computed together anyway.
				if (boxSizingReliableVal == null) {
					computeStyleTests();
				}
				return pixelMarginRightVal;
			},
			reliableMarginLeft: function () {

				// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
				if (boxSizingReliableVal == null) {
					computeStyleTests();
				}
				return reliableMarginLeftVal;
			},
			reliableMarginRight: function () {

				// Support: Android 2.3
				// Check if div with explicit width and no margin-right incorrectly
				// gets computed margin-right based on width of container. (#3333)
				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
				// This support function is only executed once so no memoizing is needed.
				var ret,
				    marginDiv = div.appendChild(document.createElement("div"));

				// Reset CSS: box-sizing; display; margin; border; padding
				marginDiv.style.cssText = div.style.cssText =

				// Support: Android 2.3
				// Vendor-prefix box-sizing
				"-webkit-box-sizing:content-box;box-sizing:content-box;" + "display:block;margin:0;border:0;padding:0";
				marginDiv.style.marginRight = marginDiv.style.width = "0";
				div.style.width = "1px";
				documentElement.appendChild(container);

				ret = !parseFloat(window.getComputedStyle(marginDiv).marginRight);

				documentElement.removeChild(container);
				div.removeChild(marginDiv);

				return ret;
			}
		});
	})();

	function curCSS(elem, name, computed) {
		var width,
		    minWidth,
		    maxWidth,
		    ret,
		    style = elem.style;

		computed = computed || getStyles(elem);
		ret = computed ? computed.getPropertyValue(name) || computed[name] : undefined;

		// Support: Opera 12.1x only
		// Fall back to style even without computed
		// computed is undefined for elems on document fragments
		if ((ret === "" || ret === undefined) && !jQuery.contains(elem.ownerDocument, elem)) {
			ret = jQuery.style(elem, name);
		}

		// Support: IE9
		// getPropertyValue is only needed for .css('filter') (#12537)
		if (computed) {

			// A tribute to the "awesome hack by Dean Edwards"
			// Android Browser returns percentage for some values,
			// but width seems to be reliably pixels.
			// This is against the CSSOM draft spec:
			// http://dev.w3.org/csswg/cssom/#resolved-values
			if (!support.pixelMarginRight() && rnumnonpx.test(ret) && rmargin.test(name)) {

				// Remember the original values
				width = style.width;
				minWidth = style.minWidth;
				maxWidth = style.maxWidth;

				// Put in the new values to get a computed value out
				style.minWidth = style.maxWidth = style.width = ret;
				ret = computed.width;

				// Revert the changed values
				style.width = width;
				style.minWidth = minWidth;
				style.maxWidth = maxWidth;
			}
		}

		return ret !== undefined ?

		// Support: IE9-11+
		// IE returns zIndex value as an integer.
		ret + "" : ret;
	}

	function addGetHookIf(conditionFn, hookFn) {

		// Define the hook, we'll check on the first run if it's really needed.
		return {
			get: function () {
				if (conditionFn()) {

					// Hook not needed (or it's not possible to use it due
					// to missing dependency), remove it.
					delete this.get;
					return;
				}

				// Hook needed; redefine it so that the support test is not executed again.
				return (this.get = hookFn).apply(this, arguments);
			}
		};
	}

	var

	// Swappable if display is none or starts with table
	// except "table", "table-cell", or "table-caption"
	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
	    cssShow = { position: "absolute", visibility: "hidden", display: "block" },
	    cssNormalTransform = {
		letterSpacing: "0",
		fontWeight: "400"
	},
	    cssPrefixes = ["Webkit", "O", "Moz", "ms"],
	    emptyStyle = document.createElement("div").style;

	// Return a css property mapped to a potentially vendor prefixed property
	function vendorPropName(name) {

		// Shortcut for names that are not vendor prefixed
		if (name in emptyStyle) {
			return name;
		}

		// Check for vendor prefixed names
		var capName = name[0].toUpperCase() + name.slice(1),
		    i = cssPrefixes.length;

		while (i--) {
			name = cssPrefixes[i] + capName;
			if (name in emptyStyle) {
				return name;
			}
		}
	}

	function setPositiveNumber(elem, value, subtract) {

		// Any relative (+/-) values have already been
		// normalized at this point
		var matches = rcssNum.exec(value);
		return matches ?

		// Guard against undefined "subtract", e.g., when used as in cssHooks
		Math.max(0, matches[2] - (subtract || 0)) + (matches[3] || "px") : value;
	}

	function augmentWidthOrHeight(elem, name, extra, isBorderBox, styles) {
		var i = extra === (isBorderBox ? "border" : "content") ?

		// If we already have the right measurement, avoid augmentation
		4 :

		// Otherwise initialize for horizontal or vertical properties
		name === "width" ? 1 : 0,
		    val = 0;

		for (; i < 4; i += 2) {

			// Both box models exclude margin, so add it if we want it
			if (extra === "margin") {
				val += jQuery.css(elem, extra + cssExpand[i], true, styles);
			}

			if (isBorderBox) {

				// border-box includes padding, so remove it if we want content
				if (extra === "content") {
					val -= jQuery.css(elem, "padding" + cssExpand[i], true, styles);
				}

				// At this point, extra isn't border nor margin, so remove border
				if (extra !== "margin") {
					val -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
				}
			} else {

				// At this point, extra isn't content, so add padding
				val += jQuery.css(elem, "padding" + cssExpand[i], true, styles);

				// At this point, extra isn't content nor padding, so add border
				if (extra !== "padding") {
					val += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
				}
			}
		}

		return val;
	}

	function getWidthOrHeight(elem, name, extra) {

		// Start with offset property, which is equivalent to the border-box value
		var valueIsBorderBox = true,
		    val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
		    styles = getStyles(elem),
		    isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box";

		// Some non-html elements return undefined for offsetWidth, so check for null/undefined
		// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
		// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
		if (val <= 0 || val == null) {

			// Fall back to computed then uncomputed css if necessary
			val = curCSS(elem, name, styles);
			if (val < 0 || val == null) {
				val = elem.style[name];
			}

			// Computed unit is not pixels. Stop here and return.
			if (rnumnonpx.test(val)) {
				return val;
			}

			// Check for style in case a browser which returns unreliable values
			// for getComputedStyle silently falls back to the reliable elem.style
			valueIsBorderBox = isBorderBox && (support.boxSizingReliable() || val === elem.style[name]);

			// Normalize "", auto, and prepare for extra
			val = parseFloat(val) || 0;
		}

		// Use the active box-sizing model to add/subtract irrelevant styles
		return val + augmentWidthOrHeight(elem, name, extra || (isBorderBox ? "border" : "content"), valueIsBorderBox, styles) + "px";
	}

	function showHide(elements, show) {
		var display,
		    elem,
		    hidden,
		    values = [],
		    index = 0,
		    length = elements.length;

		for (; index < length; index++) {
			elem = elements[index];
			if (!elem.style) {
				continue;
			}

			values[index] = dataPriv.get(elem, "olddisplay");
			display = elem.style.display;
			if (show) {

				// Reset the inline display of this element to learn if it is
				// being hidden by cascaded rules or not
				if (!values[index] && display === "none") {
					elem.style.display = "";
				}

				// Set elements which have been overridden with display: none
				// in a stylesheet to whatever the default browser style is
				// for such an element
				if (elem.style.display === "" && isHidden(elem)) {
					values[index] = dataPriv.access(elem, "olddisplay", defaultDisplay(elem.nodeName));
				}
			} else {
				hidden = isHidden(elem);

				if (display !== "none" || !hidden) {
					dataPriv.set(elem, "olddisplay", hidden ? display : jQuery.css(elem, "display"));
				}
			}
		}

		// Set the display of most of the elements in a second loop
		// to avoid the constant reflow
		for (index = 0; index < length; index++) {
			elem = elements[index];
			if (!elem.style) {
				continue;
			}
			if (!show || elem.style.display === "none" || elem.style.display === "") {
				elem.style.display = show ? values[index] || "" : "none";
			}
		}

		return elements;
	}

	jQuery.extend({

		// Add in style property hooks for overriding the default
		// behavior of getting and setting a style property
		cssHooks: {
			opacity: {
				get: function (elem, computed) {
					if (computed) {

						// We should always get a number back from opacity
						var ret = curCSS(elem, "opacity");
						return ret === "" ? "1" : ret;
					}
				}
			}
		},

		// Don't automatically add "px" to these possibly-unitless properties
		cssNumber: {
			"animationIterationCount": true,
			"columnCount": true,
			"fillOpacity": true,
			"flexGrow": true,
			"flexShrink": true,
			"fontWeight": true,
			"lineHeight": true,
			"opacity": true,
			"order": true,
			"orphans": true,
			"widows": true,
			"zIndex": true,
			"zoom": true
		},

		// Add in properties whose names you wish to fix before
		// setting or getting the value
		cssProps: {
			"float": "cssFloat"
		},

		// Get and set the style property on a DOM Node
		style: function (elem, name, value, extra) {

			// Don't set styles on text and comment nodes
			if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {
				return;
			}

			// Make sure that we're working with the right name
			var ret,
			    type,
			    hooks,
			    origName = jQuery.camelCase(name),
			    style = elem.style;

			name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(origName) || origName);

			// Gets hook for the prefixed version, then unprefixed version
			hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];

			// Check if we're setting a value
			if (value !== undefined) {
				type = typeof value;

				// Convert "+=" or "-=" to relative numbers (#7345)
				if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) {
					value = adjustCSS(elem, name, ret);

					// Fixes bug #9237
					type = "number";
				}

				// Make sure that null and NaN values aren't set (#7116)
				if (value == null || value !== value) {
					return;
				}

				// If a number was passed in, add the unit (except for certain CSS properties)
				if (type === "number") {
					value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px");
				}

				// Support: IE9-11+
				// background-* props affect original clone's values
				if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) {
					style[name] = "inherit";
				}

				// If a hook was provided, use that value, otherwise just set the specified value
				if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== undefined) {

					style[name] = value;
				}
			} else {

				// If a hook was provided get the non-computed value from there
				if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) {

					return ret;
				}

				// Otherwise just get the value from the style object
				return style[name];
			}
		},

		css: function (elem, name, extra, styles) {
			var val,
			    num,
			    hooks,
			    origName = jQuery.camelCase(name);

			// Make sure that we're working with the right name
			name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(origName) || origName);

			// Try prefixed name followed by the unprefixed name
			hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];

			// If a hook was provided get the computed value from there
			if (hooks && "get" in hooks) {
				val = hooks.get(elem, true, extra);
			}

			// Otherwise, if a way to get the computed value exists, use that
			if (val === undefined) {
				val = curCSS(elem, name, styles);
			}

			// Convert "normal" to computed value
			if (val === "normal" && name in cssNormalTransform) {
				val = cssNormalTransform[name];
			}

			// Make numeric if forced or a qualifier was provided and val looks numeric
			if (extra === "" || extra) {
				num = parseFloat(val);
				return extra === true || isFinite(num) ? num || 0 : val;
			}
			return val;
		}
	});

	jQuery.each(["height", "width"], function (i, name) {
		jQuery.cssHooks[name] = {
			get: function (elem, computed, extra) {
				if (computed) {

					// Certain elements can have dimension info if we invisibly show them
					// but it must have a current display style that would benefit
					return rdisplayswap.test(jQuery.css(elem, "display")) && elem.offsetWidth === 0 ? swap(elem, cssShow, function () {
						return getWidthOrHeight(elem, name, extra);
					}) : getWidthOrHeight(elem, name, extra);
				}
			},

			set: function (elem, value, extra) {
				var matches,
				    styles = extra && getStyles(elem),
				    subtract = extra && augmentWidthOrHeight(elem, name, extra, jQuery.css(elem, "boxSizing", false, styles) === "border-box", styles);

				// Convert to pixels if value adjustment is needed
				if (subtract && (matches = rcssNum.exec(value)) && (matches[3] || "px") !== "px") {

					elem.style[name] = value;
					value = jQuery.css(elem, name);
				}

				return setPositiveNumber(elem, value, subtract);
			}
		};
	});

	jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft, function (elem, computed) {
		if (computed) {
			return (parseFloat(curCSS(elem, "marginLeft")) || elem.getBoundingClientRect().left - swap(elem, { marginLeft: 0 }, function () {
				return elem.getBoundingClientRect().left;
			})) + "px";
		}
	});

	// Support: Android 2.3
	jQuery.cssHooks.marginRight = addGetHookIf(support.reliableMarginRight, function (elem, computed) {
		if (computed) {
			return swap(elem, { "display": "inline-block" }, curCSS, [elem, "marginRight"]);
		}
	});

	// These hooks are used by animate to expand properties
	jQuery.each({
		margin: "",
		padding: "",
		border: "Width"
	}, function (prefix, suffix) {
		jQuery.cssHooks[prefix + suffix] = {
			expand: function (value) {
				var i = 0,
				    expanded = {},


				// Assumes a single number if not a string
				parts = typeof value === "string" ? value.split(" ") : [value];

				for (; i < 4; i++) {
					expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0];
				}

				return expanded;
			}
		};

		if (!rmargin.test(prefix)) {
			jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
		}
	});

	jQuery.fn.extend({
		css: function (name, value) {
			return access(this, function (elem, name, value) {
				var styles,
				    len,
				    map = {},
				    i = 0;

				if (jQuery.isArray(name)) {
					styles = getStyles(elem);
					len = name.length;

					for (; i < len; i++) {
						map[name[i]] = jQuery.css(elem, name[i], false, styles);
					}

					return map;
				}

				return value !== undefined ? jQuery.style(elem, name, value) : jQuery.css(elem, name);
			}, name, value, arguments.length > 1);
		},
		show: function () {
			return showHide(this, true);
		},
		hide: function () {
			return showHide(this);
		},
		toggle: function (state) {
			if (typeof state === "boolean") {
				return state ? this.show() : this.hide();
			}

			return this.each(function () {
				if (isHidden(this)) {
					jQuery(this).show();
				} else {
					jQuery(this).hide();
				}
			});
		}
	});

	function Tween(elem, options, prop, end, easing) {
		return new Tween.prototype.init(elem, options, prop, end, easing);
	}
	jQuery.Tween = Tween;

	Tween.prototype = {
		constructor: Tween,
		init: function (elem, options, prop, end, easing, unit) {
			this.elem = elem;
			this.prop = prop;
			this.easing = easing || jQuery.easing._default;
			this.options = options;
			this.start = this.now = this.cur();
			this.end = end;
			this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px");
		},
		cur: function () {
			var hooks = Tween.propHooks[this.prop];

			return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this);
		},
		run: function (percent) {
			var eased,
			    hooks = Tween.propHooks[this.prop];

			if (this.options.duration) {
				this.pos = eased = jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration);
			} else {
				this.pos = eased = percent;
			}
			this.now = (this.end - this.start) * eased + this.start;

			if (this.options.step) {
				this.options.step.call(this.elem, this.now, this);
			}

			if (hooks && hooks.set) {
				hooks.set(this);
			} else {
				Tween.propHooks._default.set(this);
			}
			return this;
		}
	};

	Tween.prototype.init.prototype = Tween.prototype;

	Tween.propHooks = {
		_default: {
			get: function (tween) {
				var result;

				// Use a property on the element directly when it is not a DOM element,
				// or when there is no matching style property that exists.
				if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) {
					return tween.elem[tween.prop];
				}

				// Passing an empty string as a 3rd parameter to .css will automatically
				// attempt a parseFloat and fallback to a string if the parse fails.
				// Simple values such as "10px" are parsed to Float;
				// complex values such as "rotate(1rad)" are returned as-is.
				result = jQuery.css(tween.elem, tween.prop, "");

				// Empty strings, null, undefined and "auto" are converted to 0.
				return !result || result === "auto" ? 0 : result;
			},
			set: function (tween) {

				// Use step hook for back compat.
				// Use cssHook if its there.
				// Use .style if available and use plain properties where available.
				if (jQuery.fx.step[tween.prop]) {
					jQuery.fx.step[tween.prop](tween);
				} else if (tween.elem.nodeType === 1 && (tween.elem.style[jQuery.cssProps[tween.prop]] != null || jQuery.cssHooks[tween.prop])) {
					jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
				} else {
					tween.elem[tween.prop] = tween.now;
				}
			}
		}
	};

	// Support: IE9
	// Panic based approach to setting things on disconnected nodes
	Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
		set: function (tween) {
			if (tween.elem.nodeType && tween.elem.parentNode) {
				tween.elem[tween.prop] = tween.now;
			}
		}
	};

	jQuery.easing = {
		linear: function (p) {
			return p;
		},
		swing: function (p) {
			return 0.5 - Math.cos(p * Math.PI) / 2;
		},
		_default: "swing"
	};

	jQuery.fx = Tween.prototype.init;

	// Back Compat <1.8 extension point
	jQuery.fx.step = {};

	var fxNow,
	    timerId,
	    rfxtypes = /^(?:toggle|show|hide)$/,
	    rrun = /queueHooks$/;

	// Animations created synchronously will run synchronously
	function createFxNow() {
		window.setTimeout(function () {
			fxNow = undefined;
		});
		return fxNow = jQuery.now();
	}

	// Generate parameters to create a standard animation
	function genFx(type, includeWidth) {
		var which,
		    i = 0,
		    attrs = { height: type };

		// If we include width, step value is 1 to do all cssExpand values,
		// otherwise step value is 2 to skip over Left and Right
		includeWidth = includeWidth ? 1 : 0;
		for (; i < 4; i += 2 - includeWidth) {
			which = cssExpand[i];
			attrs["margin" + which] = attrs["padding" + which] = type;
		}

		if (includeWidth) {
			attrs.opacity = attrs.width = type;
		}

		return attrs;
	}

	function createTween(value, prop, animation) {
		var tween,
		    collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]),
		    index = 0,
		    length = collection.length;
		for (; index < length; index++) {
			if (tween = collection[index].call(animation, prop, value)) {

				// We're done with this property
				return tween;
			}
		}
	}

	function defaultPrefilter(elem, props, opts) {
		/* jshint validthis: true */
		var prop,
		    value,
		    toggle,
		    tween,
		    hooks,
		    oldfire,
		    display,
		    checkDisplay,
		    anim = this,
		    orig = {},
		    style = elem.style,
		    hidden = elem.nodeType && isHidden(elem),
		    dataShow = dataPriv.get(elem, "fxshow");

		// Handle queue: false promises
		if (!opts.queue) {
			hooks = jQuery._queueHooks(elem, "fx");
			if (hooks.unqueued == null) {
				hooks.unqueued = 0;
				oldfire = hooks.empty.fire;
				hooks.empty.fire = function () {
					if (!hooks.unqueued) {
						oldfire();
					}
				};
			}
			hooks.unqueued++;

			anim.always(function () {

				// Ensure the complete handler is called before this completes
				anim.always(function () {
					hooks.unqueued--;
					if (!jQuery.queue(elem, "fx").length) {
						hooks.empty.fire();
					}
				});
			});
		}

		// Height/width overflow pass
		if (elem.nodeType === 1 && ("height" in props || "width" in props)) {

			// Make sure that nothing sneaks out
			// Record all 3 overflow attributes because IE9-10 do not
			// change the overflow attribute when overflowX and
			// overflowY are set to the same value
			opts.overflow = [style.overflow, style.overflowX, style.overflowY];

			// Set display property to inline-block for height/width
			// animations on inline elements that are having width/height animated
			display = jQuery.css(elem, "display");

			// Test default display if display is currently "none"
			checkDisplay = display === "none" ? dataPriv.get(elem, "olddisplay") || defaultDisplay(elem.nodeName) : display;

			if (checkDisplay === "inline" && jQuery.css(elem, "float") === "none") {
				style.display = "inline-block";
			}
		}

		if (opts.overflow) {
			style.overflow = "hidden";
			anim.always(function () {
				style.overflow = opts.overflow[0];
				style.overflowX = opts.overflow[1];
				style.overflowY = opts.overflow[2];
			});
		}

		// show/hide pass
		for (prop in props) {
			value = props[prop];
			if (rfxtypes.exec(value)) {
				delete props[prop];
				toggle = toggle || value === "toggle";
				if (value === (hidden ? "hide" : "show")) {

					// If there is dataShow left over from a stopped hide or show
					// and we are going to proceed with show, we should pretend to be hidden
					if (value === "show" && dataShow && dataShow[prop] !== undefined) {
						hidden = true;
					} else {
						continue;
					}
				}
				orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);

				// Any non-fx value stops us from restoring the original display value
			} else {
				display = undefined;
			}
		}

		if (!jQuery.isEmptyObject(orig)) {
			if (dataShow) {
				if ("hidden" in dataShow) {
					hidden = dataShow.hidden;
				}
			} else {
				dataShow = dataPriv.access(elem, "fxshow", {});
			}

			// Store state if its toggle - enables .stop().toggle() to "reverse"
			if (toggle) {
				dataShow.hidden = !hidden;
			}
			if (hidden) {
				jQuery(elem).show();
			} else {
				anim.done(function () {
					jQuery(elem).hide();
				});
			}
			anim.done(function () {
				var prop;

				dataPriv.remove(elem, "fxshow");
				for (prop in orig) {
					jQuery.style(elem, prop, orig[prop]);
				}
			});
			for (prop in orig) {
				tween = createTween(hidden ? dataShow[prop] : 0, prop, anim);

				if (!(prop in dataShow)) {
					dataShow[prop] = tween.start;
					if (hidden) {
						tween.end = tween.start;
						tween.start = prop === "width" || prop === "height" ? 1 : 0;
					}
				}
			}

			// If this is a noop like .hide().hide(), restore an overwritten display value
		} else if ((display === "none" ? defaultDisplay(elem.nodeName) : display) === "inline") {
			style.display = display;
		}
	}

	function propFilter(props, specialEasing) {
		var index, name, easing, value, hooks;

		// camelCase, specialEasing and expand cssHook pass
		for (index in props) {
			name = jQuery.camelCase(index);
			easing = specialEasing[name];
			value = props[index];
			if (jQuery.isArray(value)) {
				easing = value[1];
				value = props[index] = value[0];
			}

			if (index !== name) {
				props[name] = value;
				delete props[index];
			}

			hooks = jQuery.cssHooks[name];
			if (hooks && "expand" in hooks) {
				value = hooks.expand(value);
				delete props[name];

				// Not quite $.extend, this won't overwrite existing keys.
				// Reusing 'index' because we have the correct "name"
				for (index in value) {
					if (!(index in props)) {
						props[index] = value[index];
						specialEasing[index] = easing;
					}
				}
			} else {
				specialEasing[name] = easing;
			}
		}
	}

	function Animation(elem, properties, options) {
		var result,
		    stopped,
		    index = 0,
		    length = Animation.prefilters.length,
		    deferred = jQuery.Deferred().always(function () {

			// Don't match elem in the :animated selector
			delete tick.elem;
		}),
		    tick = function () {
			if (stopped) {
				return false;
			}
			var currentTime = fxNow || createFxNow(),
			    remaining = Math.max(0, animation.startTime + animation.duration - currentTime),


			// Support: Android 2.3
			// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
			temp = remaining / animation.duration || 0,
			    percent = 1 - temp,
			    index = 0,
			    length = animation.tweens.length;

			for (; index < length; index++) {
				animation.tweens[index].run(percent);
			}

			deferred.notifyWith(elem, [animation, percent, remaining]);

			if (percent < 1 && length) {
				return remaining;
			} else {
				deferred.resolveWith(elem, [animation]);
				return false;
			}
		},
		    animation = deferred.promise({
			elem: elem,
			props: jQuery.extend({}, properties),
			opts: jQuery.extend(true, {
				specialEasing: {},
				easing: jQuery.easing._default
			}, options),
			originalProperties: properties,
			originalOptions: options,
			startTime: fxNow || createFxNow(),
			duration: options.duration,
			tweens: [],
			createTween: function (prop, end) {
				var tween = jQuery.Tween(elem, animation.opts, prop, end, animation.opts.specialEasing[prop] || animation.opts.easing);
				animation.tweens.push(tween);
				return tween;
			},
			stop: function (gotoEnd) {
				var index = 0,


				// If we are going to the end, we want to run all the tweens
				// otherwise we skip this part
				length = gotoEnd ? animation.tweens.length : 0;
				if (stopped) {
					return this;
				}
				stopped = true;
				for (; index < length; index++) {
					animation.tweens[index].run(1);
				}

				// Resolve when we played the last frame; otherwise, reject
				if (gotoEnd) {
					deferred.notifyWith(elem, [animation, 1, 0]);
					deferred.resolveWith(elem, [animation, gotoEnd]);
				} else {
					deferred.rejectWith(elem, [animation, gotoEnd]);
				}
				return this;
			}
		}),
		    props = animation.props;

		propFilter(props, animation.opts.specialEasing);

		for (; index < length; index++) {
			result = Animation.prefilters[index].call(animation, elem, props, animation.opts);
			if (result) {
				if (jQuery.isFunction(result.stop)) {
					jQuery._queueHooks(animation.elem, animation.opts.queue).stop = jQuery.proxy(result.stop, result);
				}
				return result;
			}
		}

		jQuery.map(props, createTween, animation);

		if (jQuery.isFunction(animation.opts.start)) {
			animation.opts.start.call(elem, animation);
		}

		jQuery.fx.timer(jQuery.extend(tick, {
			elem: elem,
			anim: animation,
			queue: animation.opts.queue
		}));

		// attach callbacks from options
		return animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always);
	}

	jQuery.Animation = jQuery.extend(Animation, {
		tweeners: {
			"*": [function (prop, value) {
				var tween = this.createTween(prop, value);
				adjustCSS(tween.elem, prop, rcssNum.exec(value), tween);
				return tween;
			}]
		},

		tweener: function (props, callback) {
			if (jQuery.isFunction(props)) {
				callback = props;
				props = ["*"];
			} else {
				props = props.match(rnotwhite);
			}

			var prop,
			    index = 0,
			    length = props.length;

			for (; index < length; index++) {
				prop = props[index];
				Animation.tweeners[prop] = Animation.tweeners[prop] || [];
				Animation.tweeners[prop].unshift(callback);
			}
		},

		prefilters: [defaultPrefilter],

		prefilter: function (callback, prepend) {
			if (prepend) {
				Animation.prefilters.unshift(callback);
			} else {
				Animation.prefilters.push(callback);
			}
		}
	});

	jQuery.speed = function (speed, easing, fn) {
		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
			complete: fn || !fn && easing || jQuery.isFunction(speed) && speed,
			duration: speed,
			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
		};

		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;

		// Normalize opt.queue - true/undefined/null -> "fx"
		if (opt.queue == null || opt.queue === true) {
			opt.queue = "fx";
		}

		// Queueing
		opt.old = opt.complete;

		opt.complete = function () {
			if (jQuery.isFunction(opt.old)) {
				opt.old.call(this);
			}

			if (opt.queue) {
				jQuery.dequeue(this, opt.queue);
			}
		};

		return opt;
	};

	jQuery.fn.extend({
		fadeTo: function (speed, to, easing, callback) {

			// Show any hidden elements after setting opacity to 0
			return this.filter(isHidden).css("opacity", 0).show()

			// Animate to the value specified
			.end().animate({ opacity: to }, speed, easing, callback);
		},
		animate: function (prop, speed, easing, callback) {
			var empty = jQuery.isEmptyObject(prop),
			    optall = jQuery.speed(speed, easing, callback),
			    doAnimation = function () {

				// Operate on a copy of prop so per-property easing won't be lost
				var anim = Animation(this, jQuery.extend({}, prop), optall);

				// Empty animations, or finishing resolves immediately
				if (empty || dataPriv.get(this, "finish")) {
					anim.stop(true);
				}
			};
			doAnimation.finish = doAnimation;

			return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation);
		},
		stop: function (type, clearQueue, gotoEnd) {
			var stopQueue = function (hooks) {
				var stop = hooks.stop;
				delete hooks.stop;
				stop(gotoEnd);
			};

			if (typeof type !== "string") {
				gotoEnd = clearQueue;
				clearQueue = type;
				type = undefined;
			}
			if (clearQueue && type !== false) {
				this.queue(type || "fx", []);
			}

			return this.each(function () {
				var dequeue = true,
				    index = type != null && type + "queueHooks",
				    timers = jQuery.timers,
				    data = dataPriv.get(this);

				if (index) {
					if (data[index] && data[index].stop) {
						stopQueue(data[index]);
					}
				} else {
					for (index in data) {
						if (data[index] && data[index].stop && rrun.test(index)) {
							stopQueue(data[index]);
						}
					}
				}

				for (index = timers.length; index--;) {
					if (timers[index].elem === this && (type == null || timers[index].queue === type)) {

						timers[index].anim.stop(gotoEnd);
						dequeue = false;
						timers.splice(index, 1);
					}
				}

				// Start the next in the queue if the last step wasn't forced.
				// Timers currently will call their complete callbacks, which
				// will dequeue but only if they were gotoEnd.
				if (dequeue || !gotoEnd) {
					jQuery.dequeue(this, type);
				}
			});
		},
		finish: function (type) {
			if (type !== false) {
				type = type || "fx";
			}
			return this.each(function () {
				var index,
				    data = dataPriv.get(this),
				    queue = data[type + "queue"],
				    hooks = data[type + "queueHooks"],
				    timers = jQuery.timers,
				    length = queue ? queue.length : 0;

				// Enable finishing flag on private data
				data.finish = true;

				// Empty the queue first
				jQuery.queue(this, type, []);

				if (hooks && hooks.stop) {
					hooks.stop.call(this, true);
				}

				// Look for any active animations, and finish them
				for (index = timers.length; index--;) {
					if (timers[index].elem === this && timers[index].queue === type) {
						timers[index].anim.stop(true);
						timers.splice(index, 1);
					}
				}

				// Look for any animations in the old queue and finish them
				for (index = 0; index < length; index++) {
					if (queue[index] && queue[index].finish) {
						queue[index].finish.call(this);
					}
				}

				// Turn off finishing flag
				delete data.finish;
			});
		}
	});

	jQuery.each(["toggle", "show", "hide"], function (i, name) {
		var cssFn = jQuery.fn[name];
		jQuery.fn[name] = function (speed, easing, callback) {
			return speed == null || typeof speed === "boolean" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback);
		};
	});

	// Generate shortcuts for custom animations
	jQuery.each({
		slideDown: genFx("show"),
		slideUp: genFx("hide"),
		slideToggle: genFx("toggle"),
		fadeIn: { opacity: "show" },
		fadeOut: { opacity: "hide" },
		fadeToggle: { opacity: "toggle" }
	}, function (name, props) {
		jQuery.fn[name] = function (speed, easing, callback) {
			return this.animate(props, speed, easing, callback);
		};
	});

	jQuery.timers = [];
	jQuery.fx.tick = function () {
		var timer,
		    i = 0,
		    timers = jQuery.timers;

		fxNow = jQuery.now();

		for (; i < timers.length; i++) {
			timer = timers[i];

			// Checks the timer has not already been removed
			if (!timer() && timers[i] === timer) {
				timers.splice(i--, 1);
			}
		}

		if (!timers.length) {
			jQuery.fx.stop();
		}
		fxNow = undefined;
	};

	jQuery.fx.timer = function (timer) {
		jQuery.timers.push(timer);
		if (timer()) {
			jQuery.fx.start();
		} else {
			jQuery.timers.pop();
		}
	};

	jQuery.fx.interval = 13;
	jQuery.fx.start = function () {
		if (!timerId) {
			timerId = window.setInterval(jQuery.fx.tick, jQuery.fx.interval);
		}
	};

	jQuery.fx.stop = function () {
		window.clearInterval(timerId);

		timerId = null;
	};

	jQuery.fx.speeds = {
		slow: 600,
		fast: 200,

		// Default speed
		_default: 400
	};

	// Based off of the plugin by Clint Helfers, with permission.
	// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
	jQuery.fn.delay = function (time, type) {
		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
		type = type || "fx";

		return this.queue(type, function (next, hooks) {
			var timeout = window.setTimeout(next, time);
			hooks.stop = function () {
				window.clearTimeout(timeout);
			};
		});
	};

	(function () {
		var input = document.createElement("input"),
		    select = document.createElement("select"),
		    opt = select.appendChild(document.createElement("option"));

		input.type = "checkbox";

		// Support: iOS<=5.1, Android<=4.2+
		// Default value for a checkbox should be "on"
		support.checkOn = input.value !== "";

		// Support: IE<=11+
		// Must access selectedIndex to make default options select
		support.optSelected = opt.selected;

		// Support: Android<=2.3
		// Options inside disabled selects are incorrectly marked as disabled
		select.disabled = true;
		support.optDisabled = !opt.disabled;

		// Support: IE<=11+
		// An input loses its value after becoming a radio
		input = document.createElement("input");
		input.value = "t";
		input.type = "radio";
		support.radioValue = input.value === "t";
	})();

	var boolHook,
	    attrHandle = jQuery.expr.attrHandle;

	jQuery.fn.extend({
		attr: function (name, value) {
			return access(this, jQuery.attr, name, value, arguments.length > 1);
		},

		removeAttr: function (name) {
			return this.each(function () {
				jQuery.removeAttr(this, name);
			});
		}
	});

	jQuery.extend({
		attr: function (elem, name, value) {
			var ret,
			    hooks,
			    nType = elem.nodeType;

			// Don't get/set attributes on text, comment and attribute nodes
			if (nType === 3 || nType === 8 || nType === 2) {
				return;
			}

			// Fallback to prop when attributes are not supported
			if (typeof elem.getAttribute === "undefined") {
				return jQuery.prop(elem, name, value);
			}

			// All attributes are lowercase
			// Grab necessary hook if one is defined
			if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
				name = name.toLowerCase();
				hooks = jQuery.attrHooks[name] || (jQuery.expr.match.bool.test(name) ? boolHook : undefined);
			}

			if (value !== undefined) {
				if (value === null) {
					jQuery.removeAttr(elem, name);
					return;
				}

				if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {
					return ret;
				}

				elem.setAttribute(name, value + "");
				return value;
			}

			if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
				return ret;
			}

			ret = jQuery.find.attr(elem, name);

			// Non-existent attributes return null, we normalize to undefined
			return ret == null ? undefined : ret;
		},

		attrHooks: {
			type: {
				set: function (elem, value) {
					if (!support.radioValue && value === "radio" && jQuery.nodeName(elem, "input")) {
						var val = elem.value;
						elem.setAttribute("type", value);
						if (val) {
							elem.value = val;
						}
						return value;
					}
				}
			}
		},

		removeAttr: function (elem, value) {
			var name,
			    propName,
			    i = 0,
			    attrNames = value && value.match(rnotwhite);

			if (attrNames && elem.nodeType === 1) {
				while (name = attrNames[i++]) {
					propName = jQuery.propFix[name] || name;

					// Boolean attributes get special treatment (#10870)
					if (jQuery.expr.match.bool.test(name)) {

						// Set corresponding property to false
						elem[propName] = false;
					}

					elem.removeAttribute(name);
				}
			}
		}
	});

	// Hooks for boolean attributes
	boolHook = {
		set: function (elem, value, name) {
			if (value === false) {

				// Remove boolean attributes when set to false
				jQuery.removeAttr(elem, name);
			} else {
				elem.setAttribute(name, name);
			}
			return name;
		}
	};
	jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function (i, name) {
		var getter = attrHandle[name] || jQuery.find.attr;

		attrHandle[name] = function (elem, name, isXML) {
			var ret, handle;
			if (!isXML) {

				// Avoid an infinite loop by temporarily removing this function from the getter
				handle = attrHandle[name];
				attrHandle[name] = ret;
				ret = getter(elem, name, isXML) != null ? name.toLowerCase() : null;
				attrHandle[name] = handle;
			}
			return ret;
		};
	});

	var rfocusable = /^(?:input|select|textarea|button)$/i,
	    rclickable = /^(?:a|area)$/i;

	jQuery.fn.extend({
		prop: function (name, value) {
			return access(this, jQuery.prop, name, value, arguments.length > 1);
		},

		removeProp: function (name) {
			return this.each(function () {
				delete this[jQuery.propFix[name] || name];
			});
		}
	});

	jQuery.extend({
		prop: function (elem, name, value) {
			var ret,
			    hooks,
			    nType = elem.nodeType;

			// Don't get/set properties on text, comment and attribute nodes
			if (nType === 3 || nType === 8 || nType === 2) {
				return;
			}

			if (nType !== 1 || !jQuery.isXMLDoc(elem)) {

				// Fix name and attach hooks
				name = jQuery.propFix[name] || name;
				hooks = jQuery.propHooks[name];
			}

			if (value !== undefined) {
				if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {
					return ret;
				}

				return elem[name] = value;
			}

			if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
				return ret;
			}

			return elem[name];
		},

		propHooks: {
			tabIndex: {
				get: function (elem) {

					// elem.tabIndex doesn't always return the
					// correct value when it hasn't been explicitly set
					// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
					// Use proper attribute retrieval(#12072)
					var tabindex = jQuery.find.attr(elem, "tabindex");

					return tabindex ? parseInt(tabindex, 10) : rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href ? 0 : -1;
				}
			}
		},

		propFix: {
			"for": "htmlFor",
			"class": "className"
		}
	});

	// Support: IE <=11 only
	// Accessing the selectedIndex property
	// forces the browser to respect setting selected
	// on the option
	// The getter ensures a default option is selected
	// when in an optgroup
	if (!support.optSelected) {
		jQuery.propHooks.selected = {
			get: function (elem) {
				var parent = elem.parentNode;
				if (parent && parent.parentNode) {
					parent.parentNode.selectedIndex;
				}
				return null;
			},
			set: function (elem) {
				var parent = elem.parentNode;
				if (parent) {
					parent.selectedIndex;

					if (parent.parentNode) {
						parent.parentNode.selectedIndex;
					}
				}
			}
		};
	}

	jQuery.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () {
		jQuery.propFix[this.toLowerCase()] = this;
	});

	var rclass = /[\t\r\n\f]/g;

	function getClass(elem) {
		return elem.getAttribute && elem.getAttribute("class") || "";
	}

	jQuery.fn.extend({
		addClass: function (value) {
			var classes,
			    elem,
			    cur,
			    curValue,
			    clazz,
			    j,
			    finalValue,
			    i = 0;

			if (jQuery.isFunction(value)) {
				return this.each(function (j) {
					jQuery(this).addClass(value.call(this, j, getClass(this)));
				});
			}

			if (typeof value === "string" && value) {
				classes = value.match(rnotwhite) || [];

				while (elem = this[i++]) {
					curValue = getClass(elem);
					cur = elem.nodeType === 1 && (" " + curValue + " ").replace(rclass, " ");

					if (cur) {
						j = 0;
						while (clazz = classes[j++]) {
							if (cur.indexOf(" " + clazz + " ") < 0) {
								cur += clazz + " ";
							}
						}

						// Only assign if different to avoid unneeded rendering.
						finalValue = jQuery.trim(cur);
						if (curValue !== finalValue) {
							elem.setAttribute("class", finalValue);
						}
					}
				}
			}

			return this;
		},

		removeClass: function (value) {
			var classes,
			    elem,
			    cur,
			    curValue,
			    clazz,
			    j,
			    finalValue,
			    i = 0;

			if (jQuery.isFunction(value)) {
				return this.each(function (j) {
					jQuery(this).removeClass(value.call(this, j, getClass(this)));
				});
			}

			if (!arguments.length) {
				return this.attr("class", "");
			}

			if (typeof value === "string" && value) {
				classes = value.match(rnotwhite) || [];

				while (elem = this[i++]) {
					curValue = getClass(elem);

					// This expression is here for better compressibility (see addClass)
					cur = elem.nodeType === 1 && (" " + curValue + " ").replace(rclass, " ");

					if (cur) {
						j = 0;
						while (clazz = classes[j++]) {

							// Remove *all* instances
							while (cur.indexOf(" " + clazz + " ") > -1) {
								cur = cur.replace(" " + clazz + " ", " ");
							}
						}

						// Only assign if different to avoid unneeded rendering.
						finalValue = jQuery.trim(cur);
						if (curValue !== finalValue) {
							elem.setAttribute("class", finalValue);
						}
					}
				}
			}

			return this;
		},

		toggleClass: function (value, stateVal) {
			var type = typeof value;

			if (typeof stateVal === "boolean" && type === "string") {
				return stateVal ? this.addClass(value) : this.removeClass(value);
			}

			if (jQuery.isFunction(value)) {
				return this.each(function (i) {
					jQuery(this).toggleClass(value.call(this, i, getClass(this), stateVal), stateVal);
				});
			}

			return this.each(function () {
				var className, i, self, classNames;

				if (type === "string") {

					// Toggle individual class names
					i = 0;
					self = jQuery(this);
					classNames = value.match(rnotwhite) || [];

					while (className = classNames[i++]) {

						// Check each className given, space separated list
						if (self.hasClass(className)) {
							self.removeClass(className);
						} else {
							self.addClass(className);
						}
					}

					// Toggle whole class name
				} else if (value === undefined || type === "boolean") {
					className = getClass(this);
					if (className) {

						// Store className if set
						dataPriv.set(this, "__className__", className);
					}

					// If the element has a class name or if we're passed `false`,
					// then remove the whole classname (if there was one, the above saved it).
					// Otherwise bring back whatever was previously saved (if anything),
					// falling back to the empty string if nothing was stored.
					if (this.setAttribute) {
						this.setAttribute("class", className || value === false ? "" : dataPriv.get(this, "__className__") || "");
					}
				}
			});
		},

		hasClass: function (selector) {
			var className,
			    elem,
			    i = 0;

			className = " " + selector + " ";
			while (elem = this[i++]) {
				if (elem.nodeType === 1 && (" " + getClass(elem) + " ").replace(rclass, " ").indexOf(className) > -1) {
					return true;
				}
			}

			return false;
		}
	});

	var rreturn = /\r/g,
	    rspaces = /[\x20\t\r\n\f]+/g;

	jQuery.fn.extend({
		val: function (value) {
			var hooks,
			    ret,
			    isFunction,
			    elem = this[0];

			if (!arguments.length) {
				if (elem) {
					hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()];

					if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) {
						return ret;
					}

					ret = elem.value;

					return typeof ret === "string" ?

					// Handle most common string cases
					ret.replace(rreturn, "") :

					// Handle cases where value is null/undef or number
					ret == null ? "" : ret;
				}

				return;
			}

			isFunction = jQuery.isFunction(value);

			return this.each(function (i) {
				var val;

				if (this.nodeType !== 1) {
					return;
				}

				if (isFunction) {
					val = value.call(this, i, jQuery(this).val());
				} else {
					val = value;
				}

				// Treat null/undefined as ""; convert numbers to string
				if (val == null) {
					val = "";
				} else if (typeof val === "number") {
					val += "";
				} else if (jQuery.isArray(val)) {
					val = jQuery.map(val, function (value) {
						return value == null ? "" : value + "";
					});
				}

				hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()];

				// If set returns undefined, fall back to normal setting
				if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) {
					this.value = val;
				}
			});
		}
	});

	jQuery.extend({
		valHooks: {
			option: {
				get: function (elem) {

					var val = jQuery.find.attr(elem, "value");
					return val != null ? val :

					// Support: IE10-11+
					// option.text throws exceptions (#14686, #14858)
					// Strip and collapse whitespace
					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
					jQuery.trim(jQuery.text(elem)).replace(rspaces, " ");
				}
			},
			select: {
				get: function (elem) {
					var value,
					    option,
					    options = elem.options,
					    index = elem.selectedIndex,
					    one = elem.type === "select-one" || index < 0,
					    values = one ? null : [],
					    max = one ? index + 1 : options.length,
					    i = index < 0 ? max : one ? index : 0;

					// Loop through all the selected options
					for (; i < max; i++) {
						option = options[i];

						// IE8-9 doesn't update selected after form reset (#2551)
						if ((option.selected || i === index) && (

						// Don't return options that are disabled or in a disabled optgroup
						support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName(option.parentNode, "optgroup"))) {

							// Get the specific value for the option
							value = jQuery(option).val();

							// We don't need an array for one selects
							if (one) {
								return value;
							}

							// Multi-Selects return an array
							values.push(value);
						}
					}

					return values;
				},

				set: function (elem, value) {
					var optionSet,
					    option,
					    options = elem.options,
					    values = jQuery.makeArray(value),
					    i = options.length;

					while (i--) {
						option = options[i];
						if (option.selected = jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1) {
							optionSet = true;
						}
					}

					// Force browsers to behave consistently when non-matching value is set
					if (!optionSet) {
						elem.selectedIndex = -1;
					}
					return values;
				}
			}
		}
	});

	// Radios and checkboxes getter/setter
	jQuery.each(["radio", "checkbox"], function () {
		jQuery.valHooks[this] = {
			set: function (elem, value) {
				if (jQuery.isArray(value)) {
					return elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1;
				}
			}
		};
		if (!support.checkOn) {
			jQuery.valHooks[this].get = function (elem) {
				return elem.getAttribute("value") === null ? "on" : elem.value;
			};
		}
	});

	// Return jQuery for attributes-only inclusion


	var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;

	jQuery.extend(jQuery.event, {

		trigger: function (event, data, elem, onlyHandlers) {

			var i,
			    cur,
			    tmp,
			    bubbleType,
			    ontype,
			    handle,
			    special,
			    eventPath = [elem || document],
			    type = hasOwn.call(event, "type") ? event.type : event,
			    namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : [];

			cur = tmp = elem = elem || document;

			// Don't do events on text and comment nodes
			if (elem.nodeType === 3 || elem.nodeType === 8) {
				return;
			}

			// focus/blur morphs to focusin/out; ensure we're not firing them right now
			if (rfocusMorph.test(type + jQuery.event.triggered)) {
				return;
			}

			if (type.indexOf(".") > -1) {

				// Namespaced trigger; create a regexp to match event type in handle()
				namespaces = type.split(".");
				type = namespaces.shift();
				namespaces.sort();
			}
			ontype = type.indexOf(":") < 0 && "on" + type;

			// Caller can pass in a jQuery.Event object, Object, or just an event type string
			event = event[jQuery.expando] ? event : new jQuery.Event(type, typeof event === "object" && event);

			// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
			event.isTrigger = onlyHandlers ? 2 : 3;
			event.namespace = namespaces.join(".");
			event.rnamespace = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;

			// Clean up the event in case it is being reused
			event.result = undefined;
			if (!event.target) {
				event.target = elem;
			}

			// Clone any incoming data and prepend the event, creating the handler arg list
			data = data == null ? [event] : jQuery.makeArray(data, [event]);

			// Allow special events to draw outside the lines
			special = jQuery.event.special[type] || {};
			if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) {
				return;
			}

			// Determine event propagation path in advance, per W3C events spec (#9951)
			// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
			if (!onlyHandlers && !special.noBubble && !jQuery.isWindow(elem)) {

				bubbleType = special.delegateType || type;
				if (!rfocusMorph.test(bubbleType + type)) {
					cur = cur.parentNode;
				}
				for (; cur; cur = cur.parentNode) {
					eventPath.push(cur);
					tmp = cur;
				}

				// Only add window if we got to document (e.g., not plain obj or detached DOM)
				if (tmp === (elem.ownerDocument || document)) {
					eventPath.push(tmp.defaultView || tmp.parentWindow || window);
				}
			}

			// Fire handlers on the event path
			i = 0;
			while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {

				event.type = i > 1 ? bubbleType : special.bindType || type;

				// jQuery handler
				handle = (dataPriv.get(cur, "events") || {})[event.type] && dataPriv.get(cur, "handle");
				if (handle) {
					handle.apply(cur, data);
				}

				// Native handler
				handle = ontype && cur[ontype];
				if (handle && handle.apply && acceptData(cur)) {
					event.result = handle.apply(cur, data);
					if (event.result === false) {
						event.preventDefault();
					}
				}
			}
			event.type = type;

			// If nobody prevented the default action, do it now
			if (!onlyHandlers && !event.isDefaultPrevented()) {

				if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && acceptData(elem)) {

					// Call a native DOM method on the target with the same name name as the event.
					// Don't do default actions on window, that's where global variables be (#6170)
					if (ontype && jQuery.isFunction(elem[type]) && !jQuery.isWindow(elem)) {

						// Don't re-trigger an onFOO event when we call its FOO() method
						tmp = elem[ontype];

						if (tmp) {
							elem[ontype] = null;
						}

						// Prevent re-triggering of the same event, since we already bubbled it above
						jQuery.event.triggered = type;
						elem[type]();
						jQuery.event.triggered = undefined;

						if (tmp) {
							elem[ontype] = tmp;
						}
					}
				}
			}

			return event.result;
		},

		// Piggyback on a donor event to simulate a different one
		// Used only for `focus(in | out)` events
		simulate: function (type, elem, event) {
			var e = jQuery.extend(new jQuery.Event(), event, {
				type: type,
				isSimulated: true
			});

			jQuery.event.trigger(e, null, elem);
		}

	});

	jQuery.fn.extend({

		trigger: function (type, data) {
			return this.each(function () {
				jQuery.event.trigger(type, data, this);
			});
		},
		triggerHandler: function (type, data) {
			var elem = this[0];
			if (elem) {
				return jQuery.event.trigger(type, data, elem, true);
			}
		}
	});

	jQuery.each(("blur focus focusin focusout load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error contextmenu").split(" "), function (i, name) {

		// Handle event binding
		jQuery.fn[name] = function (data, fn) {
			return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name);
		};
	});

	jQuery.fn.extend({
		hover: function (fnOver, fnOut) {
			return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);
		}
	});

	support.focusin = "onfocusin" in window;

	// Support: Firefox
	// Firefox doesn't have focus(in | out) events
	// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
	//
	// Support: Chrome, Safari
	// focus(in | out) events fire after focus & blur events,
	// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
	// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
	if (!support.focusin) {
		jQuery.each({ focus: "focusin", blur: "focusout" }, function (orig, fix) {

			// Attach a single capturing handler on the document while someone wants focusin/focusout
			var handler = function (event) {
				jQuery.event.simulate(fix, event.target, jQuery.event.fix(event));
			};

			jQuery.event.special[fix] = {
				setup: function () {
					var doc = this.ownerDocument || this,
					    attaches = dataPriv.access(doc, fix);

					if (!attaches) {
						doc.addEventListener(orig, handler, true);
					}
					dataPriv.access(doc, fix, (attaches || 0) + 1);
				},
				teardown: function () {
					var doc = this.ownerDocument || this,
					    attaches = dataPriv.access(doc, fix) - 1;

					if (!attaches) {
						doc.removeEventListener(orig, handler, true);
						dataPriv.remove(doc, fix);
					} else {
						dataPriv.access(doc, fix, attaches);
					}
				}
			};
		});
	}
	var location = window.location;

	var nonce = jQuery.now();

	var rquery = /\?/;

	// Support: Android 2.3
	// Workaround failure to string-cast null input
	jQuery.parseJSON = function (data) {
		return JSON.parse(data + "");
	};

	// Cross-browser xml parsing
	jQuery.parseXML = function (data) {
		var xml;
		if (!data || typeof data !== "string") {
			return null;
		}

		// Support: IE9
		try {
			xml = new window.DOMParser().parseFromString(data, "text/xml");
		} catch (e) {
			xml = undefined;
		}

		if (!xml || xml.getElementsByTagName("parsererror").length) {
			jQuery.error("Invalid XML: " + data);
		}
		return xml;
	};

	var rhash = /#.*$/,
	    rts = /([?&])_=[^&]*/,
	    rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,


	// #7653, #8125, #8152: local protocol detection
	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
	    rnoContent = /^(?:GET|HEAD)$/,
	    rprotocol = /^\/\//,


	/* Prefilters
  * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
  * 2) These are called:
  *    - BEFORE asking for a transport
  *    - AFTER param serialization (s.data is a string if s.processData is true)
  * 3) key is the dataType
  * 4) the catchall symbol "*" can be used
  * 5) execution will start with transport dataType and THEN continue down to "*" if needed
  */
	prefilters = {},


	/* Transports bindings
  * 1) key is the dataType
  * 2) the catchall symbol "*" can be used
  * 3) selection will start with transport dataType and THEN go to "*" if needed
  */
	transports = {},


	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
	allTypes = "*/".concat("*"),


	// Anchor tag for parsing the document origin
	originAnchor = document.createElement("a");
	originAnchor.href = location.href;

	// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
	function addToPrefiltersOrTransports(structure) {

		// dataTypeExpression is optional and defaults to "*"
		return function (dataTypeExpression, func) {

			if (typeof dataTypeExpression !== "string") {
				func = dataTypeExpression;
				dataTypeExpression = "*";
			}

			var dataType,
			    i = 0,
			    dataTypes = dataTypeExpression.toLowerCase().match(rnotwhite) || [];

			if (jQuery.isFunction(func)) {

				// For each dataType in the dataTypeExpression
				while (dataType = dataTypes[i++]) {

					// Prepend if requested
					if (dataType[0] === "+") {
						dataType = dataType.slice(1) || "*";
						(structure[dataType] = structure[dataType] || []).unshift(func);

						// Otherwise append
					} else {
						(structure[dataType] = structure[dataType] || []).push(func);
					}
				}
			}
		};
	}

	// Base inspection function for prefilters and transports
	function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {

		var inspected = {},
		    seekingTransport = structure === transports;

		function inspect(dataType) {
			var selected;
			inspected[dataType] = true;
			jQuery.each(structure[dataType] || [], function (_, prefilterOrFactory) {
				var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);
				if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) {

					options.dataTypes.unshift(dataTypeOrTransport);
					inspect(dataTypeOrTransport);
					return false;
				} else if (seekingTransport) {
					return !(selected = dataTypeOrTransport);
				}
			});
			return selected;
		}

		return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*");
	}

	// A special extend for ajax options
	// that takes "flat" options (not to be deep extended)
	// Fixes #9887
	function ajaxExtend(target, src) {
		var key,
		    deep,
		    flatOptions = jQuery.ajaxSettings.flatOptions || {};

		for (key in src) {
			if (src[key] !== undefined) {
				(flatOptions[key] ? target : deep || (deep = {}))[key] = src[key];
			}
		}
		if (deep) {
			jQuery.extend(true, target, deep);
		}

		return target;
	}

	/* Handles responses to an ajax request:
  * - finds the right dataType (mediates between content-type and expected dataType)
  * - returns the corresponding response
  */
	function ajaxHandleResponses(s, jqXHR, responses) {

		var ct,
		    type,
		    finalDataType,
		    firstDataType,
		    contents = s.contents,
		    dataTypes = s.dataTypes;

		// Remove auto dataType and get content-type in the process
		while (dataTypes[0] === "*") {
			dataTypes.shift();
			if (ct === undefined) {
				ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
			}
		}

		// Check if we're dealing with a known content-type
		if (ct) {
			for (type in contents) {
				if (contents[type] && contents[type].test(ct)) {
					dataTypes.unshift(type);
					break;
				}
			}
		}

		// Check to see if we have a response for the expected dataType
		if (dataTypes[0] in responses) {
			finalDataType = dataTypes[0];
		} else {

			// Try convertible dataTypes
			for (type in responses) {
				if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
					finalDataType = type;
					break;
				}
				if (!firstDataType) {
					firstDataType = type;
				}
			}

			// Or just use first one
			finalDataType = finalDataType || firstDataType;
		}

		// If we found a dataType
		// We add the dataType to the list if needed
		// and return the corresponding response
		if (finalDataType) {
			if (finalDataType !== dataTypes[0]) {
				dataTypes.unshift(finalDataType);
			}
			return responses[finalDataType];
		}
	}

	/* Chain conversions given the request and the original response
  * Also sets the responseXXX fields on the jqXHR instance
  */
	function ajaxConvert(s, response, jqXHR, isSuccess) {
		var conv2,
		    current,
		    conv,
		    tmp,
		    prev,
		    converters = {},


		// Work with a copy of dataTypes in case we need to modify it for conversion
		dataTypes = s.dataTypes.slice();

		// Create converters map with lowercased keys
		if (dataTypes[1]) {
			for (conv in s.converters) {
				converters[conv.toLowerCase()] = s.converters[conv];
			}
		}

		current = dataTypes.shift();

		// Convert to each sequential dataType
		while (current) {

			if (s.responseFields[current]) {
				jqXHR[s.responseFields[current]] = response;
			}

			// Apply the dataFilter if provided
			if (!prev && isSuccess && s.dataFilter) {
				response = s.dataFilter(response, s.dataType);
			}

			prev = current;
			current = dataTypes.shift();

			if (current) {

				// There's only work to do if current dataType is non-auto
				if (current === "*") {

					current = prev;

					// Convert response if prev dataType is non-auto and differs from current
				} else if (prev !== "*" && prev !== current) {

					// Seek a direct converter
					conv = converters[prev + " " + current] || converters["* " + current];

					// If none found, seek a pair
					if (!conv) {
						for (conv2 in converters) {

							// If conv2 outputs current
							tmp = conv2.split(" ");
							if (tmp[1] === current) {

								// If prev can be converted to accepted input
								conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]];
								if (conv) {

									// Condense equivalence converters
									if (conv === true) {
										conv = converters[conv2];

										// Otherwise, insert the intermediate dataType
									} else if (converters[conv2] !== true) {
										current = tmp[0];
										dataTypes.unshift(tmp[1]);
									}
									break;
								}
							}
						}
					}

					// Apply converter (if not an equivalence)
					if (conv !== true) {

						// Unless errors are allowed to bubble, catch and return them
						if (conv && s.throws) {
							response = conv(response);
						} else {
							try {
								response = conv(response);
							} catch (e) {
								return {
									state: "parsererror",
									error: conv ? e : "No conversion from " + prev + " to " + current
								};
							}
						}
					}
				}
			}
		}

		return { state: "success", data: response };
	}

	jQuery.extend({

		// Counter for holding the number of active queries
		active: 0,

		// Last-Modified header cache for next request
		lastModified: {},
		etag: {},

		ajaxSettings: {
			url: location.href,
			type: "GET",
			isLocal: rlocalProtocol.test(location.protocol),
			global: true,
			processData: true,
			async: true,
			contentType: "application/x-www-form-urlencoded; charset=UTF-8",
			/*
   timeout: 0,
   data: null,
   dataType: null,
   username: null,
   password: null,
   cache: null,
   throws: false,
   traditional: false,
   headers: {},
   */

			accepts: {
				"*": allTypes,
				text: "text/plain",
				html: "text/html",
				xml: "application/xml, text/xml",
				json: "application/json, text/javascript"
			},

			contents: {
				xml: /\bxml\b/,
				html: /\bhtml/,
				json: /\bjson\b/
			},

			responseFields: {
				xml: "responseXML",
				text: "responseText",
				json: "responseJSON"
			},

			// Data converters
			// Keys separate source (or catchall "*") and destination types with a single space
			converters: {

				// Convert anything to text
				"* text": String,

				// Text to html (true = no transformation)
				"text html": true,

				// Evaluate text as a json expression
				"text json": jQuery.parseJSON,

				// Parse text as xml
				"text xml": jQuery.parseXML
			},

			// For options that shouldn't be deep extended:
			// you can add your own custom options here if
			// and when you create one that shouldn't be
			// deep extended (see ajaxExtend)
			flatOptions: {
				url: true,
				context: true
			}
		},

		// Creates a full fledged settings object into target
		// with both ajaxSettings and settings fields.
		// If target is omitted, writes into ajaxSettings.
		ajaxSetup: function (target, settings) {
			return settings ?

			// Building a settings object
			ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) :

			// Extending ajaxSettings
			ajaxExtend(jQuery.ajaxSettings, target);
		},

		ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
		ajaxTransport: addToPrefiltersOrTransports(transports),

		// Main method
		ajax: function (url, options) {

			// If url is an object, simulate pre-1.5 signature
			if (typeof url === "object") {
				options = url;
				url = undefined;
			}

			// Force options to be an object
			options = options || {};

			var transport,


			// URL without anti-cache param
			cacheURL,


			// Response headers
			responseHeadersString,
			    responseHeaders,


			// timeout handle
			timeoutTimer,


			// Url cleanup var
			urlAnchor,


			// To know if global events are to be dispatched
			fireGlobals,


			// Loop variable
			i,


			// Create the final options object
			s = jQuery.ajaxSetup({}, options),


			// Callbacks context
			callbackContext = s.context || s,


			// Context for global events is callbackContext if it is a DOM node or jQuery collection
			globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery(callbackContext) : jQuery.event,


			// Deferreds
			deferred = jQuery.Deferred(),
			    completeDeferred = jQuery.Callbacks("once memory"),


			// Status-dependent callbacks
			statusCode = s.statusCode || {},


			// Headers (they are sent all at once)
			requestHeaders = {},
			    requestHeadersNames = {},


			// The jqXHR state
			state = 0,


			// Default abort message
			strAbort = "canceled",


			// Fake xhr
			jqXHR = {
				readyState: 0,

				// Builds headers hashtable if needed
				getResponseHeader: function (key) {
					var match;
					if (state === 2) {
						if (!responseHeaders) {
							responseHeaders = {};
							while (match = rheaders.exec(responseHeadersString)) {
								responseHeaders[match[1].toLowerCase()] = match[2];
							}
						}
						match = responseHeaders[key.toLowerCase()];
					}
					return match == null ? null : match;
				},

				// Raw string
				getAllResponseHeaders: function () {
					return state === 2 ? responseHeadersString : null;
				},

				// Caches the header
				setRequestHeader: function (name, value) {
					var lname = name.toLowerCase();
					if (!state) {
						name = requestHeadersNames[lname] = requestHeadersNames[lname] || name;
						requestHeaders[name] = value;
					}
					return this;
				},

				// Overrides response content-type header
				overrideMimeType: function (type) {
					if (!state) {
						s.mimeType = type;
					}
					return this;
				},

				// Status-dependent callbacks
				statusCode: function (map) {
					var code;
					if (map) {
						if (state < 2) {
							for (code in map) {

								// Lazy-add the new callback in a way that preserves old ones
								statusCode[code] = [statusCode[code], map[code]];
							}
						} else {

							// Execute the appropriate callbacks
							jqXHR.always(map[jqXHR.status]);
						}
					}
					return this;
				},

				// Cancel the request
				abort: function (statusText) {
					var finalText = statusText || strAbort;
					if (transport) {
						transport.abort(finalText);
					}
					done(0, finalText);
					return this;
				}
			};

			// Attach deferreds
			deferred.promise(jqXHR).complete = completeDeferred.add;
			jqXHR.success = jqXHR.done;
			jqXHR.error = jqXHR.fail;

			// Remove hash character (#7531: and string promotion)
			// Add protocol if not provided (prefilters might expect it)
			// Handle falsy url in the settings object (#10093: consistency with old signature)
			// We also use the url parameter if available
			s.url = ((url || s.url || location.href) + "").replace(rhash, "").replace(rprotocol, location.protocol + "//");

			// Alias method option to type as per ticket #12004
			s.type = options.method || options.type || s.method || s.type;

			// Extract dataTypes list
			s.dataTypes = jQuery.trim(s.dataType || "*").toLowerCase().match(rnotwhite) || [""];

			// A cross-domain request is in order when the origin doesn't match the current origin.
			if (s.crossDomain == null) {
				urlAnchor = document.createElement("a");

				// Support: IE8-11+
				// IE throws exception if url is malformed, e.g. http://example.com:80x/
				try {
					urlAnchor.href = s.url;

					// Support: IE8-11+
					// Anchor's host property isn't correctly set when s.url is relative
					urlAnchor.href = urlAnchor.href;
					s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host;
				} catch (e) {

					// If there is an error parsing the URL, assume it is crossDomain,
					// it can be rejected by the transport if it is invalid
					s.crossDomain = true;
				}
			}

			// Convert data if not already a string
			if (s.data && s.processData && typeof s.data !== "string") {
				s.data = jQuery.param(s.data, s.traditional);
			}

			// Apply prefilters
			inspectPrefiltersOrTransports(prefilters, s, options, jqXHR);

			// If request was aborted inside a prefilter, stop there
			if (state === 2) {
				return jqXHR;
			}

			// We can fire global events as of now if asked to
			// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
			fireGlobals = jQuery.event && s.global;

			// Watch for a new set of requests
			if (fireGlobals && jQuery.active++ === 0) {
				jQuery.event.trigger("ajaxStart");
			}

			// Uppercase the type
			s.type = s.type.toUpperCase();

			// Determine if request has content
			s.hasContent = !rnoContent.test(s.type);

			// Save the URL in case we're toying with the If-Modified-Since
			// and/or If-None-Match header later on
			cacheURL = s.url;

			// More options handling for requests with no content
			if (!s.hasContent) {

				// If data is available, append data to url
				if (s.data) {
					cacheURL = s.url += (rquery.test(cacheURL) ? "&" : "?") + s.data;

					// #9682: remove data so that it's not used in an eventual retry
					delete s.data;
				}

				// Add anti-cache in url if needed
				if (s.cache === false) {
					s.url = rts.test(cacheURL) ?

					// If there is already a '_' parameter, set its value
					cacheURL.replace(rts, "$1_=" + nonce++) :

					// Otherwise add one to the end
					cacheURL + (rquery.test(cacheURL) ? "&" : "?") + "_=" + nonce++;
				}
			}

			// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
			if (s.ifModified) {
				if (jQuery.lastModified[cacheURL]) {
					jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]);
				}
				if (jQuery.etag[cacheURL]) {
					jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]);
				}
			}

			// Set the correct header, if data is being sent
			if (s.data && s.hasContent && s.contentType !== false || options.contentType) {
				jqXHR.setRequestHeader("Content-Type", s.contentType);
			}

			// Set the Accepts header for the server, depending on the dataType
			jqXHR.setRequestHeader("Accept", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"]);

			// Check for headers option
			for (i in s.headers) {
				jqXHR.setRequestHeader(i, s.headers[i]);
			}

			// Allow custom headers/mimetypes and early abort
			if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || state === 2)) {

				// Abort if not done already and return
				return jqXHR.abort();
			}

			// Aborting is no longer a cancellation
			strAbort = "abort";

			// Install callbacks on deferreds
			for (i in { success: 1, error: 1, complete: 1 }) {
				jqXHR[i](s[i]);
			}

			// Get transport
			transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR);

			// If no transport, we auto-abort
			if (!transport) {
				done(-1, "No Transport");
			} else {
				jqXHR.readyState = 1;

				// Send global event
				if (fireGlobals) {
					globalEventContext.trigger("ajaxSend", [jqXHR, s]);
				}

				// If request was aborted inside ajaxSend, stop there
				if (state === 2) {
					return jqXHR;
				}

				// Timeout
				if (s.async && s.timeout > 0) {
					timeoutTimer = window.setTimeout(function () {
						jqXHR.abort("timeout");
					}, s.timeout);
				}

				try {
					state = 1;
					transport.send(requestHeaders, done);
				} catch (e) {

					// Propagate exception as error if not done
					if (state < 2) {
						done(-1, e);

						// Simply rethrow otherwise
					} else {
						throw e;
					}
				}
			}

			// Callback for when everything is done
			function done(status, nativeStatusText, responses, headers) {
				var isSuccess,
				    success,
				    error,
				    response,
				    modified,
				    statusText = nativeStatusText;

				// Called once
				if (state === 2) {
					return;
				}

				// State is "done" now
				state = 2;

				// Clear timeout if it exists
				if (timeoutTimer) {
					window.clearTimeout(timeoutTimer);
				}

				// Dereference transport for early garbage collection
				// (no matter how long the jqXHR object will be used)
				transport = undefined;

				// Cache response headers
				responseHeadersString = headers || "";

				// Set readyState
				jqXHR.readyState = status > 0 ? 4 : 0;

				// Determine if successful
				isSuccess = status >= 200 && status < 300 || status === 304;

				// Get response data
				if (responses) {
					response = ajaxHandleResponses(s, jqXHR, responses);
				}

				// Convert no matter what (that way responseXXX fields are always set)
				response = ajaxConvert(s, response, jqXHR, isSuccess);

				// If successful, handle type chaining
				if (isSuccess) {

					// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
					if (s.ifModified) {
						modified = jqXHR.getResponseHeader("Last-Modified");
						if (modified) {
							jQuery.lastModified[cacheURL] = modified;
						}
						modified = jqXHR.getResponseHeader("etag");
						if (modified) {
							jQuery.etag[cacheURL] = modified;
						}
					}

					// if no content
					if (status === 204 || s.type === "HEAD") {
						statusText = "nocontent";

						// if not modified
					} else if (status === 304) {
						statusText = "notmodified";

						// If we have data, let's convert it
					} else {
						statusText = response.state;
						success = response.data;
						error = response.error;
						isSuccess = !error;
					}
				} else {

					// Extract error from statusText and normalize for non-aborts
					error = statusText;
					if (status || !statusText) {
						statusText = "error";
						if (status < 0) {
							status = 0;
						}
					}
				}

				// Set data for the fake xhr object
				jqXHR.status = status;
				jqXHR.statusText = (nativeStatusText || statusText) + "";

				// Success/Error
				if (isSuccess) {
					deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);
				} else {
					deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);
				}

				// Status-dependent callbacks
				jqXHR.statusCode(statusCode);
				statusCode = undefined;

				if (fireGlobals) {
					globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError", [jqXHR, s, isSuccess ? success : error]);
				}

				// Complete
				completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);

				if (fireGlobals) {
					globalEventContext.trigger("ajaxComplete", [jqXHR, s]);

					// Handle the global AJAX counter
					if (! --jQuery.active) {
						jQuery.event.trigger("ajaxStop");
					}
				}
			}

			return jqXHR;
		},

		getJSON: function (url, data, callback) {
			return jQuery.get(url, data, callback, "json");
		},

		getScript: function (url, callback) {
			return jQuery.get(url, undefined, callback, "script");
		}
	});

	jQuery.each(["get", "post"], function (i, method) {
		jQuery[method] = function (url, data, callback, type) {

			// Shift arguments if data argument was omitted
			if (jQuery.isFunction(data)) {
				type = type || callback;
				callback = data;
				data = undefined;
			}

			// The url can be an options object (which then must have .url)
			return jQuery.ajax(jQuery.extend({
				url: url,
				type: method,
				dataType: type,
				data: data,
				success: callback
			}, jQuery.isPlainObject(url) && url));
		};
	});

	jQuery._evalUrl = function (url) {
		return jQuery.ajax({
			url: url,

			// Make this explicit, since user can override this through ajaxSetup (#11264)
			type: "GET",
			dataType: "script",
			async: false,
			global: false,
			"throws": true
		});
	};

	jQuery.fn.extend({
		wrapAll: function (html) {
			var wrap;

			if (jQuery.isFunction(html)) {
				return this.each(function (i) {
					jQuery(this).wrapAll(html.call(this, i));
				});
			}

			if (this[0]) {

				// The elements to wrap the target around
				wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);

				if (this[0].parentNode) {
					wrap.insertBefore(this[0]);
				}

				wrap.map(function () {
					var elem = this;

					while (elem.firstElementChild) {
						elem = elem.firstElementChild;
					}

					return elem;
				}).append(this);
			}

			return this;
		},

		wrapInner: function (html) {
			if (jQuery.isFunction(html)) {
				return this.each(function (i) {
					jQuery(this).wrapInner(html.call(this, i));
				});
			}

			return this.each(function () {
				var self = jQuery(this),
				    contents = self.contents();

				if (contents.length) {
					contents.wrapAll(html);
				} else {
					self.append(html);
				}
			});
		},

		wrap: function (html) {
			var isFunction = jQuery.isFunction(html);

			return this.each(function (i) {
				jQuery(this).wrapAll(isFunction ? html.call(this, i) : html);
			});
		},

		unwrap: function () {
			return this.parent().each(function () {
				if (!jQuery.nodeName(this, "body")) {
					jQuery(this).replaceWith(this.childNodes);
				}
			}).end();
		}
	});

	jQuery.expr.filters.hidden = function (elem) {
		return !jQuery.expr.filters.visible(elem);
	};
	jQuery.expr.filters.visible = function (elem) {

		// Support: Opera <= 12.12
		// Opera reports offsetWidths and offsetHeights less than zero on some elements
		// Use OR instead of AND as the element is not visible if either is true
		// See tickets #10406 and #13132
		return elem.offsetWidth > 0 || elem.offsetHeight > 0 || elem.getClientRects().length > 0;
	};

	var r20 = /%20/g,
	    rbracket = /\[\]$/,
	    rCRLF = /\r?\n/g,
	    rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
	    rsubmittable = /^(?:input|select|textarea|keygen)/i;

	function buildParams(prefix, obj, traditional, add) {
		var name;

		if (jQuery.isArray(obj)) {

			// Serialize array item.
			jQuery.each(obj, function (i, v) {
				if (traditional || rbracket.test(prefix)) {

					// Treat each array item as a scalar.
					add(prefix, v);
				} else {

					// Item is non-scalar (array or object), encode its numeric index.
					buildParams(prefix + "[" + (typeof v === "object" && v != null ? i : "") + "]", v, traditional, add);
				}
			});
		} else if (!traditional && jQuery.type(obj) === "object") {

			// Serialize object item.
			for (name in obj) {
				buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
			}
		} else {

			// Serialize scalar item.
			add(prefix, obj);
		}
	}

	// Serialize an array of form elements or a set of
	// key/values into a query string
	jQuery.param = function (a, traditional) {
		var prefix,
		    s = [],
		    add = function (key, value) {

			// If value is a function, invoke it and return its value
			value = jQuery.isFunction(value) ? value() : value == null ? "" : value;
			s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
		};

		// Set traditional to true for jQuery <= 1.3.2 behavior.
		if (traditional === undefined) {
			traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
		}

		// If an array was passed in, assume that it is an array of form elements.
		if (jQuery.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) {

			// Serialize the form elements
			jQuery.each(a, function () {
				add(this.name, this.value);
			});
		} else {

			// If traditional, encode the "old" way (the way 1.3.2 or older
			// did it), otherwise encode params recursively.
			for (prefix in a) {
				buildParams(prefix, a[prefix], traditional, add);
			}
		}

		// Return the resulting serialization
		return s.join("&").replace(r20, "+");
	};

	jQuery.fn.extend({
		serialize: function () {
			return jQuery.param(this.serializeArray());
		},
		serializeArray: function () {
			return this.map(function () {

				// Can add propHook for "elements" to filter or add form elements
				var elements = jQuery.prop(this, "elements");
				return elements ? jQuery.makeArray(elements) : this;
			}).filter(function () {
				var type = this.type;

				// Use .is( ":disabled" ) so that fieldset[disabled] works
				return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !rcheckableType.test(type));
			}).map(function (i, elem) {
				var val = jQuery(this).val();

				return val == null ? null : jQuery.isArray(val) ? jQuery.map(val, function (val) {
					return { name: elem.name, value: val.replace(rCRLF, "\r\n") };
				}) : { name: elem.name, value: val.replace(rCRLF, "\r\n") };
			}).get();
		}
	});

	jQuery.ajaxSettings.xhr = function () {
		try {
			return new window.XMLHttpRequest();
		} catch (e) {}
	};

	var xhrSuccessStatus = {

		// File protocol always yields status code 0, assume 200
		0: 200,

		// Support: IE9
		// #1450: sometimes IE returns 1223 when it should be 204
		1223: 204
	},
	    xhrSupported = jQuery.ajaxSettings.xhr();

	support.cors = !!xhrSupported && "withCredentials" in xhrSupported;
	support.ajax = xhrSupported = !!xhrSupported;

	jQuery.ajaxTransport(function (options) {
		var callback, errorCallback;

		// Cross domain only allowed if supported through XMLHttpRequest
		if (support.cors || xhrSupported && !options.crossDomain) {
			return {
				send: function (headers, complete) {
					var i,
					    xhr = options.xhr();

					xhr.open(options.type, options.url, options.async, options.username, options.password);

					// Apply custom fields if provided
					if (options.xhrFields) {
						for (i in options.xhrFields) {
							xhr[i] = options.xhrFields[i];
						}
					}

					// Override mime type if needed
					if (options.mimeType && xhr.overrideMimeType) {
						xhr.overrideMimeType(options.mimeType);
					}

					// X-Requested-With header
					// For cross-domain requests, seeing as conditions for a preflight are
					// akin to a jigsaw puzzle, we simply never set it to be sure.
					// (it can always be set on a per-request basis or even using ajaxSetup)
					// For same-domain requests, won't change header if already provided.
					if (!options.crossDomain && !headers["X-Requested-With"]) {
						headers["X-Requested-With"] = "XMLHttpRequest";
					}

					// Set headers
					for (i in headers) {
						xhr.setRequestHeader(i, headers[i]);
					}

					// Callback
					callback = function (type) {
						return function () {
							if (callback) {
								callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;

								if (type === "abort") {
									xhr.abort();
								} else if (type === "error") {

									// Support: IE9
									// On a manual native abort, IE9 throws
									// errors on any property access that is not readyState
									if (typeof xhr.status !== "number") {
										complete(0, "error");
									} else {
										complete(

										// File: protocol always yields status 0; see #8605, #14207
										xhr.status, xhr.statusText);
									}
								} else {
									complete(xhrSuccessStatus[xhr.status] || xhr.status, xhr.statusText,

									// Support: IE9 only
									// IE9 has no XHR2 but throws on binary (trac-11426)
									// For XHR2 non-text, let the caller handle it (gh-2498)
									(xhr.responseType || "text") !== "text" || typeof xhr.responseText !== "string" ? { binary: xhr.response } : { text: xhr.responseText }, xhr.getAllResponseHeaders());
								}
							}
						};
					};

					// Listen to events
					xhr.onload = callback();
					errorCallback = xhr.onerror = callback("error");

					// Support: IE9
					// Use onreadystatechange to replace onabort
					// to handle uncaught aborts
					if (xhr.onabort !== undefined) {
						xhr.onabort = errorCallback;
					} else {
						xhr.onreadystatechange = function () {

							// Check readyState before timeout as it changes
							if (xhr.readyState === 4) {

								// Allow onerror to be called first,
								// but that will not handle a native abort
								// Also, save errorCallback to a variable
								// as xhr.onerror cannot be accessed
								window.setTimeout(function () {
									if (callback) {
										errorCallback();
									}
								});
							}
						};
					}

					// Create the abort callback
					callback = callback("abort");

					try {

						// Do send the request (this may raise an exception)
						xhr.send(options.hasContent && options.data || null);
					} catch (e) {

						// #14683: Only rethrow if this hasn't been notified as an error yet
						if (callback) {
							throw e;
						}
					}
				},

				abort: function () {
					if (callback) {
						callback();
					}
				}
			};
		}
	});

	// Install script dataType
	jQuery.ajaxSetup({
		accepts: {
			script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript"
		},
		contents: {
			script: /\b(?:java|ecma)script\b/
		},
		converters: {
			"text script": function (text) {
				jQuery.globalEval(text);
				return text;
			}
		}
	});

	// Handle cache's special case and crossDomain
	jQuery.ajaxPrefilter("script", function (s) {
		if (s.cache === undefined) {
			s.cache = false;
		}
		if (s.crossDomain) {
			s.type = "GET";
		}
	});

	// Bind script tag hack transport
	jQuery.ajaxTransport("script", function (s) {

		// This transport only deals with cross domain requests
		if (s.crossDomain) {
			var script, callback;
			return {
				send: function (_, complete) {
					script = jQuery("<script>").prop({
						charset: s.scriptCharset,
						src: s.url
					}).on("load error", callback = function (evt) {
						script.remove();
						callback = null;
						if (evt) {
							complete(evt.type === "error" ? 404 : 200, evt.type);
						}
					});

					// Use native DOM manipulation to avoid our domManip AJAX trickery
					document.head.appendChild(script[0]);
				},
				abort: function () {
					if (callback) {
						callback();
					}
				}
			};
		}
	});

	var oldCallbacks = [],
	    rjsonp = /(=)\?(?=&|$)|\?\?/;

	// Default jsonp settings
	jQuery.ajaxSetup({
		jsonp: "callback",
		jsonpCallback: function () {
			var callback = oldCallbacks.pop() || jQuery.expando + "_" + nonce++;
			this[callback] = true;
			return callback;
		}
	});

	// Detect, normalize options and install callbacks for jsonp requests
	jQuery.ajaxPrefilter("json jsonp", function (s, originalSettings, jqXHR) {

		var callbackName,
		    overwritten,
		    responseContainer,
		    jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ? "url" : typeof s.data === "string" && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0 && rjsonp.test(s.data) && "data");

		// Handle iff the expected data type is "jsonp" or we have a parameter to set
		if (jsonProp || s.dataTypes[0] === "jsonp") {

			// Get callback name, remembering preexisting value associated with it
			callbackName = s.jsonpCallback = jQuery.isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback;

			// Insert callback into url or form data
			if (jsonProp) {
				s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName);
			} else if (s.jsonp !== false) {
				s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName;
			}

			// Use data converter to retrieve json after script execution
			s.converters["script json"] = function () {
				if (!responseContainer) {
					jQuery.error(callbackName + " was not called");
				}
				return responseContainer[0];
			};

			// Force json dataType
			s.dataTypes[0] = "json";

			// Install callback
			overwritten = window[callbackName];
			window[callbackName] = function () {
				responseContainer = arguments;
			};

			// Clean-up function (fires after converters)
			jqXHR.always(function () {

				// If previous value didn't exist - remove it
				if (overwritten === undefined) {
					jQuery(window).removeProp(callbackName);

					// Otherwise restore preexisting value
				} else {
					window[callbackName] = overwritten;
				}

				// Save back as free
				if (s[callbackName]) {

					// Make sure that re-using the options doesn't screw things around
					s.jsonpCallback = originalSettings.jsonpCallback;

					// Save the callback name for future use
					oldCallbacks.push(callbackName);
				}

				// Call if it was a function and we have a response
				if (responseContainer && jQuery.isFunction(overwritten)) {
					overwritten(responseContainer[0]);
				}

				responseContainer = overwritten = undefined;
			});

			// Delegate to script
			return "script";
		}
	});

	// Argument "data" should be string of html
	// context (optional): If specified, the fragment will be created in this context,
	// defaults to document
	// keepScripts (optional): If true, will include scripts passed in the html string
	jQuery.parseHTML = function (data, context, keepScripts) {
		if (!data || typeof data !== "string") {
			return null;
		}
		if (typeof context === "boolean") {
			keepScripts = context;
			context = false;
		}
		context = context || document;

		var parsed = rsingleTag.exec(data),
		    scripts = !keepScripts && [];

		// Single tag
		if (parsed) {
			return [context.createElement(parsed[1])];
		}

		parsed = buildFragment([data], context, scripts);

		if (scripts && scripts.length) {
			jQuery(scripts).remove();
		}

		return jQuery.merge([], parsed.childNodes);
	};

	// Keep a copy of the old load method
	var _load = jQuery.fn.load;

	/**
  * Load a url into a page
  */
	jQuery.fn.load = function (url, params, callback) {
		if (typeof url !== "string" && _load) {
			return _load.apply(this, arguments);
		}

		var selector,
		    type,
		    response,
		    self = this,
		    off = url.indexOf(" ");

		if (off > -1) {
			selector = jQuery.trim(url.slice(off));
			url = url.slice(0, off);
		}

		// If it's a function
		if (jQuery.isFunction(params)) {

			// We assume that it's the callback
			callback = params;
			params = undefined;

			// Otherwise, build a param string
		} else if (params && typeof params === "object") {
			type = "POST";
		}

		// If we have elements to modify, make the request
		if (self.length > 0) {
			jQuery.ajax({
				url: url,

				// If "type" variable is undefined, then "GET" method will be used.
				// Make value of this field explicit since
				// user can override it through ajaxSetup method
				type: type || "GET",
				dataType: "html",
				data: params
			}).done(function (responseText) {

				// Save response for use in complete callback
				response = arguments;

				self.html(selector ?

				// If a selector was specified, locate the right elements in a dummy div
				// Exclude scripts to avoid IE 'Permission Denied' errors
				jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) :

				// Otherwise use the full result
				responseText);

				// If the request succeeds, this function gets "data", "status", "jqXHR"
				// but they are ignored because response was set above.
				// If it fails, this function gets "jqXHR", "status", "error"
			}).always(callback && function (jqXHR, status) {
				self.each(function () {
					callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
				});
			});
		}

		return this;
	};

	// Attach a bunch of functions for handling common AJAX events
	jQuery.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (i, type) {
		jQuery.fn[type] = function (fn) {
			return this.on(type, fn);
		};
	});

	jQuery.expr.filters.animated = function (elem) {
		return jQuery.grep(jQuery.timers, function (fn) {
			return elem === fn.elem;
		}).length;
	};

	/**
  * Gets a window from an element
  */
	function getWindow(elem) {
		return jQuery.isWindow(elem) ? elem : elem.nodeType === 9 && elem.defaultView;
	}

	jQuery.offset = {
		setOffset: function (elem, options, i) {
			var curPosition,
			    curLeft,
			    curCSSTop,
			    curTop,
			    curOffset,
			    curCSSLeft,
			    calculatePosition,
			    position = jQuery.css(elem, "position"),
			    curElem = jQuery(elem),
			    props = {};

			// Set position first, in-case top/left are set even on static elem
			if (position === "static") {
				elem.style.position = "relative";
			}

			curOffset = curElem.offset();
			curCSSTop = jQuery.css(elem, "top");
			curCSSLeft = jQuery.css(elem, "left");
			calculatePosition = (position === "absolute" || position === "fixed") && (curCSSTop + curCSSLeft).indexOf("auto") > -1;

			// Need to be able to calculate position if either
			// top or left is auto and position is either absolute or fixed
			if (calculatePosition) {
				curPosition = curElem.position();
				curTop = curPosition.top;
				curLeft = curPosition.left;
			} else {
				curTop = parseFloat(curCSSTop) || 0;
				curLeft = parseFloat(curCSSLeft) || 0;
			}

			if (jQuery.isFunction(options)) {

				// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
				options = options.call(elem, i, jQuery.extend({}, curOffset));
			}

			if (options.top != null) {
				props.top = options.top - curOffset.top + curTop;
			}
			if (options.left != null) {
				props.left = options.left - curOffset.left + curLeft;
			}

			if ("using" in options) {
				options.using.call(elem, props);
			} else {
				curElem.css(props);
			}
		}
	};

	jQuery.fn.extend({
		offset: function (options) {
			if (arguments.length) {
				return options === undefined ? this : this.each(function (i) {
					jQuery.offset.setOffset(this, options, i);
				});
			}

			var docElem,
			    win,
			    elem = this[0],
			    box = { top: 0, left: 0 },
			    doc = elem && elem.ownerDocument;

			if (!doc) {
				return;
			}

			docElem = doc.documentElement;

			// Make sure it's not a disconnected DOM node
			if (!jQuery.contains(docElem, elem)) {
				return box;
			}

			box = elem.getBoundingClientRect();
			win = getWindow(doc);
			return {
				top: box.top + win.pageYOffset - docElem.clientTop,
				left: box.left + win.pageXOffset - docElem.clientLeft
			};
		},

		position: function () {
			if (!this[0]) {
				return;
			}

			var offsetParent,
			    offset,
			    elem = this[0],
			    parentOffset = { top: 0, left: 0 };

			// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
			// because it is its only offset parent
			if (jQuery.css(elem, "position") === "fixed") {

				// Assume getBoundingClientRect is there when computed position is fixed
				offset = elem.getBoundingClientRect();
			} else {

				// Get *real* offsetParent
				offsetParent = this.offsetParent();

				// Get correct offsets
				offset = this.offset();
				if (!jQuery.nodeName(offsetParent[0], "html")) {
					parentOffset = offsetParent.offset();
				}

				// Add offsetParent borders
				parentOffset.top += jQuery.css(offsetParent[0], "borderTopWidth", true);
				parentOffset.left += jQuery.css(offsetParent[0], "borderLeftWidth", true);
			}

			// Subtract parent offsets and element margins
			return {
				top: offset.top - parentOffset.top - jQuery.css(elem, "marginTop", true),
				left: offset.left - parentOffset.left - jQuery.css(elem, "marginLeft", true)
			};
		},

		// This method will return documentElement in the following cases:
		// 1) For the element inside the iframe without offsetParent, this method will return
		//    documentElement of the parent window
		// 2) For the hidden or detached element
		// 3) For body or html element, i.e. in case of the html node - it will return itself
		//
		// but those exceptions were never presented as a real life use-cases
		// and might be considered as more preferable results.
		//
		// This logic, however, is not guaranteed and can change at any point in the future
		offsetParent: function () {
			return this.map(function () {
				var offsetParent = this.offsetParent;

				while (offsetParent && jQuery.css(offsetParent, "position") === "static") {
					offsetParent = offsetParent.offsetParent;
				}

				return offsetParent || documentElement;
			});
		}
	});

	// Create scrollLeft and scrollTop methods
	jQuery.each({ scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function (method, prop) {
		var top = "pageYOffset" === prop;

		jQuery.fn[method] = function (val) {
			return access(this, function (elem, method, val) {
				var win = getWindow(elem);

				if (val === undefined) {
					return win ? win[prop] : elem[method];
				}

				if (win) {
					win.scrollTo(!top ? val : win.pageXOffset, top ? val : win.pageYOffset);
				} else {
					elem[method] = val;
				}
			}, method, val, arguments.length);
		};
	});

	// Support: Safari<7-8+, Chrome<37-44+
	// Add the top/left cssHooks using jQuery.fn.position
	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
	// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280
	// getComputedStyle returns percent when specified for top/left/bottom/right;
	// rather than make the css module depend on the offset module, just check for it here
	jQuery.each(["top", "left"], function (i, prop) {
		jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition, function (elem, computed) {
			if (computed) {
				computed = curCSS(elem, prop);

				// If curCSS returns percentage, fallback to offset
				return rnumnonpx.test(computed) ? jQuery(elem).position()[prop] + "px" : computed;
			}
		});
	});

	// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
	jQuery.each({ Height: "height", Width: "width" }, function (name, type) {
		jQuery.each({ padding: "inner" + name, content: type, "": "outer" + name }, function (defaultExtra, funcName) {

			// Margin is only for outerHeight, outerWidth
			jQuery.fn[funcName] = function (margin, value) {
				var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"),
				    extra = defaultExtra || (margin === true || value === true ? "margin" : "border");

				return access(this, function (elem, type, value) {
					var doc;

					if (jQuery.isWindow(elem)) {

						// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
						// isn't a whole lot we can do. See pull request at this URL for discussion:
						// https://github.com/jquery/jquery/pull/764
						return elem.document.documentElement["client" + name];
					}

					// Get document width or height
					if (elem.nodeType === 9) {
						doc = elem.documentElement;

						// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
						// whichever is greatest
						return Math.max(elem.body["scroll" + name], doc["scroll" + name], elem.body["offset" + name], doc["offset" + name], doc["client" + name]);
					}

					return value === undefined ?

					// Get width or height on the element, requesting but not forcing parseFloat
					jQuery.css(elem, type, extra) :

					// Set width or height on the element
					jQuery.style(elem, type, value, extra);
				}, type, chainable ? margin : undefined, chainable, null);
			};
		});
	});

	jQuery.fn.extend({

		bind: function (types, data, fn) {
			return this.on(types, null, data, fn);
		},
		unbind: function (types, fn) {
			return this.off(types, null, fn);
		},

		delegate: function (selector, types, data, fn) {
			return this.on(types, selector, data, fn);
		},
		undelegate: function (selector, types, fn) {

			// ( namespace ) or ( selector, types [, fn] )
			return arguments.length === 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn);
		},
		size: function () {
			return this.length;
		}
	});

	jQuery.fn.andSelf = jQuery.fn.addBack;

	// Register as a named AMD module, since jQuery can be concatenated with other
	// files that may use define, but not via a proper concatenation script that
	// understands anonymous AMD modules. A named AMD is safest and most robust
	// way to register. Lowercase jquery is used because AMD module names are
	// derived from file names, and jQuery is normally delivered in a lowercase
	// file name. Do this after creating the global so that if an AMD module wants
	// to call noConflict to hide this version of jQuery, it will work.

	// Note that for maximum portability, libraries that are not jQuery should
	// declare themselves as anonymous modules, and avoid setting a global if an
	// AMD loader is present. jQuery is a special case. For more information, see
	// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon

	if (typeof define === "function" && define.amd) {
		define("jquery", [], function () {
			return jQuery;
		});
	}

	var

	// Map over jQuery in case of overwrite
	_jQuery = window.jQuery,


	// Map over the $ in case of overwrite
	_$ = window.$;

	jQuery.noConflict = function (deep) {
		if (window.$ === jQuery) {
			window.$ = _$;
		}

		if (deep && window.jQuery === jQuery) {
			window.jQuery = _jQuery;
		}

		return jQuery;
	};

	// Expose jQuery and $ identifiers, even in AMD
	// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
	// and CommonJS for browser emulators (#13566)
	if (!noGlobal) {
		window.jQuery = window.$ = jQuery;
	}

	return jQuery;
});

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/owl.carousel.js":[function(require,module,exports){
/**
 * Owl Carousel v2.1.4
 * Copyright 2013-2016 David Deutsch
 * Licensed under MIT (https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE)
 */
/**
 * Owl carousel
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 * @todo Lazy Load Icon
 * @todo prevent animationend bubling
 * @todo itemsScaleUp
 * @todo Test Zepto
 * @todo stagePadding calculate wrong active classes
 */
;(function ($, window, document, undefined) {

	/**
  * Creates a carousel.
  * @class The Owl Carousel.
  * @public
  * @param {HTMLElement|jQuery} element - The element to create the carousel for.
  * @param {Object} [options] - The options
  */
	function Owl(element, options) {

		/**
   * Current settings for the carousel.
   * @public
   */
		this.settings = null;

		/**
   * Current options set by the caller including defaults.
   * @public
   */
		this.options = $.extend({}, Owl.Defaults, options);

		/**
   * Plugin element.
   * @public
   */
		this.$element = $(element);

		/**
   * Proxied event handlers.
   * @protected
   */
		this._handlers = {};

		/**
   * References to the running plugins of this carousel.
   * @protected
   */
		this._plugins = {};

		/**
   * Currently suppressed events to prevent them from beeing retriggered.
   * @protected
   */
		this._supress = {};

		/**
   * Absolute current position.
   * @protected
   */
		this._current = null;

		/**
   * Animation speed in milliseconds.
   * @protected
   */
		this._speed = null;

		/**
   * Coordinates of all items in pixel.
   * @todo The name of this member is missleading.
   * @protected
   */
		this._coordinates = [];

		/**
   * Current breakpoint.
   * @todo Real media queries would be nice.
   * @protected
   */
		this._breakpoint = null;

		/**
   * Current width of the plugin element.
   */
		this._width = null;

		/**
   * All real items.
   * @protected
   */
		this._items = [];

		/**
   * All cloned items.
   * @protected
   */
		this._clones = [];

		/**
   * Merge values of all items.
   * @todo Maybe this could be part of a plugin.
   * @protected
   */
		this._mergers = [];

		/**
   * Widths of all items.
   */
		this._widths = [];

		/**
   * Invalidated parts within the update process.
   * @protected
   */
		this._invalidated = {};

		/**
   * Ordered list of workers for the update process.
   * @protected
   */
		this._pipe = [];

		/**
   * Current state information for the drag operation.
   * @todo #261
   * @protected
   */
		this._drag = {
			time: null,
			target: null,
			pointer: null,
			stage: {
				start: null,
				current: null
			},
			direction: null
		};

		/**
   * Current state information and their tags.
   * @type {Object}
   * @protected
   */
		this._states = {
			current: {},
			tags: {
				'initializing': ['busy'],
				'animating': ['busy'],
				'dragging': ['interacting']
			}
		};

		$.each(['onResize', 'onThrottledResize'], $.proxy(function (i, handler) {
			this._handlers[handler] = $.proxy(this[handler], this);
		}, this));

		$.each(Owl.Plugins, $.proxy(function (key, plugin) {
			this._plugins[key.charAt(0).toLowerCase() + key.slice(1)] = new plugin(this);
		}, this));

		$.each(Owl.Workers, $.proxy(function (priority, worker) {
			this._pipe.push({
				'filter': worker.filter,
				'run': $.proxy(worker.run, this)
			});
		}, this));

		this.setup();
		this.initialize();
	}

	/**
  * Default options for the carousel.
  * @public
  */
	Owl.Defaults = {
		items: 3,
		loop: false,
		center: false,
		rewind: false,

		mouseDrag: true,
		touchDrag: true,
		pullDrag: true,
		freeDrag: false,

		margin: 0,
		stagePadding: 0,

		merge: false,
		mergeFit: true,
		autoWidth: false,

		startPosition: 0,
		rtl: false,

		smartSpeed: 250,
		fluidSpeed: false,
		dragEndSpeed: false,

		responsive: {},
		responsiveRefreshRate: 200,
		responsiveBaseElement: window,

		fallbackEasing: 'swing',

		info: false,

		nestedItemSelector: false,
		itemElement: 'div',
		stageElement: 'div',

		refreshClass: 'owl-refresh',
		loadedClass: 'owl-loaded',
		loadingClass: 'owl-loading',
		rtlClass: 'owl-rtl',
		responsiveClass: 'owl-responsive',
		dragClass: 'owl-drag',
		itemClass: 'owl-item',
		stageClass: 'owl-stage',
		stageOuterClass: 'owl-stage-outer',
		grabClass: 'owl-grab'
	};

	/**
  * Enumeration for width.
  * @public
  * @readonly
  * @enum {String}
  */
	Owl.Width = {
		Default: 'default',
		Inner: 'inner',
		Outer: 'outer'
	};

	/**
  * Enumeration for types.
  * @public
  * @readonly
  * @enum {String}
  */
	Owl.Type = {
		Event: 'event',
		State: 'state'
	};

	/**
  * Contains all registered plugins.
  * @public
  */
	Owl.Plugins = {};

	/**
  * List of workers involved in the update process.
  */
	Owl.Workers = [{
		filter: ['width', 'settings'],
		run: function () {
			this._width = this.$element.width();
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function (cache) {
			cache.current = this._items && this._items[this.relative(this._current)];
		}
	}, {
		filter: ['items', 'settings'],
		run: function () {
			this.$stage.children('.cloned').remove();
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function (cache) {
			var margin = this.settings.margin || '',
			    grid = !this.settings.autoWidth,
			    rtl = this.settings.rtl,
			    css = {
				'width': 'auto',
				'margin-left': rtl ? margin : '',
				'margin-right': rtl ? '' : margin
			};

			!grid && this.$stage.children().css(css);

			cache.css = css;
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function (cache) {
			var width = (this.width() / this.settings.items).toFixed(3) - this.settings.margin,
			    merge = null,
			    iterator = this._items.length,
			    grid = !this.settings.autoWidth,
			    widths = [];

			cache.items = {
				merge: false,
				width: width
			};

			while (iterator--) {
				merge = this._mergers[iterator];
				merge = this.settings.mergeFit && Math.min(merge, this.settings.items) || merge;

				cache.items.merge = merge > 1 || cache.items.merge;

				widths[iterator] = !grid ? this._items[iterator].width() : width * merge;
			}

			this._widths = widths;
		}
	}, {
		filter: ['items', 'settings'],
		run: function () {
			var clones = [],
			    items = this._items,
			    settings = this.settings,
			    view = Math.max(settings.items * 2, 4),
			    size = Math.ceil(items.length / 2) * 2,
			    repeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0,
			    append = '',
			    prepend = '';

			repeat /= 2;

			while (repeat--) {
				clones.push(this.normalize(clones.length / 2, true));
				append = append + items[clones[clones.length - 1]][0].outerHTML;
				clones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true));
				prepend = items[clones[clones.length - 1]][0].outerHTML + prepend;
			}

			this._clones = clones;

			$(append).addClass('cloned').appendTo(this.$stage);
			$(prepend).addClass('cloned').prependTo(this.$stage);
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function () {
			var rtl = this.settings.rtl ? 1 : -1,
			    size = this._clones.length + this._items.length,
			    iterator = -1,
			    previous = 0,
			    current = 0,
			    coordinates = [];

			while (++iterator < size) {
				previous = coordinates[iterator - 1] || 0;
				current = this._widths[this.relative(iterator)] + this.settings.margin;
				coordinates.push(previous + current * rtl);
			}

			this._coordinates = coordinates;
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function () {
			var padding = this.settings.stagePadding,
			    coordinates = this._coordinates,
			    css = {
				'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2,
				'padding-left': padding || '',
				'padding-right': padding || ''
			};

			this.$stage.css(css);
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function (cache) {
			var iterator = this._coordinates.length,
			    grid = !this.settings.autoWidth,
			    items = this.$stage.children();

			if (grid && cache.items.merge) {
				while (iterator--) {
					cache.css.width = this._widths[this.relative(iterator)];
					items.eq(iterator).css(cache.css);
				}
			} else if (grid) {
				cache.css.width = cache.items.width;
				items.css(cache.css);
			}
		}
	}, {
		filter: ['items'],
		run: function () {
			this._coordinates.length < 1 && this.$stage.removeAttr('style');
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function (cache) {
			cache.current = cache.current ? this.$stage.children().index(cache.current) : 0;
			cache.current = Math.max(this.minimum(), Math.min(this.maximum(), cache.current));
			this.reset(cache.current);
		}
	}, {
		filter: ['position'],
		run: function () {
			this.animate(this.coordinates(this._current));
		}
	}, {
		filter: ['width', 'position', 'items', 'settings'],
		run: function () {
			var rtl = this.settings.rtl ? 1 : -1,
			    padding = this.settings.stagePadding * 2,
			    begin = this.coordinates(this.current()) + padding,
			    end = begin + this.width() * rtl,
			    inner,
			    outer,
			    matches = [],
			    i,
			    n;

			for (i = 0, n = this._coordinates.length; i < n; i++) {
				inner = this._coordinates[i - 1] || 0;
				outer = Math.abs(this._coordinates[i]) + padding * rtl;

				if (this.op(inner, '<=', begin) && this.op(inner, '>', end) || this.op(outer, '<', begin) && this.op(outer, '>', end)) {
					matches.push(i);
				}
			}

			this.$stage.children('.active').removeClass('active');
			this.$stage.children(':eq(' + matches.join('), :eq(') + ')').addClass('active');

			if (this.settings.center) {
				this.$stage.children('.center').removeClass('center');
				this.$stage.children().eq(this.current()).addClass('center');
			}
		}
	}];

	/**
  * Initializes the carousel.
  * @protected
  */
	Owl.prototype.initialize = function () {
		this.enter('initializing');
		this.trigger('initialize');

		this.$element.toggleClass(this.settings.rtlClass, this.settings.rtl);

		if (this.settings.autoWidth && !this.is('pre-loading')) {
			var imgs, nestedSelector, width;
			imgs = this.$element.find('img');
			nestedSelector = this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector : undefined;
			width = this.$element.children(nestedSelector).width();

			if (imgs.length && width <= 0) {
				this.preloadAutoWidthImages(imgs);
			}
		}

		this.$element.addClass(this.options.loadingClass);

		// create stage
		this.$stage = $('<' + this.settings.stageElement + ' class="' + this.settings.stageClass + '"/>').wrap('<div class="' + this.settings.stageOuterClass + '"/>');

		// append stage
		this.$element.append(this.$stage.parent());

		// append content
		this.replace(this.$element.children().not(this.$stage.parent()));

		// check visibility
		if (this.$element.is(':visible')) {
			// update view
			this.refresh();
		} else {
			// invalidate width
			this.invalidate('width');
		}

		this.$element.removeClass(this.options.loadingClass).addClass(this.options.loadedClass);

		// register event handlers
		this.registerEventHandlers();

		this.leave('initializing');
		this.trigger('initialized');
	};

	/**
  * Setups the current settings.
  * @todo Remove responsive classes. Why should adaptive designs be brought into IE8?
  * @todo Support for media queries by using `matchMedia` would be nice.
  * @public
  */
	Owl.prototype.setup = function () {
		var viewport = this.viewport(),
		    overwrites = this.options.responsive,
		    match = -1,
		    settings = null;

		if (!overwrites) {
			settings = $.extend({}, this.options);
		} else {
			$.each(overwrites, function (breakpoint) {
				if (breakpoint <= viewport && breakpoint > match) {
					match = Number(breakpoint);
				}
			});

			settings = $.extend({}, this.options, overwrites[match]);
			delete settings.responsive;

			// responsive class
			if (settings.responsiveClass) {
				this.$element.attr('class', this.$element.attr('class').replace(new RegExp('(' + this.options.responsiveClass + '-)\\S+\\s', 'g'), '$1' + match));
			}
		}

		if (this.settings === null || this._breakpoint !== match) {
			this.trigger('change', { property: { name: 'settings', value: settings } });
			this._breakpoint = match;
			this.settings = settings;
			this.invalidate('settings');
			this.trigger('changed', { property: { name: 'settings', value: this.settings } });
		}
	};

	/**
  * Updates option logic if necessery.
  * @protected
  */
	Owl.prototype.optionsLogic = function () {
		if (this.settings.autoWidth) {
			this.settings.stagePadding = false;
			this.settings.merge = false;
		}
	};

	/**
  * Prepares an item before add.
  * @todo Rename event parameter `content` to `item`.
  * @protected
  * @returns {jQuery|HTMLElement} - The item container.
  */
	Owl.prototype.prepare = function (item) {
		var event = this.trigger('prepare', { content: item });

		if (!event.data) {
			event.data = $('<' + this.settings.itemElement + '/>').addClass(this.options.itemClass).append(item);
		}

		this.trigger('prepared', { content: event.data });

		return event.data;
	};

	/**
  * Updates the view.
  * @public
  */
	Owl.prototype.update = function () {
		var i = 0,
		    n = this._pipe.length,
		    filter = $.proxy(function (p) {
			return this[p];
		}, this._invalidated),
		    cache = {};

		while (i < n) {
			if (this._invalidated.all || $.grep(this._pipe[i].filter, filter).length > 0) {
				this._pipe[i].run(cache);
			}
			i++;
		}

		this._invalidated = {};

		!this.is('valid') && this.enter('valid');
	};

	/**
  * Gets the width of the view.
  * @public
  * @param {Owl.Width} [dimension=Owl.Width.Default] - The dimension to return.
  * @returns {Number} - The width of the view in pixel.
  */
	Owl.prototype.width = function (dimension) {
		dimension = dimension || Owl.Width.Default;
		switch (dimension) {
			case Owl.Width.Inner:
			case Owl.Width.Outer:
				return this._width;
			default:
				return this._width - this.settings.stagePadding * 2 + this.settings.margin;
		}
	};

	/**
  * Refreshes the carousel primarily for adaptive purposes.
  * @public
  */
	Owl.prototype.refresh = function () {
		this.enter('refreshing');
		this.trigger('refresh');

		this.setup();

		this.optionsLogic();

		this.$element.addClass(this.options.refreshClass);

		this.update();

		this.$element.removeClass(this.options.refreshClass);

		this.leave('refreshing');
		this.trigger('refreshed');
	};

	/**
  * Checks window `resize` event.
  * @protected
  */
	Owl.prototype.onThrottledResize = function () {
		window.clearTimeout(this.resizeTimer);
		this.resizeTimer = window.setTimeout(this._handlers.onResize, this.settings.responsiveRefreshRate);
	};

	/**
  * Checks window `resize` event.
  * @protected
  */
	Owl.prototype.onResize = function () {
		if (!this._items.length) {
			return false;
		}

		if (this._width === this.$element.width()) {
			return false;
		}

		if (!this.$element.is(':visible')) {
			return false;
		}

		this.enter('resizing');

		if (this.trigger('resize').isDefaultPrevented()) {
			this.leave('resizing');
			return false;
		}

		this.invalidate('width');

		this.refresh();

		this.leave('resizing');
		this.trigger('resized');
	};

	/**
  * Registers event handlers.
  * @todo Check `msPointerEnabled`
  * @todo #261
  * @protected
  */
	Owl.prototype.registerEventHandlers = function () {
		if ($.support.transition) {
			this.$stage.on($.support.transition.end + '.owl.core', $.proxy(this.onTransitionEnd, this));
		}

		if (this.settings.responsive !== false) {
			this.on(window, 'resize', this._handlers.onThrottledResize);
		}

		if (this.settings.mouseDrag) {
			this.$element.addClass(this.options.dragClass);
			this.$stage.on('mousedown.owl.core', $.proxy(this.onDragStart, this));
			this.$stage.on('dragstart.owl.core selectstart.owl.core', function () {
				return false;
			});
		}

		if (this.settings.touchDrag) {
			this.$stage.on('touchstart.owl.core', $.proxy(this.onDragStart, this));
			this.$stage.on('touchcancel.owl.core', $.proxy(this.onDragEnd, this));
		}
	};

	/**
  * Handles `touchstart` and `mousedown` events.
  * @todo Horizontal swipe threshold as option
  * @todo #261
  * @protected
  * @param {Event} event - The event arguments.
  */
	Owl.prototype.onDragStart = function (event) {
		var stage = null;

		if (event.which === 3) {
			return;
		}

		if ($.support.transform) {
			stage = this.$stage.css('transform').replace(/.*\(|\)| /g, '').split(',');
			stage = {
				x: stage[stage.length === 16 ? 12 : 4],
				y: stage[stage.length === 16 ? 13 : 5]
			};
		} else {
			stage = this.$stage.position();
			stage = {
				x: this.settings.rtl ? stage.left + this.$stage.width() - this.width() + this.settings.margin : stage.left,
				y: stage.top
			};
		}

		if (this.is('animating')) {
			$.support.transform ? this.animate(stage.x) : this.$stage.stop();
			this.invalidate('position');
		}

		this.$element.toggleClass(this.options.grabClass, event.type === 'mousedown');

		this.speed(0);

		this._drag.time = new Date().getTime();
		this._drag.target = $(event.target);
		this._drag.stage.start = stage;
		this._drag.stage.current = stage;
		this._drag.pointer = this.pointer(event);

		$(document).on('mouseup.owl.core touchend.owl.core', $.proxy(this.onDragEnd, this));

		$(document).one('mousemove.owl.core touchmove.owl.core', $.proxy(function (event) {
			var delta = this.difference(this._drag.pointer, this.pointer(event));

			$(document).on('mousemove.owl.core touchmove.owl.core', $.proxy(this.onDragMove, this));

			if (Math.abs(delta.x) < Math.abs(delta.y) && this.is('valid')) {
				return;
			}

			event.preventDefault();

			this.enter('dragging');
			this.trigger('drag');
		}, this));
	};

	/**
  * Handles the `touchmove` and `mousemove` events.
  * @todo #261
  * @protected
  * @param {Event} event - The event arguments.
  */
	Owl.prototype.onDragMove = function (event) {
		var minimum = null,
		    maximum = null,
		    pull = null,
		    delta = this.difference(this._drag.pointer, this.pointer(event)),
		    stage = this.difference(this._drag.stage.start, delta);

		if (!this.is('dragging')) {
			return;
		}

		event.preventDefault();

		if (this.settings.loop) {
			minimum = this.coordinates(this.minimum());
			maximum = this.coordinates(this.maximum() + 1) - minimum;
			stage.x = ((stage.x - minimum) % maximum + maximum) % maximum + minimum;
		} else {
			minimum = this.settings.rtl ? this.coordinates(this.maximum()) : this.coordinates(this.minimum());
			maximum = this.settings.rtl ? this.coordinates(this.minimum()) : this.coordinates(this.maximum());
			pull = this.settings.pullDrag ? -1 * delta.x / 5 : 0;
			stage.x = Math.max(Math.min(stage.x, minimum + pull), maximum + pull);
		}

		this._drag.stage.current = stage;

		this.animate(stage.x);
	};

	/**
  * Handles the `touchend` and `mouseup` events.
  * @todo #261
  * @todo Threshold for click event
  * @protected
  * @param {Event} event - The event arguments.
  */
	Owl.prototype.onDragEnd = function (event) {
		var delta = this.difference(this._drag.pointer, this.pointer(event)),
		    stage = this._drag.stage.current,
		    direction = delta.x > 0 ^ this.settings.rtl ? 'left' : 'right';

		$(document).off('.owl.core');

		this.$element.removeClass(this.options.grabClass);

		if (delta.x !== 0 && this.is('dragging') || !this.is('valid')) {
			this.speed(this.settings.dragEndSpeed || this.settings.smartSpeed);
			this.current(this.closest(stage.x, delta.x !== 0 ? direction : this._drag.direction));
			this.invalidate('position');
			this.update();

			this._drag.direction = direction;

			if (Math.abs(delta.x) > 3 || new Date().getTime() - this._drag.time > 300) {
				this._drag.target.one('click.owl.core', function () {
					return false;
				});
			}
		}

		if (!this.is('dragging')) {
			return;
		}

		this.leave('dragging');
		this.trigger('dragged');
	};

	/**
  * Gets absolute position of the closest item for a coordinate.
  * @todo Setting `freeDrag` makes `closest` not reusable. See #165.
  * @protected
  * @param {Number} coordinate - The coordinate in pixel.
  * @param {String} direction - The direction to check for the closest item. Ether `left` or `right`.
  * @return {Number} - The absolute position of the closest item.
  */
	Owl.prototype.closest = function (coordinate, direction) {
		var position = -1,
		    pull = 30,
		    width = this.width(),
		    coordinates = this.coordinates();

		if (!this.settings.freeDrag) {
			// check closest item
			$.each(coordinates, $.proxy(function (index, value) {
				// on a left pull, check on current index
				if (direction === 'left' && coordinate > value - pull && coordinate < value + pull) {
					position = index;
					// on a right pull, check on previous index
					// to do so, subtract width from value and set position = index + 1
				} else if (direction === 'right' && coordinate > value - width - pull && coordinate < value - width + pull) {
					position = index + 1;
				} else if (this.op(coordinate, '<', value) && this.op(coordinate, '>', coordinates[index + 1] || value - width)) {
					position = direction === 'left' ? index + 1 : index;
				}
				return position === -1;
			}, this));
		}

		if (!this.settings.loop) {
			// non loop boundries
			if (this.op(coordinate, '>', coordinates[this.minimum()])) {
				position = coordinate = this.minimum();
			} else if (this.op(coordinate, '<', coordinates[this.maximum()])) {
				position = coordinate = this.maximum();
			}
		}

		return position;
	};

	/**
  * Animates the stage.
  * @todo #270
  * @public
  * @param {Number} coordinate - The coordinate in pixels.
  */
	Owl.prototype.animate = function (coordinate) {
		var animate = this.speed() > 0;

		this.is('animating') && this.onTransitionEnd();

		if (animate) {
			this.enter('animating');
			this.trigger('translate');
		}

		if ($.support.transform3d && $.support.transition) {
			this.$stage.css({
				transform: 'translate3d(' + coordinate + 'px,0px,0px)',
				transition: this.speed() / 1000 + 's'
			});
		} else if (animate) {
			this.$stage.animate({
				left: coordinate + 'px'
			}, this.speed(), this.settings.fallbackEasing, $.proxy(this.onTransitionEnd, this));
		} else {
			this.$stage.css({
				left: coordinate + 'px'
			});
		}
	};

	/**
  * Checks whether the carousel is in a specific state or not.
  * @param {String} state - The state to check.
  * @returns {Boolean} - The flag which indicates if the carousel is busy.
  */
	Owl.prototype.is = function (state) {
		return this._states.current[state] && this._states.current[state] > 0;
	};

	/**
  * Sets the absolute position of the current item.
  * @public
  * @param {Number} [position] - The new absolute position or nothing to leave it unchanged.
  * @returns {Number} - The absolute position of the current item.
  */
	Owl.prototype.current = function (position) {
		if (position === undefined) {
			return this._current;
		}

		if (this._items.length === 0) {
			return undefined;
		}

		position = this.normalize(position);

		if (this._current !== position) {
			var event = this.trigger('change', { property: { name: 'position', value: position } });

			if (event.data !== undefined) {
				position = this.normalize(event.data);
			}

			this._current = position;

			this.invalidate('position');

			this.trigger('changed', { property: { name: 'position', value: this._current } });
		}

		return this._current;
	};

	/**
  * Invalidates the given part of the update routine.
  * @param {String} [part] - The part to invalidate.
  * @returns {Array.<String>} - The invalidated parts.
  */
	Owl.prototype.invalidate = function (part) {
		if ($.type(part) === 'string') {
			this._invalidated[part] = true;
			this.is('valid') && this.leave('valid');
		}
		return $.map(this._invalidated, function (v, i) {
			return i;
		});
	};

	/**
  * Resets the absolute position of the current item.
  * @public
  * @param {Number} position - The absolute position of the new item.
  */
	Owl.prototype.reset = function (position) {
		position = this.normalize(position);

		if (position === undefined) {
			return;
		}

		this._speed = 0;
		this._current = position;

		this.suppress(['translate', 'translated']);

		this.animate(this.coordinates(position));

		this.release(['translate', 'translated']);
	};

	/**
  * Normalizes an absolute or a relative position of an item.
  * @public
  * @param {Number} position - The absolute or relative position to normalize.
  * @param {Boolean} [relative=false] - Whether the given position is relative or not.
  * @returns {Number} - The normalized position.
  */
	Owl.prototype.normalize = function (position, relative) {
		var n = this._items.length,
		    m = relative ? 0 : this._clones.length;

		if (!this.isNumeric(position) || n < 1) {
			position = undefined;
		} else if (position < 0 || position >= n + m) {
			position = ((position - m / 2) % n + n) % n + m / 2;
		}

		return position;
	};

	/**
  * Converts an absolute position of an item into a relative one.
  * @public
  * @param {Number} position - The absolute position to convert.
  * @returns {Number} - The converted position.
  */
	Owl.prototype.relative = function (position) {
		position -= this._clones.length / 2;
		return this.normalize(position, true);
	};

	/**
  * Gets the maximum position for the current item.
  * @public
  * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
  * @returns {Number}
  */
	Owl.prototype.maximum = function (relative) {
		var settings = this.settings,
		    maximum = this._coordinates.length,
		    boundary = Math.abs(this._coordinates[maximum - 1]) - this._width,
		    i = -1,
		    j;

		if (settings.loop) {
			maximum = this._clones.length / 2 + this._items.length - 1;
		} else if (settings.autoWidth || settings.merge) {
			// binary search
			while (maximum - i > 1) {
				Math.abs(this._coordinates[j = maximum + i >> 1]) < boundary ? i = j : maximum = j;
			}
		} else if (settings.center) {
			maximum = this._items.length - 1;
		} else {
			maximum = this._items.length - settings.items;
		}

		if (relative) {
			maximum -= this._clones.length / 2;
		}

		return Math.max(maximum, 0);
	};

	/**
  * Gets the minimum position for the current item.
  * @public
  * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
  * @returns {Number}
  */
	Owl.prototype.minimum = function (relative) {
		return relative ? 0 : this._clones.length / 2;
	};

	/**
  * Gets an item at the specified relative position.
  * @public
  * @param {Number} [position] - The relative position of the item.
  * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
  */
	Owl.prototype.items = function (position) {
		if (position === undefined) {
			return this._items.slice();
		}

		position = this.normalize(position, true);
		return this._items[position];
	};

	/**
  * Gets an item at the specified relative position.
  * @public
  * @param {Number} [position] - The relative position of the item.
  * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
  */
	Owl.prototype.mergers = function (position) {
		if (position === undefined) {
			return this._mergers.slice();
		}

		position = this.normalize(position, true);
		return this._mergers[position];
	};

	/**
  * Gets the absolute positions of clones for an item.
  * @public
  * @param {Number} [position] - The relative position of the item.
  * @returns {Array.<Number>} - The absolute positions of clones for the item or all if no position was given.
  */
	Owl.prototype.clones = function (position) {
		var odd = this._clones.length / 2,
		    even = odd + this._items.length,
		    map = function (index) {
			return index % 2 === 0 ? even + index / 2 : odd - (index + 1) / 2;
		};

		if (position === undefined) {
			return $.map(this._clones, function (v, i) {
				return map(i);
			});
		}

		return $.map(this._clones, function (v, i) {
			return v === position ? map(i) : null;
		});
	};

	/**
  * Sets the current animation speed.
  * @public
  * @param {Number} [speed] - The animation speed in milliseconds or nothing to leave it unchanged.
  * @returns {Number} - The current animation speed in milliseconds.
  */
	Owl.prototype.speed = function (speed) {
		if (speed !== undefined) {
			this._speed = speed;
		}

		return this._speed;
	};

	/**
  * Gets the coordinate of an item.
  * @todo The name of this method is missleanding.
  * @public
  * @param {Number} position - The absolute position of the item within `minimum()` and `maximum()`.
  * @returns {Number|Array.<Number>} - The coordinate of the item in pixel or all coordinates.
  */
	Owl.prototype.coordinates = function (position) {
		var multiplier = 1,
		    newPosition = position - 1,
		    coordinate;

		if (position === undefined) {
			return $.map(this._coordinates, $.proxy(function (coordinate, index) {
				return this.coordinates(index);
			}, this));
		}

		if (this.settings.center) {
			if (this.settings.rtl) {
				multiplier = -1;
				newPosition = position + 1;
			}

			coordinate = this._coordinates[position];
			coordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier;
		} else {
			coordinate = this._coordinates[newPosition] || 0;
		}

		coordinate = Math.ceil(coordinate);

		return coordinate;
	};

	/**
  * Calculates the speed for a translation.
  * @protected
  * @param {Number} from - The absolute position of the start item.
  * @param {Number} to - The absolute position of the target item.
  * @param {Number} [factor=undefined] - The time factor in milliseconds.
  * @returns {Number} - The time in milliseconds for the translation.
  */
	Owl.prototype.duration = function (from, to, factor) {
		if (factor === 0) {
			return 0;
		}

		return Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs(factor || this.settings.smartSpeed);
	};

	/**
  * Slides to the specified item.
  * @public
  * @param {Number} position - The position of the item.
  * @param {Number} [speed] - The time in milliseconds for the transition.
  */
	Owl.prototype.to = function (position, speed) {
		var current = this.current(),
		    revert = null,
		    distance = position - this.relative(current),
		    direction = (distance > 0) - (distance < 0),
		    items = this._items.length,
		    minimum = this.minimum(),
		    maximum = this.maximum();

		if (this.settings.loop) {
			if (!this.settings.rewind && Math.abs(distance) > items / 2) {
				distance += direction * -1 * items;
			}

			position = current + distance;
			revert = ((position - minimum) % items + items) % items + minimum;

			if (revert !== position && revert - distance <= maximum && revert - distance > 0) {
				current = revert - distance;
				position = revert;
				this.reset(current);
			}
		} else if (this.settings.rewind) {
			maximum += 1;
			position = (position % maximum + maximum) % maximum;
		} else {
			position = Math.max(minimum, Math.min(maximum, position));
		}

		this.speed(this.duration(current, position, speed));
		this.current(position);

		if (this.$element.is(':visible')) {
			this.update();
		}
	};

	/**
  * Slides to the next item.
  * @public
  * @param {Number} [speed] - The time in milliseconds for the transition.
  */
	Owl.prototype.next = function (speed) {
		speed = speed || false;
		this.to(this.relative(this.current()) + 1, speed);
	};

	/**
  * Slides to the previous item.
  * @public
  * @param {Number} [speed] - The time in milliseconds for the transition.
  */
	Owl.prototype.prev = function (speed) {
		speed = speed || false;
		this.to(this.relative(this.current()) - 1, speed);
	};

	/**
  * Handles the end of an animation.
  * @protected
  * @param {Event} event - The event arguments.
  */
	Owl.prototype.onTransitionEnd = function (event) {

		// if css2 animation then event object is undefined
		if (event !== undefined) {
			event.stopPropagation();

			// Catch only owl-stage transitionEnd event
			if ((event.target || event.srcElement || event.originalTarget) !== this.$stage.get(0)) {
				return false;
			}
		}

		this.leave('animating');
		this.trigger('translated');
	};

	/**
  * Gets viewport width.
  * @protected
  * @return {Number} - The width in pixel.
  */
	Owl.prototype.viewport = function () {
		var width;
		if (this.options.responsiveBaseElement !== window) {
			width = $(this.options.responsiveBaseElement).width();
		} else if (window.innerWidth) {
			width = window.innerWidth;
		} else if (document.documentElement && document.documentElement.clientWidth) {
			width = document.documentElement.clientWidth;
		} else {
			throw 'Can not detect viewport width.';
		}
		return width;
	};

	/**
  * Replaces the current content.
  * @public
  * @param {HTMLElement|jQuery|String} content - The new content.
  */
	Owl.prototype.replace = function (content) {
		this.$stage.empty();
		this._items = [];

		if (content) {
			content = content instanceof jQuery ? content : $(content);
		}

		if (this.settings.nestedItemSelector) {
			content = content.find('.' + this.settings.nestedItemSelector);
		}

		content.filter(function () {
			return this.nodeType === 1;
		}).each($.proxy(function (index, item) {
			item = this.prepare(item);
			this.$stage.append(item);
			this._items.push(item);
			this._mergers.push(item.find('[data-merge]').andSelf('[data-merge]').attr('data-merge') * 1 || 1);
		}, this));

		this.reset(this.isNumeric(this.settings.startPosition) ? this.settings.startPosition : 0);

		this.invalidate('items');
	};

	/**
  * Adds an item.
  * @todo Use `item` instead of `content` for the event arguments.
  * @public
  * @param {HTMLElement|jQuery|String} content - The item content to add.
  * @param {Number} [position] - The relative position at which to insert the item otherwise the item will be added to the end.
  */
	Owl.prototype.add = function (content, position) {
		var current = this.relative(this._current);

		position = position === undefined ? this._items.length : this.normalize(position, true);
		content = content instanceof jQuery ? content : $(content);

		this.trigger('add', { content: content, position: position });

		content = this.prepare(content);

		if (this._items.length === 0 || position === this._items.length) {
			this._items.length === 0 && this.$stage.append(content);
			this._items.length !== 0 && this._items[position - 1].after(content);
			this._items.push(content);
			this._mergers.push(content.find('[data-merge]').andSelf('[data-merge]').attr('data-merge') * 1 || 1);
		} else {
			this._items[position].before(content);
			this._items.splice(position, 0, content);
			this._mergers.splice(position, 0, content.find('[data-merge]').andSelf('[data-merge]').attr('data-merge') * 1 || 1);
		}

		this._items[current] && this.reset(this._items[current].index());

		this.invalidate('items');

		this.trigger('added', { content: content, position: position });
	};

	/**
  * Removes an item by its position.
  * @todo Use `item` instead of `content` for the event arguments.
  * @public
  * @param {Number} position - The relative position of the item to remove.
  */
	Owl.prototype.remove = function (position) {
		position = this.normalize(position, true);

		if (position === undefined) {
			return;
		}

		this.trigger('remove', { content: this._items[position], position: position });

		this._items[position].remove();
		this._items.splice(position, 1);
		this._mergers.splice(position, 1);

		this.invalidate('items');

		this.trigger('removed', { content: null, position: position });
	};

	/**
  * Preloads images with auto width.
  * @todo Replace by a more generic approach
  * @protected
  */
	Owl.prototype.preloadAutoWidthImages = function (images) {
		images.each($.proxy(function (i, element) {
			this.enter('pre-loading');
			element = $(element);
			$(new Image()).one('load', $.proxy(function (e) {
				element.attr('src', e.target.src);
				element.css('opacity', 1);
				this.leave('pre-loading');
				!this.is('pre-loading') && !this.is('initializing') && this.refresh();
			}, this)).attr('src', element.attr('src') || element.attr('data-src') || element.attr('data-src-retina'));
		}, this));
	};

	/**
  * Destroys the carousel.
  * @public
  */
	Owl.prototype.destroy = function () {

		this.$element.off('.owl.core');
		this.$stage.off('.owl.core');
		$(document).off('.owl.core');

		if (this.settings.responsive !== false) {
			window.clearTimeout(this.resizeTimer);
			this.off(window, 'resize', this._handlers.onThrottledResize);
		}

		for (var i in this._plugins) {
			this._plugins[i].destroy();
		}

		this.$stage.children('.cloned').remove();

		this.$stage.unwrap();
		this.$stage.children().contents().unwrap();
		this.$stage.children().unwrap();

		this.$element.removeClass(this.options.refreshClass).removeClass(this.options.loadingClass).removeClass(this.options.loadedClass).removeClass(this.options.rtlClass).removeClass(this.options.dragClass).removeClass(this.options.grabClass).attr('class', this.$element.attr('class').replace(new RegExp(this.options.responsiveClass + '-\\S+\\s', 'g'), '')).removeData('owl.carousel');
	};

	/**
  * Operators to calculate right-to-left and left-to-right.
  * @protected
  * @param {Number} [a] - The left side operand.
  * @param {String} [o] - The operator.
  * @param {Number} [b] - The right side operand.
  */
	Owl.prototype.op = function (a, o, b) {
		var rtl = this.settings.rtl;
		switch (o) {
			case '<':
				return rtl ? a > b : a < b;
			case '>':
				return rtl ? a < b : a > b;
			case '>=':
				return rtl ? a <= b : a >= b;
			case '<=':
				return rtl ? a >= b : a <= b;
			default:
				break;
		}
	};

	/**
  * Attaches to an internal event.
  * @protected
  * @param {HTMLElement} element - The event source.
  * @param {String} event - The event name.
  * @param {Function} listener - The event handler to attach.
  * @param {Boolean} capture - Wether the event should be handled at the capturing phase or not.
  */
	Owl.prototype.on = function (element, event, listener, capture) {
		if (element.addEventListener) {
			element.addEventListener(event, listener, capture);
		} else if (element.attachEvent) {
			element.attachEvent('on' + event, listener);
		}
	};

	/**
  * Detaches from an internal event.
  * @protected
  * @param {HTMLElement} element - The event source.
  * @param {String} event - The event name.
  * @param {Function} listener - The attached event handler to detach.
  * @param {Boolean} capture - Wether the attached event handler was registered as a capturing listener or not.
  */
	Owl.prototype.off = function (element, event, listener, capture) {
		if (element.removeEventListener) {
			element.removeEventListener(event, listener, capture);
		} else if (element.detachEvent) {
			element.detachEvent('on' + event, listener);
		}
	};

	/**
  * Triggers a public event.
  * @todo Remove `status`, `relatedTarget` should be used instead.
  * @protected
  * @param {String} name - The event name.
  * @param {*} [data=null] - The event data.
  * @param {String} [namespace=carousel] - The event namespace.
  * @param {String} [state] - The state which is associated with the event.
  * @param {Boolean} [enter=false] - Indicates if the call enters the specified state or not.
  * @returns {Event} - The event arguments.
  */
	Owl.prototype.trigger = function (name, data, namespace, state, enter) {
		var status = {
			item: { count: this._items.length, index: this.current() }
		},
		    handler = $.camelCase($.grep(['on', name, namespace], function (v) {
			return v;
		}).join('-').toLowerCase()),
		    event = $.Event([name, 'owl', namespace || 'carousel'].join('.').toLowerCase(), $.extend({ relatedTarget: this }, status, data));

		if (!this._supress[name]) {
			$.each(this._plugins, function (name, plugin) {
				if (plugin.onTrigger) {
					plugin.onTrigger(event);
				}
			});

			this.register({ type: Owl.Type.Event, name: name });
			this.$element.trigger(event);

			if (this.settings && typeof this.settings[handler] === 'function') {
				this.settings[handler].call(this, event);
			}
		}

		return event;
	};

	/**
  * Enters a state.
  * @param name - The state name.
  */
	Owl.prototype.enter = function (name) {
		$.each([name].concat(this._states.tags[name] || []), $.proxy(function (i, name) {
			if (this._states.current[name] === undefined) {
				this._states.current[name] = 0;
			}

			this._states.current[name]++;
		}, this));
	};

	/**
  * Leaves a state.
  * @param name - The state name.
  */
	Owl.prototype.leave = function (name) {
		$.each([name].concat(this._states.tags[name] || []), $.proxy(function (i, name) {
			this._states.current[name]--;
		}, this));
	};

	/**
  * Registers an event or state.
  * @public
  * @param {Object} object - The event or state to register.
  */
	Owl.prototype.register = function (object) {
		if (object.type === Owl.Type.Event) {
			if (!$.event.special[object.name]) {
				$.event.special[object.name] = {};
			}

			if (!$.event.special[object.name].owl) {
				var _default = $.event.special[object.name]._default;
				$.event.special[object.name]._default = function (e) {
					if (_default && _default.apply && (!e.namespace || e.namespace.indexOf('owl') === -1)) {
						return _default.apply(this, arguments);
					}
					return e.namespace && e.namespace.indexOf('owl') > -1;
				};
				$.event.special[object.name].owl = true;
			}
		} else if (object.type === Owl.Type.State) {
			if (!this._states.tags[object.name]) {
				this._states.tags[object.name] = object.tags;
			} else {
				this._states.tags[object.name] = this._states.tags[object.name].concat(object.tags);
			}

			this._states.tags[object.name] = $.grep(this._states.tags[object.name], $.proxy(function (tag, i) {
				return $.inArray(tag, this._states.tags[object.name]) === i;
			}, this));
		}
	};

	/**
  * Suppresses events.
  * @protected
  * @param {Array.<String>} events - The events to suppress.
  */
	Owl.prototype.suppress = function (events) {
		$.each(events, $.proxy(function (index, event) {
			this._supress[event] = true;
		}, this));
	};

	/**
  * Releases suppressed events.
  * @protected
  * @param {Array.<String>} events - The events to release.
  */
	Owl.prototype.release = function (events) {
		$.each(events, $.proxy(function (index, event) {
			delete this._supress[event];
		}, this));
	};

	/**
  * Gets unified pointer coordinates from event.
  * @todo #261
  * @protected
  * @param {Event} - The `mousedown` or `touchstart` event.
  * @returns {Object} - Contains `x` and `y` coordinates of current pointer position.
  */
	Owl.prototype.pointer = function (event) {
		var result = { x: null, y: null };

		event = event.originalEvent || event || window.event;

		event = event.touches && event.touches.length ? event.touches[0] : event.changedTouches && event.changedTouches.length ? event.changedTouches[0] : event;

		if (event.pageX) {
			result.x = event.pageX;
			result.y = event.pageY;
		} else {
			result.x = event.clientX;
			result.y = event.clientY;
		}

		return result;
	};

	/**
  * Determines if the input is a Number or something that can be coerced to a Number
  * @protected
  * @param {Number|String|Object|Array|Boolean|RegExp|Function|Symbol} - The input to be tested
  * @returns {Boolean} - An indication if the input is a Number or can be coerced to a Number
  */
	Owl.prototype.isNumeric = function (number) {
		return !isNaN(parseFloat(number));
	};

	/**
  * Gets the difference of two vectors.
  * @todo #261
  * @protected
  * @param {Object} - The first vector.
  * @param {Object} - The second vector.
  * @returns {Object} - The difference.
  */
	Owl.prototype.difference = function (first, second) {
		return {
			x: first.x - second.x,
			y: first.y - second.y
		};
	};

	/**
  * The jQuery Plugin for the Owl Carousel
  * @todo Navigation plugin `next` and `prev`
  * @public
  */
	$.fn.owlCarousel = function (option) {
		var args = Array.prototype.slice.call(arguments, 1);

		return this.each(function () {
			var $this = $(this),
			    data = $this.data('owl.carousel');

			if (!data) {
				data = new Owl(this, typeof option == 'object' && option);
				$this.data('owl.carousel', data);

				$.each(['next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove'], function (i, event) {
					data.register({ type: Owl.Type.Event, name: event });
					data.$element.on(event + '.owl.carousel.core', $.proxy(function (e) {
						if (e.namespace && e.relatedTarget !== this) {
							this.suppress([event]);
							data[event].apply(this, [].slice.call(arguments, 1));
							this.release([event]);
						}
					}, data));
				});
			}

			if (typeof option == 'string' && option.charAt(0) !== '_') {
				data[option].apply(data, args);
			}
		});
	};

	/**
  * The constructor for the jQuery Plugin
  * @public
  */
	$.fn.owlCarousel.Constructor = Owl;
})(window.Zepto || window.jQuery, window, document);

/**
 * AutoRefresh Plugin
 * @version 2.1.0
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the auto refresh plugin.
  * @class The Auto Refresh Plugin
  * @param {Owl} carousel - The Owl Carousel
  */
	var AutoRefresh = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * Refresh interval.
   * @protected
   * @type {number}
   */
		this._interval = null;

		/**
   * Whether the element is currently visible or not.
   * @protected
   * @type {Boolean}
   */
		this._visible = null;

		/**
   * All event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'initialized.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.autoRefresh) {
					this.watch();
				}
			}, this)
		};

		// set default options
		this._core.options = $.extend({}, AutoRefresh.Defaults, this._core.options);

		// register event handlers
		this._core.$element.on(this._handlers);
	};

	/**
  * Default options.
  * @public
  */
	AutoRefresh.Defaults = {
		autoRefresh: true,
		autoRefreshInterval: 500
	};

	/**
  * Watches the element.
  */
	AutoRefresh.prototype.watch = function () {
		if (this._interval) {
			return;
		}

		this._visible = this._core.$element.is(':visible');
		this._interval = window.setInterval($.proxy(this.refresh, this), this._core.settings.autoRefreshInterval);
	};

	/**
  * Refreshes the element.
  */
	AutoRefresh.prototype.refresh = function () {
		if (this._core.$element.is(':visible') === this._visible) {
			return;
		}

		this._visible = !this._visible;

		this._core.$element.toggleClass('owl-hidden', !this._visible);

		this._visible && this._core.invalidate('width') && this._core.refresh();
	};

	/**
  * Destroys the plugin.
  */
	AutoRefresh.prototype.destroy = function () {
		var handler, property;

		window.clearInterval(this._interval);

		for (handler in this._handlers) {
			this._core.$element.off(handler, this._handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh;
})(window.Zepto || window.jQuery, window, document);

/**
 * Lazy Plugin
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the lazy plugin.
  * @class The Lazy Plugin
  * @param {Owl} carousel - The Owl Carousel
  */
	var Lazy = function (carousel) {

		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * Already loaded items.
   * @protected
   * @type {Array.<jQuery>}
   */
		this._loaded = [];

		/**
   * Event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'initialized.owl.carousel change.owl.carousel resized.owl.carousel': $.proxy(function (e) {
				if (!e.namespace) {
					return;
				}

				if (!this._core.settings || !this._core.settings.lazyLoad) {
					return;
				}

				if (e.property && e.property.name == 'position' || e.type == 'initialized') {
					var settings = this._core.settings,
					    n = settings.center && Math.ceil(settings.items / 2) || settings.items,
					    i = settings.center && n * -1 || 0,
					    position = (e.property && e.property.value !== undefined ? e.property.value : this._core.current()) + i,
					    clones = this._core.clones().length,
					    load = $.proxy(function (i, v) {
						this.load(v);
					}, this);

					while (i++ < n) {
						this.load(clones / 2 + this._core.relative(position));
						clones && $.each(this._core.clones(this._core.relative(position)), load);
						position++;
					}
				}
			}, this)
		};

		// set the default options
		this._core.options = $.extend({}, Lazy.Defaults, this._core.options);

		// register event handler
		this._core.$element.on(this._handlers);
	};

	/**
  * Default options.
  * @public
  */
	Lazy.Defaults = {
		lazyLoad: false
	};

	/**
  * Loads all resources of an item at the specified position.
  * @param {Number} position - The absolute position of the item.
  * @protected
  */
	Lazy.prototype.load = function (position) {
		var $item = this._core.$stage.children().eq(position),
		    $elements = $item && $item.find('.owl-lazy');

		if (!$elements || $.inArray($item.get(0), this._loaded) > -1) {
			return;
		}

		$elements.each($.proxy(function (index, element) {
			var $element = $(element),
			    image,
			    url = window.devicePixelRatio > 1 && $element.attr('data-src-retina') || $element.attr('data-src');

			this._core.trigger('load', { element: $element, url: url }, 'lazy');

			if ($element.is('img')) {
				$element.one('load.owl.lazy', $.proxy(function () {
					$element.css('opacity', 1);
					this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
				}, this)).attr('src', url);
			} else {
				image = new Image();
				image.onload = $.proxy(function () {
					$element.css({
						'background-image': 'url(' + url + ')',
						'opacity': '1'
					});
					this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
				}, this);
				image.src = url;
			}
		}, this));

		this._loaded.push($item.get(0));
	};

	/**
  * Destroys the plugin.
  * @public
  */
	Lazy.prototype.destroy = function () {
		var handler, property;

		for (handler in this.handlers) {
			this._core.$element.off(handler, this.handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.Lazy = Lazy;
})(window.Zepto || window.jQuery, window, document);

/**
 * AutoHeight Plugin
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the auto height plugin.
  * @class The Auto Height Plugin
  * @param {Owl} carousel - The Owl Carousel
  */
	var AutoHeight = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * All event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'initialized.owl.carousel refreshed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.autoHeight) {
					this.update();
				}
			}, this),
			'changed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.autoHeight && e.property.name == 'position') {
					this.update();
				}
			}, this),
			'loaded.owl.lazy': $.proxy(function (e) {
				if (e.namespace && this._core.settings.autoHeight && e.element.closest('.' + this._core.settings.itemClass).index() === this._core.current()) {
					this.update();
				}
			}, this)
		};

		// set default options
		this._core.options = $.extend({}, AutoHeight.Defaults, this._core.options);

		// register event handlers
		this._core.$element.on(this._handlers);
	};

	/**
  * Default options.
  * @public
  */
	AutoHeight.Defaults = {
		autoHeight: false,
		autoHeightClass: 'owl-height'
	};

	/**
  * Updates the view.
  */
	AutoHeight.prototype.update = function () {
		var start = this._core._current,
		    end = start + this._core.settings.items,
		    visible = this._core.$stage.children().toArray().slice(start, end),
		    heights = [],
		    maxheight = 0;

		$.each(visible, function (index, item) {
			heights.push($(item).height());
		});

		maxheight = Math.max.apply(null, heights);

		this._core.$stage.parent().height(maxheight).addClass(this._core.settings.autoHeightClass);
	};

	AutoHeight.prototype.destroy = function () {
		var handler, property;

		for (handler in this._handlers) {
			this._core.$element.off(handler, this._handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.AutoHeight = AutoHeight;
})(window.Zepto || window.jQuery, window, document);

/**
 * Video Plugin
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the video plugin.
  * @class The Video Plugin
  * @param {Owl} carousel - The Owl Carousel
  */
	var Video = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * Cache all video URLs.
   * @protected
   * @type {Object}
   */
		this._videos = {};

		/**
   * Current playing item.
   * @protected
   * @type {jQuery}
   */
		this._playing = null;

		/**
   * All event handlers.
   * @todo The cloned content removale is too late
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'initialized.owl.carousel': $.proxy(function (e) {
				if (e.namespace) {
					this._core.register({ type: 'state', name: 'playing', tags: ['interacting'] });
				}
			}, this),
			'resize.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.video && this.isInFullScreen()) {
					e.preventDefault();
				}
			}, this),
			'refreshed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.is('resizing')) {
					this._core.$stage.find('.cloned .owl-video-frame').remove();
				}
			}, this),
			'changed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && e.property.name === 'position' && this._playing) {
					this.stop();
				}
			}, this),
			'prepared.owl.carousel': $.proxy(function (e) {
				if (!e.namespace) {
					return;
				}

				var $element = $(e.content).find('.owl-video');

				if ($element.length) {
					$element.css('display', 'none');
					this.fetch($element, $(e.content));
				}
			}, this)
		};

		// set default options
		this._core.options = $.extend({}, Video.Defaults, this._core.options);

		// register event handlers
		this._core.$element.on(this._handlers);

		this._core.$element.on('click.owl.video', '.owl-video-play-icon', $.proxy(function (e) {
			this.play(e);
		}, this));
	};

	/**
  * Default options.
  * @public
  */
	Video.Defaults = {
		video: false,
		videoHeight: false,
		videoWidth: false
	};

	/**
  * Gets the video ID and the type (YouTube/Vimeo/vzaar only).
  * @protected
  * @param {jQuery} target - The target containing the video data.
  * @param {jQuery} item - The item containing the video.
  */
	Video.prototype.fetch = function (target, item) {
		var type = function () {
			if (target.attr('data-vimeo-id')) {
				return 'vimeo';
			} else if (target.attr('data-vzaar-id')) {
				return 'vzaar';
			} else {
				return 'youtube';
			}
		}(),
		    id = target.attr('data-vimeo-id') || target.attr('data-youtube-id') || target.attr('data-vzaar-id'),
		    width = target.attr('data-width') || this._core.settings.videoWidth,
		    height = target.attr('data-height') || this._core.settings.videoHeight,
		    url = target.attr('href');

		if (url) {

			/*
   		Parses the id's out of the following urls (and probably more):
   		https://www.youtube.com/watch?v=:id
   		https://youtu.be/:id
   		https://vimeo.com/:id
   		https://vimeo.com/channels/:channel/:id
   		https://vimeo.com/groups/:group/videos/:id
   		https://app.vzaar.com/videos/:id
   			Visual example: https://regexper.com/#(http%3A%7Chttps%3A%7C)%5C%2F%5C%2F(player.%7Cwww.%7Capp.)%3F(vimeo%5C.com%7Cyoutu(be%5C.com%7C%5C.be%7Cbe%5C.googleapis%5C.com)%7Cvzaar%5C.com)%5C%2F(video%5C%2F%7Cvideos%5C%2F%7Cembed%5C%2F%7Cchannels%5C%2F.%2B%5C%2F%7Cgroups%5C%2F.%2B%5C%2F%7Cwatch%5C%3Fv%3D%7Cv%5C%2F)%3F(%5BA-Za-z0-9._%25-%5D*)(%5C%26%5CS%2B)%3F
   */

			id = url.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/);

			if (id[3].indexOf('youtu') > -1) {
				type = 'youtube';
			} else if (id[3].indexOf('vimeo') > -1) {
				type = 'vimeo';
			} else if (id[3].indexOf('vzaar') > -1) {
				type = 'vzaar';
			} else {
				throw new Error('Video URL not supported.');
			}
			id = id[6];
		} else {
			throw new Error('Missing video URL.');
		}

		this._videos[url] = {
			type: type,
			id: id,
			width: width,
			height: height
		};

		item.attr('data-video', url);

		this.thumbnail(target, this._videos[url]);
	};

	/**
  * Creates video thumbnail.
  * @protected
  * @param {jQuery} target - The target containing the video data.
  * @param {Object} info - The video info object.
  * @see `fetch`
  */
	Video.prototype.thumbnail = function (target, video) {
		var tnLink,
		    icon,
		    path,
		    dimensions = video.width && video.height ? 'style="width:' + video.width + 'px;height:' + video.height + 'px;"' : '',
		    customTn = target.find('img'),
		    srcType = 'src',
		    lazyClass = '',
		    settings = this._core.settings,
		    create = function (path) {
			icon = '<div class="owl-video-play-icon"></div>';

			if (settings.lazyLoad) {
				tnLink = '<div class="owl-video-tn ' + lazyClass + '" ' + srcType + '="' + path + '"></div>';
			} else {
				tnLink = '<div class="owl-video-tn" style="opacity:1;background-image:url(' + path + ')"></div>';
			}
			target.after(tnLink);
			target.after(icon);
		};

		// wrap video content into owl-video-wrapper div
		target.wrap('<div class="owl-video-wrapper"' + dimensions + '></div>');

		if (this._core.settings.lazyLoad) {
			srcType = 'data-src';
			lazyClass = 'owl-lazy';
		}

		// custom thumbnail
		if (customTn.length) {
			create(customTn.attr(srcType));
			customTn.remove();
			return false;
		}

		if (video.type === 'youtube') {
			path = "//img.youtube.com/vi/" + video.id + "/hqdefault.jpg";
			create(path);
		} else if (video.type === 'vimeo') {
			$.ajax({
				type: 'GET',
				url: '//vimeo.com/api/v2/video/' + video.id + '.json',
				jsonp: 'callback',
				dataType: 'jsonp',
				success: function (data) {
					path = data[0].thumbnail_large;
					create(path);
				}
			});
		} else if (video.type === 'vzaar') {
			$.ajax({
				type: 'GET',
				url: '//vzaar.com/api/videos/' + video.id + '.json',
				jsonp: 'callback',
				dataType: 'jsonp',
				success: function (data) {
					path = data.framegrab_url;
					create(path);
				}
			});
		}
	};

	/**
  * Stops the current video.
  * @public
  */
	Video.prototype.stop = function () {
		this._core.trigger('stop', null, 'video');
		this._playing.find('.owl-video-frame').remove();
		this._playing.removeClass('owl-video-playing');
		this._playing = null;
		this._core.leave('playing');
		this._core.trigger('stopped', null, 'video');
	};

	/**
  * Starts the current video.
  * @public
  * @param {Event} event - The event arguments.
  */
	Video.prototype.play = function (event) {
		var target = $(event.target),
		    item = target.closest('.' + this._core.settings.itemClass),
		    video = this._videos[item.attr('data-video')],
		    width = video.width || '100%',
		    height = video.height || this._core.$stage.height(),
		    html;

		if (this._playing) {
			return;
		}

		this._core.enter('playing');
		this._core.trigger('play', null, 'video');

		item = this._core.items(this._core.relative(item.index()));

		this._core.reset(item.index());

		if (video.type === 'youtube') {
			html = '<iframe width="' + width + '" height="' + height + '" src="//www.youtube.com/embed/' + video.id + '?autoplay=1&v=' + video.id + '" frameborder="0" allowfullscreen></iframe>';
		} else if (video.type === 'vimeo') {
			html = '<iframe src="//player.vimeo.com/video/' + video.id + '?autoplay=1" width="' + width + '" height="' + height + '" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>';
		} else if (video.type === 'vzaar') {
			html = '<iframe frameborder="0"' + 'height="' + height + '"' + 'width="' + width + '" allowfullscreen mozallowfullscreen webkitAllowFullScreen ' + 'src="//view.vzaar.com/' + video.id + '/player?autoplay=true"></iframe>';
		}

		$('<div class="owl-video-frame">' + html + '</div>').insertAfter(item.find('.owl-video'));

		this._playing = item.addClass('owl-video-playing');
	};

	/**
  * Checks whether an video is currently in full screen mode or not.
  * @todo Bad style because looks like a readonly method but changes members.
  * @protected
  * @returns {Boolean}
  */
	Video.prototype.isInFullScreen = function () {
		var element = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement;

		return element && $(element).parent().hasClass('owl-video-frame');
	};

	/**
  * Destroys the plugin.
  */
	Video.prototype.destroy = function () {
		var handler, property;

		this._core.$element.off('click.owl.video');

		for (handler in this._handlers) {
			this._core.$element.off(handler, this._handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.Video = Video;
})(window.Zepto || window.jQuery, window, document);

/**
 * Animate Plugin
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the animate plugin.
  * @class The Navigation Plugin
  * @param {Owl} scope - The Owl Carousel
  */
	var Animate = function (scope) {
		this.core = scope;
		this.core.options = $.extend({}, Animate.Defaults, this.core.options);
		this.swapping = true;
		this.previous = undefined;
		this.next = undefined;

		this.handlers = {
			'change.owl.carousel': $.proxy(function (e) {
				if (e.namespace && e.property.name == 'position') {
					this.previous = this.core.current();
					this.next = e.property.value;
				}
			}, this),
			'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function (e) {
				if (e.namespace) {
					this.swapping = e.type == 'translated';
				}
			}, this),
			'translate.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) {
					this.swap();
				}
			}, this)
		};

		this.core.$element.on(this.handlers);
	};

	/**
  * Default options.
  * @public
  */
	Animate.Defaults = {
		animateOut: false,
		animateIn: false
	};

	/**
  * Toggles the animation classes whenever an translations starts.
  * @protected
  * @returns {Boolean|undefined}
  */
	Animate.prototype.swap = function () {

		if (this.core.settings.items !== 1) {
			return;
		}

		if (!$.support.animation || !$.support.transition) {
			return;
		}

		this.core.speed(0);

		var left,
		    clear = $.proxy(this.clear, this),
		    previous = this.core.$stage.children().eq(this.previous),
		    next = this.core.$stage.children().eq(this.next),
		    incoming = this.core.settings.animateIn,
		    outgoing = this.core.settings.animateOut;

		if (this.core.current() === this.previous) {
			return;
		}

		if (outgoing) {
			left = this.core.coordinates(this.previous) - this.core.coordinates(this.next);
			previous.one($.support.animation.end, clear).css({ 'left': left + 'px' }).addClass('animated owl-animated-out').addClass(outgoing);
		}

		if (incoming) {
			next.one($.support.animation.end, clear).addClass('animated owl-animated-in').addClass(incoming);
		}
	};

	Animate.prototype.clear = function (e) {
		$(e.target).css({ 'left': '' }).removeClass('animated owl-animated-out owl-animated-in').removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut);
		this.core.onTransitionEnd();
	};

	/**
  * Destroys the plugin.
  * @public
  */
	Animate.prototype.destroy = function () {
		var handler, property;

		for (handler in this.handlers) {
			this.core.$element.off(handler, this.handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.Animate = Animate;
})(window.Zepto || window.jQuery, window, document);

/**
 * Autoplay Plugin
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the autoplay plugin.
  * @class The Autoplay Plugin
  * @param {Owl} scope - The Owl Carousel
  */
	var Autoplay = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * The autoplay timeout.
   * @type {Timeout}
   */
		this._timeout = null;

		/**
   * Indicates whenever the autoplay is paused.
   * @type {Boolean}
   */
		this._paused = false;

		/**
   * All event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'changed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && e.property.name === 'settings') {
					if (this._core.settings.autoplay) {
						this.play();
					} else {
						this.stop();
					}
				} else if (e.namespace && e.property.name === 'position') {
					//console.log('play?', e);
					if (this._core.settings.autoplay) {
						this._setAutoPlayInterval();
					}
				}
			}, this),
			'initialized.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.autoplay) {
					this.play();
				}
			}, this),
			'play.owl.autoplay': $.proxy(function (e, t, s) {
				if (e.namespace) {
					this.play(t, s);
				}
			}, this),
			'stop.owl.autoplay': $.proxy(function (e) {
				if (e.namespace) {
					this.stop();
				}
			}, this),
			'mouseover.owl.autoplay': $.proxy(function () {
				if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
					this.pause();
				}
			}, this),
			'mouseleave.owl.autoplay': $.proxy(function () {
				if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
					this.play();
				}
			}, this),
			'touchstart.owl.core': $.proxy(function () {
				if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
					this.pause();
				}
			}, this),
			'touchend.owl.core': $.proxy(function () {
				if (this._core.settings.autoplayHoverPause) {
					this.play();
				}
			}, this)
		};

		// register event handlers
		this._core.$element.on(this._handlers);

		// set default options
		this._core.options = $.extend({}, Autoplay.Defaults, this._core.options);
	};

	/**
  * Default options.
  * @public
  */
	Autoplay.Defaults = {
		autoplay: false,
		autoplayTimeout: 5000,
		autoplayHoverPause: false,
		autoplaySpeed: false
	};

	/**
  * Starts the autoplay.
  * @public
  * @param {Number} [timeout] - The interval before the next animation starts.
  * @param {Number} [speed] - The animation speed for the animations.
  */
	Autoplay.prototype.play = function (timeout, speed) {
		this._paused = false;

		if (this._core.is('rotating')) {
			return;
		}

		this._core.enter('rotating');

		this._setAutoPlayInterval();
	};

	/**
  * Gets a new timeout
  * @private
  * @param {Number} [timeout] - The interval before the next animation starts.
  * @param {Number} [speed] - The animation speed for the animations.
  * @return {Timeout}
  */
	Autoplay.prototype._getNextTimeout = function (timeout, speed) {
		if (this._timeout) {
			window.clearTimeout(this._timeout);
		}
		return window.setTimeout($.proxy(function () {
			if (this._paused || this._core.is('busy') || this._core.is('interacting') || document.hidden) {
				return;
			}
			this._core.next(speed || this._core.settings.autoplaySpeed);
		}, this), timeout || this._core.settings.autoplayTimeout);
	};

	/**
  * Sets autoplay in motion.
  * @private
  */
	Autoplay.prototype._setAutoPlayInterval = function () {
		this._timeout = this._getNextTimeout();
	};

	/**
  * Stops the autoplay.
  * @public
  */
	Autoplay.prototype.stop = function () {
		if (!this._core.is('rotating')) {
			return;
		}

		window.clearTimeout(this._timeout);
		this._core.leave('rotating');
	};

	/**
  * Stops the autoplay.
  * @public
  */
	Autoplay.prototype.pause = function () {
		if (!this._core.is('rotating')) {
			return;
		}

		this._paused = true;
	};

	/**
  * Destroys the plugin.
  */
	Autoplay.prototype.destroy = function () {
		var handler, property;

		this.stop();

		for (handler in this._handlers) {
			this._core.$element.off(handler, this._handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay;
})(window.Zepto || window.jQuery, window, document);

/**
 * Navigation Plugin
 * @version 2.1.0
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {
	'use strict';

	/**
  * Creates the navigation plugin.
  * @class The Navigation Plugin
  * @param {Owl} carousel - The Owl Carousel.
  */

	var Navigation = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * Indicates whether the plugin is initialized or not.
   * @protected
   * @type {Boolean}
   */
		this._initialized = false;

		/**
   * The current paging indexes.
   * @protected
   * @type {Array}
   */
		this._pages = [];

		/**
   * All DOM elements of the user interface.
   * @protected
   * @type {Object}
   */
		this._controls = {};

		/**
   * Markup for an indicator.
   * @protected
   * @type {Array.<String>}
   */
		this._templates = [];

		/**
   * The carousel element.
   * @type {jQuery}
   */
		this.$element = this._core.$element;

		/**
   * Overridden methods of the carousel.
   * @protected
   * @type {Object}
   */
		this._overrides = {
			next: this._core.next,
			prev: this._core.prev,
			to: this._core.to
		};

		/**
   * All event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'prepared.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.dotsData) {
					this._templates.push('<div class="' + this._core.settings.dotClass + '">' + $(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '</div>');
				}
			}, this),
			'added.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.dotsData) {
					this._templates.splice(e.position, 0, this._templates.pop());
				}
			}, this),
			'remove.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.dotsData) {
					this._templates.splice(e.position, 1);
				}
			}, this),
			'changed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && e.property.name == 'position') {
					this.draw();
				}
			}, this),
			'initialized.owl.carousel': $.proxy(function (e) {
				if (e.namespace && !this._initialized) {
					this._core.trigger('initialize', null, 'navigation');
					this.initialize();
					this.update();
					this.draw();
					this._initialized = true;
					this._core.trigger('initialized', null, 'navigation');
				}
			}, this),
			'refreshed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._initialized) {
					this._core.trigger('refresh', null, 'navigation');
					this.update();
					this.draw();
					this._core.trigger('refreshed', null, 'navigation');
				}
			}, this)
		};

		// set default options
		this._core.options = $.extend({}, Navigation.Defaults, this._core.options);

		// register event handlers
		this.$element.on(this._handlers);
	};

	/**
  * Default options.
  * @public
  * @todo Rename `slideBy` to `navBy`
  */
	Navigation.Defaults = {
		nav: false,
		navText: ['prev', 'next'],
		navSpeed: false,
		navElement: 'div',
		navContainer: false,
		navContainerClass: 'owl-nav',
		navClass: ['owl-prev', 'owl-next'],
		slideBy: 1,
		dotClass: 'owl-dot',
		dotsClass: 'owl-dots',
		dots: true,
		dotsEach: false,
		dotsData: false,
		dotsSpeed: false,
		dotsContainer: false
	};

	/**
  * Initializes the layout of the plugin and extends the carousel.
  * @protected
  */
	Navigation.prototype.initialize = function () {
		var override,
		    settings = this._core.settings;

		// create DOM structure for relative navigation
		this._controls.$relative = (settings.navContainer ? $(settings.navContainer) : $('<div>').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled');

		this._controls.$previous = $('<' + settings.navElement + '>').addClass(settings.navClass[0]).html(settings.navText[0]).prependTo(this._controls.$relative).on('click', $.proxy(function (e) {
			this.prev(settings.navSpeed);
		}, this));
		this._controls.$next = $('<' + settings.navElement + '>').addClass(settings.navClass[1]).html(settings.navText[1]).appendTo(this._controls.$relative).on('click', $.proxy(function (e) {
			this.next(settings.navSpeed);
		}, this));

		// create DOM structure for absolute navigation
		if (!settings.dotsData) {
			this._templates = [$('<div>').addClass(settings.dotClass).append($('<span>')).prop('outerHTML')];
		}

		this._controls.$absolute = (settings.dotsContainer ? $(settings.dotsContainer) : $('<div>').addClass(settings.dotsClass).appendTo(this.$element)).addClass('disabled');

		this._controls.$absolute.on('click', 'div', $.proxy(function (e) {
			var index = $(e.target).parent().is(this._controls.$absolute) ? $(e.target).index() : $(e.target).parent().index();

			e.preventDefault();

			this.to(index, settings.dotsSpeed);
		}, this));

		// override public methods of the carousel
		for (override in this._overrides) {
			this._core[override] = $.proxy(this[override], this);
		}
	};

	/**
  * Destroys the plugin.
  * @protected
  */
	Navigation.prototype.destroy = function () {
		var handler, control, property, override;

		for (handler in this._handlers) {
			this.$element.off(handler, this._handlers[handler]);
		}
		for (control in this._controls) {
			this._controls[control].remove();
		}
		for (override in this.overides) {
			this._core[override] = this._overrides[override];
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	/**
  * Updates the internal state.
  * @protected
  */
	Navigation.prototype.update = function () {
		var i,
		    j,
		    k,
		    lower = this._core.clones().length / 2,
		    upper = lower + this._core.items().length,
		    maximum = this._core.maximum(true),
		    settings = this._core.settings,
		    size = settings.center || settings.autoWidth || settings.dotsData ? 1 : settings.dotsEach || settings.items;

		if (settings.slideBy !== 'page') {
			settings.slideBy = Math.min(settings.slideBy, settings.items);
		}

		if (settings.dots || settings.slideBy == 'page') {
			this._pages = [];

			for (i = lower, j = 0, k = 0; i < upper; i++) {
				if (j >= size || j === 0) {
					this._pages.push({
						start: Math.min(maximum, i - lower),
						end: i - lower + size - 1
					});
					if (Math.min(maximum, i - lower) === maximum) {
						break;
					}
					j = 0, ++k;
				}
				j += this._core.mergers(this._core.relative(i));
			}
		}
	};

	/**
  * Draws the user interface.
  * @todo The option `dotsData` wont work.
  * @protected
  */
	Navigation.prototype.draw = function () {
		var difference,
		    settings = this._core.settings,
		    disabled = this._core.items().length <= settings.items,
		    index = this._core.relative(this._core.current()),
		    loop = settings.loop || settings.rewind;

		this._controls.$relative.toggleClass('disabled', !settings.nav || disabled);

		if (settings.nav) {
			this._controls.$previous.toggleClass('disabled', !loop && index <= this._core.minimum(true));
			this._controls.$next.toggleClass('disabled', !loop && index >= this._core.maximum(true));
		}

		this._controls.$absolute.toggleClass('disabled', !settings.dots || disabled);

		if (settings.dots) {
			difference = this._pages.length - this._controls.$absolute.children().length;

			if (settings.dotsData && difference !== 0) {
				this._controls.$absolute.html(this._templates.join(''));
			} else if (difference > 0) {
				this._controls.$absolute.append(new Array(difference + 1).join(this._templates[0]));
			} else if (difference < 0) {
				this._controls.$absolute.children().slice(difference).remove();
			}

			this._controls.$absolute.find('.active').removeClass('active');
			this._controls.$absolute.children().eq($.inArray(this.current(), this._pages)).addClass('active');
		}
	};

	/**
  * Extends event data.
  * @protected
  * @param {Event} event - The event object which gets thrown.
  */
	Navigation.prototype.onTrigger = function (event) {
		var settings = this._core.settings;

		event.page = {
			index: $.inArray(this.current(), this._pages),
			count: this._pages.length,
			size: settings && (settings.center || settings.autoWidth || settings.dotsData ? 1 : settings.dotsEach || settings.items)
		};
	};

	/**
  * Gets the current page position of the carousel.
  * @protected
  * @returns {Number}
  */
	Navigation.prototype.current = function () {
		var current = this._core.relative(this._core.current());
		return $.grep(this._pages, $.proxy(function (page, index) {
			return page.start <= current && page.end >= current;
		}, this)).pop();
	};

	/**
  * Gets the current succesor/predecessor position.
  * @protected
  * @returns {Number}
  */
	Navigation.prototype.getPosition = function (successor) {
		var position,
		    length,
		    settings = this._core.settings;

		if (settings.slideBy == 'page') {
			position = $.inArray(this.current(), this._pages);
			length = this._pages.length;
			successor ? ++position : --position;
			position = this._pages[(position % length + length) % length].start;
		} else {
			position = this._core.relative(this._core.current());
			length = this._core.items().length;
			successor ? position += settings.slideBy : position -= settings.slideBy;
		}

		return position;
	};

	/**
  * Slides to the next item or page.
  * @public
  * @param {Number} [speed=false] - The time in milliseconds for the transition.
  */
	Navigation.prototype.next = function (speed) {
		$.proxy(this._overrides.to, this._core)(this.getPosition(true), speed);
	};

	/**
  * Slides to the previous item or page.
  * @public
  * @param {Number} [speed=false] - The time in milliseconds for the transition.
  */
	Navigation.prototype.prev = function (speed) {
		$.proxy(this._overrides.to, this._core)(this.getPosition(false), speed);
	};

	/**
  * Slides to the specified item or page.
  * @public
  * @param {Number} position - The position of the item or page.
  * @param {Number} [speed] - The time in milliseconds for the transition.
  * @param {Boolean} [standard=false] - Whether to use the standard behaviour or not.
  */
	Navigation.prototype.to = function (position, speed, standard) {
		var length;

		if (!standard && this._pages.length) {
			length = this._pages.length;
			$.proxy(this._overrides.to, this._core)(this._pages[(position % length + length) % length].start, speed);
		} else {
			$.proxy(this._overrides.to, this._core)(position, speed);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.Navigation = Navigation;
})(window.Zepto || window.jQuery, window, document);

/**
 * Hash Plugin
 * @version 2.1.0
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {
	'use strict';

	/**
  * Creates the hash plugin.
  * @class The Hash Plugin
  * @param {Owl} carousel - The Owl Carousel
  */

	var Hash = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * Hash index for the items.
   * @protected
   * @type {Object}
   */
		this._hashes = {};

		/**
   * The carousel element.
   * @type {jQuery}
   */
		this.$element = this._core.$element;

		/**
   * All event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'initialized.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.startPosition === 'URLHash') {
					$(window).trigger('hashchange.owl.navigation');
				}
			}, this),
			'prepared.owl.carousel': $.proxy(function (e) {
				if (e.namespace) {
					var hash = $(e.content).find('[data-hash]').addBack('[data-hash]').attr('data-hash');

					if (!hash) {
						return;
					}

					this._hashes[hash] = e.content;
				}
			}, this),
			'changed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && e.property.name === 'position') {
					var current = this._core.items(this._core.relative(this._core.current())),
					    hash = $.map(this._hashes, function (item, hash) {
						return item === current ? hash : null;
					}).join();

					if (!hash || window.location.hash.slice(1) === hash) {
						return;
					}

					window.location.hash = hash;
				}
			}, this)
		};

		// set default options
		this._core.options = $.extend({}, Hash.Defaults, this._core.options);

		// register the event handlers
		this.$element.on(this._handlers);

		// register event listener for hash navigation
		$(window).on('hashchange.owl.navigation', $.proxy(function (e) {
			var hash = window.location.hash.substring(1),
			    items = this._core.$stage.children(),
			    position = this._hashes[hash] && items.index(this._hashes[hash]);

			if (position === undefined || position === this._core.current()) {
				return;
			}

			this._core.to(this._core.relative(position), false, true);
		}, this));
	};

	/**
  * Default options.
  * @public
  */
	Hash.Defaults = {
		URLhashListener: false
	};

	/**
  * Destroys the plugin.
  * @public
  */
	Hash.prototype.destroy = function () {
		var handler, property;

		$(window).off('hashchange.owl.navigation');

		for (handler in this._handlers) {
			this._core.$element.off(handler, this._handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.Hash = Hash;
})(window.Zepto || window.jQuery, window, document);

/**
 * Support Plugin
 *
 * @version 2.1.0
 * @author Vivid Planet Software GmbH
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	var style = $('<support>').get(0).style,
	    prefixes = 'Webkit Moz O ms'.split(' '),
	    events = {
		transition: {
			end: {
				WebkitTransition: 'webkitTransitionEnd',
				MozTransition: 'transitionend',
				OTransition: 'oTransitionEnd',
				transition: 'transitionend'
			}
		},
		animation: {
			end: {
				WebkitAnimation: 'webkitAnimationEnd',
				MozAnimation: 'animationend',
				OAnimation: 'oAnimationEnd',
				animation: 'animationend'
			}
		}
	},
	    tests = {
		csstransforms: function () {
			return !!test('transform');
		},
		csstransforms3d: function () {
			return !!test('perspective');
		},
		csstransitions: function () {
			return !!test('transition');
		},
		cssanimations: function () {
			return !!test('animation');
		}
	};

	function test(property, prefixed) {
		var result = false,
		    upper = property.charAt(0).toUpperCase() + property.slice(1);

		$.each((property + ' ' + prefixes.join(upper + ' ') + upper).split(' '), function (i, property) {
			if (style[property] !== undefined) {
				result = prefixed ? property : true;
				return false;
			}
		});

		return result;
	}

	function prefixed(property) {
		return test(property, true);
	}

	if (tests.csstransitions()) {
		/* jshint -W053 */
		$.support.transition = new String(prefixed('transition'));
		$.support.transition.end = events.transition.end[$.support.transition];
	}

	if (tests.cssanimations()) {
		/* jshint -W053 */
		$.support.animation = new String(prefixed('animation'));
		$.support.animation.end = events.animation.end[$.support.animation];
	}

	if (tests.csstransforms()) {
		/* jshint -W053 */
		$.support.transform = new String(prefixed('transform'));
		$.support.transform3d = tests.csstransforms3d();
	}
})(window.Zepto || window.jQuery, window, document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/picturefill.min.js":[function(require,module,exports){
/*! picturefill - v3.0.2 - 2016-02-12
 * https://scottjehl.github.io/picturefill/
 * Copyright (c) 2016 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT
 */
!function (a) {
  var b = navigator.userAgent;a.HTMLPictureElement && /ecko/.test(b) && b.match(/rv\:(\d+)/) && RegExp.$1 < 45 && addEventListener("resize", function () {
    var b,
        c = document.createElement("source"),
        d = function (a) {
      var b,
          d,
          e = a.parentNode;"PICTURE" === e.nodeName.toUpperCase() ? (b = c.cloneNode(), e.insertBefore(b, e.firstElementChild), setTimeout(function () {
        e.removeChild(b);
      })) : (!a._pfLastSize || a.offsetWidth > a._pfLastSize) && (a._pfLastSize = a.offsetWidth, d = a.sizes, a.sizes += ",100vw", setTimeout(function () {
        a.sizes = d;
      }));
    },
        e = function () {
      var a,
          b = document.querySelectorAll("picture > img, img[srcset][sizes]");for (a = 0; a < b.length; a++) d(b[a]);
    },
        f = function () {
      clearTimeout(b), b = setTimeout(e, 99);
    },
        g = a.matchMedia && matchMedia("(orientation: landscape)"),
        h = function () {
      f(), g && g.addListener && g.addListener(f);
    };return c.srcset = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==", /^[c|i]|d$/.test(document.readyState || "") ? h() : document.addEventListener("DOMContentLoaded", h), f;
  }());
}(window), function (a, b, c) {
  "use strict";
  function d(a) {
    return " " === a || "	" === a || "\n" === a || "\f" === a || "\r" === a;
  }function e(b, c) {
    var d = new a.Image();return d.onerror = function () {
      A[b] = !1, ba();
    }, d.onload = function () {
      A[b] = 1 === d.width, ba();
    }, d.src = c, "pending";
  }function f() {
    M = !1, P = a.devicePixelRatio, N = {}, O = {}, s.DPR = P || 1, Q.width = Math.max(a.innerWidth || 0, z.clientWidth), Q.height = Math.max(a.innerHeight || 0, z.clientHeight), Q.vw = Q.width / 100, Q.vh = Q.height / 100, r = [Q.height, Q.width, P].join("-"), Q.em = s.getEmValue(), Q.rem = Q.em;
  }function g(a, b, c, d) {
    var e, f, g, h;return "saveData" === B.algorithm ? a > 2.7 ? h = c + 1 : (f = b - c, e = Math.pow(a - .6, 1.5), g = f * e, d && (g += .1 * e), h = a + g) : h = c > 1 ? Math.sqrt(a * b) : a, h > c;
  }function h(a) {
    var b,
        c = s.getSet(a),
        d = !1;"pending" !== c && (d = r, c && (b = s.setRes(c), s.applySetCandidate(b, a))), a[s.ns].evaled = d;
  }function i(a, b) {
    return a.res - b.res;
  }function j(a, b, c) {
    var d;return !c && b && (c = a[s.ns].sets, c = c && c[c.length - 1]), d = k(b, c), d && (b = s.makeUrl(b), a[s.ns].curSrc = b, a[s.ns].curCan = d, d.res || aa(d, d.set.sizes)), d;
  }function k(a, b) {
    var c, d, e;if (a && b) for (e = s.parseSet(b), a = s.makeUrl(a), c = 0; c < e.length; c++) if (a === s.makeUrl(e[c].url)) {
      d = e[c];break;
    }return d;
  }function l(a, b) {
    var c,
        d,
        e,
        f,
        g = a.getElementsByTagName("source");for (c = 0, d = g.length; d > c; c++) e = g[c], e[s.ns] = !0, f = e.getAttribute("srcset"), f && b.push({ srcset: f, media: e.getAttribute("media"), type: e.getAttribute("type"), sizes: e.getAttribute("sizes") });
  }function m(a, b) {
    function c(b) {
      var c,
          d = b.exec(a.substring(m));return d ? (c = d[0], m += c.length, c) : void 0;
    }function e() {
      var a,
          c,
          d,
          e,
          f,
          i,
          j,
          k,
          l,
          m = !1,
          o = {};for (e = 0; e < h.length; e++) f = h[e], i = f[f.length - 1], j = f.substring(0, f.length - 1), k = parseInt(j, 10), l = parseFloat(j), X.test(j) && "w" === i ? ((a || c) && (m = !0), 0 === k ? m = !0 : a = k) : Y.test(j) && "x" === i ? ((a || c || d) && (m = !0), 0 > l ? m = !0 : c = l) : X.test(j) && "h" === i ? ((d || c) && (m = !0), 0 === k ? m = !0 : d = k) : m = !0;m || (o.url = g, a && (o.w = a), c && (o.d = c), d && (o.h = d), d || c || a || (o.d = 1), 1 === o.d && (b.has1x = !0), o.set = b, n.push(o));
    }function f() {
      for (c(T), i = "", j = "in descriptor";;) {
        if (k = a.charAt(m), "in descriptor" === j) {
          if (d(k)) i && (h.push(i), i = "", j = "after descriptor");else {
            if ("," === k) return m += 1, i && h.push(i), void e();if ("(" === k) i += k, j = "in parens";else {
              if ("" === k) return i && h.push(i), void e();i += k;
            }
          }
        } else if ("in parens" === j) {
          if (")" === k) i += k, j = "in descriptor";else {
            if ("" === k) return h.push(i), void e();i += k;
          }
        } else if ("after descriptor" === j) if (d(k)) ;else {
          if ("" === k) return void e();j = "in descriptor", m -= 1;
        }m += 1;
      }
    }for (var g, h, i, j, k, l = a.length, m = 0, n = [];;) {
      if (c(U), m >= l) return n;g = c(V), h = [], "," === g.slice(-1) ? (g = g.replace(W, ""), e()) : f();
    }
  }function n(a) {
    function b(a) {
      function b() {
        f && (g.push(f), f = "");
      }function c() {
        g[0] && (h.push(g), g = []);
      }for (var e, f = "", g = [], h = [], i = 0, j = 0, k = !1;;) {
        if (e = a.charAt(j), "" === e) return b(), c(), h;if (k) {
          if ("*" === e && "/" === a[j + 1]) {
            k = !1, j += 2, b();continue;
          }j += 1;
        } else {
          if (d(e)) {
            if (a.charAt(j - 1) && d(a.charAt(j - 1)) || !f) {
              j += 1;continue;
            }if (0 === i) {
              b(), j += 1;continue;
            }e = " ";
          } else if ("(" === e) i += 1;else if (")" === e) i -= 1;else {
            if ("," === e) {
              b(), c(), j += 1;continue;
            }if ("/" === e && "*" === a.charAt(j + 1)) {
              k = !0, j += 2;continue;
            }
          }f += e, j += 1;
        }
      }
    }function c(a) {
      return k.test(a) && parseFloat(a) >= 0 ? !0 : l.test(a) ? !0 : "0" === a || "-0" === a || "+0" === a ? !0 : !1;
    }var e,
        f,
        g,
        h,
        i,
        j,
        k = /^(?:[+-]?[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?(?:ch|cm|em|ex|in|mm|pc|pt|px|rem|vh|vmin|vmax|vw)$/i,
        l = /^calc\((?:[0-9a-z \.\+\-\*\/\(\)]+)\)$/i;for (f = b(a), g = f.length, e = 0; g > e; e++) if (h = f[e], i = h[h.length - 1], c(i)) {
      if (j = i, h.pop(), 0 === h.length) return j;if (h = h.join(" "), s.matchesMedia(h)) return j;
    }return "100vw";
  }b.createElement("picture");var o,
      p,
      q,
      r,
      s = {},
      t = !1,
      u = function () {},
      v = b.createElement("img"),
      w = v.getAttribute,
      x = v.setAttribute,
      y = v.removeAttribute,
      z = b.documentElement,
      A = {},
      B = { algorithm: "" },
      C = "data-pfsrc",
      D = C + "set",
      E = navigator.userAgent,
      F = /rident/.test(E) || /ecko/.test(E) && E.match(/rv\:(\d+)/) && RegExp.$1 > 35,
      G = "currentSrc",
      H = /\s+\+?\d+(e\d+)?w/,
      I = /(\([^)]+\))?\s*(.+)/,
      J = a.picturefillCFG,
      K = "position:absolute;left:0;visibility:hidden;display:block;padding:0;border:none;font-size:1em;width:1em;overflow:hidden;clip:rect(0px, 0px, 0px, 0px)",
      L = "font-size:100%!important;",
      M = !0,
      N = {},
      O = {},
      P = a.devicePixelRatio,
      Q = { px: 1, "in": 96 },
      R = b.createElement("a"),
      S = !1,
      T = /^[ \t\n\r\u000c]+/,
      U = /^[, \t\n\r\u000c]+/,
      V = /^[^ \t\n\r\u000c]+/,
      W = /[,]+$/,
      X = /^\d+$/,
      Y = /^-?(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/,
      Z = function (a, b, c, d) {
    a.addEventListener ? a.addEventListener(b, c, d || !1) : a.attachEvent && a.attachEvent("on" + b, c);
  },
      $ = function (a) {
    var b = {};return function (c) {
      return c in b || (b[c] = a(c)), b[c];
    };
  },
      _ = function () {
    var a = /^([\d\.]+)(em|vw|px)$/,
        b = function () {
      for (var a = arguments, b = 0, c = a[0]; ++b in a;) c = c.replace(a[b], a[++b]);return c;
    },
        c = $(function (a) {
      return "return " + b((a || "").toLowerCase(), /\band\b/g, "&&", /,/g, "||", /min-([a-z-\s]+):/g, "e.$1>=", /max-([a-z-\s]+):/g, "e.$1<=", /calc([^)]+)/g, "($1)", /(\d+[\.]*[\d]*)([a-z]+)/g, "($1 * e.$2)", /^(?!(e.[a-z]|[0-9\.&=|><\+\-\*\(\)\/])).*/gi, "") + ";";
    });return function (b, d) {
      var e;if (!(b in N)) if (N[b] = !1, d && (e = b.match(a))) N[b] = e[1] * Q[e[2]];else try {
        N[b] = new Function("e", c(b))(Q);
      } catch (f) {}return N[b];
    };
  }(),
      aa = function (a, b) {
    return a.w ? (a.cWidth = s.calcListLength(b || "100vw"), a.res = a.w / a.cWidth) : a.res = a.d, a;
  },
      ba = function (a) {
    if (t) {
      var c,
          d,
          e,
          f = a || {};if (f.elements && 1 === f.elements.nodeType && ("IMG" === f.elements.nodeName.toUpperCase() ? f.elements = [f.elements] : (f.context = f.elements, f.elements = null)), c = f.elements || s.qsa(f.context || b, f.reevaluate || f.reselect ? s.sel : s.selShort), e = c.length) {
        for (s.setupRun(f), S = !0, d = 0; e > d; d++) s.fillImg(c[d], f);s.teardownRun(f);
      }
    }
  };o = a.console && console.warn ? function (a) {
    console.warn(a);
  } : u, G in v || (G = "src"), A["image/jpeg"] = !0, A["image/gif"] = !0, A["image/png"] = !0, A["image/svg+xml"] = b.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1"), s.ns = ("pf" + new Date().getTime()).substr(0, 9), s.supSrcset = "srcset" in v, s.supSizes = "sizes" in v, s.supPicture = !!a.HTMLPictureElement, s.supSrcset && s.supPicture && !s.supSizes && !function (a) {
    v.srcset = "data:,a", a.src = "data:,a", s.supSrcset = v.complete === a.complete, s.supPicture = s.supSrcset && s.supPicture;
  }(b.createElement("img")), s.supSrcset && !s.supSizes ? !function () {
    var a = "data:image/gif;base64,R0lGODlhAgABAPAAAP///wAAACH5BAAAAAAALAAAAAACAAEAAAICBAoAOw==",
        c = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",
        d = b.createElement("img"),
        e = function () {
      var a = d.width;2 === a && (s.supSizes = !0), q = s.supSrcset && !s.supSizes, t = !0, setTimeout(ba);
    };d.onload = e, d.onerror = e, d.setAttribute("sizes", "9px"), d.srcset = c + " 1w," + a + " 9w", d.src = c;
  }() : t = !0, s.selShort = "picture>img,img[srcset]", s.sel = s.selShort, s.cfg = B, s.DPR = P || 1, s.u = Q, s.types = A, s.setSize = u, s.makeUrl = $(function (a) {
    return R.href = a, R.href;
  }), s.qsa = function (a, b) {
    return "querySelector" in a ? a.querySelectorAll(b) : [];
  }, s.matchesMedia = function () {
    return a.matchMedia && (matchMedia("(min-width: 0.1em)") || {}).matches ? s.matchesMedia = function (a) {
      return !a || matchMedia(a).matches;
    } : s.matchesMedia = s.mMQ, s.matchesMedia.apply(this, arguments);
  }, s.mMQ = function (a) {
    return a ? _(a) : !0;
  }, s.calcLength = function (a) {
    var b = _(a, !0) || !1;return 0 > b && (b = !1), b;
  }, s.supportsType = function (a) {
    return a ? A[a] : !0;
  }, s.parseSize = $(function (a) {
    var b = (a || "").match(I);return { media: b && b[1], length: b && b[2] };
  }), s.parseSet = function (a) {
    return a.cands || (a.cands = m(a.srcset, a)), a.cands;
  }, s.getEmValue = function () {
    var a;if (!p && (a = b.body)) {
      var c = b.createElement("div"),
          d = z.style.cssText,
          e = a.style.cssText;c.style.cssText = K, z.style.cssText = L, a.style.cssText = L, a.appendChild(c), p = c.offsetWidth, a.removeChild(c), p = parseFloat(p, 10), z.style.cssText = d, a.style.cssText = e;
    }return p || 16;
  }, s.calcListLength = function (a) {
    if (!(a in O) || B.uT) {
      var b = s.calcLength(n(a));O[a] = b ? b : Q.width;
    }return O[a];
  }, s.setRes = function (a) {
    var b;if (a) {
      b = s.parseSet(a);for (var c = 0, d = b.length; d > c; c++) aa(b[c], a.sizes);
    }return b;
  }, s.setRes.res = aa, s.applySetCandidate = function (a, b) {
    if (a.length) {
      var c,
          d,
          e,
          f,
          h,
          k,
          l,
          m,
          n,
          o = b[s.ns],
          p = s.DPR;if (k = o.curSrc || b[G], l = o.curCan || j(b, k, a[0].set), l && l.set === a[0].set && (n = F && !b.complete && l.res - .1 > p, n || (l.cached = !0, l.res >= p && (h = l))), !h) for (a.sort(i), f = a.length, h = a[f - 1], d = 0; f > d; d++) if (c = a[d], c.res >= p) {
        e = d - 1, h = a[e] && (n || k !== s.makeUrl(c.url)) && g(a[e].res, c.res, p, a[e].cached) ? a[e] : c;break;
      }h && (m = s.makeUrl(h.url), o.curSrc = m, o.curCan = h, m !== k && s.setSrc(b, h), s.setSize(b));
    }
  }, s.setSrc = function (a, b) {
    var c;a.src = b.url, "image/svg+xml" === b.set.type && (c = a.style.width, a.style.width = a.offsetWidth + 1 + "px", a.offsetWidth + 1 && (a.style.width = c));
  }, s.getSet = function (a) {
    var b,
        c,
        d,
        e = !1,
        f = a[s.ns].sets;for (b = 0; b < f.length && !e; b++) if (c = f[b], c.srcset && s.matchesMedia(c.media) && (d = s.supportsType(c.type))) {
      "pending" === d && (c = d), e = c;break;
    }return e;
  }, s.parseSets = function (a, b, d) {
    var e,
        f,
        g,
        h,
        i = b && "PICTURE" === b.nodeName.toUpperCase(),
        j = a[s.ns];(j.src === c || d.src) && (j.src = w.call(a, "src"), j.src ? x.call(a, C, j.src) : y.call(a, C)), (j.srcset === c || d.srcset || !s.supSrcset || a.srcset) && (e = w.call(a, "srcset"), j.srcset = e, h = !0), j.sets = [], i && (j.pic = !0, l(b, j.sets)), j.srcset ? (f = { srcset: j.srcset, sizes: w.call(a, "sizes") }, j.sets.push(f), g = (q || j.src) && H.test(j.srcset || ""), g || !j.src || k(j.src, f) || f.has1x || (f.srcset += ", " + j.src, f.cands.push({ url: j.src, d: 1, set: f }))) : j.src && j.sets.push({ srcset: j.src, sizes: null }), j.curCan = null, j.curSrc = c, j.supported = !(i || f && !s.supSrcset || g && !s.supSizes), h && s.supSrcset && !j.supported && (e ? (x.call(a, D, e), a.srcset = "") : y.call(a, D)), j.supported && !j.srcset && (!j.src && a.src || a.src !== s.makeUrl(j.src)) && (null === j.src ? a.removeAttribute("src") : a.src = j.src), j.parsed = !0;
  }, s.fillImg = function (a, b) {
    var c,
        d = b.reselect || b.reevaluate;a[s.ns] || (a[s.ns] = {}), c = a[s.ns], (d || c.evaled !== r) && ((!c.parsed || b.reevaluate) && s.parseSets(a, a.parentNode, b), c.supported ? c.evaled = r : h(a));
  }, s.setupRun = function () {
    (!S || M || P !== a.devicePixelRatio) && f();
  }, s.supPicture ? (ba = u, s.fillImg = u) : !function () {
    var c,
        d = a.attachEvent ? /d$|^c/ : /d$|^c|^i/,
        e = function () {
      var a = b.readyState || "";f = setTimeout(e, "loading" === a ? 200 : 999), b.body && (s.fillImgs(), c = c || d.test(a), c && clearTimeout(f));
    },
        f = setTimeout(e, b.body ? 9 : 99),
        g = function (a, b) {
      var c,
          d,
          e = function () {
        var f = new Date() - d;b > f ? c = setTimeout(e, b - f) : (c = null, a());
      };return function () {
        d = new Date(), c || (c = setTimeout(e, b));
      };
    },
        h = z.clientHeight,
        i = function () {
      M = Math.max(a.innerWidth || 0, z.clientWidth) !== Q.width || z.clientHeight !== h, h = z.clientHeight, M && s.fillImgs();
    };Z(a, "resize", g(i, 99)), Z(b, "readystatechange", e);
  }(), s.picturefill = ba, s.fillImgs = ba, s.teardownRun = u, ba._ = s, a.picturefillCFG = { pf: s, push: function (a) {
      var b = a.shift();"function" == typeof s[b] ? s[b].apply(s, a) : (B[b] = a[0], S && s.fillImgs({ reselect: !0 }));
    } };for (; J && J.length;) a.picturefillCFG.push(J.shift());a.picturefill = ba, "object" == typeof module && "object" == typeof module.exports ? module.exports = ba : "function" == typeof define && define.amd && define("picturefill", function () {
    return ba;
  }), s.supPicture || (A["image/webp"] = e("image/webp", "data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAABBxAR/Q9ERP8DAABWUDggGAAAADABAJ0BKgEAAQADADQlpAADcAD++/1QAA=="));
}(window, document);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/accordion.min.js":[function(require,module,exports){
/*! UIkit 2.25.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  var i;window.UIkit && (i = t(UIkit)), "function" == typeof define && define.amd && define("uikit-accordion", ["uikit"], function () {
    return i || t(UIkit);
  });
}(function (t) {
  "use strict";
  function i(i) {
    var o = t.$(i),
        e = "auto";if (o.is(":visible")) e = o.outerHeight();else {
      var a = { position: o.css("position"), visibility: o.css("visibility"), display: o.css("display") };e = o.css({ position: "absolute", visibility: "hidden", display: "block" }).outerHeight(), o.css(a);
    }return e;
  }return t.component("accordion", { defaults: { showfirst: !0, collapse: !0, animate: !0, easing: "swing", duration: 300, toggle: ".uk-accordion-title", containers: ".uk-accordion-content", clsactive: "uk-active" }, boot: function () {
      t.ready(function (i) {
        setTimeout(function () {
          t.$("[data-uk-accordion]", i).each(function () {
            var i = t.$(this);i.data("accordion") || t.accordion(i, t.Utils.options(i.attr("data-uk-accordion")));
          });
        }, 0);
      });
    }, init: function () {
      var i = this;this.element.on("click.uk.accordion", this.options.toggle, function (o) {
        o.preventDefault(), i.toggleItem(t.$(this).data("wrapper"), i.options.animate, i.options.collapse);
      }), this.update(), this.options.showfirst && this.toggleItem(this.toggle.eq(0).data("wrapper"), !1, !1);
    }, toggleItem: function (o, e, a) {
      var n = this;o.data("toggle").toggleClass(this.options.clsactive), o.data("content").toggleClass(this.options.clsactive);var s = o.data("toggle").hasClass(this.options.clsactive);a && (this.toggle.not(o.data("toggle")).removeClass(this.options.clsactive), this.content.not(o.data("content")).removeClass(this.options.clsactive).parent().stop().css("overflow", "hidden").animate({ height: 0 }, { easing: this.options.easing, duration: e ? this.options.duration : 0 }).attr("aria-expanded", "false")), o.stop().css("overflow", "hidden"), e ? o.animate({ height: s ? i(o.data("content")) : 0 }, { easing: this.options.easing, duration: this.options.duration, complete: function () {
          s && (o.css({ overflow: "", height: "auto" }), t.Utils.checkDisplay(o.data("content"))), n.trigger("display.uk.check");
        } }) : (o.height(s ? "auto" : 0), s && (o.css({ overflow: "" }), t.Utils.checkDisplay(o.data("content"))), this.trigger("display.uk.check")), o.attr("aria-expanded", s), this.element.trigger("toggle.uk.accordion", [s, o.data("toggle"), o.data("content")]);
    }, update: function () {
      var i,
          o,
          e,
          a = this;this.toggle = this.find(this.options.toggle), this.content = this.find(this.options.containers), this.content.each(function (n) {
        i = t.$(this), i.parent().data("wrapper") ? o = i.parent() : (o = t.$(this).wrap('<div data-wrapper="true" style="overflow:hidden;height:0;position:relative;"></div>').parent(), o.attr("aria-expanded", "false")), e = a.toggle.eq(n), o.data("toggle", e), o.data("content", i), e.data("wrapper", o), i.data("wrapper", o);
      }), this.element.trigger("update.uk.accordion", [this]);
    } }), t.accordion;
});

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/lightbox.min.js":[function(require,module,exports){
/*! UIkit 2.27.4 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (i) {
  var t;window.UIkit2 && (t = i(UIkit2)), "function" == typeof define && define.amd && define("uikit-lightbox", ["uikit"], function () {
    return t || i(UIkit2);
  });
}(function (i) {
  "use strict";
  function t(t) {
    if (e) return e.lightbox = t, e;e = i.$(['<div class="uk-modal">', '<div class="uk-modal-dialog uk-modal-dialog-lightbox uk-slidenav-position" style="margin-left:auto;margin-right:auto;width:200px;height:200px;top:' + Math.abs(window.innerHeight / 2 - 200) + 'px;">', '<a href="#" class="uk-modal-close uk-close uk-close-alt"></a>', '<div class="uk-lightbox-content"></div>', '<div class="uk-modal-spinner uk-hidden"></div>', "</div>", "</div>"].join("")).appendTo("body"), e.dialog = e.find(".uk-modal-dialog:first"), e.content = e.find(".uk-lightbox-content:first"), e.loader = e.find(".uk-modal-spinner:first"), e.closer = e.find(".uk-close.uk-close-alt"), e.modal = i.modal(e, { modal: !1 }), e.on("swipeRight swipeLeft", function (i) {
      e.lightbox["swipeLeft" == i.type ? "next" : "previous"]();
    }).on("click", "[data-lightbox-previous], [data-lightbox-next]", function (t) {
      t.preventDefault(), e.lightbox[i.$(this).is("[data-lightbox-next]") ? "next" : "previous"]();
    }), e.on("hide.uk.modal", function () {
      e.content.html("");
    });var o = { w: window.innerWidth, h: window.innerHeight };return i.$win.on("load resize orientationchange", i.Utils.debounce(function () {
      o.w !== window.innerWidth && e.is(":visible") && !i.Utils.isFullscreen() && e.lightbox.fitSize(), o = { w: window.innerWidth, h: window.innerHeight };
    }, 100)), e.lightbox = t, e;
  }var e,
      o = {};return i.component("lightbox", { defaults: { allowfullscreen: !0, duration: 400, group: !1, keyboard: !0 }, index: 0, items: !1, boot: function () {
      i.$html.on("click", "[data-uk-lightbox]", function (t) {
        t.preventDefault();var e = i.$(this);e.data("lightbox") || i.lightbox(e, i.Utils.options(e.attr("data-uk-lightbox"))), e.data("lightbox").show(e);
      }), i.$doc.on("keyup", function (i) {
        if (e && e.is(":visible") && e.lightbox.options.keyboard) switch (i.preventDefault(), i.keyCode) {case 37:
            e.lightbox.previous();break;case 39:
            e.lightbox.next();}
      });
    }, init: function () {
      var t = [];if (this.index = 0, this.siblings = [], this.element && this.element.length) {
        var e = this.options.group ? i.$('[data-uk-lightbox*="' + this.options.group + '"]') : this.element;e.each(function () {
          var e = i.$(this);t.push({ source: e.attr("href"), title: e.attr("data-title") || e.attr("title"), type: e.attr("data-lightbox-type") || "auto", link: e });
        }), this.index = e.index(this.element), this.siblings = t;
      } else this.options.group && this.options.group.length && (this.siblings = this.options.group);this.trigger("lightbox-init", [this]);
    }, show: function (e) {
      this.modal = t(this), this.modal.dialog.stop(), this.modal.content.stop();var o,
          n,
          s = this,
          h = i.$.Deferred();e = e || 0, "object" == typeof e && this.siblings.forEach(function (i, t) {
        e[0] === i.link[0] && (e = t);
      }), 0 > e ? e = this.siblings.length - e : this.siblings[e] || (e = 0), n = this.siblings[e], o = { lightbox: s, source: n.source, type: n.type, index: e, promise: h, title: n.title, item: n, meta: { content: "", width: null, height: null } }, this.index = e, this.modal.content.empty(), this.modal.is(":visible") || (this.modal.content.css({ width: "", height: "" }).empty(), this.modal.modal.show()), this.modal.loader.removeClass("uk-hidden"), h.promise().done(function () {
        s.data = o, s.fitSize(o);
      }).fail(function () {
        o.meta.content = '<div class="uk-position-cover uk-flex uk-flex-middle uk-flex-center"><strong>Loading resource failed!</strong></div>', o.meta.width = 400, o.meta.height = 300, s.data = o, s.fitSize(o);
      }), s.trigger("showitem.uk.lightbox", [o]);
    }, fitSize: function () {
      var t = this,
          e = this.data,
          o = this.modal.dialog.outerWidth() - this.modal.dialog.width(),
          n = parseInt(this.modal.dialog.css("margin-top"), 10),
          s = parseInt(this.modal.dialog.css("margin-bottom"), 10),
          h = n + s,
          a = e.meta.content,
          l = t.options.duration;this.siblings.length > 1 && (a = [a, '<a href="#" class="uk-slidenav uk-slidenav-contrast uk-slidenav-previous uk-hidden-touch" data-lightbox-previous></a>', '<a href="#" class="uk-slidenav uk-slidenav-contrast uk-slidenav-next uk-hidden-touch" data-lightbox-next></a>'].join(""));var d,
          r,
          u = i.$("<div>&nbsp;</div>").css({ opacity: 0, position: "absolute", top: 0, left: 0, width: "100%", maxWidth: t.modal.dialog.css("max-width"), padding: t.modal.dialog.css("padding"), margin: t.modal.dialog.css("margin") }),
          c = e.meta.width,
          g = e.meta.height;u.appendTo("body").width(), d = u.width(), r = window.innerHeight - h, u.remove(), this.modal.dialog.find(".uk-modal-caption").remove(), e.title && (this.modal.dialog.append('<div class="uk-modal-caption">' + e.title + "</div>"), r -= this.modal.dialog.find(".uk-modal-caption").outerHeight()), d < e.meta.width && (g = Math.floor(g * (d / c)), c = d), g > r && (g = Math.floor(r), c = Math.ceil(e.meta.width * (r / e.meta.height))), this.modal.content.css("opacity", 0).width(c).html(a), "iframe" == e.type && this.modal.content.find("iframe:first").height(g);var m = g + o,
          p = Math.floor(window.innerHeight / 2 - m / 2) - h;0 > p && (p = 0), this.modal.closer.addClass("uk-hidden"), t.modal.data("mwidth") == c && t.modal.data("mheight") == g && (l = 0), this.modal.dialog.animate({ width: c + o, height: g + o, top: p }, l, "swing", function () {
        t.modal.loader.addClass("uk-hidden"), t.modal.content.css({ width: "" }).animate({ opacity: 1 }, function () {
          t.modal.closer.removeClass("uk-hidden");
        }), t.modal.data({ mwidth: c, mheight: g });
      });
    }, next: function () {
      this.show(this.siblings[this.index + 1] ? this.index + 1 : 0);
    }, previous: function () {
      this.show(this.siblings[this.index - 1] ? this.index - 1 : this.siblings.length - 1);
    } }), i.plugin("lightbox", "image", { init: function (i) {
      i.on("showitem.uk.lightbox", function (i, t) {
        if ("image" == t.type || t.source && t.source.match(/\.(jpg|jpeg|png|gif|svg)$/i)) {
          var e = function (i, e, o) {
            t.meta = { content: '<img class="uk-responsive-width" width="' + e + '" height="' + o + '" src ="' + i + '">', width: e, height: o }, t.type = "image", t.promise.resolve();
          };if (o[t.source]) e(t.source, o[t.source].width, o[t.source].height);else {
            var n = new Image();n.onerror = function () {
              t.promise.reject("Loading image failed");
            }, n.onload = function () {
              o[t.source] = { width: n.width, height: n.height }, e(t.source, o[t.source].width, o[t.source].height);
            }, n.src = t.source;
          }
        }
      });
    } }), i.plugin("lightbox", "youtube", { init: function (i) {
      var t = /(\/\/.*?youtube\.[a-z]+)\/watch\?v=([^&]+)&?(.*)/,
          n = /youtu\.be\/(.*)/;i.on("showitem.uk.lightbox", function (i, s) {
        var h,
            a,
            l = function (i, t, o) {
          s.meta = { content: '<iframe src="//www.youtube.com/embed/' + i + '" width="' + t + '" height="' + o + '" style="max-width:100%;"' + (e.lightbox.options.allowfullscreen ? " allowfullscreen" : "") + "></iframe>", width: t, height: o }, s.type = "iframe", s.promise.resolve();
        };if ((a = s.source.match(t)) && (h = a[2]), (a = s.source.match(n)) && (h = a[1]), h) {
          if (o[h]) l(h, o[h].width, o[h].height);else {
            var d = new Image(),
                r = !1;d.onerror = function () {
              o[h] = { width: 640, height: 320 }, l(h, o[h].width, o[h].height);
            }, d.onload = function () {
              120 == d.width && 90 == d.height ? r ? (o[h] = { width: 640, height: 320 }, l(h, o[h].width, o[h].height)) : (r = !0, d.src = "//img.youtube.com/vi/" + h + "/0.jpg") : (o[h] = { width: d.width, height: d.height }, l(h, d.width, d.height));
            }, d.src = "//img.youtube.com/vi/" + h + "/maxresdefault.jpg";
          }i.stopImmediatePropagation();
        }
      });
    } }), i.plugin("lightbox", "vimeo", { init: function (t) {
      var n,
          s = /(\/\/.*?)vimeo\.[a-z]+\/([0-9]+).*?/;t.on("showitem.uk.lightbox", function (t, h) {
        var a,
            l = function (i, t, o) {
          h.meta = { content: '<iframe src="//player.vimeo.com/video/' + i + '" width="' + t + '" height="' + o + '" style="width:100%;box-sizing:border-box;"' + (e.lightbox.options.allowfullscreen ? " allowfullscreen" : "") + "></iframe>", width: t, height: o }, h.type = "iframe", h.promise.resolve();
        };(n = h.source.match(s)) && (a = n[2], o[a] ? l(a, o[a].width, o[a].height) : i.$.ajax({ type: "GET", url: "//vimeo.com/api/oembed.json?url=" + encodeURI(h.source), jsonp: "callback", dataType: "jsonp", success: function (i) {
            o[a] = { width: i.width, height: i.height }, l(a, o[a].width, o[a].height);
          } }), t.stopImmediatePropagation());
      });
    } }), i.plugin("lightbox", "video", { init: function (t) {
      t.on("showitem.uk.lightbox", function (t, e) {
        var n = function (i, t, o) {
          e.meta = { content: '<video class="uk-responsive-width" src="' + i + '" width="' + t + '" height="' + o + '" controls></video>', width: t, height: o }, e.type = "video", e.promise.resolve();
        };if ("video" == e.type || e.source.match(/\.(mp4|webm|ogv)$/i)) if (o[e.source]) n(e.source, o[e.source].width, o[e.source].height);else var s = i.$('<video style="position:fixed;visibility:hidden;top:-10000px;"></video>').attr("src", e.source).appendTo("body"),
            h = setInterval(function () {
          s[0].videoWidth && (clearInterval(h), o[e.source] = { width: s[0].videoWidth, height: s[0].videoHeight }, n(e.source, o[e.source].width, o[e.source].height), s.remove());
        }, 20);
      });
    } }), i.plugin("lightbox", "iframe", { init: function (i) {
      i.on("showitem.uk.lightbox", function (t, o) {
        var n = function (i, t, n) {
          o.meta = { content: '<iframe class="uk-responsive-width" src="' + i + '" width="' + t + '" height="' + n + '"' + (e.lightbox.options.allowfullscreen ? " allowfullscreen" : "") + "></iframe>", width: t, height: n }, o.type = "iframe", o.promise.resolve();
        };("iframe" === o.type || o.source.match(/\.(html|php)$/)) && n(o.source, i.options.width || 800, i.options.height || 600);
      });
    } }), i.lightbox.create = function (t, e) {
    if (t) {
      var o,
          n = [];return t.forEach(function (t) {
        n.push(i.$.extend({ source: "", title: "", type: "auto", link: !1 }, "string" == typeof t ? { source: t } : t));
      }), o = i.lightbox(i.$.extend({}, e, { group: n }));
    }
  }, i.lightbox;
});

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/modal.min.js":[function(require,module,exports){
/*! UIkit 2.27.4 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  "use strict";
  function i(i, e) {
    return e ? ("object" == typeof i ? (i = i instanceof jQuery ? i : t.$(i), i.parent().length && (e.persist = i, e.persist.data("modalPersistParent", i.parent()))) : i = "string" == typeof i || "number" == typeof i ? t.$("<div></div>").html(i) : t.$("<div></div>").html("UIkit2.modal Error: Unsupported data type: " + typeof i), i.appendTo(e.element.find(".uk-modal-dialog")), e) : void 0;
  }var e,
      o = !1,
      n = 0,
      s = t.$html;t.$win.on("resize orientationchange", t.Utils.debounce(function () {
    t.$(".uk-modal.uk-open").each(function () {
      return t.$(this).data("modal") && t.$(this).data("modal").resize();
    });
  }, 150)), t.component("modal", { defaults: { keyboard: !0, bgclose: !0, minScrollHeight: 150, center: !1, modal: !0 }, scrollable: !1, transition: !1, hasTransitioned: !0, init: function () {
      if (e || (e = t.$("body")), this.element.length) {
        var i = this;this.paddingdir = "padding-" + ("left" == t.langdirection ? "right" : "left"), this.dialog = this.find(".uk-modal-dialog"), this.active = !1, this.element.attr("aria-hidden", this.element.hasClass("uk-open")), this.on("click", ".uk-modal-close", function (t) {
          t.preventDefault(), i.hide();
        }).on("click", function (e) {
          var o = t.$(e.target);o[0] == i.element[0] && i.options.bgclose && i.hide();
        }), t.domObserve(this.element, function () {
          i.resize();
        });
      }
    }, toggle: function () {
      return this[this.isActive() ? "hide" : "show"]();
    }, show: function () {
      if (this.element.length) {
        var i = this;if (!this.isActive()) return this.options.modal && o && o.hide(!0), this.element.removeClass("uk-open").show(), this.resize(!0), this.options.modal && (o = this), this.active = !0, n++, t.support.transition ? (this.hasTransitioned = !1, this.element.one(t.support.transition.end, function () {
          i.hasTransitioned = !0, t.Utils.focus(i.dialog, "a[href]");
        }).addClass("uk-open")) : (this.element.addClass("uk-open"), t.Utils.focus(this.dialog, "a[href]")), s.addClass("uk-modal-page").height(), this.element.attr("aria-hidden", "false"), this.element.trigger("show.uk.modal"), t.Utils.checkDisplay(this.dialog, !0), this;
      }
    }, hide: function (i) {
      if (!i && t.support.transition && this.hasTransitioned) {
        var e = this;this.one(t.support.transition.end, function () {
          e._hide();
        }).removeClass("uk-open");
      } else this._hide();return this;
    }, resize: function (t) {
      if (this.isActive() || t) {
        var i = e.width();if (this.scrollbarwidth = window.innerWidth - i, e.css(this.paddingdir, this.scrollbarwidth), this.element.css("overflow-y", this.scrollbarwidth ? "scroll" : "auto"), !this.updateScrollable() && this.options.center) {
          var o = this.dialog.outerHeight(),
              n = parseInt(this.dialog.css("margin-top"), 10) + parseInt(this.dialog.css("margin-bottom"), 10);o + n < window.innerHeight ? this.dialog.css({ top: window.innerHeight / 2 - o / 2 - n }) : this.dialog.css({ top: "" });
        }
      }
    }, updateScrollable: function () {
      var t = this.dialog.find(".uk-overflow-container:visible:first");if (t.length) {
        t.css("height", 0);var i = Math.abs(parseInt(this.dialog.css("margin-top"), 10)),
            e = this.dialog.outerHeight(),
            o = window.innerHeight,
            n = o - 2 * (20 > i ? 20 : i) - e;return t.css({ maxHeight: n < this.options.minScrollHeight ? "" : n, height: "" }), !0;
      }return !1;
    }, _hide: function () {
      this.active = !1, n > 0 ? n-- : n = 0, this.element.hide().removeClass("uk-open"), this.element.attr("aria-hidden", "true"), n || (s.removeClass("uk-modal-page"), e.css(this.paddingdir, "")), o === this && (o = !1), this.trigger("hide.uk.modal");
    }, isActive: function () {
      return this.element.hasClass("uk-open");
    } }), t.component("modalTrigger", { boot: function () {
      t.$html.on("click.modal.uikit", "[data-uk-modal]", function (i) {
        var e = t.$(this);if (e.is("a") && i.preventDefault(), !e.data("modalTrigger")) {
          var o = t.modalTrigger(e, t.Utils.options(e.attr("data-uk-modal")));o.show();
        }
      }), t.$html.on("keydown.modal.uikit", function (t) {
        o && 27 === t.keyCode && o.options.keyboard && (t.preventDefault(), o.hide());
      });
    }, init: function () {
      var i = this;this.options = t.$.extend({ target: i.element.is("a") ? i.element.attr("href") : !1 }, this.options), this.modal = t.modal(this.options.target, this.options), this.on("click", function (t) {
        t.preventDefault(), i.show();
      }), this.proxy(this.modal, "show hide isActive");
    } }), t.modal.dialog = function (e, o) {
    var n = t.modal(t.$(t.modal.dialog.template).appendTo("body"), o);return n.on("hide.uk.modal", function () {
      n.persist && (n.persist.appendTo(n.persist.data("modalPersistParent")), n.persist = !1), n.element.remove();
    }), i(e, n), n;
  }, t.modal.dialog.template = '<div class="uk-modal"><div class="uk-modal-dialog" style="min-height:0;"></div></div>', t.modal.alert = function (i, e) {
    e = t.$.extend(!0, { bgclose: !1, keyboard: !1, modal: !1, labels: t.modal.labels }, e);var o = t.modal.dialog(['<div class="uk-margin uk-modal-content">' + String(i) + "</div>", '<div class="uk-modal-footer uk-text-right"><button class="uk-button uk-button-primary uk-modal-close">' + e.labels.Ok + "</button></div>"].join(""), e);return o.on("show.uk.modal", function () {
      setTimeout(function () {
        o.element.find("button:first").focus();
      }, 50);
    }), o.show();
  }, t.modal.confirm = function (i, e, o) {
    var n = arguments.length > 1 && arguments[arguments.length - 1] ? arguments[arguments.length - 1] : {};e = t.$.isFunction(e) ? e : function () {}, o = t.$.isFunction(o) ? o : function () {}, n = t.$.extend(!0, { bgclose: !1, keyboard: !1, modal: !1, labels: t.modal.labels }, t.$.isFunction(n) ? {} : n);var s = t.modal.dialog(['<div class="uk-margin uk-modal-content">' + String(i) + "</div>", '<div class="uk-modal-footer uk-text-right"><button class="uk-button js-modal-confirm-cancel">' + n.labels.Cancel + '</button> <button class="uk-button uk-button-primary js-modal-confirm">' + n.labels.Ok + "</button></div>"].join(""), n);return s.element.find(".js-modal-confirm, .js-modal-confirm-cancel").on("click", function () {
      t.$(this).is(".js-modal-confirm") ? e() : o(), s.hide();
    }), s.on("show.uk.modal", function () {
      setTimeout(function () {
        s.element.find(".js-modal-confirm").focus();
      }, 50);
    }), s.show();
  }, t.modal.prompt = function (i, e, o, n) {
    o = t.$.isFunction(o) ? o : function () {}, n = t.$.extend(!0, { bgclose: !1, keyboard: !1, modal: !1, labels: t.modal.labels }, n);var s = t.modal.dialog([i ? '<div class="uk-modal-content uk-form">' + String(i) + "</div>" : "", '<div class="uk-margin-small-top uk-modal-content uk-form"><p><input type="text" class="uk-width-1-1"></p></div>', '<div class="uk-modal-footer uk-text-right"><button class="uk-button uk-modal-close">' + n.labels.Cancel + '</button> <button class="uk-button uk-button-primary js-modal-ok">' + n.labels.Ok + "</button></div>"].join(""), n),
        a = s.element.find("input[type='text']").val(e || "").on("keyup", function (t) {
      13 == t.keyCode && s.element.find(".js-modal-ok").trigger("click");
    });return s.element.find(".js-modal-ok").on("click", function () {
      o(a.val()) !== !1 && s.hide();
    }), s.show();
  }, t.modal.blockUI = function (i, e) {
    var o = t.modal.dialog(['<div class="uk-margin uk-modal-content">' + String(i || '<div class="uk-text-center">...</div>') + "</div>"].join(""), t.$.extend({ bgclose: !1, keyboard: !1, modal: !1 }, e));return o.content = o.element.find(".uk-modal-content:first"), o.show();
  }, t.modal.labels = { Ok: "Ok", Cancel: "Cancel" };
}(UIkit2);

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slider.min.js":[function(require,module,exports){
/*! UIkit 2.25.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  var e;window.UIkit && (e = t(UIkit)), "function" == typeof define && define.amd && define("uikit-slider", ["uikit"], function () {
    return e || t(UIkit);
  });
}(function (t) {
  "use strict";
  var e,
      i,
      s,
      n,
      a = {};return t.component("slider", { defaults: { center: !1, threshold: 10, infinite: !0, autoplay: !1, autoplayInterval: 7e3, pauseOnHover: !0, activecls: "uk-active" }, boot: function () {
      t.ready(function (e) {
        setTimeout(function () {
          t.$("[data-uk-slider]", e).each(function () {
            var e = t.$(this);e.data("slider") || t.slider(e, t.Utils.options(e.attr("data-uk-slider")));
          });
        }, 0);
      });
    }, init: function () {
      var o = this;this.container = this.element.find(".uk-slider"), this.focus = 0, t.$win.on("resize load", t.Utils.debounce(function () {
        o.resize(!0);
      }, 100)), this.on("click.uk.slider", "[data-uk-slider-item]", function (e) {
        e.preventDefault();var i = t.$(this).attr("data-uk-slider-item");if (o.focus != i) switch (o.stop(), i) {case "next":case "previous":
            o["next" == i ? "next" : "previous"]();break;default:
            o.updateFocus(parseInt(i, 10));}
      }), this.container.on({ "touchstart mousedown": function (h) {
          h.originalEvent && h.originalEvent.touches && (h = h.originalEvent.touches[0]), h.button && 2 == h.button || !o.active || (o.stop(), s = t.$(h.target).is("a") ? t.$(h.target) : t.$(h.target).parents("a:first"), n = !1, s.length && s.one("click", function (t) {
            n && t.preventDefault();
          }), i = function (t) {
            n = !0, e = o, a = { touchx: parseInt(t.pageX, 10), dir: 1, focus: o.focus, base: o.options.center ? "center" : "area" }, t.originalEvent && t.originalEvent.touches && (t = t.originalEvent.touches[0]), e.element.data({ "pointer-start": { x: parseInt(t.pageX, 10), y: parseInt(t.pageY, 10) }, "pointer-pos-start": o.pos }), o.container.addClass("uk-drag"), i = !1;
          }, i.x = parseInt(h.pageX, 10), i.threshold = o.options.threshold);
        }, mouseenter: function () {
          o.options.pauseOnHover && (o.hovering = !0);
        }, mouseleave: function () {
          o.hovering = !1;
        } }), this.resize(!0), this.on("display.uk.check", function () {
        o.element.is(":visible") && o.resize(!0);
      }), this.element.find("a,img").attr("draggable", "false"), this.options.autoplay && this.start();
    }, resize: function (e) {
      var i,
          s,
          n,
          a,
          o = this,
          h = 0,
          r = 0;return this.items = this.container.children().filter(":visible"), this.vp = this.element[0].getBoundingClientRect().width, this.container.css({ "min-width": "", "min-height": "" }), this.items.each(function (e) {
        i = t.$(this), a = i.css({ left: "", width: "" })[0].getBoundingClientRect(), s = a.width, n = i.width(), r = Math.max(r, a.height), i.css({ left: h, width: s }).data({ idx: e, left: h, width: s, cwidth: n, area: h + s, center: h - (o.vp / 2 - n / 2) }), h += s;
      }), this.container.css({ "min-width": h, "min-height": r }), this.options.infinite && (h <= 2 * this.vp || this.items.length < 5) && !this.itemsResized ? (this.container.children().each(function (t) {
        o.container.append(o.items.eq(t).clone(!0).attr("id", ""));
      }).each(function (t) {
        o.container.append(o.items.eq(t).clone(!0).attr("id", ""));
      }), this.itemsResized = !0, this.resize()) : (this.cw = h, this.pos = 0, this.active = h >= this.vp, this.container.css({ "-ms-transform": "", "-webkit-transform": "", transform: "" }), e && this.updateFocus(this.focus), void 0);
    }, updatePos: function (t) {
      this.pos = t, this.container.css({ "-ms-transform": "translateX(" + t + "px)", "-webkit-transform": "translateX(" + t + "px)", transform: "translateX(" + t + "px)" });
    }, updateFocus: function (e, i) {
      if (this.active) {
        i = i || (e > this.focus ? 1 : -1);var s,
            n,
            a = this.items.eq(e);if (this.options.infinite && this.infinite(e, i), this.options.center) this.updatePos(-1 * a.data("center")), this.items.filter("." + this.options.activecls).removeClass(this.options.activecls), a.addClass(this.options.activecls);else if (this.options.infinite) this.updatePos(-1 * a.data("left"));else {
          for (s = 0, n = e; n < this.items.length; n++) s += this.items.eq(n).data("width");if (s > this.vp) this.updatePos(-1 * a.data("left"));else if (1 == i) {
            for (s = 0, n = this.items.length - 1; n >= 0; n--) {
              if (s += this.items.eq(n).data("width"), s == this.vp) {
                e = n;break;
              }if (s > this.vp) {
                e = n < this.items.length - 1 ? n + 1 : n;break;
              }
            }s > this.vp ? this.updatePos(-1 * (this.container.width() - this.vp)) : this.updatePos(-1 * this.items.eq(e).data("left"));
          }
        }var o = this.items.eq(e).data("left");this.items.removeClass("uk-slide-before uk-slide-after").each(function (i) {
          i !== e && t.$(this).addClass(t.$(this).data("left") < o ? "uk-slide-before" : "uk-slide-after");
        }), this.focus = e, this.trigger("focusitem.uk.slider", [e, this.items.eq(e), this]);
      }
    }, next: function () {
      var t = this.items[this.focus + 1] ? this.focus + 1 : this.options.infinite ? 0 : this.focus;this.updateFocus(t, 1);
    }, previous: function () {
      var t = this.items[this.focus - 1] ? this.focus - 1 : this.options.infinite ? this.items[this.focus - 1] ? this.items - 1 : this.items.length - 1 : this.focus;this.updateFocus(t, -1);
    }, start: function () {
      this.stop();var t = this;this.interval = setInterval(function () {
        t.hovering || t.next();
      }, this.options.autoplayInterval);
    }, stop: function () {
      this.interval && clearInterval(this.interval);
    }, infinite: function (t, e) {
      var i,
          s = this,
          n = this.items.eq(t),
          a = t,
          o = [],
          h = 0;if (1 == e) {
        for (i = 0; i < this.items.length && (a != t && (h += this.items.eq(a).data("width"), o.push(this.items.eq(a))), !(h > this.vp)); i++) a = a + 1 == this.items.length ? 0 : a + 1;o.length && o.forEach(function (t) {
          var e = n.data("area");t.css({ left: e }).data({ left: e, area: e + t.data("width"), center: e - (s.vp / 2 - t.data("cwidth") / 2) }), n = t;
        });
      } else {
        for (i = this.items.length - 1; i > -1 && (h += this.items.eq(a).data("width"), a != t && o.push(this.items.eq(a)), !(h > this.vp)); i--) a = a - 1 == -1 ? this.items.length - 1 : a - 1;o.length && o.forEach(function (t) {
          var e = n.data("left") - t.data("width");t.css({ left: e }).data({ left: e, area: e + t.data("width"), center: e - (s.vp / 2 - t.data("cwidth") / 2) }), n = t;
        });
      }
    } }), t.$doc.on("mousemove.uk.slider touchmove.uk.slider", function (t) {
    if (t.originalEvent && t.originalEvent.touches && (t = t.originalEvent.touches[0]), i && Math.abs(t.pageX - i.x) > i.threshold && (window.getSelection().toString() ? e = i = !1 : i(t)), e) {
      var s, n, o, h, r, c, f, u, d, l;if (t.clientX || t.clientY ? s = t.clientX : (t.pageX || t.pageY) && (s = t.pageX - document.body.scrollLeft - document.documentElement.scrollLeft), r = a.focus, n = s - e.element.data("pointer-start").x, o = e.element.data("pointer-pos-start") + n, h = s > e.element.data("pointer-start").x ? -1 : 1, c = e.items.eq(a.focus), 1 == h) for (f = c.data("left") + Math.abs(n), u = 0, d = a.focus; u < e.items.length; u++) {
        if (l = e.items.eq(d), d != a.focus && l.data("left") < f && l.data("area") > f) {
          r = d;break;
        }d = d + 1 == e.items.length ? 0 : d + 1;
      } else for (f = c.data("left") - Math.abs(n), u = 0, d = a.focus; u < e.items.length; u++) {
        if (l = e.items.eq(d), d != a.focus && l.data("area") <= c.data("left") && l.data("center") < f) {
          r = d;break;
        }d = d - 1 == -1 ? e.items.length - 1 : d - 1;
      }e.options.infinite && r != a._focus && e.infinite(r, h), e.updatePos(o), a.dir = h, a._focus = r, a.touchx = parseInt(t.pageX, 10), a.diff = f;
    }
  }), t.$doc.on("mouseup.uk.slider touchend.uk.slider", function () {
    if (e) {
      e.container.removeClass("uk-drag"), e.items.eq(a.focus);var t,
          s,
          n,
          o = !1;if (1 == a.dir) for (s = 0, n = a.focus; s < e.items.length; s++) {
        if (t = e.items.eq(n), n != a.focus && t.data("left") > a.diff) {
          o = n;break;
        }n = n + 1 == e.items.length ? 0 : n + 1;
      } else for (s = 0, n = a.focus; s < e.items.length; s++) {
        if (t = e.items.eq(n), n != a.focus && t.data("left") < a.diff) {
          o = n;break;
        }n = n - 1 == -1 ? e.items.length - 1 : n - 1;
      }e.updateFocus(o !== !1 ? o : a._focus);
    }e = i = !1;
  }), t.slider;
});

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slideset.min.js":[function(require,module,exports){
/*! UIkit 2.25.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  var i;window.UIkit && (i = t(UIkit)), "function" == typeof define && define.amd && define("uikit-slideset", ["uikit"], function () {
    return i || t(UIkit);
  });
}(function (t) {
  "use strict";
  function i(i, e, s, n) {
    var a,
        o,
        r,
        l,
        h = t.$.Deferred(),
        u = this.options.delay === !1 ? Math.floor(this.options.duration / 2) : this.options.delay,
        d = this;if (n = n || 1, this.element.css("min-height", this.element.height()), s[0] === e[0]) return h.resolve(), h.promise();if ("object" == typeof i ? (a = i[0], o = i[1] || i[0]) : (a = i, o = a), r = function () {
      if (e && e.length && e.hide().removeClass(o + " uk-animation-reverse").css({ opacity: "", "animation-delay": "", animation: "" }), !s.length) return h.resolve(), void 0;for (l = 0; l < s.length; l++) s.eq(1 == n ? l : s.length - l - 1).css("animation-delay", l * u + "ms");var i = function () {
        s.removeClass("" + a).css({ opacity: "", display: "", "animation-delay": "", animation: "" }), h.resolve(), d.element.css("min-height", ""), i = !1;
      };s.addClass(a)[1 == n ? "last" : "first"]().one(t.support.animation.end, function () {
        i && i();
      }).end().css("display", ""), setTimeout(function () {
        i && i();
      }, s.length * u * 2);
    }, s.length && s.css("animation-duration", this.options.duration + "ms"), e && e.length) for (e.css("animation-duration", this.options.duration + "ms")[1 == n ? "last" : "first"]().one(t.support.animation.end, function () {
      r();
    }), l = 0; l < e.length; l++) !function (i, e) {
      setTimeout(function () {
        e.css("display", "none").css("display", "").css("opacity", 0).on(t.support.animation.end, function () {
          e.removeClass(o);
        }).addClass(o + " uk-animation-reverse");
      }.bind(this), l * u);
    }(l, e.eq(1 == n ? l : e.length - l - 1));else r();return h.promise();
  }function e(t, i) {
    var e,
        s = 0,
        n = -1,
        a = t.length || 0,
        o = [];if (1 > i) return null;for (; a > s;) e = s % i, e ? o[n][e] = t[s] : o[++n] = [t[s]], s++;for (s = 0, a = o.length; a > s;) o[s] = jQuery(o[s]), s++;return o;
  }var s;t.component("slideset", { defaults: { "default": 1, animation: "fade", duration: 200, filter: "", delay: !1, controls: !1, autoplay: !1, autoplayInterval: 7e3, pauseOnHover: !0 }, sets: [], boot: function () {
      t.ready(function (i) {
        t.$("[data-uk-slideset]", i).each(function () {
          var i = t.$(this);i.data("slideset") || t.slideset(i, t.Utils.options(i.attr("data-uk-slideset")));
        });
      });
    }, init: function () {
      var i = this;this.activeSet = !1, this.list = this.element.find(".uk-slideset"), this.nav = this.element.find(".uk-slideset-nav"), this.controls = this.options.controls ? t.$(this.options.controls) : this.element, t.$win.on("resize load", t.Utils.debounce(function () {
        i.updateSets();
      }, 100)), i.list.addClass("uk-grid-width-1-" + i.options.default), ["xlarge", "large", "medium", "small"].forEach(function (t) {
        i.options[t] && i.list.addClass("uk-grid-width-" + t + "-1-" + i.options[t]);
      }), this.on("click.uk.slideset", "[data-uk-slideset-item]", function (e) {
        if (e.preventDefault(), !i.animating) {
          var s = t.$(this).attr("data-uk-slideset-item");if (i.activeSet !== s) switch (s) {case "next":case "previous":
              i["next" == s ? "next" : "previous"]();break;default:
              i.show(parseInt(s, 10));}
        }
      }), this.controls.on("click.uk.slideset", "[data-uk-filter]", function (e) {
        var s = t.$(this);s.parent().hasClass("uk-slideset") || (e.preventDefault(), i.animating || i.currentFilter == s.attr("data-uk-filter") || (i.updateFilter(s.attr("data-uk-filter")), i._hide().then(function () {
          i.updateSets(!0, !0);
        })));
      }), this.on("swipeRight swipeLeft", function (t) {
        i["swipeLeft" == t.type ? "next" : "previous"]();
      }), this.updateFilter(this.options.filter), this.updateSets(), this.element.on({ mouseenter: function () {
          i.options.pauseOnHover && (i.hovering = !0);
        }, mouseleave: function () {
          i.hovering = !1;
        } }), this.options.autoplay && this.start();
    }, updateSets: function (t, i) {
      var s,
          n = this.visible;if (this.visible = this.getVisibleOnCurrenBreakpoint(), n != this.visible || i) {
        for (this.children = this.list.children().hide(), this.items = this.getItems(), this.sets = e(this.items, this.visible), s = 0; s < this.sets.length; s++) this.sets[s].css({ display: "none" });if (this.nav.length && this.nav.empty()) {
          for (s = 0; s < this.sets.length; s++) this.nav.append('<li data-uk-slideset-item="' + s + '"><a></a></li>');this.nav[1 == this.nav.children().length ? "addClass" : "removeClass"]("uk-invisible");
        }this.activeSet = !1, this.show(0, !t);
      }
    }, updateFilter: function (i) {
      var e,
          s = this;this.currentFilter = i, this.controls.find("[data-uk-filter]").each(function () {
        e = t.$(this), e.parent().hasClass("uk-slideset") || (e.attr("data-uk-filter") == s.currentFilter ? e.addClass("uk-active") : e.removeClass("uk-active"));
      });
    }, getVisibleOnCurrenBreakpoint: function () {
      var i = null,
          e = t.$('<div style="position:absolute;height:1px;top:-1000px;width:100px"><div></div></div>').appendTo("body"),
          s = e.children().eq(0),
          n = this.options;return ["xlarge", "large", "medium", "small"].forEach(function (t) {
        n[t] && !i && (e.attr("class", "uk-grid-width-" + t + "-1-2").width(), 50 == s.width() && (i = t));
      }), e.remove(), this.options[i] || this.options["default"];
    }, getItems: function () {
      var i,
          e = [];return this.currentFilter ? (i = this.currentFilter || [], "string" == typeof i && (i = i.split(/,/).map(function (t) {
        return t.trim();
      })), this.children.each(function () {
        var s = t.$(this),
            n = s.attr("data-uk-filter"),
            a = i.length ? !1 : !0;n && (n = n.split(/,/).map(function (t) {
          return t.trim();
        }), i.forEach(function (t) {
          n.indexOf(t) > -1 && (a = !0);
        })), a && e.push(s[0]);
      }), e = t.$(e)) : e = this.list.children(), e;
    }, show: function (i, e, n) {
      var a = this;if (this.activeSet !== i && !this.animating) {
        n = n || (i < this.activeSet ? -1 : 1);var o = this.sets[this.activeSet] || [],
            r = this.sets[i],
            l = this._getAnimation();(e || !t.support.animation) && (l = s.none), this.animating = !0, this.nav.length && this.nav.children().removeClass("uk-active").eq(i).addClass("uk-active"), l.apply(a, [o, r, n]).then(function () {
          t.Utils.checkDisplay(r, !0), a.children.hide().removeClass("uk-active"), r.addClass("uk-active").css({ display: "", opacity: "" }), a.animating = !1, a.activeSet = i, t.Utils.checkDisplay(r, !0), a.trigger("show.uk.slideset", [r]);
        });
      }
    }, _getAnimation: function () {
      var i = s[this.options.animation] || s.none;return t.support.animation || (i = s.none), i;
    }, _hide: function () {
      var t = this,
          i = this.sets[this.activeSet] || [],
          e = this._getAnimation();return this.animating = !0, e.apply(t, [i, [], 1]).then(function () {
        t.animating = !1;
      });
    }, next: function () {
      this.show(this.sets[this.activeSet + 1] ? this.activeSet + 1 : 0, !1, 1);
    }, previous: function () {
      this.show(this.sets[this.activeSet - 1] ? this.activeSet - 1 : this.sets.length - 1, !1, -1);
    }, start: function () {
      this.stop();var t = this;this.interval = setInterval(function () {
        t.hovering || t.animating || t.next();
      }, this.options.autoplayInterval);
    }, stop: function () {
      this.interval && clearInterval(this.interval);
    } }), s = { none: function () {
      var i = t.$.Deferred();return i.resolve(), i.promise();
    }, fade: function (t, e) {
      return i.apply(this, ["uk-animation-fade", t, e]);
    }, "slide-bottom": function (t, e) {
      return i.apply(this, ["uk-animation-slide-bottom", t, e]);
    }, "slide-top": function (t, e) {
      return i.apply(this, ["uk-animation-slide-top", t, e]);
    }, "slide-vertical": function (t, e, s) {
      var n = ["uk-animation-slide-top", "uk-animation-slide-bottom"];return -1 == s && n.reverse(), i.apply(this, [n, t, e]);
    }, "slide-horizontal": function (t, e, s) {
      var n = ["uk-animation-slide-right", "uk-animation-slide-left"];return -1 == s && n.reverse(), i.apply(this, [n, t, e, s]);
    }, scale: function (t, e) {
      return i.apply(this, ["uk-animation-scale-up", t, e]);
    } }, t.slideset.animations = s;
});

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slideshow.min.js":[function(require,module,exports){
/*! UIkit 2.25.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (i) {
    var t;
    window.UIkit && (t = i(UIkit)), "function" == typeof define && define.amd && define("uikit-slideshow", ["uikit"], function () {
        return t || i(UIkit);
    });
}(function (i) {
    "use strict";

    var t,
        s = 0;
    i.component("slideshow", {
        defaults: {
            animation: "fade",
            duration: 500,
            height: "auto",
            start: 0,
            autoplay: !1,
            autoplayInterval: 7e3,
            videoautoplay: !0,
            videomute: !0,
            slices: 15,
            pauseOnHover: !0,
            kenburns: !1,
            kenburnsanimations: ["uk-animation-middle-left", "uk-animation-top-right", "uk-animation-bottom-left", "uk-animation-top-center", "", "uk-animation-bottom-right"]
        }, current: !1, interval: null, hovering: !1, boot: function () {
            i.ready(function (t) {
                i.$("[data-uk-slideshow]", t).each(function () {
                    var t = i.$(this);
                    t.data("slideshow") || i.slideshow(t, i.Utils.options(t.attr("data-uk-slideshow")));
                });
            });
        }, init: function () {
            var t,
                e,
                a = this;
            this.container = this.element.hasClass("uk-slideshow") ? this.element : i.$(this.find(".uk-slideshow")), this.slides = this.container.children(), this.slidesCount = this.slides.length, this.current = this.options.start, this.animating = !1, this.triggers = this.find("[data-uk-slideshow-item]"), this.fixFullscreen = navigator.userAgent.match(/(iPad|iPhone|iPod)/g) && this.container.hasClass("uk-slideshow-fullscreen"), this.options.kenburns && (e = this.options.kenburns === !0 ? "15s" : this.options.kenburns, String(e).match(/(ms|s)$/) || (e += "ms"), "string" == typeof this.options.kenburnsanimations && (this.options.kenburnsanimations = this.options.kenburnsanimations.split(","))), this.slides.each(function (n) {
                var o = i.$(this),
                    r = o.children("img,video,iframe").eq(0);
                if (o.data("media", r), o.data("sizer", r), r.length) {
                    var d;
                    switch (r[0].nodeName) {
                        case "PICTURE":
                        case "IMG":
                            var u = i.$('<div class="uk-cover-background uk-position-cover"></div>').css({ "background-image": "url(" + r.attr("src") + ")" });
                            r.attr("width") && r.attr("height") && (d = i.$("<canvas></canvas>").attr({
                                width: r.attr("width"),
                                height: r.attr("height")
                            }), r.replaceWith(d), r = d, d = void 0), r.css({
                                width: "100%",
                                height: "auto",
                                opacity: 0
                            }), o.prepend(u).data("cover", u);
                            break;
                        case "IFRAME":
                            var h = r[0].src,
                                c = "sw-" + ++s;
                            r.attr("src", "").on("load", function () {
                                if ((n !== a.current || n == a.current && !a.options.videoautoplay) && a.pausemedia(r), a.options.videomute) {
                                    a.mutemedia(r);
                                    var i = setInterval(function (t) {
                                        return function () {
                                            a.mutemedia(r), ++t >= 4 && clearInterval(i);
                                        };
                                    }(0), 250);
                                }
                            }).data("slideshow", a).attr("data-player-id", c).attr("src", [h, h.indexOf("?") > -1 ? "&" : "?", "enablejsapi=1&api=1&player_id=" + c].join("")).addClass("uk-position-absolute"), i.support.touch || r.css("pointer-events", "none"), d = !0, i.cover && (i.cover(r), r.attr("data-uk-cover", "{}"));
                            break;
                        case "VIDEO":
                            r.addClass("uk-cover-object uk-position-absolute"), d = !0, a.options.videomute && a.mutemedia(r);
                    }
                    if (d) {
                        t = i.$("<canvas></canvas>").attr({ width: r[0].width, height: r[0].height });
                        var l = i.$('<img style="width:100%;height:auto;">').attr("src", t[0].toDataURL());
                        o.prepend(l), o.data("sizer", l);
                    }
                } else o.data("sizer", o);
                a.hasKenBurns(o) && o.data("cover").css({ "-webkit-animation-duration": e, "animation-duration": e });
            }), this.on("click.uk.slideshow", "[data-uk-slideshow-item]", function (t) {
                t.preventDefault();
                var s = i.$(this).attr("data-uk-slideshow-item");
                if (a.current != s) {
                    switch (s) {
                        case "next":
                        case "previous":
                            a["next" == s ? "next" : "previous"]();
                            break;
                        default:
                            a.show(parseInt(s, 10));
                    }
                    a.stop();
                }
            }), this.slides.attr("aria-hidden", "true").eq(this.current).addClass("uk-active").attr("aria-hidden", "false"), this.triggers.filter('[data-uk-slideshow-item="' + this.current + '"]').addClass("uk-active"), i.$win.on("resize load", i.Utils.debounce(function () {
                a.resize(), a.fixFullscreen && (a.container.css("height", window.innerHeight), a.slides.css("height", window.innerHeight));
            }, 100)), setTimeout(function () {
                a.resize();
            }, 80), this.options.autoplay && this.start(), this.options.videoautoplay && this.slides.eq(this.current).data("media") && this.playmedia(this.slides.eq(this.current).data("media")), this.options.kenburns && this.applyKenBurns(this.slides.eq(this.current)), this.container.on({
                mouseenter: function () {
                    a.options.pauseOnHover && (a.hovering = !0);
                }, mouseleave: function () {
                    a.hovering = !1;
                }
            }), this.on("swipeRight swipeLeft", function (i) {
                a["swipeLeft" == i.type ? "next" : "previous"]();
            }), this.on("display.uk.check", function () {
                a.element.is(":visible") && (a.resize(), a.fixFullscreen && (a.container.css("height", window.innerHeight), a.slides.css("height", window.innerHeight)));
            });
        }, resize: function () {
            if (!this.container.hasClass("uk-slideshow-fullscreen")) {
                var t = this.options.height;
                "auto" === this.options.height && (t = 0, this.slides.css("height", "").each(function () {
                    t = Math.max(t, i.$(this).height());
                })), this.container.css("height", t), this.slides.css("height", t);
            }
        }, show: function (s, e) {
            if (!this.animating && this.current != s) {
                this.animating = !0;
                var a = this,
                    n = this.slides.eq(this.current),
                    o = this.slides.eq(s),
                    r = e ? e : this.current < s ? 1 : -1,
                    d = n.data("media"),
                    u = t[this.options.animation] ? this.options.animation : "fade",
                    h = o.data("media"),
                    c = function () {
                    a.animating && (d && d.is("video,iframe") && a.pausemedia(d), h && h.is("video,iframe") && a.playmedia(h), o.addClass("uk-active").attr("aria-hidden", "false"), n.removeClass("uk-active").attr("aria-hidden", "true"), a.animating = !1, a.current = s, i.Utils.checkDisplay(o, '[class*="uk-animation-"]:not(.uk-cover-background.uk-position-cover)'), a.trigger("show.uk.slideshow", [o, n, a]));
                };
                a.applyKenBurns(o), i.support.animation || (u = "none"), n = i.$(n), o = i.$(o), a.trigger("beforeshow.uk.slideshow", [o, n, a]), t[u].apply(this, [n, o, r]).then(c), a.triggers.removeClass("uk-active"), a.triggers.filter('[data-uk-slideshow-item="' + s + '"]').addClass("uk-active");
            }
        }, applyKenBurns: function (i) {
            if (this.hasKenBurns(i)) {
                var t = this.options.kenburnsanimations,
                    s = this.kbindex || 0;
                i.data("cover").attr("class", "uk-cover-background uk-position-cover").width(), i.data("cover").addClass(["uk-animation-scale", "uk-animation-reverse", t[s].trim()].join(" ")), this.kbindex = t[s + 1] ? s + 1 : 0;
            }
        }, hasKenBurns: function (i) {
            return this.options.kenburns && i.data("cover");
        }, next: function () {
            this.show(this.slides[this.current + 1] ? this.current + 1 : 0, 1);
        }, previous: function () {
            this.show(this.slides[this.current - 1] ? this.current - 1 : this.slides.length - 1, -1);
        }, start: function () {
            this.stop();
            var i = this;
            this.interval = setInterval(function () {
                i.hovering || i.next();
            }, this.options.autoplayInterval);
        }, stop: function () {
            this.interval && clearInterval(this.interval);
        }, playmedia: function (i) {
            if (i && i[0]) switch (i[0].nodeName) {
                case "VIDEO":
                    this.options.videomute || (i[0].muted = !1), i[0].play();
                    break;
                case "IFRAME":
                    this.options.videomute || i[0].contentWindow.postMessage('{ "event": "command", "func": "unmute", "method":"setVolume", "value":1}', "*"), i[0].contentWindow.postMessage('{ "event": "command", "func": "playVideo", "method":"play"}', "*");
            }
        }, pausemedia: function (i) {
            switch (i[0].nodeName) {
                case "VIDEO":
                    i[0].pause();
                    break;
                case "IFRAME":
                    i[0].contentWindow.postMessage('{ "event": "command", "func": "pauseVideo", "method":"pause"}', "*");
            }
        }, mutemedia: function (i) {
            switch (i[0].nodeName) {
                case "VIDEO":
                    i[0].muted = !0;
                    break;
                case "IFRAME":
                    i[0].contentWindow.postMessage('{ "event": "command", "func": "mute", "method":"setVolume", "value":0}', "*");
            }
        }
    }), t = {
        none: function () {
            var t = i.$.Deferred();
            return t.resolve(), t.promise();
        }, scroll: function (t, s, e) {
            var a = i.$.Deferred();
            return t.css("animation-duration", this.options.duration + "ms"), s.css("animation-duration", this.options.duration + "ms"), s.css("opacity", 1).one(i.support.animation.end, function () {
                t.removeClass(-1 == e ? "uk-slideshow-scroll-backward-out" : "uk-slideshow-scroll-forward-out"), s.css("opacity", "").removeClass(-1 == e ? "uk-slideshow-scroll-backward-in" : "uk-slideshow-scroll-forward-in"), a.resolve();
            }.bind(this)), t.addClass(-1 == e ? "uk-slideshow-scroll-backward-out" : "uk-slideshow-scroll-forward-out"), s.addClass(-1 == e ? "uk-slideshow-scroll-backward-in" : "uk-slideshow-scroll-forward-in"), s.width(), a.promise();
        }, swipe: function (t, s, e) {
            var a = i.$.Deferred();
            return t.css("animation-duration", this.options.duration + "ms"), s.css("animation-duration", this.options.duration + "ms"), s.css("opacity", 1).one(i.support.animation.end, function () {
                t.removeClass(-1 === e ? "uk-slideshow-swipe-backward-out" : "uk-slideshow-swipe-forward-out"), s.css("opacity", "").removeClass(-1 === e ? "uk-slideshow-swipe-backward-in" : "uk-slideshow-swipe-forward-in"), a.resolve();
            }.bind(this)), t.addClass(-1 == e ? "uk-slideshow-swipe-backward-out" : "uk-slideshow-swipe-forward-out"), s.addClass(-1 == e ? "uk-slideshow-swipe-backward-in" : "uk-slideshow-swipe-forward-in"), s.width(), a.promise();
        }, scale: function (t, s) {
            var e = i.$.Deferred();
            return t.css("animation-duration", this.options.duration + "ms"), s.css("animation-duration", this.options.duration + "ms"), s.css("opacity", 1), t.one(i.support.animation.end, function () {
                t.removeClass("uk-slideshow-scale-out"), s.css("opacity", ""), e.resolve();
            }.bind(this)), t.addClass("uk-slideshow-scale-out"), t.width(), e.promise();
        }, fade: function (t, s) {
            var e = i.$.Deferred();
            return t.css("animation-duration", this.options.duration + "ms"), s.css("animation-duration", this.options.duration + "ms"), s.css("opacity", 1), s.data("cover") || s.data("placeholder") || s.css("opacity", 1).one(i.support.animation.end, function () {
                s.removeClass("uk-slideshow-fade-in");
            }).addClass("uk-slideshow-fade-in"), t.one(i.support.animation.end, function () {
                t.removeClass("uk-slideshow-fade-out"), s.css("opacity", ""), e.resolve();
            }.bind(this)), t.addClass("uk-slideshow-fade-out"), t.width(), e.promise();
        }
    }, i.slideshow.animations = t, window.addEventListener("message", function (t) {
        var s,
            e = t.data;
        if ("string" == typeof e) try {
            e = JSON.parse(e);
        } catch (a) {
            e = {};
        }
        t.origin && t.origin.indexOf("vimeo") > -1 && "ready" == e.event && e.player_id && (s = i.$('[data-player-id="' + e.player_id + '"]'), s.length && s.data("slideshow").mutemedia(s));
    }, !1);
});

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/sticky.min.js":[function(require,module,exports){
/*! UIkit 2.26.3 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  var i;window.UIkit && (i = t(UIkit)), "function" == typeof define && define.amd && define("uikit-sticky", ["uikit"], function () {
    return i || t(UIkit);
  });
}(function (t) {
  "use strict";
  function i() {
    var i = arguments.length ? arguments : n;if (i.length && !(e.scrollTop() < 0)) for (var o, a, r, h, p = e.scrollTop(), c = s.height(), l = e.height(), d = c - l, u = p > d ? d - p : 0, m = 0; m < i.length; m++) if (h = i[m], h.element.is(":visible") && !h.animate) {
      if (h.check()) {
        if (h.top < 0 ? o = 0 : (r = h.element.outerHeight(), o = c - r - h.top - h.options.bottom - p - u, o = 0 > o ? o + h.top : h.top), h.boundary && h.boundary.length) {
          var f = h.boundary.offset().top;a = h.boundtoparent ? c - (f + h.boundary.outerHeight()) + parseInt(h.boundary.css("padding-bottom")) : c - f, o = p + r > c - a - (h.top < 0 ? 0 : h.top) ? c - a - (p + r) : o;
        }if (h.currentTop != o) {
          if (h.element.css({ position: "fixed", top: o, width: h.getWidthFrom.length ? h.getWidthFrom.width() : h.element.width() }), !h.init && (h.element.addClass(h.options.clsinit), location.hash && p > 0 && h.options.target)) {
            var g = t.$(location.hash);g.length && setTimeout(function (t, i) {
              return function () {
                i.element.width();var e = t.offset(),
                    s = e.top + t.outerHeight(),
                    n = i.element.offset(),
                    o = i.element.outerHeight(),
                    a = n.top + o;n.top < s && e.top < a && (p = e.top - o - i.options.target, window.scrollTo(0, p));
              };
            }(g, h), 0);
          }h.element.addClass(h.options.clsactive).removeClass(h.options.clsinactive), h.element.trigger("active.uk.sticky"), h.element.css("margin", ""), h.options.animation && h.init && !t.Utils.isInView(h.wrapper) && h.element.addClass(h.options.animation), h.currentTop = o;
        }
      } else null !== h.currentTop && h.reset();h.init = !0;
    }
  }var e = t.$win,
      s = t.$doc,
      n = [],
      o = 1;return t.component("sticky", { defaults: { top: 0, bottom: 0, animation: "", clsinit: "uk-sticky-init", clsactive: "uk-active", clsinactive: "", getWidthFrom: "", showup: !1, boundary: !1, media: !1, target: !1, disabled: !1 }, boot: function () {
      t.$doc.on("scrolling.uk.document", function (t, e) {
        e && e.dir && (o = e.dir.y, i());
      }), t.$win.on("resize orientationchange", t.Utils.debounce(function () {
        if (n.length) {
          for (var t = 0; t < n.length; t++) n[t].reset(!0);i();
        }
      }, 100)), t.ready(function (e) {
        setTimeout(function () {
          t.$("[data-uk-sticky]", e).each(function () {
            var i = t.$(this);i.data("sticky") || t.sticky(i, t.Utils.options(i.attr("data-uk-sticky")));
          }), i();
        }, 0);
      });
    }, init: function () {
      var i,
          a = this.options.boundary;this.wrapper = this.element.wrap('<div class="uk-sticky-placeholder"></div>').parent(), this.computeWrapper(), this.element.css("margin", 0), a && (a === !0 || "!" === a[0] ? (a = a === !0 ? this.wrapper.parent() : this.wrapper.closest(a.substr(1)), i = !0) : "string" == typeof a && (a = t.$(a))), this.sticky = { self: this, options: this.options, element: this.element, currentTop: null, wrapper: this.wrapper, init: !1, getWidthFrom: t.$(this.options.getWidthFrom || this.wrapper), boundary: a, boundtoparent: i, top: 0, calcTop: function () {
          var i = this.options.top;if (this.options.top && "string" == typeof this.options.top) if (this.options.top.match(/^(-|)(\d+)vh$/)) i = window.innerHeight * parseInt(this.options.top, 10) / 100;else {
            var e = t.$(this.options.top).first();e.length && e.is(":visible") && (i = -1 * (e.offset().top + e.outerHeight() - this.wrapper.offset().top));
          }this.top = i;
        }, reset: function (i) {
          this.calcTop();var e = function () {
            this.element.css({ position: "", top: "", width: "", left: "", margin: "0" }), this.element.removeClass([this.options.animation, "uk-animation-reverse", this.options.clsactive].join(" ")), this.element.addClass(this.options.clsinactive), this.element.trigger("inactive.uk.sticky"), this.currentTop = null, this.animate = !1;
          }.bind(this);!i && this.options.animation && t.support.animation && !t.Utils.isInView(this.wrapper) ? (this.animate = !0, this.element.removeClass(this.options.animation).one(t.support.animation.end, function () {
            e();
          }).width(), this.element.addClass(this.options.animation + " uk-animation-reverse")) : e();
        }, check: function () {
          if (this.options.disabled) return !1;if (this.options.media) switch (typeof this.options.media) {case "number":
              if (window.innerWidth < this.options.media) return !1;break;case "string":
              if (window.matchMedia && !window.matchMedia(this.options.media).matches) return !1;}var i = e.scrollTop(),
              n = s.height(),
              a = n - window.innerHeight,
              r = i > a ? a - i : 0,
              h = this.wrapper.offset().top,
              p = h - this.top - r,
              c = i >= p;return c && this.options.showup && (1 == o && (c = !1), -1 == o && !this.element.hasClass(this.options.clsactive) && t.Utils.isInView(this.wrapper) && (c = !1)), c;
        } }, this.sticky.calcTop(), n.push(this.sticky);
    }, update: function () {
      i(this.sticky);
    }, enable: function () {
      this.options.disabled = !1, this.update();
    }, disable: function (t) {
      this.options.disabled = !0, this.sticky.reset(t);
    }, computeWrapper: function () {
      this.wrapper.css({ height: -1 == ["absolute", "fixed"].indexOf(this.element.css("position")) ? this.element.outerHeight() : "", "float": "none" != this.element.css("float") ? this.element.css("float") : "", margin: this.element.css("margin") }), "fixed" == this.element.css("position") && this.element.css({ width: this.sticky.getWidthFrom.length ? this.sticky.getWidthFrom.width() : this.element.width() });
    } }), t.sticky;
});

},{}],"/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/tooltip.min.js":[function(require,module,exports){
/*! UIkit 2.26.3 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  var i;window.UIkit && (i = t(UIkit)), "function" == typeof define && define.amd && define("uikit-tooltip", ["uikit"], function () {
    return i || t(UIkit);
  });
}(function (t) {
  "use strict";
  var i, o, e;return t.component("tooltip", { defaults: { offset: 5, pos: "top", animation: !1, delay: 0, cls: "", activeClass: "uk-active", src: function (t) {
        var i = t.attr("title");return void 0 !== i && t.data("cached-title", i).removeAttr("title"), t.data("cached-title");
      } }, tip: "", boot: function () {
      t.$html.on("mouseenter.tooltip.uikit focus.tooltip.uikit", "[data-uk-tooltip]", function () {
        var i = t.$(this);i.data("tooltip") || (t.tooltip(i, t.Utils.options(i.attr("data-uk-tooltip"))), i.trigger("mouseenter"));
      });
    }, init: function () {
      var o = this;i || (i = t.$('<div class="uk-tooltip"></div>').appendTo("body")), this.on({ focus: function () {
          o.show();
        }, blur: function () {
          o.hide();
        }, mouseenter: function () {
          o.show();
        }, mouseleave: function () {
          o.hide();
        } });
    }, show: function () {
      if (this.tip = "function" == typeof this.options.src ? this.options.src(this.element) : this.options.src, o && clearTimeout(o), e && clearTimeout(e), "string" == typeof this.tip ? this.tip.length : 0) {
        i.stop().css({ top: -2e3, visibility: "hidden" }).removeClass(this.options.activeClass).show(), i.html('<div class="uk-tooltip-inner">' + this.tip + "</div>");var s = this,
            n = t.$.extend({}, this.element.offset(), { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight }),
            l = i[0].offsetWidth,
            f = i[0].offsetHeight,
            p = "function" == typeof this.options.offset ? this.options.offset.call(this.element) : this.options.offset,
            a = "function" == typeof this.options.pos ? this.options.pos.call(this.element) : this.options.pos,
            h = a.split("-"),
            c = { display: "none", visibility: "visible", top: n.top + n.height + f, left: n.left };if ("fixed" == t.$html.css("position") || "fixed" == t.$body.css("position")) {
          var r = t.$("body").offset(),
              d = t.$("html").offset(),
              u = { top: d.top + r.top, left: d.left + r.left };n.left -= u.left, n.top -= u.top;
        }"left" != h[0] && "right" != h[0] || "right" != t.langdirection || (h[0] = "left" == h[0] ? "right" : "left");var m = { bottom: { top: n.top + n.height + p, left: n.left + n.width / 2 - l / 2 }, top: { top: n.top - f - p, left: n.left + n.width / 2 - l / 2 }, left: { top: n.top + n.height / 2 - f / 2, left: n.left - l - p }, right: { top: n.top + n.height / 2 - f / 2, left: n.left + n.width + p } };t.$.extend(c, m[h[0]]), 2 == h.length && (c.left = "left" == h[1] ? n.left : n.left + n.width - l);var v = this.checkBoundary(c.left, c.top, l, f);if (v) {
          switch (v) {case "x":
              a = 2 == h.length ? h[0] + "-" + (c.left < 0 ? "left" : "right") : c.left < 0 ? "right" : "left";break;case "y":
              a = 2 == h.length ? (c.top < 0 ? "bottom" : "top") + "-" + h[1] : c.top < 0 ? "bottom" : "top";break;case "xy":
              a = 2 == h.length ? (c.top < 0 ? "bottom" : "top") + "-" + (c.left < 0 ? "left" : "right") : c.left < 0 ? "right" : "left";}h = a.split("-"), t.$.extend(c, m[h[0]]), 2 == h.length && (c.left = "left" == h[1] ? n.left : n.left + n.width - l);
        }c.left -= t.$body.position().left, o = setTimeout(function () {
          i.css(c).attr("class", ["uk-tooltip", "uk-tooltip-" + a, s.options.cls].join(" ")), s.options.animation ? i.css({ opacity: 0, display: "block" }).addClass(s.options.activeClass).animate({ opacity: 1 }, parseInt(s.options.animation, 10) || 400) : i.show().addClass(s.options.activeClass), o = !1, e = setInterval(function () {
            s.element.is(":visible") || s.hide();
          }, 150);
        }, parseInt(this.options.delay, 10) || 0);
      }
    }, hide: function () {
      if (!this.element.is("input") || this.element[0] !== document.activeElement) if (o && clearTimeout(o), e && clearTimeout(e), i.stop(), this.options.animation) {
        var t = this;i.fadeOut(parseInt(this.options.animation, 10) || 400, function () {
          i.removeClass(t.options.activeClass);
        });
      } else i.hide().removeClass(this.options.activeClass);
    }, content: function () {
      return this.tip;
    }, checkBoundary: function (i, o, e, s) {
      var n = "";return (0 > i || i - t.$win.scrollLeft() + e > window.innerWidth) && (n += "x"), (0 > o || o - t.$win.scrollTop() + s > window.innerHeight) && (n += "y"), n;
    } }), t.tooltip;
});

},{}]},{},["/Applications/MAMP/htdocs/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/app.js"])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvZGVzYW5kcm8tbWF0Y2hlcy1zZWxlY3Rvci9tYXRjaGVzLXNlbGVjdG9yLmpzIiwibm9kZV9tb2R1bGVzL2V2LWVtaXR0ZXIvZXYtZW1pdHRlci5qcyIsIm5vZGVfbW9kdWxlcy9maXp6eS11aS11dGlscy91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9nZXQtc2l6ZS9nZXQtc2l6ZS5qcyIsIm5vZGVfbW9kdWxlcy9pbWFnZXNsb2FkZWQvaW1hZ2VzbG9hZGVkLmpzIiwibm9kZV9tb2R1bGVzL21hc29ucnktbGF5b3V0L21hc29ucnkuanMiLCJub2RlX21vZHVsZXMvb3V0bGF5ZXIvaXRlbS5qcyIsIm5vZGVfbW9kdWxlcy9vdXRsYXllci9vdXRsYXllci5qcyIsIm5vZGVfbW9kdWxlcy9zdmc0ZXZlcnlib2R5L2Rpc3Qvc3ZnNGV2ZXJ5Ym9keS5qcyIsIm5vZGVfbW9kdWxlcy91aWtpdC9kaXN0L2pzL3Vpa2l0LmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvYXBwLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy9Pd2xDb250cm9sLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy9jaGFuZ2VyLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy9jbGVhcmFibGUtaW5wdXQuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9jb21wb25lbnRzL2V2ZW50cy5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL2NvbXBvbmVudHMvZmlsdGVyLWFjY29yZGlvbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL2NvbXBvbmVudHMvZm9ybWhhbmRsZXIuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9jb21wb25lbnRzL21hc29ucnktbGF5b3V0LmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy9vbmVwYWdlci5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL2NvbXBvbmVudHMvc2hhcmVyLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy9zbGlkZXNob3cuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9jb21wb25lbnRzL3Ntb290aC1zY3JvbGwuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9jb21wb25lbnRzL3N0aWNreS1oZWFkZXIuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9jb21wb25lbnRzL3N0aWNreS1zdWJtZW51LmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy90YWJsZS5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL2NvbXBvbmVudHMvdG9nZ2xlLWRvd25sb2FkLWJ1dHRvbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL2NvbXBvbmVudHMvdmlkZW8uanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9zaGFtZS5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL3ZlbmRvci9qcXVlcnkuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy92ZW5kb3Ivb3dsLmNhcm91c2VsLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvdmVuZG9yL3BpY3R1cmVmaWxsLm1pbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL3ZlbmRvci91aWtpdC9hY2NvcmRpb24ubWluLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvdmVuZG9yL3Vpa2l0L2xpZ2h0Ym94Lm1pbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL3ZlbmRvci91aWtpdC9tb2RhbC5taW4uanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy92ZW5kb3IvdWlraXQvc2xpZGVyLm1pbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL3ZlbmRvci91aWtpdC9zbGlkZXNldC5taW4uanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy92ZW5kb3IvdWlraXQvc2xpZGVzaG93Lm1pbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL3ZlbmRvci91aWtpdC9zdGlja3kubWluLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvdmVuZG9yL3Vpa2l0L3Rvb2x0aXAubWluLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL09BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxaUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzM2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNTBIQSxPQUFPLENBQVAsR0FBVyxPQUFPLE1BQVAsR0FBZ0IsUUFBUSxpQkFBUixDQUEzQjs7QUFFQTtBQUNBLFFBQVEsZUFBUjtBQUNBLFFBQVEsT0FBUjs7QUFFQTtBQUNBLFFBQVEsMEJBQVI7QUFDQSxRQUFRLDZCQUFSO0FBQ0EsUUFBUSw4QkFBUjtBQUNBLFFBQVEsMkJBQVI7QUFDQSxRQUFRLDZCQUFSO0FBQ0EsUUFBUSw4QkFBUjtBQUNBLFFBQVEsMkJBQVI7QUFDQSxRQUFRLDRCQUFSOztBQUVBLFFBQVEsdUJBQVI7QUFDQTtBQUNBLFFBQVEsMEJBQVI7O0FBRUE7QUFDQSxRQUFRLHNCQUFSO0FBQ0EsUUFBUSx3QkFBUjtBQUNBLFFBQVEsb0JB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ckMsTUFBbUQsS0FBRyxHQUF0RCxHQUEyRCxDQUFDLElBQUUsQ0FBRixJQUFLLElBQUUsRUFBRSxJQUFGLENBQU8sU0FBUCxFQUFGLEdBQXFCLENBQXJCLEdBQXVCLE9BQU8sV0FBcEMsTUFBbUQsS0FBRyxHQUF0RCxDQUEzRCxFQUFzSCxDQUE1SDtBQUE4SCxLQUE1MEcsRUFBdEIsR0FBcTJHLEVBQUUsT0FBOTJHO0FBQXMzRyxDQUEvaUgsQ0FBRCIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qKlxuICogbWF0Y2hlc1NlbGVjdG9yIHYyLjAuMlxuICogbWF0Y2hlc1NlbGVjdG9yKCBlbGVtZW50LCAnLnNlbGVjdG9yJyApXG4gKiBNSVQgbGljZW5zZVxuICovXG5cbi8qanNoaW50IGJyb3dzZXI6IHRydWUsIHN0cmljdDogdHJ1ZSwgdW5kZWY6IHRydWUsIHVudXNlZDogdHJ1ZSAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8qZ2xvYmFsIGRlZmluZTogZmFsc2UsIG1vZHVsZTogZmFsc2UgKi9cbiAgJ3VzZSBzdHJpY3QnO1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTURcbiAgICBkZWZpbmUoIGZhY3RvcnkgKTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93Lm1hdGNoZXNTZWxlY3RvciA9IGZhY3RvcnkoKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbWF0Y2hlc01ldGhvZCA9ICggZnVuY3Rpb24oKSB7XG4gICAgdmFyIEVsZW1Qcm90byA9IHdpbmRvdy5FbGVtZW50LnByb3RvdHlwZTtcbiAgICAvLyBjaGVjayBmb3IgdGhlIHN0YW5kYXJkIG1ldGhvZCBuYW1lIGZpcnN0XG4gICAgaWYgKCBFbGVtUHJvdG8ubWF0Y2hlcyApIHtcbiAgICAgIHJldHVybiAnbWF0Y2hlcyc7XG4gICAgfVxuICAgIC8vIGNoZWNrIHVuLXByZWZpeGVkXG4gICAgaWYgKCBFbGVtUHJvdG8ubWF0Y2hlc1NlbGVjdG9yICkge1xuICAgICAgcmV0dXJuICdtYXRjaGVzU2VsZWN0b3InO1xuICAgIH1cbiAgICAvLyBjaGVjayB2ZW5kb3IgcHJlZml4ZXNcbiAgICB2YXIgcHJlZml4ZXMgPSBbICd3ZWJraXQnLCAnbW96JywgJ21zJywgJ28nIF07XG5cbiAgICBmb3IgKCB2YXIgaT0wOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICB2YXIgcHJlZml4ID0gcHJlZml4ZXNbaV07XG4gICAgICB2YXIgbWV0aG9kID0gcHJlZml4ICsgJ01hdGNoZXNTZWxlY3Rvcic7XG4gICAgICBpZiAoIEVsZW1Qcm90b1sgbWV0aG9kIF0gKSB7XG4gICAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgICB9XG4gICAgfVxuICB9KSgpO1xuXG4gIHJldHVybiBmdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3IoIGVsZW0sIHNlbGVjdG9yICkge1xuICAgIHJldHVybiBlbGVtWyBtYXRjaGVzTWV0aG9kIF0oIHNlbGVjdG9yICk7XG4gIH07XG5cbn0pKTtcbiIsIi8qKlxuICogRXZFbWl0dGVyIHYxLjEuMFxuICogTGlsJyBldmVudCBlbWl0dGVyXG4gKiBNSVQgTGljZW5zZVxuICovXG5cbi8qIGpzaGludCB1bnVzZWQ6IHRydWUsIHVuZGVmOiB0cnVlLCBzdHJpY3Q6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLyoganNoaW50IHN0cmljdDogZmFsc2UgKi8gLyogZ2xvYmFscyBkZWZpbmUsIG1vZHVsZSwgd2luZG93ICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EIC0gUmVxdWlyZUpTXG4gICAgZGVmaW5lKCBmYWN0b3J5ICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlMgLSBCcm93c2VyaWZ5LCBXZWJwYWNrXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQnJvd3NlciBnbG9iYWxzXG4gICAgZ2xvYmFsLkV2RW1pdHRlciA9IGZhY3RvcnkoKTtcbiAgfVxuXG59KCB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBFdkVtaXR0ZXIoKSB7fVxuXG52YXIgcHJvdG8gPSBFdkVtaXR0ZXIucHJvdG90eXBlO1xuXG5wcm90by5vbiA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGxpc3RlbmVyICkge1xuICBpZiAoICFldmVudE5hbWUgfHwgIWxpc3RlbmVyICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBzZXQgZXZlbnRzIGhhc2hcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgLy8gc2V0IGxpc3RlbmVycyBhcnJheVxuICB2YXIgbGlzdGVuZXJzID0gZXZlbnRzWyBldmVudE5hbWUgXSA9IGV2ZW50c1sgZXZlbnROYW1lIF0gfHwgW107XG4gIC8vIG9ubHkgYWRkIG9uY2VcbiAgaWYgKCBsaXN0ZW5lcnMuaW5kZXhPZiggbGlzdGVuZXIgKSA9PSAtMSApIHtcbiAgICBsaXN0ZW5lcnMucHVzaCggbGlzdGVuZXIgKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxucHJvdG8ub25jZSA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGxpc3RlbmVyICkge1xuICBpZiAoICFldmVudE5hbWUgfHwgIWxpc3RlbmVyICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBhZGQgZXZlbnRcbiAgdGhpcy5vbiggZXZlbnROYW1lLCBsaXN0ZW5lciApO1xuICAvLyBzZXQgb25jZSBmbGFnXG4gIC8vIHNldCBvbmNlRXZlbnRzIGhhc2hcbiAgdmFyIG9uY2VFdmVudHMgPSB0aGlzLl9vbmNlRXZlbnRzID0gdGhpcy5fb25jZUV2ZW50cyB8fCB7fTtcbiAgLy8gc2V0IG9uY2VMaXN0ZW5lcnMgb2JqZWN0XG4gIHZhciBvbmNlTGlzdGVuZXJzID0gb25jZUV2ZW50c1sgZXZlbnROYW1lIF0gPSBvbmNlRXZlbnRzWyBldmVudE5hbWUgXSB8fCB7fTtcbiAgLy8gc2V0IGZsYWdcbiAgb25jZUxpc3RlbmVyc1sgbGlzdGVuZXIgXSA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5vZmYgPSBmdW5jdGlvbiggZXZlbnROYW1lLCBsaXN0ZW5lciApIHtcbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50cyAmJiB0aGlzLl9ldmVudHNbIGV2ZW50TmFtZSBdO1xuICBpZiAoICFsaXN0ZW5lcnMgfHwgIWxpc3RlbmVycy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKCBsaXN0ZW5lciApO1xuICBpZiAoIGluZGV4ICE9IC0xICkge1xuICAgIGxpc3RlbmVycy5zcGxpY2UoIGluZGV4LCAxICk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbnByb3RvLmVtaXRFdmVudCA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGFyZ3MgKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHMgJiYgdGhpcy5fZXZlbnRzWyBldmVudE5hbWUgXTtcbiAgaWYgKCAhbGlzdGVuZXJzIHx8ICFsaXN0ZW5lcnMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBjb3B5IG92ZXIgdG8gYXZvaWQgaW50ZXJmZXJlbmNlIGlmIC5vZmYoKSBpbiBsaXN0ZW5lclxuICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoMCk7XG4gIGFyZ3MgPSBhcmdzIHx8IFtdO1xuICAvLyBvbmNlIHN0dWZmXG4gIHZhciBvbmNlTGlzdGVuZXJzID0gdGhpcy5fb25jZUV2ZW50cyAmJiB0aGlzLl9vbmNlRXZlbnRzWyBldmVudE5hbWUgXTtcblxuICBmb3IgKCB2YXIgaT0wOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXVxuICAgIHZhciBpc09uY2UgPSBvbmNlTGlzdGVuZXJzICYmIG9uY2VMaXN0ZW5lcnNbIGxpc3RlbmVyIF07XG4gICAgaWYgKCBpc09uY2UgKSB7XG4gICAgICAvLyByZW1vdmUgbGlzdGVuZXJcbiAgICAgIC8vIHJlbW92ZSBiZWZvcmUgdHJpZ2dlciB0byBwcmV2ZW50IHJlY3Vyc2lvblxuICAgICAgdGhpcy5vZmYoIGV2ZW50TmFtZSwgbGlzdGVuZXIgKTtcbiAgICAgIC8vIHVuc2V0IG9uY2UgZmxhZ1xuICAgICAgZGVsZXRlIG9uY2VMaXN0ZW5lcnNbIGxpc3RlbmVyIF07XG4gICAgfVxuICAgIC8vIHRyaWdnZXIgbGlzdGVuZXJcbiAgICBsaXN0ZW5lci5hcHBseSggdGhpcywgYXJncyApO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5hbGxPZmYgPSBmdW5jdGlvbigpIHtcbiAgZGVsZXRlIHRoaXMuX2V2ZW50cztcbiAgZGVsZXRlIHRoaXMuX29uY2VFdmVudHM7XG59O1xuXG5yZXR1cm4gRXZFbWl0dGVyO1xuXG59KSk7XG4iLCIvKipcbiAqIEZpenp5IFVJIHV0aWxzIHYyLjAuN1xuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCB1bmRlZjogdHJ1ZSwgdW51c2VkOiB0cnVlLCBzdHJpY3Q6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLypqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKmdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cblxuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJ2Rlc2FuZHJvLW1hdGNoZXMtc2VsZWN0b3IvbWF0Y2hlcy1zZWxlY3RvcidcbiAgICBdLCBmdW5jdGlvbiggbWF0Y2hlc1NlbGVjdG9yICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgbWF0Y2hlc1NlbGVjdG9yICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCdkZXNhbmRyby1tYXRjaGVzLXNlbGVjdG9yJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LmZpenp5VUlVdGlscyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cubWF0Y2hlc1NlbGVjdG9yXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgbWF0Y2hlc1NlbGVjdG9yICkge1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHt9O1xuXG4vLyAtLS0tLSBleHRlbmQgLS0tLS0gLy9cblxuLy8gZXh0ZW5kcyBvYmplY3RzXG51dGlscy5leHRlbmQgPSBmdW5jdGlvbiggYSwgYiApIHtcbiAgZm9yICggdmFyIHByb3AgaW4gYiApIHtcbiAgICBhWyBwcm9wIF0gPSBiWyBwcm9wIF07XG4gIH1cbiAgcmV0dXJuIGE7XG59O1xuXG4vLyAtLS0tLSBtb2R1bG8gLS0tLS0gLy9cblxudXRpbHMubW9kdWxvID0gZnVuY3Rpb24oIG51bSwgZGl2ICkge1xuICByZXR1cm4gKCAoIG51bSAlIGRpdiApICsgZGl2ICkgJSBkaXY7XG59O1xuXG4vLyAtLS0tLSBtYWtlQXJyYXkgLS0tLS0gLy9cblxudmFyIGFycmF5U2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbi8vIHR1cm4gZWxlbWVudCBvciBub2RlTGlzdCBpbnRvIGFuIGFycmF5XG51dGlscy5tYWtlQXJyYXkgPSBmdW5jdGlvbiggb2JqICkge1xuICBpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuICAgIC8vIHVzZSBvYmplY3QgaWYgYWxyZWFkeSBhbiBhcnJheVxuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgLy8gcmV0dXJuIGVtcHR5IGFycmF5IGlmIHVuZGVmaW5lZCBvciBudWxsLiAjNlxuICBpZiAoIG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgaXNBcnJheUxpa2UgPSB0eXBlb2Ygb2JqID09ICdvYmplY3QnICYmIHR5cGVvZiBvYmoubGVuZ3RoID09ICdudW1iZXInO1xuICBpZiAoIGlzQXJyYXlMaWtlICkge1xuICAgIC8vIGNvbnZlcnQgbm9kZUxpc3QgdG8gYXJyYXlcbiAgICByZXR1cm4gYXJyYXlTbGljZS5jYWxsKCBvYmogKTtcbiAgfVxuXG4gIC8vIGFycmF5IG9mIHNpbmdsZSBpbmRleFxuICByZXR1cm4gWyBvYmogXTtcbn07XG5cbi8vIC0tLS0tIHJlbW92ZUZyb20gLS0tLS0gLy9cblxudXRpbHMucmVtb3ZlRnJvbSA9IGZ1bmN0aW9uKCBhcnksIG9iaiApIHtcbiAgdmFyIGluZGV4ID0gYXJ5LmluZGV4T2YoIG9iaiApO1xuICBpZiAoIGluZGV4ICE9IC0xICkge1xuICAgIGFyeS5zcGxpY2UoIGluZGV4LCAxICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIGdldFBhcmVudCAtLS0tLSAvL1xuXG51dGlscy5nZXRQYXJlbnQgPSBmdW5jdGlvbiggZWxlbSwgc2VsZWN0b3IgKSB7XG4gIHdoaWxlICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0gIT0gZG9jdW1lbnQuYm9keSApIHtcbiAgICBlbGVtID0gZWxlbS5wYXJlbnROb2RlO1xuICAgIGlmICggbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApICkge1xuICAgICAgcmV0dXJuIGVsZW07XG4gICAgfVxuICB9XG59O1xuXG4vLyAtLS0tLSBnZXRRdWVyeUVsZW1lbnQgLS0tLS0gLy9cblxuLy8gdXNlIGVsZW1lbnQgYXMgc2VsZWN0b3Igc3RyaW5nXG51dGlscy5nZXRRdWVyeUVsZW1lbnQgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgaWYgKCB0eXBlb2YgZWxlbSA9PSAnc3RyaW5nJyApIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggZWxlbSApO1xuICB9XG4gIHJldHVybiBlbGVtO1xufTtcblxuLy8gLS0tLS0gaGFuZGxlRXZlbnQgLS0tLS0gLy9cblxuLy8gZW5hYmxlIC5vbnR5cGUgdG8gdHJpZ2dlciBmcm9tIC5hZGRFdmVudExpc3RlbmVyKCBlbGVtLCAndHlwZScgKVxudXRpbHMuaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBtZXRob2QgPSAnb24nICsgZXZlbnQudHlwZTtcbiAgaWYgKCB0aGlzWyBtZXRob2QgXSApIHtcbiAgICB0aGlzWyBtZXRob2QgXSggZXZlbnQgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gZmlsdGVyRmluZEVsZW1lbnRzIC0tLS0tIC8vXG5cbnV0aWxzLmZpbHRlckZpbmRFbGVtZW50cyA9IGZ1bmN0aW9uKCBlbGVtcywgc2VsZWN0b3IgKSB7XG4gIC8vIG1ha2UgYXJyYXkgb2YgZWxlbXNcbiAgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGVsZW1zICk7XG4gIHZhciBmZkVsZW1zID0gW107XG5cbiAgZWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgLy8gY2hlY2sgdGhhdCBlbGVtIGlzIGFuIGFjdHVhbCBlbGVtZW50XG4gICAgaWYgKCAhKCBlbGVtIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgKSApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYWRkIGVsZW0gaWYgbm8gc2VsZWN0b3JcbiAgICBpZiAoICFzZWxlY3RvciApIHtcbiAgICAgIGZmRWxlbXMucHVzaCggZWxlbSApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBmaWx0ZXIgJiBmaW5kIGl0ZW1zIGlmIHdlIGhhdmUgYSBzZWxlY3RvclxuICAgIC8vIGZpbHRlclxuICAgIGlmICggbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApICkge1xuICAgICAgZmZFbGVtcy5wdXNoKCBlbGVtICk7XG4gICAgfVxuICAgIC8vIGZpbmQgY2hpbGRyZW5cbiAgICB2YXIgY2hpbGRFbGVtcyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbCggc2VsZWN0b3IgKTtcbiAgICAvLyBjb25jYXQgY2hpbGRFbGVtcyB0byBmaWx0ZXJGb3VuZCBhcnJheVxuICAgIGZvciAoIHZhciBpPTA7IGkgPCBjaGlsZEVsZW1zLmxlbmd0aDsgaSsrICkge1xuICAgICAgZmZFbGVtcy5wdXNoKCBjaGlsZEVsZW1zW2ldICk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZmZFbGVtcztcbn07XG5cbi8vIC0tLS0tIGRlYm91bmNlTWV0aG9kIC0tLS0tIC8vXG5cbnV0aWxzLmRlYm91bmNlTWV0aG9kID0gZnVuY3Rpb24oIF9jbGFzcywgbWV0aG9kTmFtZSwgdGhyZXNob2xkICkge1xuICB0aHJlc2hvbGQgPSB0aHJlc2hvbGQgfHwgMTAwO1xuICAvLyBvcmlnaW5hbCBtZXRob2RcbiAgdmFyIG1ldGhvZCA9IF9jbGFzcy5wcm90b3R5cGVbIG1ldGhvZE5hbWUgXTtcbiAgdmFyIHRpbWVvdXROYW1lID0gbWV0aG9kTmFtZSArICdUaW1lb3V0JztcblxuICBfY2xhc3MucHJvdG90eXBlWyBtZXRob2ROYW1lIF0gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGltZW91dCA9IHRoaXNbIHRpbWVvdXROYW1lIF07XG4gICAgY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXNbIHRpbWVvdXROYW1lIF0gPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcbiAgICAgIG1ldGhvZC5hcHBseSggX3RoaXMsIGFyZ3MgKTtcbiAgICAgIGRlbGV0ZSBfdGhpc1sgdGltZW91dE5hbWUgXTtcbiAgICB9LCB0aHJlc2hvbGQgKTtcbiAgfTtcbn07XG5cbi8vIC0tLS0tIGRvY1JlYWR5IC0tLS0tIC8vXG5cbnV0aWxzLmRvY1JlYWR5ID0gZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuICB2YXIgcmVhZHlTdGF0ZSA9IGRvY3VtZW50LnJlYWR5U3RhdGU7XG4gIGlmICggcmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnIHx8IHJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJyApIHtcbiAgICAvLyBkbyBhc3luYyB0byBhbGxvdyBmb3Igb3RoZXIgc2NyaXB0cyB0byBydW4uIG1ldGFmaXp6eS9mbGlja2l0eSM0NDFcbiAgICBzZXRUaW1lb3V0KCBjYWxsYmFjayApO1xuICB9IGVsc2Uge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdET01Db250ZW50TG9hZGVkJywgY2FsbGJhY2sgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gaHRtbEluaXQgLS0tLS0gLy9cblxuLy8gaHR0cDovL2phbWVzcm9iZXJ0cy5uYW1lL2Jsb2cvMjAxMC8wMi8yMi9zdHJpbmctZnVuY3Rpb25zLWZvci1qYXZhc2NyaXB0LXRyaW0tdG8tY2FtZWwtY2FzZS10by1kYXNoZWQtYW5kLXRvLXVuZGVyc2NvcmUvXG51dGlscy50b0Rhc2hlZCA9IGZ1bmN0aW9uKCBzdHIgKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSggLyguKShbQS1aXSkvZywgZnVuY3Rpb24oIG1hdGNoLCAkMSwgJDIgKSB7XG4gICAgcmV0dXJuICQxICsgJy0nICsgJDI7XG4gIH0pLnRvTG93ZXJDYXNlKCk7XG59O1xuXG52YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlO1xuLyoqXG4gKiBhbGxvdyB1c2VyIHRvIGluaXRpYWxpemUgY2xhc3NlcyB2aWEgW2RhdGEtbmFtZXNwYWNlXSBvciAuanMtbmFtZXNwYWNlIGNsYXNzXG4gKiBodG1sSW5pdCggV2lkZ2V0LCAnd2lkZ2V0TmFtZScgKVxuICogb3B0aW9ucyBhcmUgcGFyc2VkIGZyb20gZGF0YS1uYW1lc3BhY2Utb3B0aW9uc1xuICovXG51dGlscy5odG1sSW5pdCA9IGZ1bmN0aW9uKCBXaWRnZXRDbGFzcywgbmFtZXNwYWNlICkge1xuICB1dGlscy5kb2NSZWFkeSggZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRhc2hlZE5hbWVzcGFjZSA9IHV0aWxzLnRvRGFzaGVkKCBuYW1lc3BhY2UgKTtcbiAgICB2YXIgZGF0YUF0dHIgPSAnZGF0YS0nICsgZGFzaGVkTmFtZXNwYWNlO1xuICAgIHZhciBkYXRhQXR0ckVsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ1snICsgZGF0YUF0dHIgKyAnXScgKTtcbiAgICB2YXIganNEYXNoRWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLmpzLScgKyBkYXNoZWROYW1lc3BhY2UgKTtcbiAgICB2YXIgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGRhdGFBdHRyRWxlbXMgKVxuICAgICAgLmNvbmNhdCggdXRpbHMubWFrZUFycmF5KCBqc0Rhc2hFbGVtcyApICk7XG4gICAgdmFyIGRhdGFPcHRpb25zQXR0ciA9IGRhdGFBdHRyICsgJy1vcHRpb25zJztcbiAgICB2YXIgalF1ZXJ5ID0gd2luZG93LmpRdWVyeTtcblxuICAgIGVsZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtICkge1xuICAgICAgdmFyIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZSggZGF0YUF0dHIgKSB8fFxuICAgICAgICBlbGVtLmdldEF0dHJpYnV0ZSggZGF0YU9wdGlvbnNBdHRyICk7XG4gICAgICB2YXIgb3B0aW9ucztcbiAgICAgIHRyeSB7XG4gICAgICAgIG9wdGlvbnMgPSBhdHRyICYmIEpTT04ucGFyc2UoIGF0dHIgKTtcbiAgICAgIH0gY2F0Y2ggKCBlcnJvciApIHtcbiAgICAgICAgLy8gbG9nIGVycm9yLCBkbyBub3QgaW5pdGlhbGl6ZVxuICAgICAgICBpZiAoIGNvbnNvbGUgKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvciggJ0Vycm9yIHBhcnNpbmcgJyArIGRhdGFBdHRyICsgJyBvbiAnICsgZWxlbS5jbGFzc05hbWUgK1xuICAgICAgICAgICc6ICcgKyBlcnJvciApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGluaXRpYWxpemVcbiAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBXaWRnZXRDbGFzcyggZWxlbSwgb3B0aW9ucyApO1xuICAgICAgLy8gbWFrZSBhdmFpbGFibGUgdmlhICQoKS5kYXRhKCduYW1lc3BhY2UnKVxuICAgICAgaWYgKCBqUXVlcnkgKSB7XG4gICAgICAgIGpRdWVyeS5kYXRhKCBlbGVtLCBuYW1lc3BhY2UsIGluc3RhbmNlICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfSk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIHV0aWxzO1xuXG59KSk7XG4iLCIvKiFcbiAqIGdldFNpemUgdjIuMC4zXG4gKiBtZWFzdXJlIHNpemUgb2YgZWxlbWVudHNcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuLyoganNoaW50IGJyb3dzZXI6IHRydWUsIHN0cmljdDogdHJ1ZSwgdW5kZWY6IHRydWUsIHVudXNlZDogdHJ1ZSAqL1xuLyogZ2xvYmFscyBjb25zb2xlOiBmYWxzZSAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qIGdsb2JhbHMgZGVmaW5lLCBtb2R1bGUgKi9cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTURcbiAgICBkZWZpbmUoIGZhY3RvcnkgKTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LmdldFNpemUgPSBmYWN0b3J5KCk7XG4gIH1cblxufSkoIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSgpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyBnZXQgYSBudW1iZXIgZnJvbSBhIHN0cmluZywgbm90IGEgcGVyY2VudGFnZVxuZnVuY3Rpb24gZ2V0U3R5bGVTaXplKCB2YWx1ZSApIHtcbiAgdmFyIG51bSA9IHBhcnNlRmxvYXQoIHZhbHVlICk7XG4gIC8vIG5vdCBhIHBlcmNlbnQgbGlrZSAnMTAwJScsIGFuZCBhIG51bWJlclxuICB2YXIgaXNWYWxpZCA9IHZhbHVlLmluZGV4T2YoJyUnKSA9PSAtMSAmJiAhaXNOYU4oIG51bSApO1xuICByZXR1cm4gaXNWYWxpZCAmJiBudW07XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG52YXIgbG9nRXJyb3IgPSB0eXBlb2YgY29uc29sZSA9PSAndW5kZWZpbmVkJyA/IG5vb3AgOlxuICBmdW5jdGlvbiggbWVzc2FnZSApIHtcbiAgICBjb25zb2xlLmVycm9yKCBtZXNzYWdlICk7XG4gIH07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1lYXN1cmVtZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgbWVhc3VyZW1lbnRzID0gW1xuICAncGFkZGluZ0xlZnQnLFxuICAncGFkZGluZ1JpZ2h0JyxcbiAgJ3BhZGRpbmdUb3AnLFxuICAncGFkZGluZ0JvdHRvbScsXG4gICdtYXJnaW5MZWZ0JyxcbiAgJ21hcmdpblJpZ2h0JyxcbiAgJ21hcmdpblRvcCcsXG4gICdtYXJnaW5Cb3R0b20nLFxuICAnYm9yZGVyTGVmdFdpZHRoJyxcbiAgJ2JvcmRlclJpZ2h0V2lkdGgnLFxuICAnYm9yZGVyVG9wV2lkdGgnLFxuICAnYm9yZGVyQm90dG9tV2lkdGgnXG5dO1xuXG52YXIgbWVhc3VyZW1lbnRzTGVuZ3RoID0gbWVhc3VyZW1lbnRzLmxlbmd0aDtcblxuZnVuY3Rpb24gZ2V0WmVyb1NpemUoKSB7XG4gIHZhciBzaXplID0ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMCxcbiAgICBpbm5lcldpZHRoOiAwLFxuICAgIGlubmVySGVpZ2h0OiAwLFxuICAgIG91dGVyV2lkdGg6IDAsXG4gICAgb3V0ZXJIZWlnaHQ6IDBcbiAgfTtcbiAgZm9yICggdmFyIGk9MDsgaSA8IG1lYXN1cmVtZW50c0xlbmd0aDsgaSsrICkge1xuICAgIHZhciBtZWFzdXJlbWVudCA9IG1lYXN1cmVtZW50c1tpXTtcbiAgICBzaXplWyBtZWFzdXJlbWVudCBdID0gMDtcbiAgfVxuICByZXR1cm4gc2l6ZTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2V0U3R5bGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBnZXRTdHlsZSwgZ2V0IHN0eWxlIG9mIGVsZW1lbnQsIGNoZWNrIGZvciBGaXJlZm94IGJ1Z1xuICogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQ4Mzk3XG4gKi9cbmZ1bmN0aW9uIGdldFN0eWxlKCBlbGVtICkge1xuICB2YXIgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG4gIGlmICggIXN0eWxlICkge1xuICAgIGxvZ0Vycm9yKCAnU3R5bGUgcmV0dXJuZWQgJyArIHN0eWxlICtcbiAgICAgICcuIEFyZSB5b3UgcnVubmluZyB0aGlzIGNvZGUgaW4gYSBoaWRkZW4gaWZyYW1lIG9uIEZpcmVmb3g/ICcgK1xuICAgICAgJ1NlZSBodHRwczovL2JpdC5seS9nZXRzaXplYnVnMScgKTtcbiAgfVxuICByZXR1cm4gc3R5bGU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNldHVwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnZhciBpc1NldHVwID0gZmFsc2U7XG5cbnZhciBpc0JveFNpemVPdXRlcjtcblxuLyoqXG4gKiBzZXR1cFxuICogY2hlY2sgaXNCb3hTaXplck91dGVyXG4gKiBkbyBvbiBmaXJzdCBnZXRTaXplKCkgcmF0aGVyIHRoYW4gb24gcGFnZSBsb2FkIGZvciBGaXJlZm94IGJ1Z1xuICovXG5mdW5jdGlvbiBzZXR1cCgpIHtcbiAgLy8gc2V0dXAgb25jZVxuICBpZiAoIGlzU2V0dXAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlzU2V0dXAgPSB0cnVlO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGJveCBzaXppbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICAvKipcbiAgICogQ2hyb21lICYgU2FmYXJpIG1lYXN1cmUgdGhlIG91dGVyLXdpZHRoIG9uIHN0eWxlLndpZHRoIG9uIGJvcmRlci1ib3ggZWxlbXNcbiAgICogSUUxMSAmIEZpcmVmb3g8MjkgbWVhc3VyZXMgdGhlIGlubmVyLXdpZHRoXG4gICAqL1xuICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGRpdi5zdHlsZS53aWR0aCA9ICcyMDBweCc7XG4gIGRpdi5zdHlsZS5wYWRkaW5nID0gJzFweCAycHggM3B4IDRweCc7XG4gIGRpdi5zdHlsZS5ib3JkZXJTdHlsZSA9ICdzb2xpZCc7XG4gIGRpdi5zdHlsZS5ib3JkZXJXaWR0aCA9ICcxcHggMnB4IDNweCA0cHgnO1xuICBkaXYuc3R5bGUuYm94U2l6aW5nID0gJ2JvcmRlci1ib3gnO1xuXG4gIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIGJvZHkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuICB2YXIgc3R5bGUgPSBnZXRTdHlsZSggZGl2ICk7XG4gIC8vIHJvdW5kIHZhbHVlIGZvciBicm93c2VyIHpvb20uIGRlc2FuZHJvL21hc29ucnkjOTI4XG4gIGlzQm94U2l6ZU91dGVyID0gTWF0aC5yb3VuZCggZ2V0U3R5bGVTaXplKCBzdHlsZS53aWR0aCApICkgPT0gMjAwO1xuICBnZXRTaXplLmlzQm94U2l6ZU91dGVyID0gaXNCb3hTaXplT3V0ZXI7XG5cbiAgYm9keS5yZW1vdmVDaGlsZCggZGl2ICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdldFNpemUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuZnVuY3Rpb24gZ2V0U2l6ZSggZWxlbSApIHtcbiAgc2V0dXAoKTtcblxuICAvLyB1c2UgcXVlcnlTZWxldG9yIGlmIGVsZW0gaXMgc3RyaW5nXG4gIGlmICggdHlwZW9mIGVsZW0gPT0gJ3N0cmluZycgKSB7XG4gICAgZWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGVsZW0gKTtcbiAgfVxuXG4gIC8vIGRvIG5vdCBwcm9jZWVkIG9uIG5vbi1vYmplY3RzXG4gIGlmICggIWVsZW0gfHwgdHlwZW9mIGVsZW0gIT0gJ29iamVjdCcgfHwgIWVsZW0ubm9kZVR5cGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHN0eWxlID0gZ2V0U3R5bGUoIGVsZW0gKTtcblxuICAvLyBpZiBoaWRkZW4sIGV2ZXJ5dGhpbmcgaXMgMFxuICBpZiAoIHN0eWxlLmRpc3BsYXkgPT0gJ25vbmUnICkge1xuICAgIHJldHVybiBnZXRaZXJvU2l6ZSgpO1xuICB9XG5cbiAgdmFyIHNpemUgPSB7fTtcbiAgc2l6ZS53aWR0aCA9IGVsZW0ub2Zmc2V0V2lkdGg7XG4gIHNpemUuaGVpZ2h0ID0gZWxlbS5vZmZzZXRIZWlnaHQ7XG5cbiAgdmFyIGlzQm9yZGVyQm94ID0gc2l6ZS5pc0JvcmRlckJveCA9IHN0eWxlLmJveFNpemluZyA9PSAnYm9yZGVyLWJveCc7XG5cbiAgLy8gZ2V0IGFsbCBtZWFzdXJlbWVudHNcbiAgZm9yICggdmFyIGk9MDsgaSA8IG1lYXN1cmVtZW50c0xlbmd0aDsgaSsrICkge1xuICAgIHZhciBtZWFzdXJlbWVudCA9IG1lYXN1cmVtZW50c1tpXTtcbiAgICB2YXIgdmFsdWUgPSBzdHlsZVsgbWVhc3VyZW1lbnQgXTtcbiAgICB2YXIgbnVtID0gcGFyc2VGbG9hdCggdmFsdWUgKTtcbiAgICAvLyBhbnkgJ2F1dG8nLCAnbWVkaXVtJyB2YWx1ZSB3aWxsIGJlIDBcbiAgICBzaXplWyBtZWFzdXJlbWVudCBdID0gIWlzTmFOKCBudW0gKSA/IG51bSA6IDA7XG4gIH1cblxuICB2YXIgcGFkZGluZ1dpZHRoID0gc2l6ZS5wYWRkaW5nTGVmdCArIHNpemUucGFkZGluZ1JpZ2h0O1xuICB2YXIgcGFkZGluZ0hlaWdodCA9IHNpemUucGFkZGluZ1RvcCArIHNpemUucGFkZGluZ0JvdHRvbTtcbiAgdmFyIG1hcmdpbldpZHRoID0gc2l6ZS5tYXJnaW5MZWZ0ICsgc2l6ZS5tYXJnaW5SaWdodDtcbiAgdmFyIG1hcmdpbkhlaWdodCA9IHNpemUubWFyZ2luVG9wICsgc2l6ZS5tYXJnaW5Cb3R0b207XG4gIHZhciBib3JkZXJXaWR0aCA9IHNpemUuYm9yZGVyTGVmdFdpZHRoICsgc2l6ZS5ib3JkZXJSaWdodFdpZHRoO1xuICB2YXIgYm9yZGVySGVpZ2h0ID0gc2l6ZS5ib3JkZXJUb3BXaWR0aCArIHNpemUuYm9yZGVyQm90dG9tV2lkdGg7XG5cbiAgdmFyIGlzQm9yZGVyQm94U2l6ZU91dGVyID0gaXNCb3JkZXJCb3ggJiYgaXNCb3hTaXplT3V0ZXI7XG5cbiAgLy8gb3ZlcndyaXRlIHdpZHRoIGFuZCBoZWlnaHQgaWYgd2UgY2FuIGdldCBpdCBmcm9tIHN0eWxlXG4gIHZhciBzdHlsZVdpZHRoID0gZ2V0U3R5bGVTaXplKCBzdHlsZS53aWR0aCApO1xuICBpZiAoIHN0eWxlV2lkdGggIT09IGZhbHNlICkge1xuICAgIHNpemUud2lkdGggPSBzdHlsZVdpZHRoICtcbiAgICAgIC8vIGFkZCBwYWRkaW5nIGFuZCBib3JkZXIgdW5sZXNzIGl0J3MgYWxyZWFkeSBpbmNsdWRpbmcgaXRcbiAgICAgICggaXNCb3JkZXJCb3hTaXplT3V0ZXIgPyAwIDogcGFkZGluZ1dpZHRoICsgYm9yZGVyV2lkdGggKTtcbiAgfVxuXG4gIHZhciBzdHlsZUhlaWdodCA9IGdldFN0eWxlU2l6ZSggc3R5bGUuaGVpZ2h0ICk7XG4gIGlmICggc3R5bGVIZWlnaHQgIT09IGZhbHNlICkge1xuICAgIHNpemUuaGVpZ2h0ID0gc3R5bGVIZWlnaHQgK1xuICAgICAgLy8gYWRkIHBhZGRpbmcgYW5kIGJvcmRlciB1bmxlc3MgaXQncyBhbHJlYWR5IGluY2x1ZGluZyBpdFxuICAgICAgKCBpc0JvcmRlckJveFNpemVPdXRlciA/IDAgOiBwYWRkaW5nSGVpZ2h0ICsgYm9yZGVySGVpZ2h0ICk7XG4gIH1cblxuICBzaXplLmlubmVyV2lkdGggPSBzaXplLndpZHRoIC0gKCBwYWRkaW5nV2lkdGggKyBib3JkZXJXaWR0aCApO1xuICBzaXplLmlubmVySGVpZ2h0ID0gc2l6ZS5oZWlnaHQgLSAoIHBhZGRpbmdIZWlnaHQgKyBib3JkZXJIZWlnaHQgKTtcblxuICBzaXplLm91dGVyV2lkdGggPSBzaXplLndpZHRoICsgbWFyZ2luV2lkdGg7XG4gIHNpemUub3V0ZXJIZWlnaHQgPSBzaXplLmhlaWdodCArIG1hcmdpbkhlaWdodDtcblxuICByZXR1cm4gc2l6ZTtcbn1cblxucmV0dXJuIGdldFNpemU7XG5cbn0pO1xuIiwiLyohXG4gKiBpbWFnZXNMb2FkZWQgdjQuMS40XG4gKiBKYXZhU2NyaXB0IGlzIGFsbCBsaWtlIFwiWW91IGltYWdlcyBhcmUgZG9uZSB5ZXQgb3Igd2hhdD9cIlxuICogTUlUIExpY2Vuc2VcbiAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7ICd1c2Ugc3RyaWN0JztcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG5cbiAgLypnbG9iYWwgZGVmaW5lOiBmYWxzZSwgbW9kdWxlOiBmYWxzZSwgcmVxdWlyZTogZmFsc2UgKi9cblxuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJ2V2LWVtaXR0ZXIvZXYtZW1pdHRlcidcbiAgICBdLCBmdW5jdGlvbiggRXZFbWl0dGVyICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgRXZFbWl0dGVyICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCdldi1lbWl0dGVyJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LmltYWdlc0xvYWRlZCA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cuRXZFbWl0dGVyXG4gICAgKTtcbiAgfVxuXG59KSggdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0aGlzLFxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgZmFjdG9yeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5mdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIEV2RW1pdHRlciApIHtcblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgJCA9IHdpbmRvdy5qUXVlcnk7XG52YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGV4dGVuZCBvYmplY3RzXG5mdW5jdGlvbiBleHRlbmQoIGEsIGIgKSB7XG4gIGZvciAoIHZhciBwcm9wIGluIGIgKSB7XG4gICAgYVsgcHJvcCBdID0gYlsgcHJvcCBdO1xuICB9XG4gIHJldHVybiBhO1xufVxuXG52YXIgYXJyYXlTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuLy8gdHVybiBlbGVtZW50IG9yIG5vZGVMaXN0IGludG8gYW4gYXJyYXlcbmZ1bmN0aW9uIG1ha2VBcnJheSggb2JqICkge1xuICBpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuICAgIC8vIHVzZSBvYmplY3QgaWYgYWxyZWFkeSBhbiBhcnJheVxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICB2YXIgaXNBcnJheUxpa2UgPSB0eXBlb2Ygb2JqID09ICdvYmplY3QnICYmIHR5cGVvZiBvYmoubGVuZ3RoID09ICdudW1iZXInO1xuICBpZiAoIGlzQXJyYXlMaWtlICkge1xuICAgIC8vIGNvbnZlcnQgbm9kZUxpc3QgdG8gYXJyYXlcbiAgICByZXR1cm4gYXJyYXlTbGljZS5jYWxsKCBvYmogKTtcbiAgfVxuXG4gIC8vIGFycmF5IG9mIHNpbmdsZSBpbmRleFxuICByZXR1cm4gWyBvYmogXTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaW1hZ2VzTG9hZGVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogQHBhcmFtIHtBcnJheSwgRWxlbWVudCwgTm9kZUxpc3QsIFN0cmluZ30gZWxlbVxuICogQHBhcmFtIHtPYmplY3Qgb3IgRnVuY3Rpb259IG9wdGlvbnMgLSBpZiBmdW5jdGlvbiwgdXNlIGFzIGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkFsd2F5cyAtIGNhbGxiYWNrIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIEltYWdlc0xvYWRlZCggZWxlbSwgb3B0aW9ucywgb25BbHdheXMgKSB7XG4gIC8vIGNvZXJjZSBJbWFnZXNMb2FkZWQoKSB3aXRob3V0IG5ldywgdG8gYmUgbmV3IEltYWdlc0xvYWRlZCgpXG4gIGlmICggISggdGhpcyBpbnN0YW5jZW9mIEltYWdlc0xvYWRlZCApICkge1xuICAgIHJldHVybiBuZXcgSW1hZ2VzTG9hZGVkKCBlbGVtLCBvcHRpb25zLCBvbkFsd2F5cyApO1xuICB9XG4gIC8vIHVzZSBlbGVtIGFzIHNlbGVjdG9yIHN0cmluZ1xuICB2YXIgcXVlcnlFbGVtID0gZWxlbTtcbiAgaWYgKCB0eXBlb2YgZWxlbSA9PSAnc3RyaW5nJyApIHtcbiAgICBxdWVyeUVsZW0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCBlbGVtICk7XG4gIH1cbiAgLy8gYmFpbCBpZiBiYWQgZWxlbWVudFxuICBpZiAoICFxdWVyeUVsZW0gKSB7XG4gICAgY29uc29sZS5lcnJvciggJ0JhZCBlbGVtZW50IGZvciBpbWFnZXNMb2FkZWQgJyArICggcXVlcnlFbGVtIHx8IGVsZW0gKSApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuZWxlbWVudHMgPSBtYWtlQXJyYXkoIHF1ZXJ5RWxlbSApO1xuICB0aGlzLm9wdGlvbnMgPSBleHRlbmQoIHt9LCB0aGlzLm9wdGlvbnMgKTtcbiAgLy8gc2hpZnQgYXJndW1lbnRzIGlmIG5vIG9wdGlvbnMgc2V0XG4gIGlmICggdHlwZW9mIG9wdGlvbnMgPT0gJ2Z1bmN0aW9uJyApIHtcbiAgICBvbkFsd2F5cyA9IG9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgZXh0ZW5kKCB0aGlzLm9wdGlvbnMsIG9wdGlvbnMgKTtcbiAgfVxuXG4gIGlmICggb25BbHdheXMgKSB7XG4gICAgdGhpcy5vbiggJ2Fsd2F5cycsIG9uQWx3YXlzICk7XG4gIH1cblxuICB0aGlzLmdldEltYWdlcygpO1xuXG4gIGlmICggJCApIHtcbiAgICAvLyBhZGQgalF1ZXJ5IERlZmVycmVkIG9iamVjdFxuICAgIHRoaXMuanFEZWZlcnJlZCA9IG5ldyAkLkRlZmVycmVkKCk7XG4gIH1cblxuICAvLyBIQUNLIGNoZWNrIGFzeW5jIHRvIGFsbG93IHRpbWUgdG8gYmluZCBsaXN0ZW5lcnNcbiAgc2V0VGltZW91dCggdGhpcy5jaGVjay5iaW5kKCB0aGlzICkgKTtcbn1cblxuSW1hZ2VzTG9hZGVkLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV2RW1pdHRlci5wcm90b3R5cGUgKTtcblxuSW1hZ2VzTG9hZGVkLnByb3RvdHlwZS5vcHRpb25zID0ge307XG5cbkltYWdlc0xvYWRlZC5wcm90b3R5cGUuZ2V0SW1hZ2VzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuaW1hZ2VzID0gW107XG5cbiAgLy8gZmlsdGVyICYgZmluZCBpdGVtcyBpZiB3ZSBoYXZlIGFuIGl0ZW0gc2VsZWN0b3JcbiAgdGhpcy5lbGVtZW50cy5mb3JFYWNoKCB0aGlzLmFkZEVsZW1lbnRJbWFnZXMsIHRoaXMgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gKi9cbkltYWdlc0xvYWRlZC5wcm90b3R5cGUuYWRkRWxlbWVudEltYWdlcyA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICAvLyBmaWx0ZXIgc2libGluZ3NcbiAgaWYgKCBlbGVtLm5vZGVOYW1lID09ICdJTUcnICkge1xuICAgIHRoaXMuYWRkSW1hZ2UoIGVsZW0gKTtcbiAgfVxuICAvLyBnZXQgYmFja2dyb3VuZCBpbWFnZSBvbiBlbGVtZW50XG4gIGlmICggdGhpcy5vcHRpb25zLmJhY2tncm91bmQgPT09IHRydWUgKSB7XG4gICAgdGhpcy5hZGRFbGVtZW50QmFja2dyb3VuZEltYWdlcyggZWxlbSApO1xuICB9XG5cbiAgLy8gZmluZCBjaGlsZHJlblxuICAvLyBubyBub24tZWxlbWVudCBub2RlcywgIzE0M1xuICB2YXIgbm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuICBpZiAoICFub2RlVHlwZSB8fCAhZWxlbWVudE5vZGVUeXBlc1sgbm9kZVR5cGUgXSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGNoaWxkSW1ncyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbCgnaW1nJyk7XG4gIC8vIGNvbmNhdCBjaGlsZEVsZW1zIHRvIGZpbHRlckZvdW5kIGFycmF5XG4gIGZvciAoIHZhciBpPTA7IGkgPCBjaGlsZEltZ3MubGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIGltZyA9IGNoaWxkSW1nc1tpXTtcbiAgICB0aGlzLmFkZEltYWdlKCBpbWcgKTtcbiAgfVxuXG4gIC8vIGdldCBjaGlsZCBiYWNrZ3JvdW5kIGltYWdlc1xuICBpZiAoIHR5cGVvZiB0aGlzLm9wdGlvbnMuYmFja2dyb3VuZCA9PSAnc3RyaW5nJyApIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoIHRoaXMub3B0aW9ucy5iYWNrZ3JvdW5kICk7XG4gICAgZm9yICggaT0wOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKSB7XG4gICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIHRoaXMuYWRkRWxlbWVudEJhY2tncm91bmRJbWFnZXMoIGNoaWxkICk7XG4gICAgfVxuICB9XG59O1xuXG52YXIgZWxlbWVudE5vZGVUeXBlcyA9IHtcbiAgMTogdHJ1ZSxcbiAgOTogdHJ1ZSxcbiAgMTE6IHRydWVcbn07XG5cbkltYWdlc0xvYWRlZC5wcm90b3R5cGUuYWRkRWxlbWVudEJhY2tncm91bmRJbWFnZXMgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgdmFyIHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSApO1xuICBpZiAoICFzdHlsZSApIHtcbiAgICAvLyBGaXJlZm94IHJldHVybnMgbnVsbCBpZiBpbiBhIGhpZGRlbiBpZnJhbWUgaHR0cHM6Ly9idWd6aWwubGEvNTQ4Mzk3XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGdldCB1cmwgaW5zaWRlIHVybChcIi4uLlwiKVxuICB2YXIgcmVVUkwgPSAvdXJsXFwoKFsnXCJdKT8oLio/KVxcMVxcKS9naTtcbiAgdmFyIG1hdGNoZXMgPSByZVVSTC5leGVjKCBzdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgKTtcbiAgd2hpbGUgKCBtYXRjaGVzICE9PSBudWxsICkge1xuICAgIHZhciB1cmwgPSBtYXRjaGVzICYmIG1hdGNoZXNbMl07XG4gICAgaWYgKCB1cmwgKSB7XG4gICAgICB0aGlzLmFkZEJhY2tncm91bmQoIHVybCwgZWxlbSApO1xuICAgIH1cbiAgICBtYXRjaGVzID0gcmVVUkwuZXhlYyggc3R5bGUuYmFja2dyb3VuZEltYWdlICk7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtJbWFnZX0gaW1nXG4gKi9cbkltYWdlc0xvYWRlZC5wcm90b3R5cGUuYWRkSW1hZ2UgPSBmdW5jdGlvbiggaW1nICkge1xuICB2YXIgbG9hZGluZ0ltYWdlID0gbmV3IExvYWRpbmdJbWFnZSggaW1nICk7XG4gIHRoaXMuaW1hZ2VzLnB1c2goIGxvYWRpbmdJbWFnZSApO1xufTtcblxuSW1hZ2VzTG9hZGVkLnByb3RvdHlwZS5hZGRCYWNrZ3JvdW5kID0gZnVuY3Rpb24oIHVybCwgZWxlbSApIHtcbiAgdmFyIGJhY2tncm91bmQgPSBuZXcgQmFja2dyb3VuZCggdXJsLCBlbGVtICk7XG4gIHRoaXMuaW1hZ2VzLnB1c2goIGJhY2tncm91bmQgKTtcbn07XG5cbkltYWdlc0xvYWRlZC5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbigpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcbiAgdGhpcy5wcm9ncmVzc2VkQ291bnQgPSAwO1xuICB0aGlzLmhhc0FueUJyb2tlbiA9IGZhbHNlO1xuICAvLyBjb21wbGV0ZSBpZiBubyBpbWFnZXNcbiAgaWYgKCAhdGhpcy5pbWFnZXMubGVuZ3RoICkge1xuICAgIHRoaXMuY29tcGxldGUoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBmdW5jdGlvbiBvblByb2dyZXNzKCBpbWFnZSwgZWxlbSwgbWVzc2FnZSApIHtcbiAgICAvLyBIQUNLIC0gQ2hyb21lIHRyaWdnZXJzIGV2ZW50IGJlZm9yZSBvYmplY3QgcHJvcGVydGllcyBoYXZlIGNoYW5nZWQuICM4M1xuICAgIHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuICAgICAgX3RoaXMucHJvZ3Jlc3MoIGltYWdlLCBlbGVtLCBtZXNzYWdlICk7XG4gICAgfSk7XG4gIH1cblxuICB0aGlzLmltYWdlcy5mb3JFYWNoKCBmdW5jdGlvbiggbG9hZGluZ0ltYWdlICkge1xuICAgIGxvYWRpbmdJbWFnZS5vbmNlKCAncHJvZ3Jlc3MnLCBvblByb2dyZXNzICk7XG4gICAgbG9hZGluZ0ltYWdlLmNoZWNrKCk7XG4gIH0pO1xufTtcblxuSW1hZ2VzTG9hZGVkLnByb3RvdHlwZS5wcm9ncmVzcyA9IGZ1bmN0aW9uKCBpbWFnZSwgZWxlbSwgbWVzc2FnZSApIHtcbiAgdGhpcy5wcm9ncmVzc2VkQ291bnQrKztcbiAgdGhpcy5oYXNBbnlCcm9rZW4gPSB0aGlzLmhhc0FueUJyb2tlbiB8fCAhaW1hZ2UuaXNMb2FkZWQ7XG4gIC8vIHByb2dyZXNzIGV2ZW50XG4gIHRoaXMuZW1pdEV2ZW50KCAncHJvZ3Jlc3MnLCBbIHRoaXMsIGltYWdlLCBlbGVtIF0gKTtcbiAgaWYgKCB0aGlzLmpxRGVmZXJyZWQgJiYgdGhpcy5qcURlZmVycmVkLm5vdGlmeSApIHtcbiAgICB0aGlzLmpxRGVmZXJyZWQubm90aWZ5KCB0aGlzLCBpbWFnZSApO1xuICB9XG4gIC8vIGNoZWNrIGlmIGNvbXBsZXRlZFxuICBpZiAoIHRoaXMucHJvZ3Jlc3NlZENvdW50ID09IHRoaXMuaW1hZ2VzLmxlbmd0aCApIHtcbiAgICB0aGlzLmNvbXBsZXRlKCk7XG4gIH1cblxuICBpZiAoIHRoaXMub3B0aW9ucy5kZWJ1ZyAmJiBjb25zb2xlICkge1xuICAgIGNvbnNvbGUubG9nKCAncHJvZ3Jlc3M6ICcgKyBtZXNzYWdlLCBpbWFnZSwgZWxlbSApO1xuICB9XG59O1xuXG5JbWFnZXNMb2FkZWQucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBldmVudE5hbWUgPSB0aGlzLmhhc0FueUJyb2tlbiA/ICdmYWlsJyA6ICdkb25lJztcbiAgdGhpcy5pc0NvbXBsZXRlID0gdHJ1ZTtcbiAgdGhpcy5lbWl0RXZlbnQoIGV2ZW50TmFtZSwgWyB0aGlzIF0gKTtcbiAgdGhpcy5lbWl0RXZlbnQoICdhbHdheXMnLCBbIHRoaXMgXSApO1xuICBpZiAoIHRoaXMuanFEZWZlcnJlZCApIHtcbiAgICB2YXIganFNZXRob2QgPSB0aGlzLmhhc0FueUJyb2tlbiA/ICdyZWplY3QnIDogJ3Jlc29sdmUnO1xuICAgIHRoaXMuanFEZWZlcnJlZFsganFNZXRob2QgXSggdGhpcyApO1xuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuZnVuY3Rpb24gTG9hZGluZ0ltYWdlKCBpbWcgKSB7XG4gIHRoaXMuaW1nID0gaW1nO1xufVxuXG5Mb2FkaW5nSW1hZ2UucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXZFbWl0dGVyLnByb3RvdHlwZSApO1xuXG5Mb2FkaW5nSW1hZ2UucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24oKSB7XG4gIC8vIElmIGNvbXBsZXRlIGlzIHRydWUgYW5kIGJyb3dzZXIgc3VwcG9ydHMgbmF0dXJhbCBzaXplcyxcbiAgLy8gdHJ5IHRvIGNoZWNrIGZvciBpbWFnZSBzdGF0dXMgbWFudWFsbHkuXG4gIHZhciBpc0NvbXBsZXRlID0gdGhpcy5nZXRJc0ltYWdlQ29tcGxldGUoKTtcbiAgaWYgKCBpc0NvbXBsZXRlICkge1xuICAgIC8vIHJlcG9ydCBiYXNlZCBvbiBuYXR1cmFsV2lkdGhcbiAgICB0aGlzLmNvbmZpcm0oIHRoaXMuaW1nLm5hdHVyYWxXaWR0aCAhPT0gMCwgJ25hdHVyYWxXaWR0aCcgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJZiBub25lIG9mIHRoZSBjaGVja3MgYWJvdmUgbWF0Y2hlZCwgc2ltdWxhdGUgbG9hZGluZyBvbiBkZXRhY2hlZCBlbGVtZW50LlxuICB0aGlzLnByb3h5SW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgdGhpcy5wcm94eUltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgdGhpcyApO1xuICB0aGlzLnByb3h5SW1hZ2UuYWRkRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgdGhpcyApO1xuICAvLyBiaW5kIHRvIGltYWdlIGFzIHdlbGwgZm9yIEZpcmVmb3guICMxOTFcbiAgdGhpcy5pbWcuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCB0aGlzICk7XG4gIHRoaXMuaW1nLmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIHRoaXMgKTtcbiAgdGhpcy5wcm94eUltYWdlLnNyYyA9IHRoaXMuaW1nLnNyYztcbn07XG5cbkxvYWRpbmdJbWFnZS5wcm90b3R5cGUuZ2V0SXNJbWFnZUNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGNoZWNrIGZvciBub24temVybywgbm9uLXVuZGVmaW5lZCBuYXR1cmFsV2lkdGhcbiAgLy8gZml4ZXMgU2FmYXJpK0luZmluaXRlU2Nyb2xsK01hc29ucnkgYnVnIGluZmluaXRlLXNjcm9sbCM2NzFcbiAgcmV0dXJuIHRoaXMuaW1nLmNvbXBsZXRlICYmIHRoaXMuaW1nLm5hdHVyYWxXaWR0aDtcbn07XG5cbkxvYWRpbmdJbWFnZS5wcm90b3R5cGUuY29uZmlybSA9IGZ1bmN0aW9uKCBpc0xvYWRlZCwgbWVzc2FnZSApIHtcbiAgdGhpcy5pc0xvYWRlZCA9IGlzTG9hZGVkO1xuICB0aGlzLmVtaXRFdmVudCggJ3Byb2dyZXNzJywgWyB0aGlzLCB0aGlzLmltZywgbWVzc2FnZSBdICk7XG59O1xuXG4vLyAtLS0tLSBldmVudHMgLS0tLS0gLy9cblxuLy8gdHJpZ2dlciBzcGVjaWZpZWQgaGFuZGxlciBmb3IgZXZlbnQgdHlwZVxuTG9hZGluZ0ltYWdlLnByb3RvdHlwZS5oYW5kbGVFdmVudCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIG1ldGhvZCA9ICdvbicgKyBldmVudC50eXBlO1xuICBpZiAoIHRoaXNbIG1ldGhvZCBdICkge1xuICAgIHRoaXNbIG1ldGhvZCBdKCBldmVudCApO1xuICB9XG59O1xuXG5Mb2FkaW5nSW1hZ2UucHJvdG90eXBlLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmNvbmZpcm0oIHRydWUsICdvbmxvYWQnICk7XG4gIHRoaXMudW5iaW5kRXZlbnRzKCk7XG59O1xuXG5Mb2FkaW5nSW1hZ2UucHJvdG90eXBlLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5jb25maXJtKCBmYWxzZSwgJ29uZXJyb3InICk7XG4gIHRoaXMudW5iaW5kRXZlbnRzKCk7XG59O1xuXG5Mb2FkaW5nSW1hZ2UucHJvdG90eXBlLnVuYmluZEV2ZW50cyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnByb3h5SW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCB0aGlzICk7XG4gIHRoaXMucHJveHlJbWFnZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZXJyb3InLCB0aGlzICk7XG4gIHRoaXMuaW1nLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdsb2FkJywgdGhpcyApO1xuICB0aGlzLmltZy5yZW1vdmVFdmVudExpc3RlbmVyKCAnZXJyb3InLCB0aGlzICk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCYWNrZ3JvdW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmZ1bmN0aW9uIEJhY2tncm91bmQoIHVybCwgZWxlbWVudCApIHtcbiAgdGhpcy51cmwgPSB1cmw7XG4gIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG4gIHRoaXMuaW1nID0gbmV3IEltYWdlKCk7XG59XG5cbi8vIGluaGVyaXQgTG9hZGluZ0ltYWdlIHByb3RvdHlwZVxuQmFja2dyb3VuZC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMb2FkaW5nSW1hZ2UucHJvdG90eXBlICk7XG5cbkJhY2tncm91bmQucHJvdG90eXBlLmNoZWNrID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuaW1nLmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgdGhpcyApO1xuICB0aGlzLmltZy5hZGRFdmVudExpc3RlbmVyKCAnZXJyb3InLCB0aGlzICk7XG4gIHRoaXMuaW1nLnNyYyA9IHRoaXMudXJsO1xuICAvLyBjaGVjayBpZiBpbWFnZSBpcyBhbHJlYWR5IGNvbXBsZXRlXG4gIHZhciBpc0NvbXBsZXRlID0gdGhpcy5nZXRJc0ltYWdlQ29tcGxldGUoKTtcbiAgaWYgKCBpc0NvbXBsZXRlICkge1xuICAgIHRoaXMuY29uZmlybSggdGhpcy5pbWcubmF0dXJhbFdpZHRoICE9PSAwLCAnbmF0dXJhbFdpZHRoJyApO1xuICAgIHRoaXMudW5iaW5kRXZlbnRzKCk7XG4gIH1cbn07XG5cbkJhY2tncm91bmQucHJvdG90eXBlLnVuYmluZEV2ZW50cyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmltZy5yZW1vdmVFdmVudExpc3RlbmVyKCAnbG9hZCcsIHRoaXMgKTtcbiAgdGhpcy5pbWcucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgdGhpcyApO1xufTtcblxuQmFja2dyb3VuZC5wcm90b3R5cGUuY29uZmlybSA9IGZ1bmN0aW9uKCBpc0xvYWRlZCwgbWVzc2FnZSApIHtcbiAgdGhpcy5pc0xvYWRlZCA9IGlzTG9hZGVkO1xuICB0aGlzLmVtaXRFdmVudCggJ3Byb2dyZXNzJywgWyB0aGlzLCB0aGlzLmVsZW1lbnQsIG1lc3NhZ2UgXSApO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0galF1ZXJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbkltYWdlc0xvYWRlZC5tYWtlSlF1ZXJ5UGx1Z2luID0gZnVuY3Rpb24oIGpRdWVyeSApIHtcbiAgalF1ZXJ5ID0galF1ZXJ5IHx8IHdpbmRvdy5qUXVlcnk7XG4gIGlmICggIWpRdWVyeSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gc2V0IGxvY2FsIHZhcmlhYmxlXG4gICQgPSBqUXVlcnk7XG4gIC8vICQoKS5pbWFnZXNMb2FkZWQoKVxuICAkLmZuLmltYWdlc0xvYWRlZCA9IGZ1bmN0aW9uKCBvcHRpb25zLCBjYWxsYmFjayApIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBuZXcgSW1hZ2VzTG9hZGVkKCB0aGlzLCBvcHRpb25zLCBjYWxsYmFjayApO1xuICAgIHJldHVybiBpbnN0YW5jZS5qcURlZmVycmVkLnByb21pc2UoICQodGhpcykgKTtcbiAgfTtcbn07XG4vLyB0cnkgbWFraW5nIHBsdWdpblxuSW1hZ2VzTG9hZGVkLm1ha2VKUXVlcnlQbHVnaW4oKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnJldHVybiBJbWFnZXNMb2FkZWQ7XG5cbn0pO1xuIiwiLyohXG4gKiBNYXNvbnJ5IHY0LjIuMlxuICogQ2FzY2FkaW5nIGdyaWQgbGF5b3V0IGxpYnJhcnlcbiAqIGh0dHBzOi8vbWFzb25yeS5kZXNhbmRyby5jb21cbiAqIE1JVCBMaWNlbnNlXG4gKiBieSBEYXZpZCBEZVNhbmRyb1xuICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qZ2xvYmFscyBkZWZpbmUsIG1vZHVsZSwgcmVxdWlyZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgICAnb3V0bGF5ZXIvb3V0bGF5ZXInLFxuICAgICAgICAnZ2V0LXNpemUvZ2V0LXNpemUnXG4gICAgICBdLFxuICAgICAgZmFjdG9yeSApO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgcmVxdWlyZSgnb3V0bGF5ZXInKSxcbiAgICAgIHJlcXVpcmUoJ2dldC1zaXplJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93Lk1hc29ucnkgPSBmYWN0b3J5KFxuICAgICAgd2luZG93Lk91dGxheWVyLFxuICAgICAgd2luZG93LmdldFNpemVcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggT3V0bGF5ZXIsIGdldFNpemUgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWFzb25yeURlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICAvLyBjcmVhdGUgYW4gT3V0bGF5ZXIgbGF5b3V0IGNsYXNzXG4gIHZhciBNYXNvbnJ5ID0gT3V0bGF5ZXIuY3JlYXRlKCdtYXNvbnJ5Jyk7XG4gIC8vIGlzRml0V2lkdGggLT4gZml0V2lkdGhcbiAgTWFzb25yeS5jb21wYXRPcHRpb25zLmZpdFdpZHRoID0gJ2lzRml0V2lkdGgnO1xuXG4gIHZhciBwcm90byA9IE1hc29ucnkucHJvdG90eXBlO1xuXG4gIHByb3RvLl9yZXNldExheW91dCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZ2V0U2l6ZSgpO1xuICAgIHRoaXMuX2dldE1lYXN1cmVtZW50KCAnY29sdW1uV2lkdGgnLCAnb3V0ZXJXaWR0aCcgKTtcbiAgICB0aGlzLl9nZXRNZWFzdXJlbWVudCggJ2d1dHRlcicsICdvdXRlcldpZHRoJyApO1xuICAgIHRoaXMubWVhc3VyZUNvbHVtbnMoKTtcblxuICAgIC8vIHJlc2V0IGNvbHVtbiBZXG4gICAgdGhpcy5jb2xZcyA9IFtdO1xuICAgIGZvciAoIHZhciBpPTA7IGkgPCB0aGlzLmNvbHM7IGkrKyApIHtcbiAgICAgIHRoaXMuY29sWXMucHVzaCggMCApO1xuICAgIH1cblxuICAgIHRoaXMubWF4WSA9IDA7XG4gICAgdGhpcy5ob3Jpem9udGFsQ29sSW5kZXggPSAwO1xuICB9O1xuXG4gIHByb3RvLm1lYXN1cmVDb2x1bW5zID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5nZXRDb250YWluZXJXaWR0aCgpO1xuICAgIC8vIGlmIGNvbHVtbldpZHRoIGlzIDAsIGRlZmF1bHQgdG8gb3V0ZXJXaWR0aCBvZiBmaXJzdCBpdGVtXG4gICAgaWYgKCAhdGhpcy5jb2x1bW5XaWR0aCApIHtcbiAgICAgIHZhciBmaXJzdEl0ZW0gPSB0aGlzLml0ZW1zWzBdO1xuICAgICAgdmFyIGZpcnN0SXRlbUVsZW0gPSBmaXJzdEl0ZW0gJiYgZmlyc3RJdGVtLmVsZW1lbnQ7XG4gICAgICAvLyBjb2x1bW5XaWR0aCBmYWxsIGJhY2sgdG8gaXRlbSBvZiBmaXJzdCBlbGVtZW50XG4gICAgICB0aGlzLmNvbHVtbldpZHRoID0gZmlyc3RJdGVtRWxlbSAmJiBnZXRTaXplKCBmaXJzdEl0ZW1FbGVtICkub3V0ZXJXaWR0aCB8fFxuICAgICAgICAvLyBpZiBmaXJzdCBlbGVtIGhhcyBubyB3aWR0aCwgZGVmYXVsdCB0byBzaXplIG9mIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnRhaW5lcldpZHRoO1xuICAgIH1cblxuICAgIHZhciBjb2x1bW5XaWR0aCA9IHRoaXMuY29sdW1uV2lkdGggKz0gdGhpcy5ndXR0ZXI7XG5cbiAgICAvLyBjYWxjdWxhdGUgY29sdW1uc1xuICAgIHZhciBjb250YWluZXJXaWR0aCA9IHRoaXMuY29udGFpbmVyV2lkdGggKyB0aGlzLmd1dHRlcjtcbiAgICB2YXIgY29scyA9IGNvbnRhaW5lcldpZHRoIC8gY29sdW1uV2lkdGg7XG4gICAgLy8gZml4IHJvdW5kaW5nIGVycm9ycywgdHlwaWNhbGx5IHdpdGggZ3V0dGVyc1xuICAgIHZhciBleGNlc3MgPSBjb2x1bW5XaWR0aCAtIGNvbnRhaW5lcldpZHRoICUgY29sdW1uV2lkdGg7XG4gICAgLy8gaWYgb3ZlcnNob290IGlzIGxlc3MgdGhhbiBhIHBpeGVsLCByb3VuZCB1cCwgb3RoZXJ3aXNlIGZsb29yIGl0XG4gICAgdmFyIG1hdGhNZXRob2QgPSBleGNlc3MgJiYgZXhjZXNzIDwgMSA/ICdyb3VuZCcgOiAnZmxvb3InO1xuICAgIGNvbHMgPSBNYXRoWyBtYXRoTWV0aG9kIF0oIGNvbHMgKTtcbiAgICB0aGlzLmNvbHMgPSBNYXRoLm1heCggY29scywgMSApO1xuICB9O1xuXG4gIHByb3RvLmdldENvbnRhaW5lcldpZHRoID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gY29udGFpbmVyIGlzIHBhcmVudCBpZiBmaXQgd2lkdGhcbiAgICB2YXIgaXNGaXRXaWR0aCA9IHRoaXMuX2dldE9wdGlvbignZml0V2lkdGgnKTtcbiAgICB2YXIgY29udGFpbmVyID0gaXNGaXRXaWR0aCA/IHRoaXMuZWxlbWVudC5wYXJlbnROb2RlIDogdGhpcy5lbGVtZW50O1xuICAgIC8vIGNoZWNrIHRoYXQgdGhpcy5zaXplIGFuZCBzaXplIGFyZSB0aGVyZVxuICAgIC8vIElFOCB0cmlnZ2VycyByZXNpemUgb24gYm9keSBzaXplIGNoYW5nZSwgc28gdGhleSBtaWdodCBub3QgYmVcbiAgICB2YXIgc2l6ZSA9IGdldFNpemUoIGNvbnRhaW5lciApO1xuICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSBzaXplICYmIHNpemUuaW5uZXJXaWR0aDtcbiAgfTtcblxuICBwcm90by5fZ2V0SXRlbUxheW91dFBvc2l0aW9uID0gZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgaXRlbS5nZXRTaXplKCk7XG4gICAgLy8gaG93IG1hbnkgY29sdW1ucyBkb2VzIHRoaXMgYnJpY2sgc3BhblxuICAgIHZhciByZW1haW5kZXIgPSBpdGVtLnNpemUub3V0ZXJXaWR0aCAlIHRoaXMuY29sdW1uV2lkdGg7XG4gICAgdmFyIG1hdGhNZXRob2QgPSByZW1haW5kZXIgJiYgcmVtYWluZGVyIDwgMSA/ICdyb3VuZCcgOiAnY2VpbCc7XG4gICAgLy8gcm91bmQgaWYgb2ZmIGJ5IDEgcGl4ZWwsIG90aGVyd2lzZSB1c2UgY2VpbFxuICAgIHZhciBjb2xTcGFuID0gTWF0aFsgbWF0aE1ldGhvZCBdKCBpdGVtLnNpemUub3V0ZXJXaWR0aCAvIHRoaXMuY29sdW1uV2lkdGggKTtcbiAgICBjb2xTcGFuID0gTWF0aC5taW4oIGNvbFNwYW4sIHRoaXMuY29scyApO1xuICAgIC8vIHVzZSBob3Jpem9udGFsIG9yIHRvcCBjb2x1bW4gcG9zaXRpb25cbiAgICB2YXIgY29sUG9zTWV0aG9kID0gdGhpcy5vcHRpb25zLmhvcml6b250YWxPcmRlciA/XG4gICAgICAnX2dldEhvcml6b250YWxDb2xQb3NpdGlvbicgOiAnX2dldFRvcENvbFBvc2l0aW9uJztcbiAgICB2YXIgY29sUG9zaXRpb24gPSB0aGlzWyBjb2xQb3NNZXRob2QgXSggY29sU3BhbiwgaXRlbSApO1xuICAgIC8vIHBvc2l0aW9uIHRoZSBicmlja1xuICAgIHZhciBwb3NpdGlvbiA9IHtcbiAgICAgIHg6IHRoaXMuY29sdW1uV2lkdGggKiBjb2xQb3NpdGlvbi5jb2wsXG4gICAgICB5OiBjb2xQb3NpdGlvbi55XG4gICAgfTtcbiAgICAvLyBhcHBseSBzZXRIZWlnaHQgdG8gbmVjZXNzYXJ5IGNvbHVtbnNcbiAgICB2YXIgc2V0SGVpZ2h0ID0gY29sUG9zaXRpb24ueSArIGl0ZW0uc2l6ZS5vdXRlckhlaWdodDtcbiAgICB2YXIgc2V0TWF4ID0gY29sU3BhbiArIGNvbFBvc2l0aW9uLmNvbDtcbiAgICBmb3IgKCB2YXIgaSA9IGNvbFBvc2l0aW9uLmNvbDsgaSA8IHNldE1heDsgaSsrICkge1xuICAgICAgdGhpcy5jb2xZc1tpXSA9IHNldEhlaWdodDtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH07XG5cbiAgcHJvdG8uX2dldFRvcENvbFBvc2l0aW9uID0gZnVuY3Rpb24oIGNvbFNwYW4gKSB7XG4gICAgdmFyIGNvbEdyb3VwID0gdGhpcy5fZ2V0VG9wQ29sR3JvdXAoIGNvbFNwYW4gKTtcbiAgICAvLyBnZXQgdGhlIG1pbmltdW0gWSB2YWx1ZSBmcm9tIHRoZSBjb2x1bW5zXG4gICAgdmFyIG1pbmltdW1ZID0gTWF0aC5taW4uYXBwbHkoIE1hdGgsIGNvbEdyb3VwICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sOiBjb2xHcm91cC5pbmRleE9mKCBtaW5pbXVtWSApLFxuICAgICAgeTogbWluaW11bVksXG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNvbFNwYW4gLSBudW1iZXIgb2YgY29sdW1ucyB0aGUgZWxlbWVudCBzcGFuc1xuICAgKiBAcmV0dXJucyB7QXJyYXl9IGNvbEdyb3VwXG4gICAqL1xuICBwcm90by5fZ2V0VG9wQ29sR3JvdXAgPSBmdW5jdGlvbiggY29sU3BhbiApIHtcbiAgICBpZiAoIGNvbFNwYW4gPCAyICkge1xuICAgICAgLy8gaWYgYnJpY2sgc3BhbnMgb25seSBvbmUgY29sdW1uLCB1c2UgYWxsIHRoZSBjb2x1bW4gWXNcbiAgICAgIHJldHVybiB0aGlzLmNvbFlzO1xuICAgIH1cblxuICAgIHZhciBjb2xHcm91cCA9IFtdO1xuICAgIC8vIGhvdyBtYW55IGRpZmZlcmVudCBwbGFjZXMgY291bGQgdGhpcyBicmljayBmaXQgaG9yaXpvbnRhbGx5XG4gICAgdmFyIGdyb3VwQ291bnQgPSB0aGlzLmNvbHMgKyAxIC0gY29sU3BhbjtcbiAgICAvLyBmb3IgZWFjaCBncm91cCBwb3RlbnRpYWwgaG9yaXpvbnRhbCBwb3NpdGlvblxuICAgIGZvciAoIHZhciBpID0gMDsgaSA8IGdyb3VwQ291bnQ7IGkrKyApIHtcbiAgICAgIGNvbEdyb3VwW2ldID0gdGhpcy5fZ2V0Q29sR3JvdXBZKCBpLCBjb2xTcGFuICk7XG4gICAgfVxuICAgIHJldHVybiBjb2xHcm91cDtcbiAgfTtcblxuICBwcm90by5fZ2V0Q29sR3JvdXBZID0gZnVuY3Rpb24oIGNvbCwgY29sU3BhbiApIHtcbiAgICBpZiAoIGNvbFNwYW4gPCAyICkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sWXNbIGNvbCBdO1xuICAgIH1cbiAgICAvLyBtYWtlIGFuIGFycmF5IG9mIGNvbFkgdmFsdWVzIGZvciB0aGF0IG9uZSBncm91cFxuICAgIHZhciBncm91cENvbFlzID0gdGhpcy5jb2xZcy5zbGljZSggY29sLCBjb2wgKyBjb2xTcGFuICk7XG4gICAgLy8gYW5kIGdldCB0aGUgbWF4IHZhbHVlIG9mIHRoZSBhcnJheVxuICAgIHJldHVybiBNYXRoLm1heC5hcHBseSggTWF0aCwgZ3JvdXBDb2xZcyApO1xuICB9O1xuXG4gIC8vIGdldCBjb2x1bW4gcG9zaXRpb24gYmFzZWQgb24gaG9yaXpvbnRhbCBpbmRleC4gIzg3M1xuICBwcm90by5fZ2V0SG9yaXpvbnRhbENvbFBvc2l0aW9uID0gZnVuY3Rpb24oIGNvbFNwYW4sIGl0ZW0gKSB7XG4gICAgdmFyIGNvbCA9IHRoaXMuaG9yaXpvbnRhbENvbEluZGV4ICUgdGhpcy5jb2xzO1xuICAgIHZhciBpc092ZXIgPSBjb2xTcGFuID4gMSAmJiBjb2wgKyBjb2xTcGFuID4gdGhpcy5jb2xzO1xuICAgIC8vIHNoaWZ0IHRvIG5leHQgcm93IGlmIGl0ZW0gY2FuJ3QgZml0IG9uIGN1cnJlbnQgcm93XG4gICAgY29sID0gaXNPdmVyID8gMCA6IGNvbDtcbiAgICAvLyBkb24ndCBsZXQgemVyby1zaXplIGl0ZW1zIHRha2UgdXAgc3BhY2VcbiAgICB2YXIgaGFzU2l6ZSA9IGl0ZW0uc2l6ZS5vdXRlcldpZHRoICYmIGl0ZW0uc2l6ZS5vdXRlckhlaWdodDtcbiAgICB0aGlzLmhvcml6b250YWxDb2xJbmRleCA9IGhhc1NpemUgPyBjb2wgKyBjb2xTcGFuIDogdGhpcy5ob3Jpem9udGFsQ29sSW5kZXg7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sOiBjb2wsXG4gICAgICB5OiB0aGlzLl9nZXRDb2xHcm91cFkoIGNvbCwgY29sU3BhbiApLFxuICAgIH07XG4gIH07XG5cbiAgcHJvdG8uX21hbmFnZVN0YW1wID0gZnVuY3Rpb24oIHN0YW1wICkge1xuICAgIHZhciBzdGFtcFNpemUgPSBnZXRTaXplKCBzdGFtcCApO1xuICAgIHZhciBvZmZzZXQgPSB0aGlzLl9nZXRFbGVtZW50T2Zmc2V0KCBzdGFtcCApO1xuICAgIC8vIGdldCB0aGUgY29sdW1ucyB0aGF0IHRoaXMgc3RhbXAgYWZmZWN0c1xuICAgIHZhciBpc09yaWdpbkxlZnQgPSB0aGlzLl9nZXRPcHRpb24oJ29yaWdpbkxlZnQnKTtcbiAgICB2YXIgZmlyc3RYID0gaXNPcmlnaW5MZWZ0ID8gb2Zmc2V0LmxlZnQgOiBvZmZzZXQucmlnaHQ7XG4gICAgdmFyIGxhc3RYID0gZmlyc3RYICsgc3RhbXBTaXplLm91dGVyV2lkdGg7XG4gICAgdmFyIGZpcnN0Q29sID0gTWF0aC5mbG9vciggZmlyc3RYIC8gdGhpcy5jb2x1bW5XaWR0aCApO1xuICAgIGZpcnN0Q29sID0gTWF0aC5tYXgoIDAsIGZpcnN0Q29sICk7XG4gICAgdmFyIGxhc3RDb2wgPSBNYXRoLmZsb29yKCBsYXN0WCAvIHRoaXMuY29sdW1uV2lkdGggKTtcbiAgICAvLyBsYXN0Q29sIHNob3VsZCBub3QgZ28gb3ZlciBpZiBtdWx0aXBsZSBvZiBjb2x1bW5XaWR0aCAjNDI1XG4gICAgbGFzdENvbCAtPSBsYXN0WCAlIHRoaXMuY29sdW1uV2lkdGggPyAwIDogMTtcbiAgICBsYXN0Q29sID0gTWF0aC5taW4oIHRoaXMuY29scyAtIDEsIGxhc3RDb2wgKTtcbiAgICAvLyBzZXQgY29sWXMgdG8gYm90dG9tIG9mIHRoZSBzdGFtcFxuXG4gICAgdmFyIGlzT3JpZ2luVG9wID0gdGhpcy5fZ2V0T3B0aW9uKCdvcmlnaW5Ub3AnKTtcbiAgICB2YXIgc3RhbXBNYXhZID0gKCBpc09yaWdpblRvcCA/IG9mZnNldC50b3AgOiBvZmZzZXQuYm90dG9tICkgK1xuICAgICAgc3RhbXBTaXplLm91dGVySGVpZ2h0O1xuICAgIGZvciAoIHZhciBpID0gZmlyc3RDb2w7IGkgPD0gbGFzdENvbDsgaSsrICkge1xuICAgICAgdGhpcy5jb2xZc1tpXSA9IE1hdGgubWF4KCBzdGFtcE1heFksIHRoaXMuY29sWXNbaV0gKTtcbiAgICB9XG4gIH07XG5cbiAgcHJvdG8uX2dldENvbnRhaW5lclNpemUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLm1heFkgPSBNYXRoLm1heC5hcHBseSggTWF0aCwgdGhpcy5jb2xZcyApO1xuICAgIHZhciBzaXplID0ge1xuICAgICAgaGVpZ2h0OiB0aGlzLm1heFlcbiAgICB9O1xuXG4gICAgaWYgKCB0aGlzLl9nZXRPcHRpb24oJ2ZpdFdpZHRoJykgKSB7XG4gICAgICBzaXplLndpZHRoID0gdGhpcy5fZ2V0Q29udGFpbmVyRml0V2lkdGgoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2l6ZTtcbiAgfTtcblxuICBwcm90by5fZ2V0Q29udGFpbmVyRml0V2lkdGggPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdW51c2VkQ29scyA9IDA7XG4gICAgLy8gY291bnQgdW51c2VkIGNvbHVtbnNcbiAgICB2YXIgaSA9IHRoaXMuY29scztcbiAgICB3aGlsZSAoIC0taSApIHtcbiAgICAgIGlmICggdGhpcy5jb2xZc1tpXSAhPT0gMCApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB1bnVzZWRDb2xzKys7XG4gICAgfVxuICAgIC8vIGZpdCBjb250YWluZXIgdG8gY29sdW1ucyB0aGF0IGhhdmUgYmVlbiB1c2VkXG4gICAgcmV0dXJuICggdGhpcy5jb2xzIC0gdW51c2VkQ29scyApICogdGhpcy5jb2x1bW5XaWR0aCAtIHRoaXMuZ3V0dGVyO1xuICB9O1xuXG4gIHByb3RvLm5lZWRzUmVzaXplTGF5b3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHByZXZpb3VzV2lkdGggPSB0aGlzLmNvbnRhaW5lcldpZHRoO1xuICAgIHRoaXMuZ2V0Q29udGFpbmVyV2lkdGgoKTtcbiAgICByZXR1cm4gcHJldmlvdXNXaWR0aCAhPSB0aGlzLmNvbnRhaW5lcldpZHRoO1xuICB9O1xuXG4gIHJldHVybiBNYXNvbnJ5O1xuXG59KSk7XG4iLCIvKipcbiAqIE91dGxheWVyIEl0ZW1cbiAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKiBnbG9iYWxzIGRlZmluZSwgbW9kdWxlLCByZXF1aXJlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EIC0gUmVxdWlyZUpTXG4gICAgZGVmaW5lKCBbXG4gICAgICAgICdldi1lbWl0dGVyL2V2LWVtaXR0ZXInLFxuICAgICAgICAnZ2V0LXNpemUvZ2V0LXNpemUnXG4gICAgICBdLFxuICAgICAgZmFjdG9yeVxuICAgICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlMgLSBCcm93c2VyaWZ5LCBXZWJwYWNrXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgcmVxdWlyZSgnZXYtZW1pdHRlcicpLFxuICAgICAgcmVxdWlyZSgnZ2V0LXNpemUnKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuT3V0bGF5ZXIgPSB7fTtcbiAgICB3aW5kb3cuT3V0bGF5ZXIuSXRlbSA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3cuRXZFbWl0dGVyLFxuICAgICAgd2luZG93LmdldFNpemVcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggRXZFbWl0dGVyLCBnZXRTaXplICkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyAtLS0tLSBoZWxwZXJzIC0tLS0tIC8vXG5cbmZ1bmN0aW9uIGlzRW1wdHlPYmooIG9iaiApIHtcbiAgZm9yICggdmFyIHByb3AgaW4gb2JqICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcm9wID0gbnVsbDtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENTUzMgc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5cbnZhciBkb2NFbGVtU3R5bGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGU7XG5cbnZhciB0cmFuc2l0aW9uUHJvcGVydHkgPSB0eXBlb2YgZG9jRWxlbVN0eWxlLnRyYW5zaXRpb24gPT0gJ3N0cmluZycgP1xuICAndHJhbnNpdGlvbicgOiAnV2Via2l0VHJhbnNpdGlvbic7XG52YXIgdHJhbnNmb3JtUHJvcGVydHkgPSB0eXBlb2YgZG9jRWxlbVN0eWxlLnRyYW5zZm9ybSA9PSAnc3RyaW5nJyA/XG4gICd0cmFuc2Zvcm0nIDogJ1dlYmtpdFRyYW5zZm9ybSc7XG5cbnZhciB0cmFuc2l0aW9uRW5kRXZlbnQgPSB7XG4gIFdlYmtpdFRyYW5zaXRpb246ICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcbiAgdHJhbnNpdGlvbjogJ3RyYW5zaXRpb25lbmQnXG59WyB0cmFuc2l0aW9uUHJvcGVydHkgXTtcblxuLy8gY2FjaGUgYWxsIHZlbmRvciBwcm9wZXJ0aWVzIHRoYXQgY291bGQgaGF2ZSB2ZW5kb3IgcHJlZml4XG52YXIgdmVuZG9yUHJvcGVydGllcyA9IHtcbiAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1Qcm9wZXJ0eSxcbiAgdHJhbnNpdGlvbjogdHJhbnNpdGlvblByb3BlcnR5LFxuICB0cmFuc2l0aW9uRHVyYXRpb246IHRyYW5zaXRpb25Qcm9wZXJ0eSArICdEdXJhdGlvbicsXG4gIHRyYW5zaXRpb25Qcm9wZXJ0eTogdHJhbnNpdGlvblByb3BlcnR5ICsgJ1Byb3BlcnR5JyxcbiAgdHJhbnNpdGlvbkRlbGF5OiB0cmFuc2l0aW9uUHJvcGVydHkgKyAnRGVsYXknXG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJdGVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmZ1bmN0aW9uIEl0ZW0oIGVsZW1lbnQsIGxheW91dCApIHtcbiAgaWYgKCAhZWxlbWVudCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAvLyBwYXJlbnQgbGF5b3V0IGNsYXNzLCBpLmUuIE1hc29ucnksIElzb3RvcGUsIG9yIFBhY2tlcnlcbiAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gIHRoaXMucG9zaXRpb24gPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgdGhpcy5fY3JlYXRlKCk7XG59XG5cbi8vIGluaGVyaXQgRXZFbWl0dGVyXG52YXIgcHJvdG8gPSBJdGVtLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV2RW1pdHRlci5wcm90b3R5cGUgKTtcbnByb3RvLmNvbnN0cnVjdG9yID0gSXRlbTtcblxucHJvdG8uX2NyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyB0cmFuc2l0aW9uIG9iamVjdHNcbiAgdGhpcy5fdHJhbnNuID0ge1xuICAgIGluZ1Byb3BlcnRpZXM6IHt9LFxuICAgIGNsZWFuOiB7fSxcbiAgICBvbkVuZDoge31cbiAgfTtcblxuICB0aGlzLmNzcyh7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZSdcbiAgfSk7XG59O1xuXG4vLyB0cmlnZ2VyIHNwZWNpZmllZCBoYW5kbGVyIGZvciBldmVudCB0eXBlXG5wcm90by5oYW5kbGVFdmVudCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIG1ldGhvZCA9ICdvbicgKyBldmVudC50eXBlO1xuICBpZiAoIHRoaXNbIG1ldGhvZCBdICkge1xuICAgIHRoaXNbIG1ldGhvZCBdKCBldmVudCApO1xuICB9XG59O1xuXG5wcm90by5nZXRTaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuc2l6ZSA9IGdldFNpemUoIHRoaXMuZWxlbWVudCApO1xufTtcblxuLyoqXG4gKiBhcHBseSBDU1Mgc3R5bGVzIHRvIGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZVxuICovXG5wcm90by5jc3MgPSBmdW5jdGlvbiggc3R5bGUgKSB7XG4gIHZhciBlbGVtU3R5bGUgPSB0aGlzLmVsZW1lbnQuc3R5bGU7XG5cbiAgZm9yICggdmFyIHByb3AgaW4gc3R5bGUgKSB7XG4gICAgLy8gdXNlIHZlbmRvciBwcm9wZXJ0eSBpZiBhdmFpbGFibGVcbiAgICB2YXIgc3VwcG9ydGVkUHJvcCA9IHZlbmRvclByb3BlcnRpZXNbIHByb3AgXSB8fCBwcm9wO1xuICAgIGVsZW1TdHlsZVsgc3VwcG9ydGVkUHJvcCBdID0gc3R5bGVbIHByb3AgXTtcbiAgfVxufTtcblxuIC8vIG1lYXN1cmUgcG9zaXRpb24sIGFuZCBzZXRzIGl0XG5wcm90by5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKCB0aGlzLmVsZW1lbnQgKTtcbiAgdmFyIGlzT3JpZ2luTGVmdCA9IHRoaXMubGF5b3V0Ll9nZXRPcHRpb24oJ29yaWdpbkxlZnQnKTtcbiAgdmFyIGlzT3JpZ2luVG9wID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignb3JpZ2luVG9wJyk7XG4gIHZhciB4VmFsdWUgPSBzdHlsZVsgaXNPcmlnaW5MZWZ0ID8gJ2xlZnQnIDogJ3JpZ2h0JyBdO1xuICB2YXIgeVZhbHVlID0gc3R5bGVbIGlzT3JpZ2luVG9wID8gJ3RvcCcgOiAnYm90dG9tJyBdO1xuICB2YXIgeCA9IHBhcnNlRmxvYXQoIHhWYWx1ZSApO1xuICB2YXIgeSA9IHBhcnNlRmxvYXQoIHlWYWx1ZSApO1xuICAvLyBjb252ZXJ0IHBlcmNlbnQgdG8gcGl4ZWxzXG4gIHZhciBsYXlvdXRTaXplID0gdGhpcy5sYXlvdXQuc2l6ZTtcbiAgaWYgKCB4VmFsdWUuaW5kZXhPZignJScpICE9IC0xICkge1xuICAgIHggPSAoIHggLyAxMDAgKSAqIGxheW91dFNpemUud2lkdGg7XG4gIH1cbiAgaWYgKCB5VmFsdWUuaW5kZXhPZignJScpICE9IC0xICkge1xuICAgIHkgPSAoIHkgLyAxMDAgKSAqIGxheW91dFNpemUuaGVpZ2h0O1xuICB9XG4gIC8vIGNsZWFuIHVwICdhdXRvJyBvciBvdGhlciBub24taW50ZWdlciB2YWx1ZXNcbiAgeCA9IGlzTmFOKCB4ICkgPyAwIDogeDtcbiAgeSA9IGlzTmFOKCB5ICkgPyAwIDogeTtcbiAgLy8gcmVtb3ZlIHBhZGRpbmcgZnJvbSBtZWFzdXJlbWVudFxuICB4IC09IGlzT3JpZ2luTGVmdCA/IGxheW91dFNpemUucGFkZGluZ0xlZnQgOiBsYXlvdXRTaXplLnBhZGRpbmdSaWdodDtcbiAgeSAtPSBpc09yaWdpblRvcCA/IGxheW91dFNpemUucGFkZGluZ1RvcCA6IGxheW91dFNpemUucGFkZGluZ0JvdHRvbTtcblxuICB0aGlzLnBvc2l0aW9uLnggPSB4O1xuICB0aGlzLnBvc2l0aW9uLnkgPSB5O1xufTtcblxuLy8gc2V0IHNldHRsZWQgcG9zaXRpb24sIGFwcGx5IHBhZGRpbmdcbnByb3RvLmxheW91dFBvc2l0aW9uID0gZnVuY3Rpb24oKSB7XG4gIHZhciBsYXlvdXRTaXplID0gdGhpcy5sYXlvdXQuc2l6ZTtcbiAgdmFyIHN0eWxlID0ge307XG4gIHZhciBpc09yaWdpbkxlZnQgPSB0aGlzLmxheW91dC5fZ2V0T3B0aW9uKCdvcmlnaW5MZWZ0Jyk7XG4gIHZhciBpc09yaWdpblRvcCA9IHRoaXMubGF5b3V0Ll9nZXRPcHRpb24oJ29yaWdpblRvcCcpO1xuXG4gIC8vIHhcbiAgdmFyIHhQYWRkaW5nID0gaXNPcmlnaW5MZWZ0ID8gJ3BhZGRpbmdMZWZ0JyA6ICdwYWRkaW5nUmlnaHQnO1xuICB2YXIgeFByb3BlcnR5ID0gaXNPcmlnaW5MZWZ0ID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgdmFyIHhSZXNldFByb3BlcnR5ID0gaXNPcmlnaW5MZWZ0ID8gJ3JpZ2h0JyA6ICdsZWZ0JztcblxuICB2YXIgeCA9IHRoaXMucG9zaXRpb24ueCArIGxheW91dFNpemVbIHhQYWRkaW5nIF07XG4gIC8vIHNldCBpbiBwZXJjZW50YWdlIG9yIHBpeGVsc1xuICBzdHlsZVsgeFByb3BlcnR5IF0gPSB0aGlzLmdldFhWYWx1ZSggeCApO1xuICAvLyByZXNldCBvdGhlciBwcm9wZXJ0eVxuICBzdHlsZVsgeFJlc2V0UHJvcGVydHkgXSA9ICcnO1xuXG4gIC8vIHlcbiAgdmFyIHlQYWRkaW5nID0gaXNPcmlnaW5Ub3AgPyAncGFkZGluZ1RvcCcgOiAncGFkZGluZ0JvdHRvbSc7XG4gIHZhciB5UHJvcGVydHkgPSBpc09yaWdpblRvcCA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gIHZhciB5UmVzZXRQcm9wZXJ0eSA9IGlzT3JpZ2luVG9wID8gJ2JvdHRvbScgOiAndG9wJztcblxuICB2YXIgeSA9IHRoaXMucG9zaXRpb24ueSArIGxheW91dFNpemVbIHlQYWRkaW5nIF07XG4gIC8vIHNldCBpbiBwZXJjZW50YWdlIG9yIHBpeGVsc1xuICBzdHlsZVsgeVByb3BlcnR5IF0gPSB0aGlzLmdldFlWYWx1ZSggeSApO1xuICAvLyByZXNldCBvdGhlciBwcm9wZXJ0eVxuICBzdHlsZVsgeVJlc2V0UHJvcGVydHkgXSA9ICcnO1xuXG4gIHRoaXMuY3NzKCBzdHlsZSApO1xuICB0aGlzLmVtaXRFdmVudCggJ2xheW91dCcsIFsgdGhpcyBdICk7XG59O1xuXG5wcm90by5nZXRYVmFsdWUgPSBmdW5jdGlvbiggeCApIHtcbiAgdmFyIGlzSG9yaXpvbnRhbCA9IHRoaXMubGF5b3V0Ll9nZXRPcHRpb24oJ2hvcml6b250YWwnKTtcbiAgcmV0dXJuIHRoaXMubGF5b3V0Lm9wdGlvbnMucGVyY2VudFBvc2l0aW9uICYmICFpc0hvcml6b250YWwgP1xuICAgICggKCB4IC8gdGhpcy5sYXlvdXQuc2l6ZS53aWR0aCApICogMTAwICkgKyAnJScgOiB4ICsgJ3B4Jztcbn07XG5cbnByb3RvLmdldFlWYWx1ZSA9IGZ1bmN0aW9uKCB5ICkge1xuICB2YXIgaXNIb3Jpem9udGFsID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignaG9yaXpvbnRhbCcpO1xuICByZXR1cm4gdGhpcy5sYXlvdXQub3B0aW9ucy5wZXJjZW50UG9zaXRpb24gJiYgaXNIb3Jpem9udGFsID9cbiAgICAoICggeSAvIHRoaXMubGF5b3V0LnNpemUuaGVpZ2h0ICkgKiAxMDAgKSArICclJyA6IHkgKyAncHgnO1xufTtcblxucHJvdG8uX3RyYW5zaXRpb25UbyA9IGZ1bmN0aW9uKCB4LCB5ICkge1xuICB0aGlzLmdldFBvc2l0aW9uKCk7XG4gIC8vIGdldCBjdXJyZW50IHggJiB5IGZyb20gdG9wL2xlZnRcbiAgdmFyIGN1clggPSB0aGlzLnBvc2l0aW9uLng7XG4gIHZhciBjdXJZID0gdGhpcy5wb3NpdGlvbi55O1xuXG4gIHZhciBkaWROb3RNb3ZlID0geCA9PSB0aGlzLnBvc2l0aW9uLnggJiYgeSA9PSB0aGlzLnBvc2l0aW9uLnk7XG5cbiAgLy8gc2F2ZSBlbmQgcG9zaXRpb25cbiAgdGhpcy5zZXRQb3NpdGlvbiggeCwgeSApO1xuXG4gIC8vIGlmIGRpZCBub3QgbW92ZSBhbmQgbm90IHRyYW5zaXRpb25pbmcsIGp1c3QgZ28gdG8gbGF5b3V0XG4gIGlmICggZGlkTm90TW92ZSAmJiAhdGhpcy5pc1RyYW5zaXRpb25pbmcgKSB7XG4gICAgdGhpcy5sYXlvdXRQb3NpdGlvbigpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0cmFuc1ggPSB4IC0gY3VyWDtcbiAgdmFyIHRyYW5zWSA9IHkgLSBjdXJZO1xuICB2YXIgdHJhbnNpdGlvblN0eWxlID0ge307XG4gIHRyYW5zaXRpb25TdHlsZS50cmFuc2Zvcm0gPSB0aGlzLmdldFRyYW5zbGF0ZSggdHJhbnNYLCB0cmFuc1kgKTtcblxuICB0aGlzLnRyYW5zaXRpb24oe1xuICAgIHRvOiB0cmFuc2l0aW9uU3R5bGUsXG4gICAgb25UcmFuc2l0aW9uRW5kOiB7XG4gICAgICB0cmFuc2Zvcm06IHRoaXMubGF5b3V0UG9zaXRpb25cbiAgICB9LFxuICAgIGlzQ2xlYW5pbmc6IHRydWVcbiAgfSk7XG59O1xuXG5wcm90by5nZXRUcmFuc2xhdGUgPSBmdW5jdGlvbiggeCwgeSApIHtcbiAgLy8gZmxpcCBjb29yaWRpbmF0ZXMgaWYgb3JpZ2luIG9uIHJpZ2h0IG9yIGJvdHRvbVxuICB2YXIgaXNPcmlnaW5MZWZ0ID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignb3JpZ2luTGVmdCcpO1xuICB2YXIgaXNPcmlnaW5Ub3AgPSB0aGlzLmxheW91dC5fZ2V0T3B0aW9uKCdvcmlnaW5Ub3AnKTtcbiAgeCA9IGlzT3JpZ2luTGVmdCA/IHggOiAteDtcbiAgeSA9IGlzT3JpZ2luVG9wID8geSA6IC15O1xuICByZXR1cm4gJ3RyYW5zbGF0ZTNkKCcgKyB4ICsgJ3B4LCAnICsgeSArICdweCwgMCknO1xufTtcblxuLy8gbm9uIHRyYW5zaXRpb24gKyB0cmFuc2Zvcm0gc3VwcG9ydFxucHJvdG8uZ29UbyA9IGZ1bmN0aW9uKCB4LCB5ICkge1xuICB0aGlzLnNldFBvc2l0aW9uKCB4LCB5ICk7XG4gIHRoaXMubGF5b3V0UG9zaXRpb24oKTtcbn07XG5cbnByb3RvLm1vdmVUbyA9IHByb3RvLl90cmFuc2l0aW9uVG87XG5cbnByb3RvLnNldFBvc2l0aW9uID0gZnVuY3Rpb24oIHgsIHkgKSB7XG4gIHRoaXMucG9zaXRpb24ueCA9IHBhcnNlRmxvYXQoIHggKTtcbiAgdGhpcy5wb3NpdGlvbi55ID0gcGFyc2VGbG9hdCggeSApO1xufTtcblxuLy8gLS0tLS0gdHJhbnNpdGlvbiAtLS0tLSAvL1xuXG4vKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZSAtIENTU1xuICogQHBhcmFtIHtGdW5jdGlvbn0gb25UcmFuc2l0aW9uRW5kXG4gKi9cblxuLy8gbm9uIHRyYW5zaXRpb24sIGp1c3QgdHJpZ2dlciBjYWxsYmFja1xucHJvdG8uX25vblRyYW5zaXRpb24gPSBmdW5jdGlvbiggYXJncyApIHtcbiAgdGhpcy5jc3MoIGFyZ3MudG8gKTtcbiAgaWYgKCBhcmdzLmlzQ2xlYW5pbmcgKSB7XG4gICAgdGhpcy5fcmVtb3ZlU3R5bGVzKCBhcmdzLnRvICk7XG4gIH1cbiAgZm9yICggdmFyIHByb3AgaW4gYXJncy5vblRyYW5zaXRpb25FbmQgKSB7XG4gICAgYXJncy5vblRyYW5zaXRpb25FbmRbIHByb3AgXS5jYWxsKCB0aGlzICk7XG4gIH1cbn07XG5cbi8qKlxuICogcHJvcGVyIHRyYW5zaXRpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIC0gYXJndW1lbnRzXG4gKiAgIEBwYXJhbSB7T2JqZWN0fSB0byAtIHN0eWxlIHRvIHRyYW5zaXRpb24gdG9cbiAqICAgQHBhcmFtIHtPYmplY3R9IGZyb20gLSBzdHlsZSB0byBzdGFydCB0cmFuc2l0aW9uIGZyb21cbiAqICAgQHBhcmFtIHtCb29sZWFufSBpc0NsZWFuaW5nIC0gcmVtb3ZlcyB0cmFuc2l0aW9uIHN0eWxlcyBhZnRlciB0cmFuc2l0aW9uXG4gKiAgIEBwYXJhbSB7RnVuY3Rpb259IG9uVHJhbnNpdGlvbkVuZCAtIGNhbGxiYWNrXG4gKi9cbnByb3RvLnRyYW5zaXRpb24gPSBmdW5jdGlvbiggYXJncyApIHtcbiAgLy8gcmVkaXJlY3QgdG8gbm9uVHJhbnNpdGlvbiBpZiBubyB0cmFuc2l0aW9uIGR1cmF0aW9uXG4gIGlmICggIXBhcnNlRmxvYXQoIHRoaXMubGF5b3V0Lm9wdGlvbnMudHJhbnNpdGlvbkR1cmF0aW9uICkgKSB7XG4gICAgdGhpcy5fbm9uVHJhbnNpdGlvbiggYXJncyApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBfdHJhbnNpdGlvbiA9IHRoaXMuX3RyYW5zbjtcbiAgLy8ga2VlcCB0cmFjayBvZiBvblRyYW5zaXRpb25FbmQgY2FsbGJhY2sgYnkgY3NzIHByb3BlcnR5XG4gIGZvciAoIHZhciBwcm9wIGluIGFyZ3Mub25UcmFuc2l0aW9uRW5kICkge1xuICAgIF90cmFuc2l0aW9uLm9uRW5kWyBwcm9wIF0gPSBhcmdzLm9uVHJhbnNpdGlvbkVuZFsgcHJvcCBdO1xuICB9XG4gIC8vIGtlZXAgdHJhY2sgb2YgcHJvcGVydGllcyB0aGF0IGFyZSB0cmFuc2l0aW9uaW5nXG4gIGZvciAoIHByb3AgaW4gYXJncy50byApIHtcbiAgICBfdHJhbnNpdGlvbi5pbmdQcm9wZXJ0aWVzWyBwcm9wIF0gPSB0cnVlO1xuICAgIC8vIGtlZXAgdHJhY2sgb2YgcHJvcGVydGllcyB0byBjbGVhbiB1cCB3aGVuIHRyYW5zaXRpb24gaXMgZG9uZVxuICAgIGlmICggYXJncy5pc0NsZWFuaW5nICkge1xuICAgICAgX3RyYW5zaXRpb24uY2xlYW5bIHByb3AgXSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gc2V0IGZyb20gc3R5bGVzXG4gIGlmICggYXJncy5mcm9tICkge1xuICAgIHRoaXMuY3NzKCBhcmdzLmZyb20gKTtcbiAgICAvLyBmb3JjZSByZWRyYXcuIGh0dHA6Ly9ibG9nLmFsZXhtYWNjYXcuY29tL2Nzcy10cmFuc2l0aW9uc1xuICAgIHZhciBoID0gdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodDtcbiAgICAvLyBoYWNrIGZvciBKU0hpbnQgdG8gaHVzaCBhYm91dCB1bnVzZWQgdmFyXG4gICAgaCA9IG51bGw7XG4gIH1cbiAgLy8gZW5hYmxlIHRyYW5zaXRpb25cbiAgdGhpcy5lbmFibGVUcmFuc2l0aW9uKCBhcmdzLnRvICk7XG4gIC8vIHNldCBzdHlsZXMgdGhhdCBhcmUgdHJhbnNpdGlvbmluZ1xuICB0aGlzLmNzcyggYXJncy50byApO1xuXG4gIHRoaXMuaXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcblxufTtcblxuLy8gZGFzaCBiZWZvcmUgYWxsIGNhcCBsZXR0ZXJzLCBpbmNsdWRpbmcgZmlyc3QgZm9yXG4vLyBXZWJraXRUcmFuc2Zvcm0gPT4gLXdlYmtpdC10cmFuc2Zvcm1cbmZ1bmN0aW9uIHRvRGFzaGVkQWxsKCBzdHIgKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSggLyhbQS1aXSkvZywgZnVuY3Rpb24oICQxICkge1xuICAgIHJldHVybiAnLScgKyAkMS50b0xvd2VyQ2FzZSgpO1xuICB9KTtcbn1cblxudmFyIHRyYW5zaXRpb25Qcm9wcyA9ICdvcGFjaXR5LCcgKyB0b0Rhc2hlZEFsbCggdHJhbnNmb3JtUHJvcGVydHkgKTtcblxucHJvdG8uZW5hYmxlVHJhbnNpdGlvbiA9IGZ1bmN0aW9uKC8qIHN0eWxlICovKSB7XG4gIC8vIEhBQ0sgY2hhbmdpbmcgdHJhbnNpdGlvblByb3BlcnR5IGR1cmluZyBhIHRyYW5zaXRpb25cbiAgLy8gd2lsbCBjYXVzZSB0cmFuc2l0aW9uIHRvIGp1bXBcbiAgaWYgKCB0aGlzLmlzVHJhbnNpdGlvbmluZyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBtYWtlIGB0cmFuc2l0aW9uOiBmb28sIGJhciwgYmF6YCBmcm9tIHN0eWxlIG9iamVjdFxuICAvLyBIQUNLIHVuLWNvbW1lbnQgdGhpcyB3aGVuIGVuYWJsZVRyYW5zaXRpb24gY2FuIHdvcmtcbiAgLy8gd2hpbGUgYSB0cmFuc2l0aW9uIGlzIGhhcHBlbmluZ1xuICAvLyB2YXIgdHJhbnNpdGlvblZhbHVlcyA9IFtdO1xuICAvLyBmb3IgKCB2YXIgcHJvcCBpbiBzdHlsZSApIHtcbiAgLy8gICAvLyBkYXNoLWlmeSBjYW1lbENhc2VkIHByb3BlcnRpZXMgbGlrZSBXZWJraXRUcmFuc2l0aW9uXG4gIC8vICAgcHJvcCA9IHZlbmRvclByb3BlcnRpZXNbIHByb3AgXSB8fCBwcm9wO1xuICAvLyAgIHRyYW5zaXRpb25WYWx1ZXMucHVzaCggdG9EYXNoZWRBbGwoIHByb3AgKSApO1xuICAvLyB9XG4gIC8vIG11bmdlIG51bWJlciB0byBtaWxsaXNlY29uZCwgdG8gbWF0Y2ggc3RhZ2dlclxuICB2YXIgZHVyYXRpb24gPSB0aGlzLmxheW91dC5vcHRpb25zLnRyYW5zaXRpb25EdXJhdGlvbjtcbiAgZHVyYXRpb24gPSB0eXBlb2YgZHVyYXRpb24gPT0gJ251bWJlcicgPyBkdXJhdGlvbiArICdtcycgOiBkdXJhdGlvbjtcbiAgLy8gZW5hYmxlIHRyYW5zaXRpb24gc3R5bGVzXG4gIHRoaXMuY3NzKHtcbiAgICB0cmFuc2l0aW9uUHJvcGVydHk6IHRyYW5zaXRpb25Qcm9wcyxcbiAgICB0cmFuc2l0aW9uRHVyYXRpb246IGR1cmF0aW9uLFxuICAgIHRyYW5zaXRpb25EZWxheTogdGhpcy5zdGFnZ2VyRGVsYXkgfHwgMFxuICB9KTtcbiAgLy8gbGlzdGVuIGZvciB0cmFuc2l0aW9uIGVuZCBldmVudFxuICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHJhbnNpdGlvbkVuZEV2ZW50LCB0aGlzLCBmYWxzZSApO1xufTtcblxuLy8gLS0tLS0gZXZlbnRzIC0tLS0tIC8vXG5cbnByb3RvLm9ud2Via2l0VHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdGhpcy5vbnRyYW5zaXRpb25lbmQoIGV2ZW50ICk7XG59O1xuXG5wcm90by5vbm90cmFuc2l0aW9uZW5kID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB0aGlzLm9udHJhbnNpdGlvbmVuZCggZXZlbnQgKTtcbn07XG5cbi8vIHByb3BlcnRpZXMgdGhhdCBJIG11bmdlIHRvIG1ha2UgbXkgbGlmZSBlYXNpZXJcbnZhciBkYXNoZWRWZW5kb3JQcm9wZXJ0aWVzID0ge1xuICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAndHJhbnNmb3JtJ1xufTtcblxucHJvdG8ub250cmFuc2l0aW9uZW5kID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICAvLyBkaXNyZWdhcmQgYnViYmxlZCBldmVudHMgZnJvbSBjaGlsZHJlblxuICBpZiAoIGV2ZW50LnRhcmdldCAhPT0gdGhpcy5lbGVtZW50ICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgX3RyYW5zaXRpb24gPSB0aGlzLl90cmFuc247XG4gIC8vIGdldCBwcm9wZXJ0eSBuYW1lIG9mIHRyYW5zaXRpb25lZCBwcm9wZXJ0eSwgY29udmVydCB0byBwcmVmaXgtZnJlZVxuICB2YXIgcHJvcGVydHlOYW1lID0gZGFzaGVkVmVuZG9yUHJvcGVydGllc1sgZXZlbnQucHJvcGVydHlOYW1lIF0gfHwgZXZlbnQucHJvcGVydHlOYW1lO1xuXG4gIC8vIHJlbW92ZSBwcm9wZXJ0eSB0aGF0IGhhcyBjb21wbGV0ZWQgdHJhbnNpdGlvbmluZ1xuICBkZWxldGUgX3RyYW5zaXRpb24uaW5nUHJvcGVydGllc1sgcHJvcGVydHlOYW1lIF07XG4gIC8vIGNoZWNrIGlmIGFueSBwcm9wZXJ0aWVzIGFyZSBzdGlsbCB0cmFuc2l0aW9uaW5nXG4gIGlmICggaXNFbXB0eU9iaiggX3RyYW5zaXRpb24uaW5nUHJvcGVydGllcyApICkge1xuICAgIC8vIGFsbCBwcm9wZXJ0aWVzIGhhdmUgY29tcGxldGVkIHRyYW5zaXRpb25pbmdcbiAgICB0aGlzLmRpc2FibGVUcmFuc2l0aW9uKCk7XG4gIH1cbiAgLy8gY2xlYW4gc3R5bGVcbiAgaWYgKCBwcm9wZXJ0eU5hbWUgaW4gX3RyYW5zaXRpb24uY2xlYW4gKSB7XG4gICAgLy8gY2xlYW4gdXAgc3R5bGVcbiAgICB0aGlzLmVsZW1lbnQuc3R5bGVbIGV2ZW50LnByb3BlcnR5TmFtZSBdID0gJyc7XG4gICAgZGVsZXRlIF90cmFuc2l0aW9uLmNsZWFuWyBwcm9wZXJ0eU5hbWUgXTtcbiAgfVxuICAvLyB0cmlnZ2VyIG9uVHJhbnNpdGlvbkVuZCBjYWxsYmFja1xuICBpZiAoIHByb3BlcnR5TmFtZSBpbiBfdHJhbnNpdGlvbi5vbkVuZCApIHtcbiAgICB2YXIgb25UcmFuc2l0aW9uRW5kID0gX3RyYW5zaXRpb24ub25FbmRbIHByb3BlcnR5TmFtZSBdO1xuICAgIG9uVHJhbnNpdGlvbkVuZC5jYWxsKCB0aGlzICk7XG4gICAgZGVsZXRlIF90cmFuc2l0aW9uLm9uRW5kWyBwcm9wZXJ0eU5hbWUgXTtcbiAgfVxuXG4gIHRoaXMuZW1pdEV2ZW50KCAndHJhbnNpdGlvbkVuZCcsIFsgdGhpcyBdICk7XG59O1xuXG5wcm90by5kaXNhYmxlVHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnJlbW92ZVRyYW5zaXRpb25TdHlsZXMoKTtcbiAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHRyYW5zaXRpb25FbmRFdmVudCwgdGhpcywgZmFsc2UgKTtcbiAgdGhpcy5pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbn07XG5cbi8qKlxuICogcmVtb3ZlcyBzdHlsZSBwcm9wZXJ0eSBmcm9tIGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdHlsZVxuKiovXG5wcm90by5fcmVtb3ZlU3R5bGVzID0gZnVuY3Rpb24oIHN0eWxlICkge1xuICAvLyBjbGVhbiB1cCB0cmFuc2l0aW9uIHN0eWxlc1xuICB2YXIgY2xlYW5TdHlsZSA9IHt9O1xuICBmb3IgKCB2YXIgcHJvcCBpbiBzdHlsZSApIHtcbiAgICBjbGVhblN0eWxlWyBwcm9wIF0gPSAnJztcbiAgfVxuICB0aGlzLmNzcyggY2xlYW5TdHlsZSApO1xufTtcblxudmFyIGNsZWFuVHJhbnNpdGlvblN0eWxlID0ge1xuICB0cmFuc2l0aW9uUHJvcGVydHk6ICcnLFxuICB0cmFuc2l0aW9uRHVyYXRpb246ICcnLFxuICB0cmFuc2l0aW9uRGVsYXk6ICcnXG59O1xuXG5wcm90by5yZW1vdmVUcmFuc2l0aW9uU3R5bGVzID0gZnVuY3Rpb24oKSB7XG4gIC8vIHJlbW92ZSB0cmFuc2l0aW9uXG4gIHRoaXMuY3NzKCBjbGVhblRyYW5zaXRpb25TdHlsZSApO1xufTtcblxuLy8gLS0tLS0gc3RhZ2dlciAtLS0tLSAvL1xuXG5wcm90by5zdGFnZ2VyID0gZnVuY3Rpb24oIGRlbGF5ICkge1xuICBkZWxheSA9IGlzTmFOKCBkZWxheSApID8gMCA6IGRlbGF5O1xuICB0aGlzLnN0YWdnZXJEZWxheSA9IGRlbGF5ICsgJ21zJztcbn07XG5cbi8vIC0tLS0tIHNob3cvaGlkZS9yZW1vdmUgLS0tLS0gLy9cblxuLy8gcmVtb3ZlIGVsZW1lbnQgZnJvbSBET01cbnByb3RvLnJlbW92ZUVsZW0gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRoaXMuZWxlbWVudCApO1xuICAvLyByZW1vdmUgZGlzcGxheTogbm9uZVxuICB0aGlzLmNzcyh7IGRpc3BsYXk6ICcnIH0pO1xuICB0aGlzLmVtaXRFdmVudCggJ3JlbW92ZScsIFsgdGhpcyBdICk7XG59O1xuXG5wcm90by5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgLy8ganVzdCByZW1vdmUgZWxlbWVudCBpZiBubyB0cmFuc2l0aW9uIHN1cHBvcnQgb3Igbm8gdHJhbnNpdGlvblxuICBpZiAoICF0cmFuc2l0aW9uUHJvcGVydHkgfHwgIXBhcnNlRmxvYXQoIHRoaXMubGF5b3V0Lm9wdGlvbnMudHJhbnNpdGlvbkR1cmF0aW9uICkgKSB7XG4gICAgdGhpcy5yZW1vdmVFbGVtKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gc3RhcnQgdHJhbnNpdGlvblxuICB0aGlzLm9uY2UoICd0cmFuc2l0aW9uRW5kJywgZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5yZW1vdmVFbGVtKCk7XG4gIH0pO1xuICB0aGlzLmhpZGUoKTtcbn07XG5cbnByb3RvLnJldmVhbCA9IGZ1bmN0aW9uKCkge1xuICBkZWxldGUgdGhpcy5pc0hpZGRlbjtcbiAgLy8gcmVtb3ZlIGRpc3BsYXk6IG5vbmVcbiAgdGhpcy5jc3MoeyBkaXNwbGF5OiAnJyB9KTtcblxuICB2YXIgb3B0aW9ucyA9IHRoaXMubGF5b3V0Lm9wdGlvbnM7XG5cbiAgdmFyIG9uVHJhbnNpdGlvbkVuZCA9IHt9O1xuICB2YXIgdHJhbnNpdGlvbkVuZFByb3BlcnR5ID0gdGhpcy5nZXRIaWRlUmV2ZWFsVHJhbnNpdGlvbkVuZFByb3BlcnR5KCd2aXNpYmxlU3R5bGUnKTtcbiAgb25UcmFuc2l0aW9uRW5kWyB0cmFuc2l0aW9uRW5kUHJvcGVydHkgXSA9IHRoaXMub25SZXZlYWxUcmFuc2l0aW9uRW5kO1xuXG4gIHRoaXMudHJhbnNpdGlvbih7XG4gICAgZnJvbTogb3B0aW9ucy5oaWRkZW5TdHlsZSxcbiAgICB0bzogb3B0aW9ucy52aXNpYmxlU3R5bGUsXG4gICAgaXNDbGVhbmluZzogdHJ1ZSxcbiAgICBvblRyYW5zaXRpb25FbmQ6IG9uVHJhbnNpdGlvbkVuZFxuICB9KTtcbn07XG5cbnByb3RvLm9uUmV2ZWFsVHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uKCkge1xuICAvLyBjaGVjayBpZiBzdGlsbCB2aXNpYmxlXG4gIC8vIGR1cmluZyB0cmFuc2l0aW9uLCBpdGVtIG1heSBoYXZlIGJlZW4gaGlkZGVuXG4gIGlmICggIXRoaXMuaXNIaWRkZW4gKSB7XG4gICAgdGhpcy5lbWl0RXZlbnQoJ3JldmVhbCcpO1xuICB9XG59O1xuXG4vKipcbiAqIGdldCBzdHlsZSBwcm9wZXJ0eSB1c2UgZm9yIGhpZGUvcmV2ZWFsIHRyYW5zaXRpb24gZW5kXG4gKiBAcGFyYW0ge1N0cmluZ30gc3R5bGVQcm9wZXJ0eSAtIGhpZGRlblN0eWxlL3Zpc2libGVTdHlsZVxuICogQHJldHVybnMge1N0cmluZ31cbiAqL1xucHJvdG8uZ2V0SGlkZVJldmVhbFRyYW5zaXRpb25FbmRQcm9wZXJ0eSA9IGZ1bmN0aW9uKCBzdHlsZVByb3BlcnR5ICkge1xuICB2YXIgb3B0aW9uU3R5bGUgPSB0aGlzLmxheW91dC5vcHRpb25zWyBzdHlsZVByb3BlcnR5IF07XG4gIC8vIHVzZSBvcGFjaXR5XG4gIGlmICggb3B0aW9uU3R5bGUub3BhY2l0eSApIHtcbiAgICByZXR1cm4gJ29wYWNpdHknO1xuICB9XG4gIC8vIGdldCBmaXJzdCBwcm9wZXJ0eVxuICBmb3IgKCB2YXIgcHJvcCBpbiBvcHRpb25TdHlsZSApIHtcbiAgICByZXR1cm4gcHJvcDtcbiAgfVxufTtcblxucHJvdG8uaGlkZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBzZXQgZmxhZ1xuICB0aGlzLmlzSGlkZGVuID0gdHJ1ZTtcbiAgLy8gcmVtb3ZlIGRpc3BsYXk6IG5vbmVcbiAgdGhpcy5jc3MoeyBkaXNwbGF5OiAnJyB9KTtcblxuICB2YXIgb3B0aW9ucyA9IHRoaXMubGF5b3V0Lm9wdGlvbnM7XG5cbiAgdmFyIG9uVHJhbnNpdGlvbkVuZCA9IHt9O1xuICB2YXIgdHJhbnNpdGlvbkVuZFByb3BlcnR5ID0gdGhpcy5nZXRIaWRlUmV2ZWFsVHJhbnNpdGlvbkVuZFByb3BlcnR5KCdoaWRkZW5TdHlsZScpO1xuICBvblRyYW5zaXRpb25FbmRbIHRyYW5zaXRpb25FbmRQcm9wZXJ0eSBdID0gdGhpcy5vbkhpZGVUcmFuc2l0aW9uRW5kO1xuXG4gIHRoaXMudHJhbnNpdGlvbih7XG4gICAgZnJvbTogb3B0aW9ucy52aXNpYmxlU3R5bGUsXG4gICAgdG86IG9wdGlvbnMuaGlkZGVuU3R5bGUsXG4gICAgLy8ga2VlcCBoaWRkZW4gc3R1ZmYgaGlkZGVuXG4gICAgaXNDbGVhbmluZzogdHJ1ZSxcbiAgICBvblRyYW5zaXRpb25FbmQ6IG9uVHJhbnNpdGlvbkVuZFxuICB9KTtcbn07XG5cbnByb3RvLm9uSGlkZVRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbigpIHtcbiAgLy8gY2hlY2sgaWYgc3RpbGwgaGlkZGVuXG4gIC8vIGR1cmluZyB0cmFuc2l0aW9uLCBpdGVtIG1heSBoYXZlIGJlZW4gdW4taGlkZGVuXG4gIGlmICggdGhpcy5pc0hpZGRlbiApIHtcbiAgICB0aGlzLmNzcyh7IGRpc3BsYXk6ICdub25lJyB9KTtcbiAgICB0aGlzLmVtaXRFdmVudCgnaGlkZScpO1xuICB9XG59O1xuXG5wcm90by5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuY3NzKHtcbiAgICBwb3NpdGlvbjogJycsXG4gICAgbGVmdDogJycsXG4gICAgcmlnaHQ6ICcnLFxuICAgIHRvcDogJycsXG4gICAgYm90dG9tOiAnJyxcbiAgICB0cmFuc2l0aW9uOiAnJyxcbiAgICB0cmFuc2Zvcm06ICcnXG4gIH0pO1xufTtcblxucmV0dXJuIEl0ZW07XG5cbn0pKTtcbiIsIi8qIVxuICogT3V0bGF5ZXIgdjIuMS4xXG4gKiB0aGUgYnJhaW5zIGFuZCBndXRzIG9mIGEgbGF5b3V0IGxpYnJhcnlcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAndXNlIHN0cmljdCc7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKiBnbG9iYWxzIGRlZmluZSwgbW9kdWxlLCByZXF1aXJlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EIC0gUmVxdWlyZUpTXG4gICAgZGVmaW5lKCBbXG4gICAgICAgICdldi1lbWl0dGVyL2V2LWVtaXR0ZXInLFxuICAgICAgICAnZ2V0LXNpemUvZ2V0LXNpemUnLFxuICAgICAgICAnZml6enktdWktdXRpbHMvdXRpbHMnLFxuICAgICAgICAnLi9pdGVtJ1xuICAgICAgXSxcbiAgICAgIGZ1bmN0aW9uKCBFdkVtaXR0ZXIsIGdldFNpemUsIHV0aWxzLCBJdGVtICkge1xuICAgICAgICByZXR1cm4gZmFjdG9yeSggd2luZG93LCBFdkVtaXR0ZXIsIGdldFNpemUsIHV0aWxzLCBJdGVtKTtcbiAgICAgIH1cbiAgICApO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTIC0gQnJvd3NlcmlmeSwgV2VicGFja1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHJlcXVpcmUoJ2V2LWVtaXR0ZXInKSxcbiAgICAgIHJlcXVpcmUoJ2dldC1zaXplJyksXG4gICAgICByZXF1aXJlKCdmaXp6eS11aS11dGlscycpLFxuICAgICAgcmVxdWlyZSgnLi9pdGVtJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93Lk91dGxheWVyID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHdpbmRvdy5FdkVtaXR0ZXIsXG4gICAgICB3aW5kb3cuZ2V0U2l6ZSxcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHMsXG4gICAgICB3aW5kb3cuT3V0bGF5ZXIuSXRlbVxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIEV2RW1pdHRlciwgZ2V0U2l6ZSwgdXRpbHMsIEl0ZW0gKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIC0tLS0tIHZhcnMgLS0tLS0gLy9cblxudmFyIGNvbnNvbGUgPSB3aW5kb3cuY29uc29sZTtcbnZhciBqUXVlcnkgPSB3aW5kb3cualF1ZXJ5O1xudmFyIG5vb3AgPSBmdW5jdGlvbigpIHt9O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPdXRsYXllciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyBnbG9iYWxseSB1bmlxdWUgaWRlbnRpZmllcnNcbnZhciBHVUlEID0gMDtcbi8vIGludGVybmFsIHN0b3JlIG9mIGFsbCBPdXRsYXllciBpbnRhbmNlc1xudmFyIGluc3RhbmNlcyA9IHt9O1xuXG5cbi8qKlxuICogQHBhcmFtIHtFbGVtZW50LCBTdHJpbmd9IGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gT3V0bGF5ZXIoIGVsZW1lbnQsIG9wdGlvbnMgKSB7XG4gIHZhciBxdWVyeUVsZW1lbnQgPSB1dGlscy5nZXRRdWVyeUVsZW1lbnQoIGVsZW1lbnQgKTtcbiAgaWYgKCAhcXVlcnlFbGVtZW50ICkge1xuICAgIGlmICggY29uc29sZSApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoICdCYWQgZWxlbWVudCBmb3IgJyArIHRoaXMuY29uc3RydWN0b3IubmFtZXNwYWNlICtcbiAgICAgICAgJzogJyArICggcXVlcnlFbGVtZW50IHx8IGVsZW1lbnQgKSApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5lbGVtZW50ID0gcXVlcnlFbGVtZW50O1xuICAvLyBhZGQgalF1ZXJ5XG4gIGlmICggalF1ZXJ5ICkge1xuICAgIHRoaXMuJGVsZW1lbnQgPSBqUXVlcnkoIHRoaXMuZWxlbWVudCApO1xuICB9XG5cbiAgLy8gb3B0aW9uc1xuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5leHRlbmQoIHt9LCB0aGlzLmNvbnN0cnVjdG9yLmRlZmF1bHRzICk7XG4gIHRoaXMub3B0aW9uKCBvcHRpb25zICk7XG5cbiAgLy8gYWRkIGlkIGZvciBPdXRsYXllci5nZXRGcm9tRWxlbWVudFxuICB2YXIgaWQgPSArK0dVSUQ7XG4gIHRoaXMuZWxlbWVudC5vdXRsYXllckdVSUQgPSBpZDsgLy8gZXhwYW5kb1xuICBpbnN0YW5jZXNbIGlkIF0gPSB0aGlzOyAvLyBhc3NvY2lhdGUgdmlhIGlkXG5cbiAgLy8ga2ljayBpdCBvZmZcbiAgdGhpcy5fY3JlYXRlKCk7XG5cbiAgdmFyIGlzSW5pdExheW91dCA9IHRoaXMuX2dldE9wdGlvbignaW5pdExheW91dCcpO1xuICBpZiAoIGlzSW5pdExheW91dCApIHtcbiAgICB0aGlzLmxheW91dCgpO1xuICB9XG59XG5cbi8vIHNldHRpbmdzIGFyZSBmb3IgaW50ZXJuYWwgdXNlIG9ubHlcbk91dGxheWVyLm5hbWVzcGFjZSA9ICdvdXRsYXllcic7XG5PdXRsYXllci5JdGVtID0gSXRlbTtcblxuLy8gZGVmYXVsdCBvcHRpb25zXG5PdXRsYXllci5kZWZhdWx0cyA9IHtcbiAgY29udGFpbmVyU3R5bGU6IHtcbiAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuICB9LFxuICBpbml0TGF5b3V0OiB0cnVlLFxuICBvcmlnaW5MZWZ0OiB0cnVlLFxuICBvcmlnaW5Ub3A6IHRydWUsXG4gIHJlc2l6ZTogdHJ1ZSxcbiAgcmVzaXplQ29udGFpbmVyOiB0cnVlLFxuICAvLyBpdGVtIG9wdGlvbnNcbiAgdHJhbnNpdGlvbkR1cmF0aW9uOiAnMC40cycsXG4gIGhpZGRlblN0eWxlOiB7XG4gICAgb3BhY2l0eTogMCxcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjAwMSknXG4gIH0sXG4gIHZpc2libGVTdHlsZToge1xuICAgIG9wYWNpdHk6IDEsXG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknXG4gIH1cbn07XG5cbnZhciBwcm90byA9IE91dGxheWVyLnByb3RvdHlwZTtcbi8vIGluaGVyaXQgRXZFbWl0dGVyXG51dGlscy5leHRlbmQoIHByb3RvLCBFdkVtaXR0ZXIucHJvdG90eXBlICk7XG5cbi8qKlxuICogc2V0IG9wdGlvbnNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzXG4gKi9cbnByb3RvLm9wdGlvbiA9IGZ1bmN0aW9uKCBvcHRzICkge1xuICB1dGlscy5leHRlbmQoIHRoaXMub3B0aW9ucywgb3B0cyApO1xufTtcblxuLyoqXG4gKiBnZXQgYmFja3dhcmRzIGNvbXBhdGlibGUgb3B0aW9uIHZhbHVlLCBjaGVjayBvbGQgbmFtZVxuICovXG5wcm90by5fZ2V0T3B0aW9uID0gZnVuY3Rpb24oIG9wdGlvbiApIHtcbiAgdmFyIG9sZE9wdGlvbiA9IHRoaXMuY29uc3RydWN0b3IuY29tcGF0T3B0aW9uc1sgb3B0aW9uIF07XG4gIHJldHVybiBvbGRPcHRpb24gJiYgdGhpcy5vcHRpb25zWyBvbGRPcHRpb24gXSAhPT0gdW5kZWZpbmVkID9cbiAgICB0aGlzLm9wdGlvbnNbIG9sZE9wdGlvbiBdIDogdGhpcy5vcHRpb25zWyBvcHRpb24gXTtcbn07XG5cbk91dGxheWVyLmNvbXBhdE9wdGlvbnMgPSB7XG4gIC8vIGN1cnJlbnROYW1lOiBvbGROYW1lXG4gIGluaXRMYXlvdXQ6ICdpc0luaXRMYXlvdXQnLFxuICBob3Jpem9udGFsOiAnaXNIb3Jpem9udGFsJyxcbiAgbGF5b3V0SW5zdGFudDogJ2lzTGF5b3V0SW5zdGFudCcsXG4gIG9yaWdpbkxlZnQ6ICdpc09yaWdpbkxlZnQnLFxuICBvcmlnaW5Ub3A6ICdpc09yaWdpblRvcCcsXG4gIHJlc2l6ZTogJ2lzUmVzaXplQm91bmQnLFxuICByZXNpemVDb250YWluZXI6ICdpc1Jlc2l6aW5nQ29udGFpbmVyJ1xufTtcblxucHJvdG8uX2NyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBnZXQgaXRlbXMgZnJvbSBjaGlsZHJlblxuICB0aGlzLnJlbG9hZEl0ZW1zKCk7XG4gIC8vIGVsZW1lbnRzIHRoYXQgYWZmZWN0IGxheW91dCwgYnV0IGFyZSBub3QgbGFpZCBvdXRcbiAgdGhpcy5zdGFtcHMgPSBbXTtcbiAgdGhpcy5zdGFtcCggdGhpcy5vcHRpb25zLnN0YW1wICk7XG4gIC8vIHNldCBjb250YWluZXIgc3R5bGVcbiAgdXRpbHMuZXh0ZW5kKCB0aGlzLmVsZW1lbnQuc3R5bGUsIHRoaXMub3B0aW9ucy5jb250YWluZXJTdHlsZSApO1xuXG4gIC8vIGJpbmQgcmVzaXplIG1ldGhvZFxuICB2YXIgY2FuQmluZFJlc2l6ZSA9IHRoaXMuX2dldE9wdGlvbigncmVzaXplJyk7XG4gIGlmICggY2FuQmluZFJlc2l6ZSApIHtcbiAgICB0aGlzLmJpbmRSZXNpemUoKTtcbiAgfVxufTtcblxuLy8gZ29lcyB0aHJvdWdoIGFsbCBjaGlsZHJlbiBhZ2FpbiBhbmQgZ2V0cyBicmlja3MgaW4gcHJvcGVyIG9yZGVyXG5wcm90by5yZWxvYWRJdGVtcyA9IGZ1bmN0aW9uKCkge1xuICAvLyBjb2xsZWN0aW9uIG9mIGl0ZW0gZWxlbWVudHNcbiAgdGhpcy5pdGVtcyA9IHRoaXMuX2l0ZW1pemUoIHRoaXMuZWxlbWVudC5jaGlsZHJlbiApO1xufTtcblxuXG4vKipcbiAqIHR1cm4gZWxlbWVudHMgaW50byBPdXRsYXllci5JdGVtcyB0byBiZSB1c2VkIGluIGxheW91dFxuICogQHBhcmFtIHtBcnJheSBvciBOb2RlTGlzdCBvciBIVE1MRWxlbWVudH0gZWxlbXNcbiAqIEByZXR1cm5zIHtBcnJheX0gaXRlbXMgLSBjb2xsZWN0aW9uIG9mIG5ldyBPdXRsYXllciBJdGVtc1xuICovXG5wcm90by5faXRlbWl6ZSA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuICB2YXIgaXRlbUVsZW1zID0gdGhpcy5fZmlsdGVyRmluZEl0ZW1FbGVtZW50cyggZWxlbXMgKTtcbiAgdmFyIEl0ZW0gPSB0aGlzLmNvbnN0cnVjdG9yLkl0ZW07XG5cbiAgLy8gY3JlYXRlIG5ldyBPdXRsYXllciBJdGVtcyBmb3IgY29sbGVjdGlvblxuICB2YXIgaXRlbXMgPSBbXTtcbiAgZm9yICggdmFyIGk9MDsgaSA8IGl0ZW1FbGVtcy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgZWxlbSA9IGl0ZW1FbGVtc1tpXTtcbiAgICB2YXIgaXRlbSA9IG5ldyBJdGVtKCBlbGVtLCB0aGlzICk7XG4gICAgaXRlbXMucHVzaCggaXRlbSApO1xuICB9XG5cbiAgcmV0dXJuIGl0ZW1zO1xufTtcblxuLyoqXG4gKiBnZXQgaXRlbSBlbGVtZW50cyB0byBiZSB1c2VkIGluIGxheW91dFxuICogQHBhcmFtIHtBcnJheSBvciBOb2RlTGlzdCBvciBIVE1MRWxlbWVudH0gZWxlbXNcbiAqIEByZXR1cm5zIHtBcnJheX0gaXRlbXMgLSBpdGVtIGVsZW1lbnRzXG4gKi9cbnByb3RvLl9maWx0ZXJGaW5kSXRlbUVsZW1lbnRzID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICByZXR1cm4gdXRpbHMuZmlsdGVyRmluZEVsZW1lbnRzKCBlbGVtcywgdGhpcy5vcHRpb25zLml0ZW1TZWxlY3RvciApO1xufTtcblxuLyoqXG4gKiBnZXR0ZXIgbWV0aG9kIGZvciBnZXR0aW5nIGl0ZW0gZWxlbWVudHNcbiAqIEByZXR1cm5zIHtBcnJheX0gZWxlbXMgLSBjb2xsZWN0aW9uIG9mIGl0ZW0gZWxlbWVudHNcbiAqL1xucHJvdG8uZ2V0SXRlbUVsZW1lbnRzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLml0ZW1zLm1hcCggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgcmV0dXJuIGl0ZW0uZWxlbWVudDtcbiAgfSk7XG59O1xuXG4vLyAtLS0tLSBpbml0ICYgbGF5b3V0IC0tLS0tIC8vXG5cbi8qKlxuICogbGF5cyBvdXQgYWxsIGl0ZW1zXG4gKi9cbnByb3RvLmxheW91dCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9yZXNldExheW91dCgpO1xuICB0aGlzLl9tYW5hZ2VTdGFtcHMoKTtcblxuICAvLyBkb24ndCBhbmltYXRlIGZpcnN0IGxheW91dFxuICB2YXIgbGF5b3V0SW5zdGFudCA9IHRoaXMuX2dldE9wdGlvbignbGF5b3V0SW5zdGFudCcpO1xuICB2YXIgaXNJbnN0YW50ID0gbGF5b3V0SW5zdGFudCAhPT0gdW5kZWZpbmVkID9cbiAgICBsYXlvdXRJbnN0YW50IDogIXRoaXMuX2lzTGF5b3V0SW5pdGVkO1xuICB0aGlzLmxheW91dEl0ZW1zKCB0aGlzLml0ZW1zLCBpc0luc3RhbnQgKTtcblxuICAvLyBmbGFnIGZvciBpbml0YWxpemVkXG4gIHRoaXMuX2lzTGF5b3V0SW5pdGVkID0gdHJ1ZTtcbn07XG5cbi8vIF9pbml0IGlzIGFsaWFzIGZvciBsYXlvdXRcbnByb3RvLl9pbml0ID0gcHJvdG8ubGF5b3V0O1xuXG4vKipcbiAqIGxvZ2ljIGJlZm9yZSBhbnkgbmV3IGxheW91dFxuICovXG5wcm90by5fcmVzZXRMYXlvdXQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5nZXRTaXplKCk7XG59O1xuXG5cbnByb3RvLmdldFNpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zaXplID0gZ2V0U2l6ZSggdGhpcy5lbGVtZW50ICk7XG59O1xuXG4vKipcbiAqIGdldCBtZWFzdXJlbWVudCBmcm9tIG9wdGlvbiwgZm9yIGNvbHVtbldpZHRoLCByb3dIZWlnaHQsIGd1dHRlclxuICogaWYgb3B0aW9uIGlzIFN0cmluZyAtPiBnZXQgZWxlbWVudCBmcm9tIHNlbGVjdG9yIHN0cmluZywgJiBnZXQgc2l6ZSBvZiBlbGVtZW50XG4gKiBpZiBvcHRpb24gaXMgRWxlbWVudCAtPiBnZXQgc2l6ZSBvZiBlbGVtZW50XG4gKiBlbHNlIHVzZSBvcHRpb24gYXMgYSBudW1iZXJcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVhc3VyZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBzaXplIC0gd2lkdGggb3IgaGVpZ2h0XG4gKiBAcHJpdmF0ZVxuICovXG5wcm90by5fZ2V0TWVhc3VyZW1lbnQgPSBmdW5jdGlvbiggbWVhc3VyZW1lbnQsIHNpemUgKSB7XG4gIHZhciBvcHRpb24gPSB0aGlzLm9wdGlvbnNbIG1lYXN1cmVtZW50IF07XG4gIHZhciBlbGVtO1xuICBpZiAoICFvcHRpb24gKSB7XG4gICAgLy8gZGVmYXVsdCB0byAwXG4gICAgdGhpc1sgbWVhc3VyZW1lbnQgXSA9IDA7XG4gIH0gZWxzZSB7XG4gICAgLy8gdXNlIG9wdGlvbiBhcyBhbiBlbGVtZW50XG4gICAgaWYgKCB0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnICkge1xuICAgICAgZWxlbSA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCBvcHRpb24gKTtcbiAgICB9IGVsc2UgaWYgKCBvcHRpb24gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCApIHtcbiAgICAgIGVsZW0gPSBvcHRpb247XG4gICAgfVxuICAgIC8vIHVzZSBzaXplIG9mIGVsZW1lbnQsIGlmIGVsZW1lbnRcbiAgICB0aGlzWyBtZWFzdXJlbWVudCBdID0gZWxlbSA/IGdldFNpemUoIGVsZW0gKVsgc2l6ZSBdIDogb3B0aW9uO1xuICB9XG59O1xuXG4vKipcbiAqIGxheW91dCBhIGNvbGxlY3Rpb24gb2YgaXRlbSBlbGVtZW50c1xuICogQGFwaSBwdWJsaWNcbiAqL1xucHJvdG8ubGF5b3V0SXRlbXMgPSBmdW5jdGlvbiggaXRlbXMsIGlzSW5zdGFudCApIHtcbiAgaXRlbXMgPSB0aGlzLl9nZXRJdGVtc0ZvckxheW91dCggaXRlbXMgKTtcblxuICB0aGlzLl9sYXlvdXRJdGVtcyggaXRlbXMsIGlzSW5zdGFudCApO1xuXG4gIHRoaXMuX3Bvc3RMYXlvdXQoKTtcbn07XG5cbi8qKlxuICogZ2V0IHRoZSBpdGVtcyB0byBiZSBsYWlkIG91dFxuICogeW91IG1heSB3YW50IHRvIHNraXAgb3ZlciBzb21lIGl0ZW1zXG4gKiBAcGFyYW0ge0FycmF5fSBpdGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtc1xuICovXG5wcm90by5fZ2V0SXRlbXNGb3JMYXlvdXQgPSBmdW5jdGlvbiggaXRlbXMgKSB7XG4gIHJldHVybiBpdGVtcy5maWx0ZXIoIGZ1bmN0aW9uKCBpdGVtICkge1xuICAgIHJldHVybiAhaXRlbS5pc0lnbm9yZWQ7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBsYXlvdXQgaXRlbXNcbiAqIEBwYXJhbSB7QXJyYXl9IGl0ZW1zXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzSW5zdGFudFxuICovXG5wcm90by5fbGF5b3V0SXRlbXMgPSBmdW5jdGlvbiggaXRlbXMsIGlzSW5zdGFudCApIHtcbiAgdGhpcy5fZW1pdENvbXBsZXRlT25JdGVtcyggJ2xheW91dCcsIGl0ZW1zICk7XG5cbiAgaWYgKCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCApIHtcbiAgICAvLyBubyBpdGVtcywgZW1pdCBldmVudCB3aXRoIGVtcHR5IGFycmF5XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHF1ZXVlID0gW107XG5cbiAgaXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgLy8gZ2V0IHgveSBvYmplY3QgZnJvbSBtZXRob2RcbiAgICB2YXIgcG9zaXRpb24gPSB0aGlzLl9nZXRJdGVtTGF5b3V0UG9zaXRpb24oIGl0ZW0gKTtcbiAgICAvLyBlbnF1ZXVlXG4gICAgcG9zaXRpb24uaXRlbSA9IGl0ZW07XG4gICAgcG9zaXRpb24uaXNJbnN0YW50ID0gaXNJbnN0YW50IHx8IGl0ZW0uaXNMYXlvdXRJbnN0YW50O1xuICAgIHF1ZXVlLnB1c2goIHBvc2l0aW9uICk7XG4gIH0sIHRoaXMgKTtcblxuICB0aGlzLl9wcm9jZXNzTGF5b3V0UXVldWUoIHF1ZXVlICk7XG59O1xuXG4vKipcbiAqIGdldCBpdGVtIGxheW91dCBwb3NpdGlvblxuICogQHBhcmFtIHtPdXRsYXllci5JdGVtfSBpdGVtXG4gKiBAcmV0dXJucyB7T2JqZWN0fSB4IGFuZCB5IHBvc2l0aW9uXG4gKi9cbnByb3RvLl9nZXRJdGVtTGF5b3V0UG9zaXRpb24gPSBmdW5jdGlvbiggLyogaXRlbSAqLyApIHtcbiAgcmV0dXJuIHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcbn07XG5cbi8qKlxuICogaXRlcmF0ZSBvdmVyIGFycmF5IGFuZCBwb3NpdGlvbiBlYWNoIGl0ZW1cbiAqIFJlYXNvbiBiZWluZyAtIHNlcGFyYXRpbmcgdGhpcyBsb2dpYyBwcmV2ZW50cyAnbGF5b3V0IGludmFsaWRhdGlvbidcbiAqIHRoeCBAcGF1bF9pcmlzaFxuICogQHBhcmFtIHtBcnJheX0gcXVldWVcbiAqL1xucHJvdG8uX3Byb2Nlc3NMYXlvdXRRdWV1ZSA9IGZ1bmN0aW9uKCBxdWV1ZSApIHtcbiAgdGhpcy51cGRhdGVTdGFnZ2VyKCk7XG4gIHF1ZXVlLmZvckVhY2goIGZ1bmN0aW9uKCBvYmosIGkgKSB7XG4gICAgdGhpcy5fcG9zaXRpb25JdGVtKCBvYmouaXRlbSwgb2JqLngsIG9iai55LCBvYmouaXNJbnN0YW50LCBpICk7XG4gIH0sIHRoaXMgKTtcbn07XG5cbi8vIHNldCBzdGFnZ2VyIGZyb20gb3B0aW9uIGluIG1pbGxpc2Vjb25kcyBudW1iZXJcbnByb3RvLnVwZGF0ZVN0YWdnZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0YWdnZXIgPSB0aGlzLm9wdGlvbnMuc3RhZ2dlcjtcbiAgaWYgKCBzdGFnZ2VyID09PSBudWxsIHx8IHN0YWdnZXIgPT09IHVuZGVmaW5lZCApIHtcbiAgICB0aGlzLnN0YWdnZXIgPSAwO1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnN0YWdnZXIgPSBnZXRNaWxsaXNlY29uZHMoIHN0YWdnZXIgKTtcbiAgcmV0dXJuIHRoaXMuc3RhZ2dlcjtcbn07XG5cbi8qKlxuICogU2V0cyBwb3NpdGlvbiBvZiBpdGVtIGluIERPTVxuICogQHBhcmFtIHtPdXRsYXllci5JdGVtfSBpdGVtXG4gKiBAcGFyYW0ge051bWJlcn0geCAtIGhvcml6b250YWwgcG9zaXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSB5IC0gdmVydGljYWwgcG9zaXRpb25cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNJbnN0YW50IC0gZGlzYWJsZXMgdHJhbnNpdGlvbnNcbiAqL1xucHJvdG8uX3Bvc2l0aW9uSXRlbSA9IGZ1bmN0aW9uKCBpdGVtLCB4LCB5LCBpc0luc3RhbnQsIGkgKSB7XG4gIGlmICggaXNJbnN0YW50ICkge1xuICAgIC8vIGlmIG5vdCB0cmFuc2l0aW9uLCBqdXN0IHNldCBDU1NcbiAgICBpdGVtLmdvVG8oIHgsIHkgKTtcbiAgfSBlbHNlIHtcbiAgICBpdGVtLnN0YWdnZXIoIGkgKiB0aGlzLnN0YWdnZXIgKTtcbiAgICBpdGVtLm1vdmVUbyggeCwgeSApO1xuICB9XG59O1xuXG4vKipcbiAqIEFueSBsb2dpYyB5b3Ugd2FudCB0byBkbyBhZnRlciBlYWNoIGxheW91dCxcbiAqIGkuZS4gc2l6ZSB0aGUgY29udGFpbmVyXG4gKi9cbnByb3RvLl9wb3N0TGF5b3V0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucmVzaXplQ29udGFpbmVyKCk7XG59O1xuXG5wcm90by5yZXNpemVDb250YWluZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGlzUmVzaXppbmdDb250YWluZXIgPSB0aGlzLl9nZXRPcHRpb24oJ3Jlc2l6ZUNvbnRhaW5lcicpO1xuICBpZiAoICFpc1Jlc2l6aW5nQ29udGFpbmVyICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgc2l6ZSA9IHRoaXMuX2dldENvbnRhaW5lclNpemUoKTtcbiAgaWYgKCBzaXplICkge1xuICAgIHRoaXMuX3NldENvbnRhaW5lck1lYXN1cmUoIHNpemUud2lkdGgsIHRydWUgKTtcbiAgICB0aGlzLl9zZXRDb250YWluZXJNZWFzdXJlKCBzaXplLmhlaWdodCwgZmFsc2UgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZXRzIHdpZHRoIG9yIGhlaWdodCBvZiBjb250YWluZXIgaWYgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHtPYmplY3R9IHNpemVcbiAqICAgQHBhcmFtIHtOdW1iZXJ9IHdpZHRoXG4gKiAgIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAqL1xucHJvdG8uX2dldENvbnRhaW5lclNpemUgPSBub29wO1xuXG4vKipcbiAqIEBwYXJhbSB7TnVtYmVyfSBtZWFzdXJlIC0gc2l6ZSBvZiB3aWR0aCBvciBoZWlnaHRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNXaWR0aFxuICovXG5wcm90by5fc2V0Q29udGFpbmVyTWVhc3VyZSA9IGZ1bmN0aW9uKCBtZWFzdXJlLCBpc1dpZHRoICkge1xuICBpZiAoIG1lYXN1cmUgPT09IHVuZGVmaW5lZCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZWxlbVNpemUgPSB0aGlzLnNpemU7XG4gIC8vIGFkZCBwYWRkaW5nIGFuZCBib3JkZXIgd2lkdGggaWYgYm9yZGVyIGJveFxuICBpZiAoIGVsZW1TaXplLmlzQm9yZGVyQm94ICkge1xuICAgIG1lYXN1cmUgKz0gaXNXaWR0aCA/IGVsZW1TaXplLnBhZGRpbmdMZWZ0ICsgZWxlbVNpemUucGFkZGluZ1JpZ2h0ICtcbiAgICAgIGVsZW1TaXplLmJvcmRlckxlZnRXaWR0aCArIGVsZW1TaXplLmJvcmRlclJpZ2h0V2lkdGggOlxuICAgICAgZWxlbVNpemUucGFkZGluZ0JvdHRvbSArIGVsZW1TaXplLnBhZGRpbmdUb3AgK1xuICAgICAgZWxlbVNpemUuYm9yZGVyVG9wV2lkdGggKyBlbGVtU2l6ZS5ib3JkZXJCb3R0b21XaWR0aDtcbiAgfVxuXG4gIG1lYXN1cmUgPSBNYXRoLm1heCggbWVhc3VyZSwgMCApO1xuICB0aGlzLmVsZW1lbnQuc3R5bGVbIGlzV2lkdGggPyAnd2lkdGgnIDogJ2hlaWdodCcgXSA9IG1lYXN1cmUgKyAncHgnO1xufTtcblxuLyoqXG4gKiBlbWl0IGV2ZW50Q29tcGxldGUgb24gYSBjb2xsZWN0aW9uIG9mIGl0ZW1zIGV2ZW50c1xuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50TmFtZVxuICogQHBhcmFtIHtBcnJheX0gaXRlbXMgLSBPdXRsYXllci5JdGVtc1xuICovXG5wcm90by5fZW1pdENvbXBsZXRlT25JdGVtcyA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGl0ZW1zICkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICBmdW5jdGlvbiBvbkNvbXBsZXRlKCkge1xuICAgIF90aGlzLmRpc3BhdGNoRXZlbnQoIGV2ZW50TmFtZSArICdDb21wbGV0ZScsIG51bGwsIFsgaXRlbXMgXSApO1xuICB9XG5cbiAgdmFyIGNvdW50ID0gaXRlbXMubGVuZ3RoO1xuICBpZiAoICFpdGVtcyB8fCAhY291bnQgKSB7XG4gICAgb25Db21wbGV0ZSgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBkb25lQ291bnQgPSAwO1xuICBmdW5jdGlvbiB0aWNrKCkge1xuICAgIGRvbmVDb3VudCsrO1xuICAgIGlmICggZG9uZUNvdW50ID09IGNvdW50ICkge1xuICAgICAgb25Db21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGJpbmQgY2FsbGJhY2tcbiAgaXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgaXRlbS5vbmNlKCBldmVudE5hbWUsIHRpY2sgKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIGVtaXRzIGV2ZW50cyB2aWEgRXZFbWl0dGVyIGFuZCBqUXVlcnkgZXZlbnRzXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIG5hbWUgb2YgZXZlbnRcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gb3JpZ2luYWwgZXZlbnRcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgLSBleHRyYSBhcmd1bWVudHNcbiAqL1xucHJvdG8uZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uKCB0eXBlLCBldmVudCwgYXJncyApIHtcbiAgLy8gYWRkIG9yaWdpbmFsIGV2ZW50IHRvIGFyZ3VtZW50c1xuICB2YXIgZW1pdEFyZ3MgPSBldmVudCA/IFsgZXZlbnQgXS5jb25jYXQoIGFyZ3MgKSA6IGFyZ3M7XG4gIHRoaXMuZW1pdEV2ZW50KCB0eXBlLCBlbWl0QXJncyApO1xuXG4gIGlmICggalF1ZXJ5ICkge1xuICAgIC8vIHNldCB0aGlzLiRlbGVtZW50XG4gICAgdGhpcy4kZWxlbWVudCA9IHRoaXMuJGVsZW1lbnQgfHwgalF1ZXJ5KCB0aGlzLmVsZW1lbnQgKTtcbiAgICBpZiAoIGV2ZW50ICkge1xuICAgICAgLy8gY3JlYXRlIGpRdWVyeSBldmVudFxuICAgICAgdmFyICRldmVudCA9IGpRdWVyeS5FdmVudCggZXZlbnQgKTtcbiAgICAgICRldmVudC50eXBlID0gdHlwZTtcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlciggJGV2ZW50LCBhcmdzICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGp1c3QgdHJpZ2dlciB3aXRoIHR5cGUgaWYgbm8gZXZlbnQgYXZhaWxhYmxlXG4gICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoIHR5cGUsIGFyZ3MgKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGlnbm9yZSAmIHN0YW1wcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5cbi8qKlxuICoga2VlcCBpdGVtIGluIGNvbGxlY3Rpb24sIGJ1dCBkbyBub3QgbGF5IGl0IG91dFxuICogaWdub3JlZCBpdGVtcyBkbyBub3QgZ2V0IHNraXBwZWQgaW4gbGF5b3V0XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1cbiAqL1xucHJvdG8uaWdub3JlID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIHZhciBpdGVtID0gdGhpcy5nZXRJdGVtKCBlbGVtICk7XG4gIGlmICggaXRlbSApIHtcbiAgICBpdGVtLmlzSWdub3JlZCA9IHRydWU7XG4gIH1cbn07XG5cbi8qKlxuICogcmV0dXJuIGl0ZW0gdG8gbGF5b3V0IGNvbGxlY3Rpb25cbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICovXG5wcm90by51bmlnbm9yZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICB2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbSggZWxlbSApO1xuICBpZiAoIGl0ZW0gKSB7XG4gICAgZGVsZXRlIGl0ZW0uaXNJZ25vcmVkO1xuICB9XG59O1xuXG4vKipcbiAqIGFkZHMgZWxlbWVudHMgdG8gc3RhbXBzXG4gKiBAcGFyYW0ge05vZGVMaXN0LCBBcnJheSwgRWxlbWVudCwgb3IgU3RyaW5nfSBlbGVtc1xuICovXG5wcm90by5zdGFtcCA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgZWxlbXMgPSB0aGlzLl9maW5kKCBlbGVtcyApO1xuICBpZiAoICFlbGVtcyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnN0YW1wcyA9IHRoaXMuc3RhbXBzLmNvbmNhdCggZWxlbXMgKTtcbiAgLy8gaWdub3JlXG4gIGVsZW1zLmZvckVhY2goIHRoaXMuaWdub3JlLCB0aGlzICk7XG59O1xuXG4vKipcbiAqIHJlbW92ZXMgZWxlbWVudHMgdG8gc3RhbXBzXG4gKiBAcGFyYW0ge05vZGVMaXN0LCBBcnJheSwgb3IgRWxlbWVudH0gZWxlbXNcbiAqL1xucHJvdG8udW5zdGFtcCA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgZWxlbXMgPSB0aGlzLl9maW5kKCBlbGVtcyApO1xuICBpZiAoICFlbGVtcyApe1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGVsZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtICkge1xuICAgIC8vIGZpbHRlciBvdXQgcmVtb3ZlZCBzdGFtcCBlbGVtZW50c1xuICAgIHV0aWxzLnJlbW92ZUZyb20oIHRoaXMuc3RhbXBzLCBlbGVtICk7XG4gICAgdGhpcy51bmlnbm9yZSggZWxlbSApO1xuICB9LCB0aGlzICk7XG59O1xuXG4vKipcbiAqIGZpbmRzIGNoaWxkIGVsZW1lbnRzXG4gKiBAcGFyYW0ge05vZGVMaXN0LCBBcnJheSwgRWxlbWVudCwgb3IgU3RyaW5nfSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBlbGVtc1xuICovXG5wcm90by5fZmluZCA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgaWYgKCAhZWxlbXMgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGlmIHN0cmluZywgdXNlIGFyZ3VtZW50IGFzIHNlbGVjdG9yIHN0cmluZ1xuICBpZiAoIHR5cGVvZiBlbGVtcyA9PSAnc3RyaW5nJyApIHtcbiAgICBlbGVtcyA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCBlbGVtcyApO1xuICB9XG4gIGVsZW1zID0gdXRpbHMubWFrZUFycmF5KCBlbGVtcyApO1xuICByZXR1cm4gZWxlbXM7XG59O1xuXG5wcm90by5fbWFuYWdlU3RhbXBzID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMuc3RhbXBzIHx8ICF0aGlzLnN0YW1wcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5fZ2V0Qm91bmRpbmdSZWN0KCk7XG5cbiAgdGhpcy5zdGFtcHMuZm9yRWFjaCggdGhpcy5fbWFuYWdlU3RhbXAsIHRoaXMgKTtcbn07XG5cbi8vIHVwZGF0ZSBib3VuZGluZ0xlZnQgLyBUb3BcbnByb3RvLl9nZXRCb3VuZGluZ1JlY3QgPSBmdW5jdGlvbigpIHtcbiAgLy8gZ2V0IGJvdW5kaW5nIHJlY3QgZm9yIGNvbnRhaW5lciBlbGVtZW50XG4gIHZhciBib3VuZGluZ1JlY3QgPSB0aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciBzaXplID0gdGhpcy5zaXplO1xuICB0aGlzLl9ib3VuZGluZ1JlY3QgPSB7XG4gICAgbGVmdDogYm91bmRpbmdSZWN0LmxlZnQgKyBzaXplLnBhZGRpbmdMZWZ0ICsgc2l6ZS5ib3JkZXJMZWZ0V2lkdGgsXG4gICAgdG9wOiBib3VuZGluZ1JlY3QudG9wICsgc2l6ZS5wYWRkaW5nVG9wICsgc2l6ZS5ib3JkZXJUb3BXaWR0aCxcbiAgICByaWdodDogYm91bmRpbmdSZWN0LnJpZ2h0IC0gKCBzaXplLnBhZGRpbmdSaWdodCArIHNpemUuYm9yZGVyUmlnaHRXaWR0aCApLFxuICAgIGJvdHRvbTogYm91bmRpbmdSZWN0LmJvdHRvbSAtICggc2l6ZS5wYWRkaW5nQm90dG9tICsgc2l6ZS5ib3JkZXJCb3R0b21XaWR0aCApXG4gIH07XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gc3RhbXBcbioqL1xucHJvdG8uX21hbmFnZVN0YW1wID0gbm9vcDtcblxuLyoqXG4gKiBnZXQgeC95IHBvc2l0aW9uIG9mIGVsZW1lbnQgcmVsYXRpdmUgdG8gY29udGFpbmVyIGVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICogQHJldHVybnMge09iamVjdH0gb2Zmc2V0IC0gaGFzIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbVxuICovXG5wcm90by5fZ2V0RWxlbWVudE9mZnNldCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICB2YXIgYm91bmRpbmdSZWN0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHRoaXNSZWN0ID0gdGhpcy5fYm91bmRpbmdSZWN0O1xuICB2YXIgc2l6ZSA9IGdldFNpemUoIGVsZW0gKTtcbiAgdmFyIG9mZnNldCA9IHtcbiAgICBsZWZ0OiBib3VuZGluZ1JlY3QubGVmdCAtIHRoaXNSZWN0LmxlZnQgLSBzaXplLm1hcmdpbkxlZnQsXG4gICAgdG9wOiBib3VuZGluZ1JlY3QudG9wIC0gdGhpc1JlY3QudG9wIC0gc2l6ZS5tYXJnaW5Ub3AsXG4gICAgcmlnaHQ6IHRoaXNSZWN0LnJpZ2h0IC0gYm91bmRpbmdSZWN0LnJpZ2h0IC0gc2l6ZS5tYXJnaW5SaWdodCxcbiAgICBib3R0b206IHRoaXNSZWN0LmJvdHRvbSAtIGJvdW5kaW5nUmVjdC5ib3R0b20gLSBzaXplLm1hcmdpbkJvdHRvbVxuICB9O1xuICByZXR1cm4gb2Zmc2V0O1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVzaXplIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGVuYWJsZSBldmVudCBoYW5kbGVycyBmb3IgbGlzdGVuZXJzXG4vLyBpLmUuIHJlc2l6ZSAtPiBvbnJlc2l6ZVxucHJvdG8uaGFuZGxlRXZlbnQgPSB1dGlscy5oYW5kbGVFdmVudDtcblxuLyoqXG4gKiBCaW5kIGxheW91dCB0byB3aW5kb3cgcmVzaXppbmdcbiAqL1xucHJvdG8uYmluZFJlc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3Jlc2l6ZScsIHRoaXMgKTtcbiAgdGhpcy5pc1Jlc2l6ZUJvdW5kID0gdHJ1ZTtcbn07XG5cbi8qKlxuICogVW5iaW5kIGxheW91dCB0byB3aW5kb3cgcmVzaXppbmdcbiAqL1xucHJvdG8udW5iaW5kUmVzaXplID0gZnVuY3Rpb24oKSB7XG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAncmVzaXplJywgdGhpcyApO1xuICB0aGlzLmlzUmVzaXplQm91bmQgPSBmYWxzZTtcbn07XG5cbnByb3RvLm9ucmVzaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucmVzaXplKCk7XG59O1xuXG51dGlscy5kZWJvdW5jZU1ldGhvZCggT3V0bGF5ZXIsICdvbnJlc2l6ZScsIDEwMCApO1xuXG5wcm90by5yZXNpemUgPSBmdW5jdGlvbigpIHtcbiAgLy8gZG9uJ3QgdHJpZ2dlciBpZiBzaXplIGRpZCBub3QgY2hhbmdlXG4gIC8vIG9yIGlmIHJlc2l6ZSB3YXMgdW5ib3VuZC4gU2VlICM5XG4gIGlmICggIXRoaXMuaXNSZXNpemVCb3VuZCB8fCAhdGhpcy5uZWVkc1Jlc2l6ZUxheW91dCgpICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMubGF5b3V0KCk7XG59O1xuXG4vKipcbiAqIGNoZWNrIGlmIGxheW91dCBpcyBuZWVkZWQgcG9zdCBsYXlvdXRcbiAqIEByZXR1cm5zIEJvb2xlYW5cbiAqL1xucHJvdG8ubmVlZHNSZXNpemVMYXlvdXQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNpemUgPSBnZXRTaXplKCB0aGlzLmVsZW1lbnQgKTtcbiAgLy8gY2hlY2sgdGhhdCB0aGlzLnNpemUgYW5kIHNpemUgYXJlIHRoZXJlXG4gIC8vIElFOCB0cmlnZ2VycyByZXNpemUgb24gYm9keSBzaXplIGNoYW5nZSwgc28gdGhleSBtaWdodCBub3QgYmVcbiAgdmFyIGhhc1NpemVzID0gdGhpcy5zaXplICYmIHNpemU7XG4gIHJldHVybiBoYXNTaXplcyAmJiBzaXplLmlubmVyV2lkdGggIT09IHRoaXMuc2l6ZS5pbm5lcldpZHRoO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIGFkZCBpdGVtcyB0byBPdXRsYXllciBpbnN0YW5jZVxuICogQHBhcmFtIHtBcnJheSBvciBOb2RlTGlzdCBvciBFbGVtZW50fSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtcyAtIE91dGxheWVyLkl0ZW1zXG4qKi9cbnByb3RvLmFkZEl0ZW1zID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtaXplKCBlbGVtcyApO1xuICAvLyBhZGQgaXRlbXMgdG8gY29sbGVjdGlvblxuICBpZiAoIGl0ZW1zLmxlbmd0aCApIHtcbiAgICB0aGlzLml0ZW1zID0gdGhpcy5pdGVtcy5jb25jYXQoIGl0ZW1zICk7XG4gIH1cbiAgcmV0dXJuIGl0ZW1zO1xufTtcblxuLyoqXG4gKiBMYXlvdXQgbmV3bHktYXBwZW5kZWQgaXRlbSBlbGVtZW50c1xuICogQHBhcmFtIHtBcnJheSBvciBOb2RlTGlzdCBvciBFbGVtZW50fSBlbGVtc1xuICovXG5wcm90by5hcHBlbmRlZCA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgdmFyIGl0ZW1zID0gdGhpcy5hZGRJdGVtcyggZWxlbXMgKTtcbiAgaWYgKCAhaXRlbXMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBsYXlvdXQgYW5kIHJldmVhbCBqdXN0IHRoZSBuZXcgaXRlbXNcbiAgdGhpcy5sYXlvdXRJdGVtcyggaXRlbXMsIHRydWUgKTtcbiAgdGhpcy5yZXZlYWwoIGl0ZW1zICk7XG59O1xuXG4vKipcbiAqIExheW91dCBwcmVwZW5kZWQgZWxlbWVudHNcbiAqIEBwYXJhbSB7QXJyYXkgb3IgTm9kZUxpc3Qgb3IgRWxlbWVudH0gZWxlbXNcbiAqL1xucHJvdG8ucHJlcGVuZGVkID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgaXRlbXMgPSB0aGlzLl9pdGVtaXplKCBlbGVtcyApO1xuICBpZiAoICFpdGVtcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGFkZCBpdGVtcyB0byBiZWdpbm5pbmcgb2YgY29sbGVjdGlvblxuICB2YXIgcHJldmlvdXNJdGVtcyA9IHRoaXMuaXRlbXMuc2xpY2UoMCk7XG4gIHRoaXMuaXRlbXMgPSBpdGVtcy5jb25jYXQoIHByZXZpb3VzSXRlbXMgKTtcbiAgLy8gc3RhcnQgbmV3IGxheW91dFxuICB0aGlzLl9yZXNldExheW91dCgpO1xuICB0aGlzLl9tYW5hZ2VTdGFtcHMoKTtcbiAgLy8gbGF5b3V0IG5ldyBzdHVmZiB3aXRob3V0IHRyYW5zaXRpb25cbiAgdGhpcy5sYXlvdXRJdGVtcyggaXRlbXMsIHRydWUgKTtcbiAgdGhpcy5yZXZlYWwoIGl0ZW1zICk7XG4gIC8vIGxheW91dCBwcmV2aW91cyBpdGVtc1xuICB0aGlzLmxheW91dEl0ZW1zKCBwcmV2aW91c0l0ZW1zICk7XG59O1xuXG4vKipcbiAqIHJldmVhbCBhIGNvbGxlY3Rpb24gb2YgaXRlbXNcbiAqIEBwYXJhbSB7QXJyYXkgb2YgT3V0bGF5ZXIuSXRlbXN9IGl0ZW1zXG4gKi9cbnByb3RvLnJldmVhbCA9IGZ1bmN0aW9uKCBpdGVtcyApIHtcbiAgdGhpcy5fZW1pdENvbXBsZXRlT25JdGVtcyggJ3JldmVhbCcsIGl0ZW1zICk7XG4gIGlmICggIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBzdGFnZ2VyID0gdGhpcy51cGRhdGVTdGFnZ2VyKCk7XG4gIGl0ZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBpdGVtLCBpICkge1xuICAgIGl0ZW0uc3RhZ2dlciggaSAqIHN0YWdnZXIgKTtcbiAgICBpdGVtLnJldmVhbCgpO1xuICB9KTtcbn07XG5cbi8qKlxuICogaGlkZSBhIGNvbGxlY3Rpb24gb2YgaXRlbXNcbiAqIEBwYXJhbSB7QXJyYXkgb2YgT3V0bGF5ZXIuSXRlbXN9IGl0ZW1zXG4gKi9cbnByb3RvLmhpZGUgPSBmdW5jdGlvbiggaXRlbXMgKSB7XG4gIHRoaXMuX2VtaXRDb21wbGV0ZU9uSXRlbXMoICdoaWRlJywgaXRlbXMgKTtcbiAgaWYgKCAhaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHN0YWdnZXIgPSB0aGlzLnVwZGF0ZVN0YWdnZXIoKTtcbiAgaXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0sIGkgKSB7XG4gICAgaXRlbS5zdGFnZ2VyKCBpICogc3RhZ2dlciApO1xuICAgIGl0ZW0uaGlkZSgpO1xuICB9KTtcbn07XG5cbi8qKlxuICogcmV2ZWFsIGl0ZW0gZWxlbWVudHNcbiAqIEBwYXJhbSB7QXJyYXl9LCB7RWxlbWVudH0sIHtOb2RlTGlzdH0gaXRlbXNcbiAqL1xucHJvdG8ucmV2ZWFsSXRlbUVsZW1lbnRzID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCBlbGVtcyApO1xuICB0aGlzLnJldmVhbCggaXRlbXMgKTtcbn07XG5cbi8qKlxuICogaGlkZSBpdGVtIGVsZW1lbnRzXG4gKiBAcGFyYW0ge0FycmF5fSwge0VsZW1lbnR9LCB7Tm9kZUxpc3R9IGl0ZW1zXG4gKi9cbnByb3RvLmhpZGVJdGVtRWxlbWVudHMgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoIGVsZW1zICk7XG4gIHRoaXMuaGlkZSggaXRlbXMgKTtcbn07XG5cbi8qKlxuICogZ2V0IE91dGxheWVyLkl0ZW0sIGdpdmVuIGFuIEVsZW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtPdXRsYXllci5JdGVtfSBpdGVtXG4gKi9cbnByb3RvLmdldEl0ZW0gPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgLy8gbG9vcCB0aHJvdWdoIGl0ZW1zIHRvIGdldCB0aGUgb25lIHRoYXQgbWF0Y2hlc1xuICBmb3IgKCB2YXIgaT0wOyBpIDwgdGhpcy5pdGVtcy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaV07XG4gICAgaWYgKCBpdGVtLmVsZW1lbnQgPT0gZWxlbSApIHtcbiAgICAgIC8vIHJldHVybiBpdGVtXG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogZ2V0IGNvbGxlY3Rpb24gb2YgT3V0bGF5ZXIuSXRlbXMsIGdpdmVuIEVsZW1lbnRzXG4gKiBAcGFyYW0ge0FycmF5fSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBpdGVtcyAtIE91dGxheWVyLkl0ZW1zXG4gKi9cbnByb3RvLmdldEl0ZW1zID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICBlbGVtcyA9IHV0aWxzLm1ha2VBcnJheSggZWxlbXMgKTtcbiAgdmFyIGl0ZW1zID0gW107XG4gIGVsZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtICkge1xuICAgIHZhciBpdGVtID0gdGhpcy5nZXRJdGVtKCBlbGVtICk7XG4gICAgaWYgKCBpdGVtICkge1xuICAgICAgaXRlbXMucHVzaCggaXRlbSApO1xuICAgIH1cbiAgfSwgdGhpcyApO1xuXG4gIHJldHVybiBpdGVtcztcbn07XG5cbi8qKlxuICogcmVtb3ZlIGVsZW1lbnQocykgZnJvbSBpbnN0YW5jZSBhbmQgRE9NXG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEVsZW1lbnR9IGVsZW1zXG4gKi9cbnByb3RvLnJlbW92ZSA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgdmFyIHJlbW92ZUl0ZW1zID0gdGhpcy5nZXRJdGVtcyggZWxlbXMgKTtcblxuICB0aGlzLl9lbWl0Q29tcGxldGVPbkl0ZW1zKCAncmVtb3ZlJywgcmVtb3ZlSXRlbXMgKTtcblxuICAvLyBiYWlsIGlmIG5vIGl0ZW1zIHRvIHJlbW92ZVxuICBpZiAoICFyZW1vdmVJdGVtcyB8fCAhcmVtb3ZlSXRlbXMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJlbW92ZUl0ZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBpdGVtICkge1xuICAgIGl0ZW0ucmVtb3ZlKCk7XG4gICAgLy8gcmVtb3ZlIGl0ZW0gZnJvbSBjb2xsZWN0aW9uXG4gICAgdXRpbHMucmVtb3ZlRnJvbSggdGhpcy5pdGVtcywgaXRlbSApO1xuICB9LCB0aGlzICk7XG59O1xuXG4vLyAtLS0tLSBkZXN0cm95IC0tLS0tIC8vXG5cbi8vIHJlbW92ZSBhbmQgZGlzYWJsZSBPdXRsYXllciBpbnN0YW5jZVxucHJvdG8uZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICAvLyBjbGVhbiB1cCBkeW5hbWljIHN0eWxlc1xuICB2YXIgc3R5bGUgPSB0aGlzLmVsZW1lbnQuc3R5bGU7XG4gIHN0eWxlLmhlaWdodCA9ICcnO1xuICBzdHlsZS5wb3NpdGlvbiA9ICcnO1xuICBzdHlsZS53aWR0aCA9ICcnO1xuICAvLyBkZXN0cm95IGl0ZW1zXG4gIHRoaXMuaXRlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgaXRlbS5kZXN0cm95KCk7XG4gIH0pO1xuXG4gIHRoaXMudW5iaW5kUmVzaXplKCk7XG5cbiAgdmFyIGlkID0gdGhpcy5lbGVtZW50Lm91dGxheWVyR1VJRDtcbiAgZGVsZXRlIGluc3RhbmNlc1sgaWQgXTsgLy8gcmVtb3ZlIHJlZmVyZW5jZSB0byBpbnN0YW5jZSBieSBpZFxuICBkZWxldGUgdGhpcy5lbGVtZW50Lm91dGxheWVyR1VJRDtcbiAgLy8gcmVtb3ZlIGRhdGEgZm9yIGpRdWVyeVxuICBpZiAoIGpRdWVyeSApIHtcbiAgICBqUXVlcnkucmVtb3ZlRGF0YSggdGhpcy5lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLm5hbWVzcGFjZSApO1xuICB9XG5cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBnZXQgT3V0bGF5ZXIgaW5zdGFuY2UgZnJvbSBlbGVtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1cbiAqIEByZXR1cm5zIHtPdXRsYXllcn1cbiAqL1xuT3V0bGF5ZXIuZGF0YSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICBlbGVtID0gdXRpbHMuZ2V0UXVlcnlFbGVtZW50KCBlbGVtICk7XG4gIHZhciBpZCA9IGVsZW0gJiYgZWxlbS5vdXRsYXllckdVSUQ7XG4gIHJldHVybiBpZCAmJiBpbnN0YW5jZXNbIGlkIF07XG59O1xuXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNyZWF0ZSBPdXRsYXllciBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIGNyZWF0ZSBhIGxheW91dCBjbGFzc1xuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICovXG5PdXRsYXllci5jcmVhdGUgPSBmdW5jdGlvbiggbmFtZXNwYWNlLCBvcHRpb25zICkge1xuICAvLyBzdWItY2xhc3MgT3V0bGF5ZXJcbiAgdmFyIExheW91dCA9IHN1YmNsYXNzKCBPdXRsYXllciApO1xuICAvLyBhcHBseSBuZXcgb3B0aW9ucyBhbmQgY29tcGF0T3B0aW9uc1xuICBMYXlvdXQuZGVmYXVsdHMgPSB1dGlscy5leHRlbmQoIHt9LCBPdXRsYXllci5kZWZhdWx0cyApO1xuICB1dGlscy5leHRlbmQoIExheW91dC5kZWZhdWx0cywgb3B0aW9ucyApO1xuICBMYXlvdXQuY29tcGF0T3B0aW9ucyA9IHV0aWxzLmV4dGVuZCgge30sIE91dGxheWVyLmNvbXBhdE9wdGlvbnMgICk7XG5cbiAgTGF5b3V0Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblxuICBMYXlvdXQuZGF0YSA9IE91dGxheWVyLmRhdGE7XG5cbiAgLy8gc3ViLWNsYXNzIEl0ZW1cbiAgTGF5b3V0Lkl0ZW0gPSBzdWJjbGFzcyggSXRlbSApO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlY2xhcmF0aXZlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgdXRpbHMuaHRtbEluaXQoIExheW91dCwgbmFtZXNwYWNlICk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0galF1ZXJ5IGJyaWRnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4gIC8vIG1ha2UgaW50byBqUXVlcnkgcGx1Z2luXG4gIGlmICggalF1ZXJ5ICYmIGpRdWVyeS5icmlkZ2V0ICkge1xuICAgIGpRdWVyeS5icmlkZ2V0KCBuYW1lc3BhY2UsIExheW91dCApO1xuICB9XG5cbiAgcmV0dXJuIExheW91dDtcbn07XG5cbmZ1bmN0aW9uIHN1YmNsYXNzKCBQYXJlbnQgKSB7XG4gIGZ1bmN0aW9uIFN1YkNsYXNzKCkge1xuICAgIFBhcmVudC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG4gIH1cblxuICBTdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQYXJlbnQucHJvdG90eXBlICk7XG4gIFN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFN1YkNsYXNzO1xuXG4gIHJldHVybiBTdWJDbGFzcztcbn1cblxuLy8gLS0tLS0gaGVscGVycyAtLS0tLSAvL1xuXG4vLyBob3cgbWFueSBtaWxsaXNlY29uZHMgYXJlIGluIGVhY2ggdW5pdFxudmFyIG1zVW5pdHMgPSB7XG4gIG1zOiAxLFxuICBzOiAxMDAwXG59O1xuXG4vLyBtdW5nZSB0aW1lLWxpa2UgcGFyYW1ldGVyIGludG8gbWlsbGlzZWNvbmQgbnVtYmVyXG4vLyAnMC40cycgLT4gNDBcbmZ1bmN0aW9uIGdldE1pbGxpc2Vjb25kcyggdGltZSApIHtcbiAgaWYgKCB0eXBlb2YgdGltZSA9PSAnbnVtYmVyJyApIHtcbiAgICByZXR1cm4gdGltZTtcbiAgfVxuICB2YXIgbWF0Y2hlcyA9IHRpbWUubWF0Y2goIC8oXlxcZCpcXC4/XFxkKikoXFx3KikvICk7XG4gIHZhciBudW0gPSBtYXRjaGVzICYmIG1hdGNoZXNbMV07XG4gIHZhciB1bml0ID0gbWF0Y2hlcyAmJiBtYXRjaGVzWzJdO1xuICBpZiAoICFudW0ubGVuZ3RoICkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIG51bSA9IHBhcnNlRmxvYXQoIG51bSApO1xuICB2YXIgbXVsdCA9IG1zVW5pdHNbIHVuaXQgXSB8fCAxO1xuICByZXR1cm4gbnVtICogbXVsdDtcbn1cblxuLy8gLS0tLS0gZmluIC0tLS0tIC8vXG5cbi8vIGJhY2sgaW4gZ2xvYmFsXG5PdXRsYXllci5JdGVtID0gSXRlbTtcblxucmV0dXJuIE91dGxheWVyO1xuXG59KSk7XG4iLCIhZnVuY3Rpb24ocm9vdCwgZmFjdG9yeSkge1xuICAgIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZGVmaW5lICYmIGRlZmluZS5hbWQgPyAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUgdW5sZXNzIGFtZE1vZHVsZUlkIGlzIHNldFxuICAgIGRlZmluZShbXSwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiByb290LnN2ZzRldmVyeWJvZHkgPSBmYWN0b3J5KCk7XG4gICAgfSkgOiBcIm9iamVjdFwiID09IHR5cGVvZiBtb2R1bGUgJiYgbW9kdWxlLmV4cG9ydHMgPyAvLyBOb2RlLiBEb2VzIG5vdCB3b3JrIHdpdGggc3RyaWN0IENvbW1vbkpTLCBidXRcbiAgICAvLyBvbmx5IENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBtb2R1bGUuZXhwb3J0cyxcbiAgICAvLyBsaWtlIE5vZGUuXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOiByb290LnN2ZzRldmVyeWJvZHkgPSBmYWN0b3J5KCk7XG59KHRoaXMsIGZ1bmN0aW9uKCkge1xuICAgIC8qISBzdmc0ZXZlcnlib2R5IHYyLjEuOSB8IGdpdGh1Yi5jb20vam9uYXRoYW50bmVhbC9zdmc0ZXZlcnlib2R5ICovXG4gICAgZnVuY3Rpb24gZW1iZWQocGFyZW50LCBzdmcsIHRhcmdldCkge1xuICAgICAgICAvLyBpZiB0aGUgdGFyZ2V0IGV4aXN0c1xuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgYSBkb2N1bWVudCBmcmFnbWVudCB0byBob2xkIHRoZSBjb250ZW50cyBvZiB0aGUgdGFyZ2V0XG4gICAgICAgICAgICB2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksIHZpZXdCb3ggPSAhc3ZnLmhhc0F0dHJpYnV0ZShcInZpZXdCb3hcIikgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZShcInZpZXdCb3hcIik7XG4gICAgICAgICAgICAvLyBjb25kaXRpb25hbGx5IHNldCB0aGUgdmlld0JveCBvbiB0aGUgc3ZnXG4gICAgICAgICAgICB2aWV3Qm94ICYmIHN2Zy5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIHZpZXdCb3gpO1xuICAgICAgICAgICAgLy8gY29weSB0aGUgY29udGVudHMgb2YgdGhlIGNsb25lIGludG8gdGhlIGZyYWdtZW50XG4gICAgICAgICAgICBmb3IgKC8vIGNsb25lIHRoZSB0YXJnZXRcbiAgICAgICAgICAgIHZhciBjbG9uZSA9IHRhcmdldC5jbG9uZU5vZGUoITApOyBjbG9uZS5jaGlsZE5vZGVzLmxlbmd0aDsgKSB7XG4gICAgICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY2xvbmUuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhcHBlbmQgdGhlIGZyYWdtZW50IGludG8gdGhlIHN2Z1xuICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBsb2FkcmVhZHlzdGF0ZWNoYW5nZSh4aHIpIHtcbiAgICAgICAgLy8gbGlzdGVuIHRvIGNoYW5nZXMgaW4gdGhlIHJlcXVlc3RcbiAgICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gaWYgdGhlIHJlcXVlc3QgaXMgcmVhZHlcbiAgICAgICAgICAgIGlmICg0ID09PSB4aHIucmVhZHlTdGF0ZSkge1xuICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY2FjaGVkIGh0bWwgZG9jdW1lbnRcbiAgICAgICAgICAgICAgICB2YXIgY2FjaGVkRG9jdW1lbnQgPSB4aHIuX2NhY2hlZERvY3VtZW50O1xuICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB0aGUgY2FjaGVkIGh0bWwgZG9jdW1lbnQgYmFzZWQgb24gdGhlIHhociByZXNwb25zZVxuICAgICAgICAgICAgICAgIGNhY2hlZERvY3VtZW50IHx8IChjYWNoZWREb2N1bWVudCA9IHhoci5fY2FjaGVkRG9jdW1lbnQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoXCJcIiksIFxuICAgICAgICAgICAgICAgIGNhY2hlZERvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0geGhyLnJlc3BvbnNlVGV4dCwgeGhyLl9jYWNoZWRUYXJnZXQgPSB7fSksIC8vIGNsZWFyIHRoZSB4aHIgZW1iZWRzIGxpc3QgYW5kIGVtYmVkIGVhY2ggaXRlbVxuICAgICAgICAgICAgICAgIHhoci5fZW1iZWRzLnNwbGljZSgwKS5tYXAoZnVuY3Rpb24oaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNhY2hlZCB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHhoci5fY2FjaGVkVGFyZ2V0W2l0ZW0uaWRdO1xuICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhlIGNhY2hlZCB0YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0IHx8ICh0YXJnZXQgPSB4aHIuX2NhY2hlZFRhcmdldFtpdGVtLmlkXSA9IGNhY2hlZERvY3VtZW50LmdldEVsZW1lbnRCeUlkKGl0ZW0uaWQpKSwgXG4gICAgICAgICAgICAgICAgICAgIC8vIGVtYmVkIHRoZSB0YXJnZXQgaW50byB0aGUgc3ZnXG4gICAgICAgICAgICAgICAgICAgIGVtYmVkKGl0ZW0ucGFyZW50LCBpdGVtLnN2ZywgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgLy8gdGVzdCB0aGUgcmVhZHkgc3RhdGUgY2hhbmdlIGltbWVkaWF0ZWx5XG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3ZnNGV2ZXJ5Ym9keShyYXdvcHRzKSB7XG4gICAgICAgIGZ1bmN0aW9uIG9uaW50ZXJ2YWwoKSB7XG4gICAgICAgICAgICAvLyB3aGlsZSB0aGUgaW5kZXggZXhpc3RzIGluIHRoZSBsaXZlIDx1c2U+IGNvbGxlY3Rpb25cbiAgICAgICAgICAgIGZvciAoLy8gZ2V0IHRoZSBjYWNoZWQgPHVzZT4gaW5kZXhcbiAgICAgICAgICAgIHZhciBpbmRleCA9IDA7IGluZGV4IDwgdXNlcy5sZW5ndGg7ICkge1xuICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY3VycmVudCA8dXNlPlxuICAgICAgICAgICAgICAgIHZhciB1c2UgPSB1c2VzW2luZGV4XSwgcGFyZW50ID0gdXNlLnBhcmVudE5vZGUsIHN2ZyA9IGdldFNWR0FuY2VzdG9yKHBhcmVudCksIHNyYyA9IHVzZS5nZXRBdHRyaWJ1dGUoXCJ4bGluazpocmVmXCIpIHx8IHVzZS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICAgICAgICAgIGlmICghc3JjICYmIG9wdHMuYXR0cmlidXRlTmFtZSAmJiAoc3JjID0gdXNlLmdldEF0dHJpYnV0ZShvcHRzLmF0dHJpYnV0ZU5hbWUpKSwgXG4gICAgICAgICAgICAgICAgc3ZnICYmIHNyYykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9seWZpbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0cy52YWxpZGF0ZSB8fCBvcHRzLnZhbGlkYXRlKHNyYywgc3ZnLCB1c2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSA8dXNlPiBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKHVzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2UgdGhlIHNyYyBhbmQgZ2V0IHRoZSB1cmwgYW5kIGlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNyY1NwbGl0ID0gc3JjLnNwbGl0KFwiI1wiKSwgdXJsID0gc3JjU3BsaXQuc2hpZnQoKSwgaWQgPSBzcmNTcGxpdC5qb2luKFwiI1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbGluayBpcyBleHRlcm5hbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmwubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY2FjaGVkIHhociByZXF1ZXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4aHIgPSByZXF1ZXN0c1t1cmxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhlIHhociByZXF1ZXN0IGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIgfHwgKHhociA9IHJlcXVlc3RzW3VybF0gPSBuZXcgWE1MSHR0cFJlcXVlc3QoKSwgeGhyLm9wZW4oXCJHRVRcIiwgdXJsKSwgeGhyLnNlbmQoKSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5fZW1iZWRzID0gW10pLCAvLyBhZGQgdGhlIHN2ZyBhbmQgaWQgYXMgYW4gaXRlbSB0byB0aGUgeGhyIGVtYmVkcyBsaXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5fZW1iZWRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmc6IHN2ZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBpZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgLy8gcHJlcGFyZSB0aGUgeGhyIHJlYWR5IHN0YXRlIGNoYW5nZSBldmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkcmVhZHlzdGF0ZWNoYW5nZSh4aHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVtYmVkIHRoZSBsb2NhbCBpZCBpbnRvIHRoZSBzdmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWQocGFyZW50LCBzdmcsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZWFzZSB0aGUgaW5kZXggd2hlbiB0aGUgcHJldmlvdXMgdmFsdWUgd2FzIG5vdCBcInZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2luZGV4LCArK251bWJlck9mU3ZnVXNlRWxlbWVudHNUb0J5cGFzcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluY3JlYXNlIHRoZSBpbmRleCB3aGVuIHRoZSBwcmV2aW91cyB2YWx1ZSB3YXMgbm90IFwidmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICArK2luZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnRpbnVlIHRoZSBpbnRlcnZhbFxuICAgICAgICAgICAgKCF1c2VzLmxlbmd0aCB8fCB1c2VzLmxlbmd0aCAtIG51bWJlck9mU3ZnVXNlRWxlbWVudHNUb0J5cGFzcyA+IDApICYmIHJlcXVlc3RBbmltYXRpb25GcmFtZShvbmludGVydmFsLCA2Nyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBvbHlmaWxsLCBvcHRzID0gT2JqZWN0KHJhd29wdHMpLCBuZXdlcklFVUEgPSAvXFxiVHJpZGVudFxcL1s1NjddXFxifFxcYk1TSUUgKD86OXwxMClcXC4wXFxiLywgd2Via2l0VUEgPSAvXFxiQXBwbGVXZWJLaXRcXC8oXFxkKylcXGIvLCBvbGRlckVkZ2VVQSA9IC9cXGJFZGdlXFwvMTJcXC4oXFxkKylcXGIvLCBlZGdlVUEgPSAvXFxiRWRnZVxcLy4oXFxkKylcXGIvLCBpbklmcmFtZSA9IHdpbmRvdy50b3AgIT09IHdpbmRvdy5zZWxmO1xuICAgICAgICBwb2x5ZmlsbCA9IFwicG9seWZpbGxcIiBpbiBvcHRzID8gb3B0cy5wb2x5ZmlsbCA6IG5ld2VySUVVQS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpIHx8IChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKG9sZGVyRWRnZVVBKSB8fCBbXSlbMV0gPCAxMDU0NyB8fCAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCh3ZWJraXRVQSkgfHwgW10pWzFdIDwgNTM3IHx8IGVkZ2VVQS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmIGluSWZyYW1lO1xuICAgICAgICAvLyBjcmVhdGUgeGhyIHJlcXVlc3RzIG9iamVjdFxuICAgICAgICB2YXIgcmVxdWVzdHMgPSB7fSwgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBzZXRUaW1lb3V0LCB1c2VzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ1c2VcIiksIG51bWJlck9mU3ZnVXNlRWxlbWVudHNUb0J5cGFzcyA9IDA7XG4gICAgICAgIC8vIGNvbmRpdGlvbmFsbHkgc3RhcnQgdGhlIGludGVydmFsIGlmIHRoZSBwb2x5ZmlsbCBpcyBhY3RpdmVcbiAgICAgICAgcG9seWZpbGwgJiYgb25pbnRlcnZhbCgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRTVkdBbmNlc3Rvcihub2RlKSB7XG4gICAgICAgIGZvciAodmFyIHN2ZyA9IG5vZGU7IFwic3ZnXCIgIT09IHN2Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICYmIChzdmcgPSBzdmcucGFyZW50Tm9kZSk7ICkge31cbiAgICAgICAgcmV0dXJuIHN2ZztcbiAgICB9XG4gICAgcmV0dXJuIHN2ZzRldmVyeWJvZHk7XG59KTsiLCIvKiEgVUlraXQgMi4yNy40IHwgaHR0cDovL3d3dy5nZXR1aWtpdC5jb20gfCAoYykgMjAxNCBZT090aGVtZSB8IE1JVCBMaWNlbnNlICovXG4oZnVuY3Rpb24oY29yZSkge1xuXG4gICAgdmFyIHVpa2l0O1xuXG4gICAgaWYgKCF3aW5kb3cualF1ZXJ5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVUlraXQgMi54IHJlcXVpcmVzIGpRdWVyeScpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHVpa2l0ID0gY29yZSh3aW5kb3cualF1ZXJ5KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsgLy8gQU1EXG5cbiAgICAgICAgZGVmaW5lKCd1aWtpdCcsIGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgIHVpa2l0LmxvYWQgPSBmdW5jdGlvbihyZXMsIHJlcSwgb25sb2FkLCBjb25maWcpIHtcblxuICAgICAgICAgICAgICAgIHZhciByZXNvdXJjZXMgPSByZXMuc3BsaXQoJywnKSwgbG9hZCA9IFtdLCBpLCBiYXNlID0gKGNvbmZpZy5jb25maWcgJiYgY29uZmlnLmNvbmZpZy51aWtpdCAmJiBjb25maWcuY29uZmlnLnVpa2l0LmJhc2UgPyBjb25maWcuY29uZmlnLnVpa2l0LmJhc2UgOiAnJykucmVwbGFjZSgvXFwvKyQvZywgJycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFiYXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIGRlZmluZSBiYXNlIHBhdGggdG8gVUlraXQgaW4gdGhlIHJlcXVpcmVqcyBjb25maWcuJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV0ucmVwbGFjZSgvXFwuL2csICcvJyk7XG4gICAgICAgICAgICAgICAgICAgIGxvYWQucHVzaChiYXNlKycvY29tcG9uZW50cy8nK3Jlc291cmNlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXEobG9hZCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ubG9hZCh1aWtpdCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gdWlraXQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxufSkoZnVuY3Rpb24oJCkge1xuXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAod2luZG93LlVJa2l0Mikge1xuICAgICAgICByZXR1cm4gd2luZG93LlVJa2l0MjtcbiAgICB9XG5cbiAgICB2YXIgVUkgPSB7fSwgX1VJID0gd2luZG93LlVJa2l0IHx8IHVuZGVmaW5lZDtcblxuICAgIFVJLnZlcnNpb24gPSAnMi4yNy40JztcblxuICAgIFVJLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gcmVzdG9yZSBVSWtpdCB2ZXJzaW9uXG4gICAgICAgIGlmIChfVUkpIHtcbiAgICAgICAgICAgIHdpbmRvdy5VSWtpdCA9IF9VSTtcbiAgICAgICAgICAgICQuVUlraXQgICAgICA9IF9VSTtcbiAgICAgICAgICAgICQuZm4udWsgICAgICA9IF9VSS5mbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBVSTtcbiAgICB9O1xuXG4gICAgd2luZG93LlVJa2l0MiA9IFVJO1xuXG4gICAgaWYgKCFfVUkpIHtcbiAgICAgICAgd2luZG93LlVJa2l0ID0gVUk7XG4gICAgfVxuXG4gICAgLy8gY2FjaGUgalF1ZXJ5XG4gICAgVUkuJCA9ICQ7XG5cbiAgICBVSS4kZG9jICA9IFVJLiQoZG9jdW1lbnQpO1xuICAgIFVJLiR3aW4gID0gVUkuJCh3aW5kb3cpO1xuICAgIFVJLiRodG1sID0gVUkuJCgnaHRtbCcpO1xuXG4gICAgVUkuc3VwcG9ydCA9IHt9O1xuICAgIFVJLnN1cHBvcnQudHJhbnNpdGlvbiA9IChmdW5jdGlvbigpIHtcblxuICAgICAgICB2YXIgdHJhbnNpdGlvbkVuZCA9IChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5ib2R5IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgICAgICAgICAgICB0cmFuc0VuZEV2ZW50TmFtZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIFdlYmtpdFRyYW5zaXRpb24gOiAnd2Via2l0VHJhbnNpdGlvbkVuZCcsXG4gICAgICAgICAgICAgICAgICAgIE1velRyYW5zaXRpb24gICAgOiAndHJhbnNpdGlvbmVuZCcsXG4gICAgICAgICAgICAgICAgICAgIE9UcmFuc2l0aW9uICAgICAgOiAnb1RyYW5zaXRpb25FbmQgb3RyYW5zaXRpb25lbmQnLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uICAgICAgIDogJ3RyYW5zaXRpb25lbmQnXG4gICAgICAgICAgICAgICAgfSwgbmFtZTtcblxuICAgICAgICAgICAgZm9yIChuYW1lIGluIHRyYW5zRW5kRXZlbnROYW1lcykge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnN0eWxlW25hbWVdICE9PSB1bmRlZmluZWQpIHJldHVybiB0cmFuc0VuZEV2ZW50TmFtZXNbbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0oKSk7XG5cbiAgICAgICAgcmV0dXJuIHRyYW5zaXRpb25FbmQgJiYgeyBlbmQ6IHRyYW5zaXRpb25FbmQgfTtcbiAgICB9KSgpO1xuXG4gICAgVUkuc3VwcG9ydC5hbmltYXRpb24gPSAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgdmFyIGFuaW1hdGlvbkVuZCA9IChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5ib2R5IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxcbiAgICAgICAgICAgICAgICBhbmltRW5kRXZlbnROYW1lcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgV2Via2l0QW5pbWF0aW9uIDogJ3dlYmtpdEFuaW1hdGlvbkVuZCcsXG4gICAgICAgICAgICAgICAgICAgIE1vekFuaW1hdGlvbiAgICA6ICdhbmltYXRpb25lbmQnLFxuICAgICAgICAgICAgICAgICAgICBPQW5pbWF0aW9uICAgICAgOiAnb0FuaW1hdGlvbkVuZCBvYW5pbWF0aW9uZW5kJyxcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uICAgICAgIDogJ2FuaW1hdGlvbmVuZCdcbiAgICAgICAgICAgICAgICB9LCBuYW1lO1xuXG4gICAgICAgICAgICBmb3IgKG5hbWUgaW4gYW5pbUVuZEV2ZW50TmFtZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zdHlsZVtuYW1lXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYW5pbUVuZEV2ZW50TmFtZXNbbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0oKSk7XG5cbiAgICAgICAgcmV0dXJuIGFuaW1hdGlvbkVuZCAmJiB7IGVuZDogYW5pbWF0aW9uRW5kIH07XG4gICAgfSkoKTtcblxuICAgIC8vIHJlcXVlc3RBbmltYXRpb25GcmFtZSBwb2x5ZmlsbFxuICAgIC8vaHR0cHM6Ly9naXRodWIuY29tL2Rhcml1cy9yZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgRGF0ZS5ub3cgPSBEYXRlLm5vdyB8fCBmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpOyB9O1xuXG4gICAgICAgIHZhciB2ZW5kb3JzID0gWyd3ZWJraXQnLCAnbW96J107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVuZG9ycy5sZW5ndGggJiYgIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7ICsraSkge1xuICAgICAgICAgICAgdmFyIHZwID0gdmVuZG9yc1tpXTtcbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB3aW5kb3dbdnArJ1JlcXVlc3RBbmltYXRpb25GcmFtZSddO1xuICAgICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gKHdpbmRvd1t2cCsnQ2FuY2VsQW5pbWF0aW9uRnJhbWUnXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgd2luZG93W3ZwKydDYW5jZWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKC9pUChhZHxob25lfG9kKS4qT1MgNi8udGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkgLy8gaU9TNiBpcyBidWdneVxuICAgICAgICAgICAgfHwgIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgIXdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSkge1xuICAgICAgICAgICAgdmFyIGxhc3RUaW1lID0gMDtcbiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIHZhciBuZXh0VGltZSA9IE1hdGgubWF4KGxhc3RUaW1lICsgMTYsIG5vdyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGNhbGxiYWNrKGxhc3RUaW1lID0gbmV4dFRpbWUpOyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUaW1lIC0gbm93KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9KCkpO1xuXG4gICAgVUkuc3VwcG9ydC50b3VjaCA9IChcbiAgICAgICAgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50KSB8fFxuICAgICAgICAod2luZG93LkRvY3VtZW50VG91Y2ggJiYgZG9jdW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuRG9jdW1lbnRUb3VjaCkgIHx8XG4gICAgICAgICh3aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQgJiYgd2luZG93Lm5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzID4gMCkgfHwgLy9JRSAxMFxuICAgICAgICAod2luZG93Lm5hdmlnYXRvci5wb2ludGVyRW5hYmxlZCAmJiB3aW5kb3cubmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzID4gMCkgfHwgLy9JRSA+PTExXG4gICAgICAgIGZhbHNlXG4gICAgKTtcblxuICAgIFVJLnN1cHBvcnQubXV0YXRpb25vYnNlcnZlciA9ICh3aW5kb3cuTXV0YXRpb25PYnNlcnZlciB8fCB3aW5kb3cuV2ViS2l0TXV0YXRpb25PYnNlcnZlciB8fCBudWxsKTtcblxuICAgIFVJLlV0aWxzID0ge307XG5cbiAgICBVSS5VdGlscy5pc0Z1bGxzY3JlZW4gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHwgZmFsc2U7XG4gICAgfTtcblxuICAgIFVJLlV0aWxzLnN0cjJqc29uID0gZnVuY3Rpb24oc3RyLCBub3RldmlsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAobm90ZXZpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0clxuICAgICAgICAgICAgICAgICAgICAvLyB3cmFwIGtleXMgd2l0aG91dCBxdW90ZSB3aXRoIHZhbGlkIGRvdWJsZSBxdW90ZVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKFtcXCRcXHddKylcXHMqOi9nLCBmdW5jdGlvbihfLCAkMSl7cmV0dXJuICdcIicrJDErJ1wiOic7fSlcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjaW5nIHNpbmdsZSBxdW90ZSB3cmFwcGVkIG9uZXMgdG8gZG91YmxlIHF1b3RlXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nKFteJ10rKScvZywgZnVuY3Rpb24oXywgJDEpe3JldHVybiAnXCInKyQxKydcIic7fSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBGdW5jdGlvbignJywgJ3ZhciBqc29uID0gJyArIHN0ciArICc7IHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGpzb24pKTsnKSkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaChlKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIH07XG5cbiAgICBVSS5VdGlscy5kZWJvdW5jZSA9IGZ1bmN0aW9uKGZ1bmMsIHdhaXQsIGltbWVkaWF0ZSkge1xuICAgICAgICB2YXIgdGltZW91dDtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLCBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICAgICAgdmFyIGxhdGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKCFpbW1lZGlhdGUpIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIGNhbGxOb3cgPSBpbW1lZGlhdGUgJiYgIXRpbWVvdXQ7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG4gICAgICAgICAgICBpZiAoY2FsbE5vdykgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgVUkuVXRpbHMudGhyb3R0bGUgPSBmdW5jdGlvbiAoZnVuYywgbGltaXQpIHtcbiAgICAgICAgdmFyIHdhaXQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghd2FpdCkge1xuICAgICAgICAgICAgICAgIGZ1bmMuY2FsbCgpO1xuICAgICAgICAgICAgICAgIHdhaXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB3YWl0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSwgbGltaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIFVJLlV0aWxzLnJlbW92ZUNzc1J1bGVzID0gZnVuY3Rpb24oc2VsZWN0b3JSZWdFeCkge1xuICAgICAgICB2YXIgaWR4LCBpZHhzLCBzdHlsZXNoZWV0LCBfaSwgX2osIF9rLCBfbGVuLCBfbGVuMSwgX2xlbjIsIF9yZWY7XG5cbiAgICAgICAgaWYoIXNlbGVjdG9yUmVnRXgpIHJldHVybjtcblxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBfcmVmID0gZG9jdW1lbnQuc3R5bGVTaGVldHM7XG4gICAgICAgICAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gX3JlZi5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQgPSBfcmVmW19pXTtcbiAgICAgICAgICAgICAgICBpZHhzID0gW107XG4gICAgICAgICAgICAgICAgc3R5bGVzaGVldC5jc3NSdWxlcyA9IHN0eWxlc2hlZXQuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgZm9yIChpZHggPSBfaiA9IDAsIF9sZW4xID0gc3R5bGVzaGVldC5jc3NSdWxlcy5sZW5ndGg7IF9qIDwgX2xlbjE7IGlkeCA9ICsrX2opIHtcbiAgICAgICAgICAgICAgICAgIGlmIChzdHlsZXNoZWV0LmNzc1J1bGVzW2lkeF0udHlwZSA9PT0gQ1NTUnVsZS5TVFlMRV9SVUxFICYmIHNlbGVjdG9yUmVnRXgudGVzdChzdHlsZXNoZWV0LmNzc1J1bGVzW2lkeF0uc2VsZWN0b3JUZXh0KSkge1xuICAgICAgICAgICAgICAgICAgICBpZHhzLnVuc2hpZnQoaWR4KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChfayA9IDAsIF9sZW4yID0gaWR4cy5sZW5ndGg7IF9rIDwgX2xlbjI7IF9rKyspIHtcbiAgICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQuZGVsZXRlUnVsZShpZHhzW19rXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChfZXJyb3IpIHt9XG4gICAgICAgIH0sIDApO1xuICAgIH07XG5cbiAgICBVSS5VdGlscy5pc0luVmlldyA9IGZ1bmN0aW9uKGVsZW1lbnQsIG9wdGlvbnMpIHtcblxuICAgICAgICB2YXIgJGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuXG4gICAgICAgIGlmICghJGVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB3aW5kb3dfbGVmdCA9IFVJLiR3aW4uc2Nyb2xsTGVmdCgpLCB3aW5kb3dfdG9wID0gVUkuJHdpbi5zY3JvbGxUb3AoKSwgb2Zmc2V0ID0gJGVsZW1lbnQub2Zmc2V0KCksIGxlZnQgPSBvZmZzZXQubGVmdCwgdG9wID0gb2Zmc2V0LnRvcDtcblxuICAgICAgICBvcHRpb25zID0gJC5leHRlbmQoe3RvcG9mZnNldDowLCBsZWZ0b2Zmc2V0OjB9LCBvcHRpb25zKTtcblxuICAgICAgICBpZiAodG9wICsgJGVsZW1lbnQuaGVpZ2h0KCkgPj0gd2luZG93X3RvcCAmJiB0b3AgLSBvcHRpb25zLnRvcG9mZnNldCA8PSB3aW5kb3dfdG9wICsgVUkuJHdpbi5oZWlnaHQoKSAmJlxuICAgICAgICAgICAgbGVmdCArICRlbGVtZW50LndpZHRoKCkgPj0gd2luZG93X2xlZnQgJiYgbGVmdCAtIG9wdGlvbnMubGVmdG9mZnNldCA8PSB3aW5kb3dfbGVmdCArIFVJLiR3aW4ud2lkdGgoKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBVSS5VdGlscy5jaGVja0Rpc3BsYXkgPSBmdW5jdGlvbihjb250ZXh0LCBpbml0YW5pbWF0aW9uKSB7XG5cbiAgICAgICAgdmFyIGVsZW1lbnRzID0gVUkuJCgnW2RhdGEtdWstbWFyZ2luXSwgW2RhdGEtdWstZ3JpZC1tYXRjaF0sIFtkYXRhLXVrLWdyaWQtbWFyZ2luXSwgW2RhdGEtdWstY2hlY2stZGlzcGxheV0nLCBjb250ZXh0IHx8IGRvY3VtZW50KSwgYW5pbWF0ZWQ7XG5cbiAgICAgICAgaWYgKGNvbnRleHQgJiYgIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgZWxlbWVudHMgPSAkKGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbWVudHMudHJpZ2dlcignZGlzcGxheS51ay5jaGVjaycpO1xuXG4gICAgICAgIC8vIGZpeCBmaXJlZm94IC8gSUUgYW5pbWF0aW9uc1xuICAgICAgICBpZiAoaW5pdGFuaW1hdGlvbikge1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mKGluaXRhbmltYXRpb24pIT0nc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGluaXRhbmltYXRpb24gPSAnW2NsYXNzKj1cInVrLWFuaW1hdGlvbi1cIl0nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbGVtZW50cy5maW5kKGluaXRhbmltYXRpb24pLmVhY2goZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgIHZhciBlbGUgID0gVUkuJCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgY2xzICA9IGVsZS5hdHRyKCdjbGFzcycpLFxuICAgICAgICAgICAgICAgICAgICBhbmltID0gY2xzLm1hdGNoKC91ay1hbmltYXRpb24tKC4rKS8pO1xuXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZUNsYXNzKGFuaW1bMF0pLndpZHRoKCk7XG5cbiAgICAgICAgICAgICAgICBlbGUuYWRkQ2xhc3MoYW5pbVswXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICB9O1xuXG4gICAgVUkuVXRpbHMub3B0aW9ucyA9IGZ1bmN0aW9uKHN0cmluZykge1xuXG4gICAgICAgIGlmICgkLnR5cGUoc3RyaW5nKSE9J3N0cmluZycpIHJldHVybiBzdHJpbmc7XG5cbiAgICAgICAgaWYgKHN0cmluZy5pbmRleE9mKCc6JykgIT0gLTEgJiYgc3RyaW5nLnRyaW0oKS5zdWJzdHIoLTEpICE9ICd9Jykge1xuICAgICAgICAgICAgc3RyaW5nID0gJ3snK3N0cmluZysnfSc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RhcnQgPSAoc3RyaW5nID8gc3RyaW5nLmluZGV4T2YoXCJ7XCIpIDogLTEpLCBvcHRpb25zID0ge307XG5cbiAgICAgICAgaWYgKHN0YXJ0ICE9IC0xKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBVSS5VdGlscy5zdHIyanNvbihzdHJpbmcuc3Vic3RyKHN0YXJ0KSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfTtcblxuICAgIFVJLlV0aWxzLmFuaW1hdGUgPSBmdW5jdGlvbihlbGVtZW50LCBjbHMpIHtcblxuICAgICAgICB2YXIgZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICBlbGVtZW50ID0gVUkuJChlbGVtZW50KTtcblxuICAgICAgICBlbGVtZW50LmNzcygnZGlzcGxheScsICdub25lJykuYWRkQ2xhc3MoY2xzKS5vbmUoVUkuc3VwcG9ydC5hbmltYXRpb24uZW5kLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MoY2xzKTtcbiAgICAgICAgICAgIGQucmVzb2x2ZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBlbGVtZW50LmNzcygnZGlzcGxheScsICcnKTtcblxuICAgICAgICByZXR1cm4gZC5wcm9taXNlKCk7XG4gICAgfTtcblxuICAgIFVJLlV0aWxzLnVpZCA9IGZ1bmN0aW9uKHByZWZpeCkge1xuICAgICAgICByZXR1cm4gKHByZWZpeCB8fCAnaWQnKSArIChuZXcgRGF0ZSgpLmdldFRpbWUoKSkrXCJSQU5EXCIrKE1hdGguY2VpbChNYXRoLnJhbmRvbSgpICogMTAwMDAwKSk7XG4gICAgfTtcblxuICAgIFVJLlV0aWxzLnRlbXBsYXRlID0gZnVuY3Rpb24oc3RyLCBkYXRhKSB7XG5cbiAgICAgICAgdmFyIHRva2VucyA9IHN0ci5yZXBsYWNlKC9cXG4vZywgJ1xcXFxuJykucmVwbGFjZSgvXFx7XFx7XFx7XFxzKiguKz8pXFxzKlxcfVxcfVxcfS9nLCBcInt7ISQxfX1cIikuc3BsaXQoLyhcXHtcXHtcXHMqKC4rPylcXHMqXFx9XFx9KS9nKSxcbiAgICAgICAgICAgIGk9MCwgdG9jLCBjbWQsIHByb3AsIHZhbCwgZm4sIG91dHB1dCA9IFtdLCBvcGVuYmxvY2tzID0gMDtcblxuICAgICAgICB3aGlsZShpIDwgdG9rZW5zLmxlbmd0aCkge1xuXG4gICAgICAgICAgICB0b2MgPSB0b2tlbnNbaV07XG5cbiAgICAgICAgICAgIGlmKHRvYy5tYXRjaCgvXFx7XFx7XFxzKiguKz8pXFxzKlxcfVxcfS8pKSB7XG4gICAgICAgICAgICAgICAgaSA9IGkgKyAxO1xuICAgICAgICAgICAgICAgIHRvYyAgPSB0b2tlbnNbaV07XG4gICAgICAgICAgICAgICAgY21kICA9IHRvY1swXTtcbiAgICAgICAgICAgICAgICBwcm9wID0gdG9jLnN1YnN0cmluZyh0b2MubWF0Y2goL14oXFxefFxcI3xcXCF8XFx+fFxcOikvKSA/IDE6MCk7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2goY21kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ34nOlxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goJ2Zvcih2YXIgJGk9MDskaTwnK3Byb3ArJy5sZW5ndGg7JGkrKykgeyB2YXIgJGl0ZW0gPSAnK3Byb3ArJ1skaV07Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuYmxvY2tzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnOic6XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgnZm9yKHZhciAka2V5IGluICcrcHJvcCsnKSB7IHZhciAkdmFsID0gJytwcm9wKydbJGtleV07Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuYmxvY2tzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnIyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgnaWYoJytwcm9wKycpIHsnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5ibG9ja3MrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdeJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKCdpZighJytwcm9wKycpIHsnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5ibG9ja3MrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKCd9Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuYmxvY2tzLS07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnISc6XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgnX19yZXQucHVzaCgnK3Byb3ArJyk7Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKCdfX3JldC5wdXNoKGVzY2FwZSgnK3Byb3ArJykpOycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQucHVzaChcIl9fcmV0LnB1c2goJ1wiK3RvYy5yZXBsYWNlKC9cXCcvZywgXCJcXFxcJ1wiKStcIicpO1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkgPSBpICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZuICA9IG5ldyBGdW5jdGlvbignJGRhdGEnLCBbXG4gICAgICAgICAgICAndmFyIF9fcmV0ID0gW107JyxcbiAgICAgICAgICAgICd0cnkgeycsXG4gICAgICAgICAgICAnd2l0aCgkZGF0YSl7JywgKCFvcGVuYmxvY2tzID8gb3V0cHV0LmpvaW4oJycpIDogJ19fcmV0ID0gW1wiTm90IGFsbCBibG9ja3MgYXJlIGNsb3NlZCBjb3JyZWN0bHkuXCJdJyksICd9OycsXG4gICAgICAgICAgICAnfWNhdGNoKGUpe19fcmV0ID0gW2UubWVzc2FnZV07fScsXG4gICAgICAgICAgICAncmV0dXJuIF9fcmV0LmpvaW4oXCJcIikucmVwbGFjZSgvXFxcXG5cXFxcbi9nLCBcIlxcXFxuXCIpOycsXG4gICAgICAgICAgICBcImZ1bmN0aW9uIGVzY2FwZShodG1sKSB7IHJldHVybiBTdHJpbmcoaHRtbCkucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC9cXFwiL2csICcmcXVvdDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpO31cIlxuICAgICAgICBdLmpvaW4oXCJcXG5cIikpO1xuXG4gICAgICAgIHJldHVybiBkYXRhID8gZm4oZGF0YSkgOiBmbjtcbiAgICB9O1xuXG4gICAgVUkuVXRpbHMuZm9jdXMgPSBmdW5jdGlvbihlbGVtZW50LCBleHRyYSkge1xuXG4gICAgICAgIGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuXG4gICAgICAgIGlmICghZWxlbWVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGF1dG9mb2N1cyA9IGVsZW1lbnQuZmluZCgnW2F1dG9mb2N1c106Zmlyc3QnKSwgdGFiaWR4O1xuXG4gICAgICAgIGlmIChhdXRvZm9jdXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gYXV0b2ZvY3VzLmZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRvZm9jdXMgPSBlbGVtZW50LmZpbmQoJzppbnB1dCcrKGV4dHJhICYmICgnLCcrZXh0cmEpIHx8ICcnKSkuZmlyc3QoKTtcblxuICAgICAgICBpZiAoYXV0b2ZvY3VzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGF1dG9mb2N1cy5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFlbGVtZW50LmF0dHIoJ3RhYmluZGV4JykpIHtcbiAgICAgICAgICAgIHRhYmlkeCA9IDEwMDA7XG4gICAgICAgICAgICBlbGVtZW50LmF0dHIoJ3RhYmluZGV4JywgdGFiaWR4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnRbMF0uZm9jdXMoKTtcblxuICAgICAgICBpZiAodGFiaWR4KSB7XG4gICAgICAgICAgICBlbGVtZW50LmF0dHIoJ3RhYmluZGV4JywgJycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgVUkuVXRpbHMuZXZlbnRzICAgICAgID0ge307XG4gICAgVUkuVXRpbHMuZXZlbnRzLmNsaWNrID0gVUkuc3VwcG9ydC50b3VjaCA/ICd0YXAnIDogJ2NsaWNrJztcblxuICAgIC8vIGRlcHJlY2F0ZWRcblxuICAgIFVJLmZuID0gZnVuY3Rpb24oY29tbWFuZCwgb3B0aW9ucykge1xuXG4gICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLCBjbWQgPSBjb21tYW5kLm1hdGNoKC9eKFthLXpcXC1dKykoPzpcXC4oW2Etel0rKSk/L2kpLCBjb21wb25lbnQgPSBjbWRbMV0sIG1ldGhvZCA9IGNtZFsyXTtcblxuICAgICAgICBpZiAoIVVJW2NvbXBvbmVudF0pIHtcbiAgICAgICAgICAgICQuZXJyb3IoJ1VJa2l0IGNvbXBvbmVudCBbJyArIGNvbXBvbmVudCArICddIGRvZXMgbm90IGV4aXN0LicpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKSwgZGF0YSA9ICR0aGlzLmRhdGEoY29tcG9uZW50KTtcbiAgICAgICAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YShjb21wb25lbnQsIChkYXRhID0gVUlbY29tcG9uZW50XSh0aGlzLCBtZXRob2QgPyB1bmRlZmluZWQgOiBvcHRpb25zKSkpO1xuICAgICAgICAgICAgaWYgKG1ldGhvZCkgZGF0YVttZXRob2RdLmFwcGx5KGRhdGEsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MsIDEpKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgICQuVUlraXQgICAgICAgICAgPSBVSTtcbiAgICAkLmZuLnVrICAgICAgICAgID0gVUkuZm47XG5cbiAgICBVSS5sYW5nZGlyZWN0aW9uID0gVUkuJGh0bWwuYXR0cihcImRpclwiKSA9PSBcInJ0bFwiID8gXCJyaWdodFwiIDogXCJsZWZ0XCI7XG5cbiAgICBVSS5jb21wb25lbnRzICAgID0ge307XG5cbiAgICBVSS5jb21wb25lbnQgPSBmdW5jdGlvbihuYW1lLCBkZWYsIG92ZXJyaWRlKSB7XG5cbiAgICAgICAgaWYgKFVJLmNvbXBvbmVudHNbbmFtZV0gJiYgIW92ZXJyaWRlKSB7XG4gICAgICAgICAgICByZXR1cm4gVUkuY29tcG9uZW50c1tuYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIG9wdGlvbnMpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5VSWtpdCAgID0gVUk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50ID8gVUkuJChlbGVtZW50KSA6IG51bGw7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgdGhpcy5kZWZhdWx0cywgb3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLnBsdWdpbnMgPSB7fTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5kYXRhKG5hbWUsIHRoaXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmluaXQoKTtcblxuICAgICAgICAgICAgKHRoaXMub3B0aW9ucy5wbHVnaW5zLmxlbmd0aCA/IHRoaXMub3B0aW9ucy5wbHVnaW5zIDogT2JqZWN0LmtleXMoZm4ucGx1Z2lucykpLmZvckVhY2goZnVuY3Rpb24ocGx1Z2luKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoZm4ucGx1Z2luc1twbHVnaW5dLmluaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm4ucGx1Z2luc1twbHVnaW5dLmluaXQoJHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICAkdGhpcy5wbHVnaW5zW3BsdWdpbl0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignaW5pdC51ay5jb21wb25lbnQnLCBbbmFtZSwgdGhpc10pO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfTtcblxuICAgICAgICBmbi5wbHVnaW5zID0ge307XG5cbiAgICAgICAgJC5leHRlbmQodHJ1ZSwgZm4ucHJvdG90eXBlLCB7XG5cbiAgICAgICAgICAgIGRlZmF1bHRzIDoge3BsdWdpbnM6IFtdfSxcblxuICAgICAgICAgICAgYm9vdDogZnVuY3Rpb24oKXt9LFxuICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24oKXt9LFxuXG4gICAgICAgICAgICBvbjogZnVuY3Rpb24oYTEsYTIsYTMpe1xuICAgICAgICAgICAgICAgIHJldHVybiBVSS4kKHRoaXMuZWxlbWVudCB8fCB0aGlzKS5vbihhMSxhMixhMyk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvbmU6IGZ1bmN0aW9uKGExLGEyLGEzKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gVUkuJCh0aGlzLmVsZW1lbnQgfHwgdGhpcykub25lKGExLGEyLGEzKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9mZjogZnVuY3Rpb24oZXZ0KXtcbiAgICAgICAgICAgICAgICByZXR1cm4gVUkuJCh0aGlzLmVsZW1lbnQgfHwgdGhpcykub2ZmKGV2dCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB0cmlnZ2VyOiBmdW5jdGlvbihldnQsIHBhcmFtcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBVSS4kKHRoaXMuZWxlbWVudCB8fCB0aGlzKS50cmlnZ2VyKGV2dCwgcGFyYW1zKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGZpbmQ6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVJLiQodGhpcy5lbGVtZW50ID8gdGhpcy5lbGVtZW50OiBbXSkuZmluZChzZWxlY3Rvcik7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBwcm94eTogZnVuY3Rpb24ob2JqLCBtZXRob2RzKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgbWV0aG9kcy5zcGxpdCgnICcpLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXNbbWV0aG9kXSkgJHRoaXNbbWV0aG9kXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gb2JqW21ldGhvZF0uYXBwbHkob2JqLCBhcmd1bWVudHMpOyB9O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgbWl4aW46IGZ1bmN0aW9uKG9iaiwgbWV0aG9kcykge1xuXG4gICAgICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgICAgIG1ldGhvZHMuc3BsaXQoJyAnKS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzW21ldGhvZF0pICR0aGlzW21ldGhvZF0gPSBvYmpbbWV0aG9kXS5iaW5kKCR0aGlzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9wdGlvbjogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbYXJndW1lbnRzWzBdXSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zW2FyZ3VtZW50c1swXV0gPSBhcmd1bWVudHNbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0sIGRlZik7XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzW25hbWVdID0gZm47XG5cbiAgICAgICAgdGhpc1tuYW1lXSA9IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgZWxlbWVudCwgb3B0aW9ucztcblxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcblxuICAgICAgICAgICAgICAgIHN3aXRjaChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdzdHJpbmcnIHx8IGFyZ3VtZW50c1swXS5ub2RlVHlwZSB8fCBhcmd1bWVudHNbMF0gaW5zdGFuY2VvZiBqUXVlcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gJChhcmd1bWVudHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gJChhcmd1bWVudHNbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5kYXRhKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZGF0YShuYW1lKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIChuZXcgVUkuY29tcG9uZW50c1tuYW1lXShlbGVtZW50LCBvcHRpb25zKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKFVJLmRvbXJlYWR5KSB7XG4gICAgICAgICAgICBVSS5jb21wb25lbnQuYm9vdChuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbjtcbiAgICB9O1xuXG4gICAgVUkucGx1Z2luID0gZnVuY3Rpb24oY29tcG9uZW50LCBuYW1lLCBkZWYpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzW2NvbXBvbmVudF0ucGx1Z2luc1tuYW1lXSA9IGRlZjtcbiAgICB9O1xuXG4gICAgVUkuY29tcG9uZW50LmJvb3QgPSBmdW5jdGlvbihuYW1lKSB7XG5cbiAgICAgICAgaWYgKFVJLmNvbXBvbmVudHNbbmFtZV0ucHJvdG90eXBlICYmIFVJLmNvbXBvbmVudHNbbmFtZV0ucHJvdG90eXBlLmJvb3QgJiYgIVVJLmNvbXBvbmVudHNbbmFtZV0uYm9vdGVkKSB7XG4gICAgICAgICAgICBVSS5jb21wb25lbnRzW25hbWVdLnByb3RvdHlwZS5ib290LmFwcGx5KFVJLCBbXSk7XG4gICAgICAgICAgICBVSS5jb21wb25lbnRzW25hbWVdLmJvb3RlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgVUkuY29tcG9uZW50LmJvb3RDb21wb25lbnRzID0gZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgZm9yICh2YXIgY29tcG9uZW50IGluIFVJLmNvbXBvbmVudHMpIHtcbiAgICAgICAgICAgIFVJLmNvbXBvbmVudC5ib290KGNvbXBvbmVudCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG5cbiAgICAvLyBET00gbXV0YXRpb24gc2F2ZSByZWFkeSBoZWxwZXIgZnVuY3Rpb25cblxuICAgIFVJLmRvbU9ic2VydmVycyA9IFtdO1xuICAgIFVJLmRvbXJlYWR5ICAgICA9IGZhbHNlO1xuXG4gICAgVUkucmVhZHkgPSBmdW5jdGlvbihmbikge1xuXG4gICAgICAgIFVJLmRvbU9ic2VydmVycy5wdXNoKGZuKTtcblxuICAgICAgICBpZiAoVUkuZG9tcmVhZHkpIHtcbiAgICAgICAgICAgIGZuKGRvY3VtZW50KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBVSS5vbiA9IGZ1bmN0aW9uKGExLGEyLGEzKXtcblxuICAgICAgICBpZiAoYTEgJiYgYTEuaW5kZXhPZigncmVhZHkudWsuZG9tJykgPiAtMSAmJiBVSS5kb21yZWFkeSkge1xuICAgICAgICAgICAgYTIuYXBwbHkoVUkuJGRvYyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gVUkuJGRvYy5vbihhMSxhMixhMyk7XG4gICAgfTtcblxuICAgIFVJLm9uZSA9IGZ1bmN0aW9uKGExLGEyLGEzKXtcblxuICAgICAgICBpZiAoYTEgJiYgYTEuaW5kZXhPZigncmVhZHkudWsuZG9tJykgPiAtMSAmJiBVSS5kb21yZWFkeSkge1xuICAgICAgICAgICAgYTIuYXBwbHkoVUkuJGRvYyk7XG4gICAgICAgICAgICByZXR1cm4gVUkuJGRvYztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBVSS4kZG9jLm9uZShhMSxhMixhMyk7XG4gICAgfTtcblxuICAgIFVJLnRyaWdnZXIgPSBmdW5jdGlvbihldnQsIHBhcmFtcykge1xuICAgICAgICByZXR1cm4gVUkuJGRvYy50cmlnZ2VyKGV2dCwgcGFyYW1zKTtcbiAgICB9O1xuXG4gICAgVUkuZG9tT2JzZXJ2ZSA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBmbikge1xuXG4gICAgICAgIGlmKCFVSS5zdXBwb3J0Lm11dGF0aW9ub2JzZXJ2ZXIpIHJldHVybjtcblxuICAgICAgICBmbiA9IGZuIHx8IGZ1bmN0aW9uKCkge307XG5cbiAgICAgICAgVUkuJChzZWxlY3RvcikuZWFjaChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgID0gdGhpcyxcbiAgICAgICAgICAgICAgICAkZWxlbWVudCA9IFVJLiQoZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGlmICgkZWxlbWVudC5kYXRhKCdvYnNlcnZlcicpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnkge1xuXG4gICAgICAgICAgICAgICAgdmFyIG9ic2VydmVyID0gbmV3IFVJLnN1cHBvcnQubXV0YXRpb25vYnNlcnZlcihVSS5VdGlscy5kZWJvdW5jZShmdW5jdGlvbihtdXRhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgZm4uYXBwbHkoZWxlbWVudCwgWyRlbGVtZW50XSk7XG4gICAgICAgICAgICAgICAgICAgICRlbGVtZW50LnRyaWdnZXIoJ2NoYW5nZWQudWsuZG9tJyk7XG4gICAgICAgICAgICAgICAgfSwgNTApLCB7Y2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlfSk7XG5cbiAgICAgICAgICAgICAgICAvLyBwYXNzIGluIHRoZSB0YXJnZXQgbm9kZSwgYXMgd2VsbCBhcyB0aGUgb2JzZXJ2ZXIgb3B0aW9uc1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZWxlbWVudCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG5cbiAgICAgICAgICAgICAgICAkZWxlbWVudC5kYXRhKCdvYnNlcnZlcicsIG9ic2VydmVyKTtcblxuICAgICAgICAgICAgfSBjYXRjaChlKSB7fVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgVUkuaW5pdCA9IGZ1bmN0aW9uKHJvb3QpIHtcblxuICAgICAgICByb290ID0gcm9vdCB8fCBkb2N1bWVudDtcblxuICAgICAgICBVSS5kb21PYnNlcnZlcnMuZm9yRWFjaChmdW5jdGlvbihmbil7XG4gICAgICAgICAgICBmbihyb290KTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIFVJLm9uKCdkb21yZWFkeS51ay5kb20nLCBmdW5jdGlvbigpe1xuXG4gICAgICAgIFVJLmluaXQoKTtcblxuICAgICAgICBpZiAoVUkuZG9tcmVhZHkpIFVJLlV0aWxzLmNoZWNrRGlzcGxheSgpO1xuICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgdmFyIGRvbVJlYWR5ID0gZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIFVJLiRib2R5ID0gVUkuJCgnYm9keScpO1xuXG4gICAgICAgICAgICBVSS50cmlnZ2VyKCdiZWZvcmVyZWFkeS51ay5kb20nKTtcblxuICAgICAgICAgICAgVUkuY29tcG9uZW50LmJvb3RDb21wb25lbnRzKCk7XG5cbiAgICAgICAgICAgIC8vIGN1c3RvbSBzY3JvbGwgb2JzZXJ2ZXJcbiAgICAgICAgICAgIHZhciByYWZUb2tlbiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgIHZhciBtZW1vcnkgPSB7ZGlyOiB7eDowLCB5OjB9LCB4OiB3aW5kb3cucGFnZVhPZmZzZXQsIHk6d2luZG93LnBhZ2VZT2Zmc2V0fTtcblxuICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlYWRpbmcgdGhpcyAod2luZG93LnBhZ2VbWHxZXU9mZnNldCkgY2F1c2VzIGEgZnVsbCBwYWdlIHJlY2FsYyBvZiB0aGUgbGF5b3V0IGluIENocm9tZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgb25jZVxuICAgICAgICAgICAgICAgICAgICB2YXIgd3B4byA9IHdpbmRvdy5wYWdlWE9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdweW8gPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRGlkIHRoZSBzY3JvbGwgcG9zaXRpb24gY2hhbmdlIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2Ugd2VyZSBoZXJlP1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVtb3J5LnggIT0gd3B4byB8fCBtZW1vcnkueSAhPSB3cHlvKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzY3JvbGwgYW5kIHN0b3JlIHRoZSBuZXcgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cHhvICE9IG1lbW9yeS54KSB7bWVtb3J5LmRpci54ID0gd3B4byA+IG1lbW9yeS54ID8gMTotMTsgfSBlbHNlIHsgbWVtb3J5LmRpci54ID0gMDsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdweW8gIT0gbWVtb3J5LnkpIHttZW1vcnkuZGlyLnkgPSB3cHlvID4gbWVtb3J5LnkgPyAxOi0xOyB9IGVsc2UgeyBtZW1vcnkuZGlyLnkgPSAwOyB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeS54ID0gd3B4bztcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeS55ID0gd3B5bztcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJpZ2dlciB0aGUgc2Nyb2xsIGV2ZW50LCB0aGlzIGNvdWxkIHByb2JhYmx5IGJlIHNlbnQgdXNpbmcgbWVtb3J5LmNsb25lKCkgYnV0IHRoaXMgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgZXhwbGljaXQgYW5kIGVhc2llciB0byBzZWUgZXhhY3RseSB3aGF0IGlzIGJlaW5nIHNlbnQgaW4gdGhlIGV2ZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgVUkuJGRvYy50cmlnZ2VyKCdzY3JvbGxpbmcudWsuZG9jdW1lbnQnLCBbe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcjoge3g6IG1lbW9yeS5kaXIueCwgeTogbWVtb3J5LmRpci55fSwgeDogd3B4bywgeTogd3B5b1xuICAgICAgICAgICAgICAgICAgICAgICAgfV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmVG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICByYWZUb2tlbiA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmIChVSS5zdXBwb3J0LnRvdWNoKSB7XG4gICAgICAgICAgICAgICAgICAgIFVJLiRodG1sLm9uKCd0b3VjaG1vdmUgdG91Y2hlbmQgTVNQb2ludGVyTW92ZSBNU1BvaW50ZXJVcCBwb2ludGVybW92ZSBwb2ludGVydXAnLCBmbik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG1lbW9yeS54IHx8IG1lbW9yeS55KSBmbigpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZuO1xuXG4gICAgICAgICAgICB9KSgpKTtcblxuICAgICAgICAgICAgLy8gcnVuIGNvbXBvbmVudCBpbml0IGZ1bmN0aW9ucyBvbiBkb21cbiAgICAgICAgICAgIFVJLnRyaWdnZXIoJ2RvbXJlYWR5LnVrLmRvbScpO1xuXG4gICAgICAgICAgICBpZiAoVUkuc3VwcG9ydC50b3VjaCkge1xuXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGNzcyBob3ZlciBydWxlcyBmb3IgdG91Y2ggZGV2aWNlc1xuICAgICAgICAgICAgICAgIC8vIFVJLlV0aWxzLnJlbW92ZUNzc1J1bGVzKC9cXC51ay0oPyFuYXZiYXIpLio6aG92ZXIvKTtcblxuICAgICAgICAgICAgICAgIC8vIHZpZXdwb3J0IHVuaXQgZml4IGZvciB1ay1oZWlnaHQtdmlld3BvcnQgLSBzaG91bGQgYmUgZml4ZWQgaW4gaU9TIDhcbiAgICAgICAgICAgICAgICBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvKGlQYWR8aVBob25lfGlQb2QpL2cpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgVUkuJHdpbi5vbignbG9hZCBvcmllbnRhdGlvbmNoYW5nZSByZXNpemUnLCBVSS5VdGlscy5kZWJvdW5jZSgoZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLnVrLWhlaWdodC12aWV3cG9ydCcpLmNzcygnaGVpZ2h0Jywgd2luZG93LmlubmVySGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm4oKTtcblxuICAgICAgICAgICAgICAgICAgICB9KSgpLCAxMDApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFVJLnRyaWdnZXIoJ2FmdGVycmVhZHkudWsuZG9tJyk7XG5cbiAgICAgICAgICAgIC8vIG1hcmsgdGhhdCBkb21yZWFkeSBpcyBsZWZ0IGJlaGluZFxuICAgICAgICAgICAgVUkuZG9tcmVhZHkgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBhdXRvIGluaXQganMgY29tcG9uZW50c1xuICAgICAgICAgICAgaWYgKFVJLnN1cHBvcnQubXV0YXRpb25vYnNlcnZlcikge1xuXG4gICAgICAgICAgICAgICAgdmFyIGluaXRGbiA9IFVJLlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpeyBVSS5pbml0KGRvY3VtZW50LmJvZHkpO30pO1xuICAgICAgICAgICAgICAgIH0sIDEwKTtcblxuICAgICAgICAgICAgICAgIChuZXcgVUkuc3VwcG9ydC5tdXRhdGlvbm9ic2VydmVyKGZ1bmN0aW9uKG11dGF0aW9ucykge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbml0ID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgbXV0YXRpb25zLmV2ZXJ5KGZ1bmN0aW9uKG11dGF0aW9uKXtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgIT0gJ2NoaWxkTGlzdCcpIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbm9kZTsgaSA8IG11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoOyArK2kpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBtdXRhdGlvbi5hZGRlZE5vZGVzW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUub3V0ZXJIVE1MICYmIG5vZGUub3V0ZXJIVE1MLmluZGV4T2YoJ2RhdGEtdWstJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaW5pdCA9IHRydWUpICYmIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdCkgaW5pdEZuKCk7XG5cbiAgICAgICAgICAgICAgICB9KSkub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7Y2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJyB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09ICdpbnRlcmFjdGl2ZScpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZG9tUmVhZHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRvbVJlYWR5O1xuXG4gICAgfSgpKTtcblxuICAgIC8vIGFkZCB0b3VjaCBpZGVudGlmaWVyIGNsYXNzXG4gICAgVUkuJGh0bWwuYWRkQ2xhc3MoVUkuc3VwcG9ydC50b3VjaCA/ICd1ay10b3VjaCcgOiAndWstbm90b3VjaCcpO1xuXG4gICAgLy8gYWRkIHVrLWhvdmVyIGNsYXNzIG9uIHRhcCB0byBzdXBwb3J0IG92ZXJsYXlzIG9uIHRvdWNoIGRldmljZXNcbiAgICBpZiAoVUkuc3VwcG9ydC50b3VjaCkge1xuXG4gICAgICAgIHZhciBob3ZlcnNldCA9IGZhbHNlLFxuICAgICAgICAgICAgZXhjbHVkZSxcbiAgICAgICAgICAgIGhvdmVyY2xzID0gJ3VrLWhvdmVyJyxcbiAgICAgICAgICAgIHNlbGVjdG9yID0gJy51ay1vdmVybGF5LCAudWstb3ZlcmxheS1ob3ZlciwgLnVrLW92ZXJsYXktdG9nZ2xlLCAudWstYW5pbWF0aW9uLWhvdmVyLCAudWstaGFzLWhvdmVyJztcblxuICAgICAgICBVSS4kaHRtbC5vbignbW91c2VlbnRlciB0b3VjaHN0YXJ0IE1TUG9pbnRlckRvd24gcG9pbnRlcmRvd24nLCBzZWxlY3RvciwgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIGlmIChob3ZlcnNldCkgJCgnLicraG92ZXJjbHMpLnJlbW92ZUNsYXNzKGhvdmVyY2xzKTtcblxuICAgICAgICAgICAgaG92ZXJzZXQgPSAkKHRoaXMpLmFkZENsYXNzKGhvdmVyY2xzKTtcblxuICAgICAgICB9KS5vbignbW91c2VsZWF2ZSB0b3VjaGVuZCBNU1BvaW50ZXJVcCBwb2ludGVydXAnLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgIGV4Y2x1ZGUgPSAkKGUudGFyZ2V0KS5wYXJlbnRzKHNlbGVjdG9yKTtcblxuICAgICAgICAgICAgaWYgKGhvdmVyc2V0KSB7XG4gICAgICAgICAgICAgICAgaG92ZXJzZXQubm90KGV4Y2x1ZGUpLnJlbW92ZUNsYXNzKGhvdmVyY2xzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFVJO1xufSk7XG5cbi8vICBCYXNlZCBvbiBaZXB0b3MgdG91Y2guanNcbi8vICBodHRwczovL3Jhdy5naXRodWIuY29tL21hZHJvYmJ5L3plcHRvL21hc3Rlci9zcmMvdG91Y2guanNcbi8vICBaZXB0by5qcyBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cblxuOyhmdW5jdGlvbigkKXtcblxuICBpZiAoJC5mbi5zd2lwZUxlZnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuXG4gIHZhciB0b3VjaCA9IHt9LCB0b3VjaFRpbWVvdXQsIHRhcFRpbWVvdXQsIHN3aXBlVGltZW91dCwgbG9uZ1RhcFRpbWVvdXQsIGxvbmdUYXBEZWxheSA9IDc1MCwgZ2VzdHVyZTtcbiAgdmFyIGhhc1RvdWNoRXZlbnRzID0gJ29udG91Y2hzdGFydCcgaW4gd2luZG93LFxuICAgICAgaGFzUG9pbnRlckV2ZW50cyA9IHdpbmRvdy5Qb2ludGVyRXZlbnQsXG4gICAgICBoYXNUb3VjaCA9IGhhc1RvdWNoRXZlbnRzXG4gICAgICB8fCB3aW5kb3cuRG9jdW1lbnRUb3VjaCAmJiBkb2N1bWVudCBpbnN0YW5jZW9mIERvY3VtZW50VG91Y2hcbiAgICAgIHx8IG5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkICYmIG5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzID4gMCAvLyBJRSAxMFxuICAgICAgfHwgbmF2aWdhdG9yLnBvaW50ZXJFbmFibGVkICYmIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDA7IC8vIElFID49MTFcblxuICBmdW5jdGlvbiBzd2lwZURpcmVjdGlvbih4MSwgeDIsIHkxLCB5Mikge1xuICAgIHJldHVybiBNYXRoLmFicyh4MSAtIHgyKSA+PSBNYXRoLmFicyh5MSAtIHkyKSA/ICh4MSAtIHgyID4gMCA/ICdMZWZ0JyA6ICdSaWdodCcpIDogKHkxIC0geTIgPiAwID8gJ1VwJyA6ICdEb3duJyk7XG4gIH1cblxuICBmdW5jdGlvbiBsb25nVGFwKCkge1xuICAgIGxvbmdUYXBUaW1lb3V0ID0gbnVsbDtcbiAgICBpZiAodG91Y2gubGFzdCkge1xuICAgICAgaWYgKCB0b3VjaC5lbCAhPT0gdW5kZWZpbmVkICkgdG91Y2guZWwudHJpZ2dlcignbG9uZ1RhcCcpO1xuICAgICAgdG91Y2ggPSB7fTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWxMb25nVGFwKCkge1xuICAgIGlmIChsb25nVGFwVGltZW91dCkgY2xlYXJUaW1lb3V0KGxvbmdUYXBUaW1lb3V0KTtcbiAgICBsb25nVGFwVGltZW91dCA9IG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWxBbGwoKSB7XG4gICAgaWYgKHRvdWNoVGltZW91dCkgICBjbGVhclRpbWVvdXQodG91Y2hUaW1lb3V0KTtcbiAgICBpZiAodGFwVGltZW91dCkgICAgIGNsZWFyVGltZW91dCh0YXBUaW1lb3V0KTtcbiAgICBpZiAoc3dpcGVUaW1lb3V0KSAgIGNsZWFyVGltZW91dChzd2lwZVRpbWVvdXQpO1xuICAgIGlmIChsb25nVGFwVGltZW91dCkgY2xlYXJUaW1lb3V0KGxvbmdUYXBUaW1lb3V0KTtcbiAgICB0b3VjaFRpbWVvdXQgPSB0YXBUaW1lb3V0ID0gc3dpcGVUaW1lb3V0ID0gbG9uZ1RhcFRpbWVvdXQgPSBudWxsO1xuICAgIHRvdWNoID0ge307XG4gIH1cblxuICBmdW5jdGlvbiBpc1ByaW1hcnlUb3VjaChldmVudCl7XG4gICAgcmV0dXJuIGV2ZW50LnBvaW50ZXJUeXBlID09IGV2ZW50Lk1TUE9JTlRFUl9UWVBFX1RPVUNIICYmIGV2ZW50LmlzUHJpbWFyeTtcbiAgfVxuXG4gICQoZnVuY3Rpb24oKXtcbiAgICB2YXIgbm93LCBkZWx0YSwgZGVsdGFYID0gMCwgZGVsdGFZID0gMCwgZmlyc3RUb3VjaDtcblxuICAgIGlmICgnTVNHZXN0dXJlJyBpbiB3aW5kb3cpIHtcbiAgICAgIGdlc3R1cmUgPSBuZXcgTVNHZXN0dXJlKCk7XG4gICAgICBnZXN0dXJlLnRhcmdldCA9IGRvY3VtZW50LmJvZHk7XG4gICAgfVxuXG4gICAgJChkb2N1bWVudClcbiAgICAgIC5vbignTVNHZXN0dXJlRW5kIGdlc3R1cmVlbmQnLCBmdW5jdGlvbihlKXtcblxuICAgICAgICB2YXIgc3dpcGVEaXJlY3Rpb25Gcm9tVmVsb2NpdHkgPSBlLm9yaWdpbmFsRXZlbnQudmVsb2NpdHlYID4gMSA/ICdSaWdodCcgOiBlLm9yaWdpbmFsRXZlbnQudmVsb2NpdHlYIDwgLTEgPyAnTGVmdCcgOiBlLm9yaWdpbmFsRXZlbnQudmVsb2NpdHlZID4gMSA/ICdEb3duJyA6IGUub3JpZ2luYWxFdmVudC52ZWxvY2l0eVkgPCAtMSA/ICdVcCcgOiBudWxsO1xuXG4gICAgICAgIGlmIChzd2lwZURpcmVjdGlvbkZyb21WZWxvY2l0eSAmJiB0b3VjaC5lbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdG91Y2guZWwudHJpZ2dlcignc3dpcGUnKTtcbiAgICAgICAgICB0b3VjaC5lbC50cmlnZ2VyKCdzd2lwZScrIHN3aXBlRGlyZWN0aW9uRnJvbVZlbG9jaXR5KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC8vIE1TUG9pbnRlckRvd246IGZvciBJRTEwXG4gICAgICAvLyBwb2ludGVyZG93bjogZm9yIElFMTFcbiAgICAgIC5vbigndG91Y2hzdGFydCBNU1BvaW50ZXJEb3duIHBvaW50ZXJkb3duJywgZnVuY3Rpb24oZSl7XG5cbiAgICAgICAgaWYoZS50eXBlID09ICdNU1BvaW50ZXJEb3duJyAmJiAhaXNQcmltYXJ5VG91Y2goZS5vcmlnaW5hbEV2ZW50KSkgcmV0dXJuO1xuXG4gICAgICAgIGZpcnN0VG91Y2ggPSAoZS50eXBlID09ICdNU1BvaW50ZXJEb3duJyB8fCBlLnR5cGUgPT0gJ3BvaW50ZXJkb3duJykgPyBlIDogZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF07XG5cbiAgICAgICAgbm93ICAgICAgPSBEYXRlLm5vdygpO1xuICAgICAgICBkZWx0YSAgICA9IG5vdyAtICh0b3VjaC5sYXN0IHx8IG5vdyk7XG4gICAgICAgIHRvdWNoLmVsID0gJCgndGFnTmFtZScgaW4gZmlyc3RUb3VjaC50YXJnZXQgPyBmaXJzdFRvdWNoLnRhcmdldCA6IGZpcnN0VG91Y2gudGFyZ2V0LnBhcmVudE5vZGUpO1xuXG4gICAgICAgIGlmKHRvdWNoVGltZW91dCkgY2xlYXJUaW1lb3V0KHRvdWNoVGltZW91dCk7XG5cbiAgICAgICAgdG91Y2gueDEgPSBmaXJzdFRvdWNoLnBhZ2VYO1xuICAgICAgICB0b3VjaC55MSA9IGZpcnN0VG91Y2gucGFnZVk7XG5cbiAgICAgICAgaWYgKGRlbHRhID4gMCAmJiBkZWx0YSA8PSAyNTApIHRvdWNoLmlzRG91YmxlVGFwID0gdHJ1ZTtcblxuICAgICAgICB0b3VjaC5sYXN0ID0gbm93O1xuICAgICAgICBsb25nVGFwVGltZW91dCA9IHNldFRpbWVvdXQobG9uZ1RhcCwgbG9uZ1RhcERlbGF5KTtcblxuICAgICAgICAvLyBhZGRzIHRoZSBjdXJyZW50IHRvdWNoIGNvbnRhY3QgZm9yIElFIGdlc3R1cmUgcmVjb2duaXRpb25cbiAgICAgICAgaWYgKGUub3JpZ2luYWxFdmVudCAmJiBlLm9yaWdpbmFsRXZlbnQucG9pbnRlcklkICYmIGdlc3R1cmUgJiYgKCBlLnR5cGUgPT0gJ01TUG9pbnRlckRvd24nIHx8IGUudHlwZSA9PSAncG9pbnRlcmRvd24nIHx8IGUudHlwZSA9PSAndG91Y2hzdGFydCcgKSApIHtcbiAgICAgICAgICBnZXN0dXJlLmFkZFBvaW50ZXIoZS5vcmlnaW5hbEV2ZW50LnBvaW50ZXJJZCk7XG4gICAgICAgIH1cblxuICAgICAgfSlcbiAgICAgIC8vIE1TUG9pbnRlck1vdmU6IGZvciBJRTEwXG4gICAgICAvLyBwb2ludGVybW92ZTogZm9yIElFMTFcbiAgICAgIC5vbigndG91Y2htb3ZlIE1TUG9pbnRlck1vdmUgcG9pbnRlcm1vdmUnLCBmdW5jdGlvbihlKXtcblxuICAgICAgICBpZiAoZS50eXBlID09ICdNU1BvaW50ZXJNb3ZlJyAmJiAhaXNQcmltYXJ5VG91Y2goZS5vcmlnaW5hbEV2ZW50KSkgcmV0dXJuO1xuXG4gICAgICAgIGZpcnN0VG91Y2ggPSAoZS50eXBlID09ICdNU1BvaW50ZXJNb3ZlJyB8fCBlLnR5cGUgPT0gJ3BvaW50ZXJtb3ZlJykgPyBlIDogZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF07XG5cbiAgICAgICAgY2FuY2VsTG9uZ1RhcCgpO1xuICAgICAgICB0b3VjaC54MiA9IGZpcnN0VG91Y2gucGFnZVg7XG4gICAgICAgIHRvdWNoLnkyID0gZmlyc3RUb3VjaC5wYWdlWTtcblxuICAgICAgICBkZWx0YVggKz0gTWF0aC5hYnModG91Y2gueDEgLSB0b3VjaC54Mik7XG4gICAgICAgIGRlbHRhWSArPSBNYXRoLmFicyh0b3VjaC55MSAtIHRvdWNoLnkyKTtcbiAgICAgIH0pXG4gICAgICAvLyBNU1BvaW50ZXJVcDogZm9yIElFMTBcbiAgICAgIC8vIHBvaW50ZXJ1cDogZm9yIElFMTFcbiAgICAgIC5vbigndG91Y2hlbmQgTVNQb2ludGVyVXAgcG9pbnRlcnVwJywgZnVuY3Rpb24oZSl7XG5cbiAgICAgICAgaWYgKGUudHlwZSA9PSAnTVNQb2ludGVyVXAnICYmICFpc1ByaW1hcnlUb3VjaChlLm9yaWdpbmFsRXZlbnQpKSByZXR1cm47XG5cbiAgICAgICAgY2FuY2VsTG9uZ1RhcCgpO1xuXG4gICAgICAgIC8vIHN3aXBlXG4gICAgICAgIGlmICgodG91Y2gueDIgJiYgTWF0aC5hYnModG91Y2gueDEgLSB0b3VjaC54MikgPiAzMCkgfHwgKHRvdWNoLnkyICYmIE1hdGguYWJzKHRvdWNoLnkxIC0gdG91Y2gueTIpID4gMzApKXtcblxuICAgICAgICAgIHN3aXBlVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAoIHRvdWNoLmVsICE9PSB1bmRlZmluZWQgKSB7XG4gICAgICAgICAgICAgIHRvdWNoLmVsLnRyaWdnZXIoJ3N3aXBlJyk7XG4gICAgICAgICAgICAgIHRvdWNoLmVsLnRyaWdnZXIoJ3N3aXBlJyArIChzd2lwZURpcmVjdGlvbih0b3VjaC54MSwgdG91Y2gueDIsIHRvdWNoLnkxLCB0b3VjaC55MikpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRvdWNoID0ge307XG4gICAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgLy8gbm9ybWFsIHRhcFxuICAgICAgICB9IGVsc2UgaWYgKCdsYXN0JyBpbiB0b3VjaCkge1xuXG4gICAgICAgICAgLy8gZG9uJ3QgZmlyZSB0YXAgd2hlbiBkZWx0YSBwb3NpdGlvbiBjaGFuZ2VkIGJ5IG1vcmUgdGhhbiAzMCBwaXhlbHMsXG4gICAgICAgICAgLy8gZm9yIGluc3RhbmNlIHdoZW4gbW92aW5nIHRvIGEgcG9pbnQgYW5kIGJhY2sgdG8gb3JpZ2luXG4gICAgICAgICAgaWYgKGlzTmFOKGRlbHRhWCkgfHwgKGRlbHRhWCA8IDMwICYmIGRlbHRhWSA8IDMwKSkge1xuICAgICAgICAgICAgLy8gZGVsYXkgYnkgb25lIHRpY2sgc28gd2UgY2FuIGNhbmNlbCB0aGUgJ3RhcCcgZXZlbnQgaWYgJ3Njcm9sbCcgZmlyZXNcbiAgICAgICAgICAgIC8vICgndGFwJyBmaXJlcyBiZWZvcmUgJ3Njcm9sbCcpXG4gICAgICAgICAgICB0YXBUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHVuaXZlcnNhbCAndGFwJyB3aXRoIHRoZSBvcHRpb24gdG8gY2FuY2VsVG91Y2goKVxuICAgICAgICAgICAgICAvLyAoY2FuY2VsVG91Y2ggY2FuY2VscyBwcm9jZXNzaW5nIG9mIHNpbmdsZSB2cyBkb3VibGUgdGFwcyBmb3IgZmFzdGVyICd0YXAnIHJlc3BvbnNlKVxuICAgICAgICAgICAgICB2YXIgZXZlbnQgPSAkLkV2ZW50KCd0YXAnKTtcbiAgICAgICAgICAgICAgZXZlbnQuY2FuY2VsVG91Y2ggPSBjYW5jZWxBbGw7XG4gICAgICAgICAgICAgIGlmICggdG91Y2guZWwgIT09IHVuZGVmaW5lZCApIHRvdWNoLmVsLnRyaWdnZXIoZXZlbnQpO1xuXG4gICAgICAgICAgICAgIC8vIHRyaWdnZXIgZG91YmxlIHRhcCBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICBpZiAodG91Y2guaXNEb3VibGVUYXApIHtcbiAgICAgICAgICAgICAgICBpZiAoIHRvdWNoLmVsICE9PSB1bmRlZmluZWQgKSB0b3VjaC5lbC50cmlnZ2VyKCdkb3VibGVUYXAnKTtcbiAgICAgICAgICAgICAgICB0b3VjaCA9IHt9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gdHJpZ2dlciBzaW5nbGUgdGFwIGFmdGVyIDI1MG1zIG9mIGluYWN0aXZpdHlcbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdG91Y2hUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgdG91Y2hUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIGlmICggdG91Y2guZWwgIT09IHVuZGVmaW5lZCApIHRvdWNoLmVsLnRyaWdnZXIoJ3NpbmdsZVRhcCcpO1xuICAgICAgICAgICAgICAgICAgdG91Y2ggPSB7fTtcbiAgICAgICAgICAgICAgICB9LCAyNTApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdG91Y2ggPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVsdGFYID0gZGVsdGFZID0gMDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC8vIHdoZW4gdGhlIGJyb3dzZXIgd2luZG93IGxvc2VzIGZvY3VzLFxuICAgICAgLy8gZm9yIGV4YW1wbGUgd2hlbiBhIG1vZGFsIGRpYWxvZyBpcyBzaG93bixcbiAgICAgIC8vIGNhbmNlbCBhbGwgb25nb2luZyBldmVudHNcbiAgICAgIC5vbigndG91Y2hjYW5jZWwgTVNQb2ludGVyQ2FuY2VsIHBvaW50ZXJjYW5jZWwnLCBmdW5jdGlvbihlKXtcblxuICAgICAgICAvLyBJZ25vcmUgcG9pbnRlcmNhbmNlbCBpZiB0aGUgZXZlbnQgc3VwcG9ydHMgdG91Y2ggZXZlbnRzLCB0byBwcmV2ZW50IHBvaW50ZXJjYW5jZWwgaW4gc3dpcGUgZ2VzdHVyZVxuICAgICAgICBpZiAoKGUudHlwZSA9PSAndG91Y2hjYW5jZWwnICYmIGhhc1RvdWNoRXZlbnRzICYmIGhhc1RvdWNoKSB8fCAoIWhhc1RvdWNoRXZlbnRzICYmIGUudHlwZSA9PSAncG9pbnRlcmNhbmNlbCcgJiYgaGFzUG9pbnRlckV2ZW50cykpIHtcbiAgICAgICAgICBjYW5jZWxBbGwoKTtcbiAgICAgICAgfVxuXG4gICAgfSk7XG5cbiAgICAvLyBzY3JvbGxpbmcgdGhlIHdpbmRvdyBpbmRpY2F0ZXMgaW50ZW50aW9uIG9mIHRoZSB1c2VyXG4gICAgLy8gdG8gc2Nyb2xsLCBub3QgdGFwIG9yIHN3aXBlLCBzbyBjYW5jZWwgYWxsIG9uZ29pbmcgZXZlbnRzXG4gICAgJCh3aW5kb3cpLm9uKCdzY3JvbGwnLCBjYW5jZWxBbGwpO1xuICB9KTtcblxuICBbJ3N3aXBlJywgJ3N3aXBlTGVmdCcsICdzd2lwZVJpZ2h0JywgJ3N3aXBlVXAnLCAnc3dpcGVEb3duJywgJ2RvdWJsZVRhcCcsICd0YXAnLCAnc2luZ2xlVGFwJywgJ2xvbmdUYXAnXS5mb3JFYWNoKGZ1bmN0aW9uKGV2ZW50TmFtZSl7XG4gICAgJC5mbltldmVudE5hbWVdID0gZnVuY3Rpb24oY2FsbGJhY2speyByZXR1cm4gJCh0aGlzKS5vbihldmVudE5hbWUsIGNhbGxiYWNrKTsgfTtcbiAgfSk7XG59KShqUXVlcnkpO1xuXG4oZnVuY3Rpb24oVUkpIHtcblxuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgdmFyIHN0YWNrcyA9IFtdO1xuXG4gICAgVUkuY29tcG9uZW50KCdzdGFja01hcmdpbicsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgY2xzOiAndWstbWFyZ2luLXNtYWxsLXRvcCcsXG4gICAgICAgICAgICByb3dmaXJzdDogZmFsc2UsXG4gICAgICAgICAgICBvYnNlcnZlOiBmYWxzZVxuICAgICAgICB9LFxuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLnJlYWR5KGZ1bmN0aW9uKGNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIFVJLiQoJ1tkYXRhLXVrLW1hcmdpbl0nLCBjb250ZXh0KS5lYWNoKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ3N0YWNrTWFyZ2luJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFVJLnN0YWNrTWFyZ2luKGVsZSwgVUkuVXRpbHMub3B0aW9ucyhlbGUuYXR0cignZGF0YS11ay1tYXJnaW4nKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgVUkuJHdpbi5vbigncmVzaXplIG9yaWVudGF0aW9uY2hhbmdlJywgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICR0aGlzLnByb2Nlc3MoKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgVUkuJChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICAgICAgVUkuJHdpbi5vbignbG9hZCcsIGZuKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBVSS5VdGlscy5kZWJvdW5jZShmbiwgMjApO1xuICAgICAgICAgICAgfSkoKSk7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2Rpc3BsYXkudWsuY2hlY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5pcygnOnZpc2libGUnKSkgdGhpcy5wcm9jZXNzKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm9ic2VydmUpIHtcblxuICAgICAgICAgICAgICAgIFVJLmRvbU9ic2VydmUodGhpcy5lbGVtZW50LCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy5lbGVtZW50LmlzKCc6dmlzaWJsZScpKSAkdGhpcy5wcm9jZXNzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN0YWNrcy5wdXNoKHRoaXMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzLCBjb2x1bW5zID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuKCk7XG5cbiAgICAgICAgICAgIFVJLlV0aWxzLnN0YWNrTWFyZ2luKGNvbHVtbnMsIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnJvd2ZpcnN0IHx8ICFjb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBNYXJrIGZpcnN0IGNvbHVtbiBlbGVtZW50c1xuICAgICAgICAgICAgdmFyIGdyb3VwID0ge30sIG1pbmxlZnQgPSBmYWxzZTtcblxuICAgICAgICAgICAgY29sdW1ucy5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMucm93Zmlyc3QpLmVhY2goZnVuY3Rpb24ob2Zmc2V0LCAkZWxlKXtcblxuICAgICAgICAgICAgICAgICRlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGUuZGlzcGxheSAhPSAnbm9uZScpIHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gJGVsZS5vZmZzZXQoKS5sZWZ0O1xuICAgICAgICAgICAgICAgICAgICAoKGdyb3VwW29mZnNldF0gPSBncm91cFtvZmZzZXRdIHx8IFtdKSAmJiBncm91cFtvZmZzZXRdKS5wdXNoKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBtaW5sZWZ0ID0gbWlubGVmdCA9PT0gZmFsc2UgPyBvZmZzZXQgOiBNYXRoLm1pbihtaW5sZWZ0LCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBVSS4kKGdyb3VwW21pbmxlZnRdKS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMucm93Zmlyc3QpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgfSk7XG5cblxuICAgIC8vIHJlc3BvbnNpdmUgZWxlbWVudCBlLmcuIGlmcmFtZXNcblxuICAgIChmdW5jdGlvbigpe1xuXG4gICAgICAgIHZhciBlbGVtZW50cyA9IFtdLCBjaGVjayA9IGZ1bmN0aW9uKGVsZSkge1xuXG4gICAgICAgICAgICBpZiAoIWVsZS5pcygnOnZpc2libGUnKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICB2YXIgd2lkdGggID0gZWxlLnBhcmVudCgpLndpZHRoKCksXG4gICAgICAgICAgICAgICAgaXdpZHRoID0gZWxlLmRhdGEoJ3dpZHRoJyksXG4gICAgICAgICAgICAgICAgcmF0aW8gID0gKHdpZHRoIC8gaXdpZHRoKSxcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBNYXRoLmZsb29yKHJhdGlvICogZWxlLmRhdGEoJ2hlaWdodCcpKTtcblxuICAgICAgICAgICAgZWxlLmNzcyh7aGVpZ2h0OiAod2lkdGggPCBpd2lkdGgpID8gaGVpZ2h0IDogZWxlLmRhdGEoJ2hlaWdodCcpfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgVUkuY29tcG9uZW50KCdyZXNwb25zaXZlRWxlbWVudCcsIHtcblxuICAgICAgICAgICAgZGVmYXVsdHM6IHt9LFxuXG4gICAgICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgIC8vIGluaXQgY29kZVxuICAgICAgICAgICAgICAgIFVJLnJlYWR5KGZ1bmN0aW9uKGNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgICAgICBVSS4kKCdpZnJhbWUudWstcmVzcG9uc2l2ZS13aWR0aCwgW2RhdGEtdWstcmVzcG9uc2l2ZV0nLCBjb250ZXh0KS5lYWNoKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlID0gVUkuJCh0aGlzKSwgb2JqO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZS5kYXRhKCdyZXNwb25zaXZlRWxlbWVudCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gVUkucmVzcG9uc2l2ZUVsZW1lbnQoZWxlLCB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgZWxlID0gdGhpcy5lbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZS5hdHRyKCd3aWR0aCcpICYmIGVsZS5hdHRyKCdoZWlnaHQnKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGVsZS5kYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIDogZWxlLmF0dHIoJ3dpZHRoJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGVsZS5hdHRyKCdoZWlnaHQnKVxuICAgICAgICAgICAgICAgICAgICB9KS5vbignZGlzcGxheS51ay5jaGVjaycsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVjayhlbGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjaGVjayhlbGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFVJLiR3aW4ub24oJ3Jlc2l6ZSBsb2FkJywgVUkuVXRpbHMuZGVib3VuY2UoZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbihlbGUpe1xuICAgICAgICAgICAgICAgIGNoZWNrKGVsZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9LCAxNSkpO1xuXG4gICAgfSkoKTtcblxuXG4gICAgLy8gaGVscGVyXG5cbiAgICBVSS5VdGlscy5zdGFja01hcmdpbiA9IGZ1bmN0aW9uKGVsZW1lbnRzLCBvcHRpb25zKSB7XG5cbiAgICAgICAgb3B0aW9ucyA9IFVJLiQuZXh0ZW5kKHtcbiAgICAgICAgICAgIGNsczogJ3VrLW1hcmdpbi1zbWFsbC10b3AnXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIGVsZW1lbnRzID0gVUkuJChlbGVtZW50cykucmVtb3ZlQ2xhc3Mob3B0aW9ucy5jbHMpO1xuXG4gICAgICAgIHZhciBtaW4gPSBmYWxzZTtcblxuICAgICAgICBlbGVtZW50cy5lYWNoKGZ1bmN0aW9uKG9mZnNldCwgaGVpZ2h0LCBwb3MsICRlbGUpe1xuXG4gICAgICAgICAgICAkZWxlICAgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICBpZiAoJGVsZS5jc3MoJ2Rpc3BsYXknKSAhPSAnbm9uZScpIHtcblxuICAgICAgICAgICAgICAgIG9mZnNldCA9ICRlbGUub2Zmc2V0KCk7XG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gJGVsZS5vdXRlckhlaWdodCgpO1xuICAgICAgICAgICAgICAgIHBvcyAgICA9IG9mZnNldC50b3AgKyBoZWlnaHQ7XG5cbiAgICAgICAgICAgICAgICAkZWxlLmRhdGEoe1xuICAgICAgICAgICAgICAgICAgICB1a01hcmdpblBvczogcG9zLFxuICAgICAgICAgICAgICAgICAgICB1a01hcmdpblRvcDogb2Zmc2V0LnRvcFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gZmFsc2UgfHwgKG9mZnNldC50b3AgPCBtaW4udG9wKSApIHtcblxuICAgICAgICAgICAgICAgICAgICBtaW4gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3AgIDogb2Zmc2V0LnRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgOiBvZmZzZXQubGVmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcyAgOiBwb3NcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSkuZWFjaChmdW5jdGlvbigkZWxlKSB7XG5cbiAgICAgICAgICAgICRlbGUgICA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgIGlmICgkZWxlLmNzcygnZGlzcGxheScpICE9ICdub25lJyAmJiAkZWxlLmRhdGEoJ3VrTWFyZ2luVG9wJykgPiBtaW4udG9wICYmICRlbGUuZGF0YSgndWtNYXJnaW5Qb3MnKSA+IG1pbi5wb3MpIHtcbiAgICAgICAgICAgICAgICAkZWxlLmFkZENsYXNzKG9wdGlvbnMuY2xzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIFVJLlV0aWxzLm1hdGNoSGVpZ2h0cyA9IGZ1bmN0aW9uKGVsZW1lbnRzLCBvcHRpb25zKSB7XG5cbiAgICAgICAgZWxlbWVudHMgPSBVSS4kKGVsZW1lbnRzKS5jc3MoJ21pbi1oZWlnaHQnLCAnJyk7XG4gICAgICAgIG9wdGlvbnMgID0gVUkuJC5leHRlbmQoeyByb3cgOiB0cnVlIH0sIG9wdGlvbnMpO1xuXG4gICAgICAgIHZhciBtYXRjaEhlaWdodHMgPSBmdW5jdGlvbihncm91cCl7XG5cbiAgICAgICAgICAgIGlmIChncm91cC5sZW5ndGggPCAyKSByZXR1cm47XG5cbiAgICAgICAgICAgIHZhciBtYXggPSAwO1xuXG4gICAgICAgICAgICBncm91cC5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgVUkuJCh0aGlzKS5vdXRlckhlaWdodCgpKTtcbiAgICAgICAgICAgIH0pLmVhY2goZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IFVJLiQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCAgPSBtYXggLSAoZWxlbWVudC5jc3MoJ2JveC1zaXppbmcnKSA9PSAnYm9yZGVyLWJveCcgPyAwIDogKGVsZW1lbnQub3V0ZXJIZWlnaHQoKSAtIGVsZW1lbnQuaGVpZ2h0KCkpKTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnQuY3NzKCdtaW4taGVpZ2h0JywgaGVpZ2h0ICsgJ3B4Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAob3B0aW9ucy5yb3cpIHtcblxuICAgICAgICAgICAgZWxlbWVudHMuZmlyc3QoKS53aWR0aCgpOyAvLyBmb3JjZSByZWRyYXdcblxuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuXG4gICAgICAgICAgICAgICAgdmFyIGxhc3RvZmZzZXQgPSBmYWxzZSwgZ3JvdXAgPSBbXTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnRzLmVhY2goZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyksIG9mZnNldCA9IGVsZS5vZmZzZXQoKS50b3A7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCAhPSBsYXN0b2Zmc2V0ICYmIGdyb3VwLmxlbmd0aCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaEhlaWdodHMoVUkuJChncm91cCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBlbGUub2Zmc2V0KCkudG9wO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAucHVzaChlbGUpO1xuICAgICAgICAgICAgICAgICAgICBsYXN0b2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaEhlaWdodHMoVUkuJChncm91cCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1hdGNoSGVpZ2h0cyhlbGVtZW50cyk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgKGZ1bmN0aW9uKGNhY2hlU3Zncyl7XG5cbiAgICAgICAgVUkuVXRpbHMuaW5saW5lU3ZnID0gZnVuY3Rpb24oc2VsZWN0b3IsIHJvb3QpIHtcblxuICAgICAgICAgICAgdmFyIGltYWdlcyA9IFVJLiQoc2VsZWN0b3IgfHwgJ2ltZ1tzcmMkPVwiLnN2Z1wiXScsIHJvb3QgfHwgZG9jdW1lbnQpLmVhY2goZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgIHZhciBpbWcgPSBVSS4kKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICBzcmMgPSBpbWcuYXR0cignc3JjJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWNhY2hlU3Znc1tzcmNdKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBVSS4kLkRlZmVycmVkKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgVUkuJC5nZXQoc3JjLCB7bmM6IE1hdGgucmFuZG9tKCl9LCBmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQucmVzb2x2ZShVSS4kKGRhdGEpLmZpbmQoJ3N2ZycpKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FjaGVTdmdzW3NyY10gPSBkLnByb21pc2UoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjYWNoZVN2Z3Nbc3JjXS50aGVuKGZ1bmN0aW9uKHN2Zykge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciAkc3ZnID0gVUkuJChzdmcpLmNsb25lKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGltZy5hdHRyKCdpZCcpKSAkc3ZnLmF0dHIoJ2lkJywgaW1nLmF0dHIoJ2lkJykpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW1nLmF0dHIoJ2NsYXNzJykpICRzdmcuYXR0cignY2xhc3MnLCBpbWcuYXR0cignY2xhc3MnKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbWcuYXR0cignc3R5bGUnKSkgJHN2Zy5hdHRyKCdzdHlsZScsIGltZy5hdHRyKCdzdHlsZScpKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1nLmF0dHIoJ3dpZHRoJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICRzdmcuYXR0cignd2lkdGgnLCBpbWcuYXR0cignd2lkdGgnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWltZy5hdHRyKCdoZWlnaHQnKSkgICRzdmcucmVtb3ZlQXR0cignaGVpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1nLmF0dHIoJ2hlaWdodCcpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICRzdmcuYXR0cignaGVpZ2h0JywgaW1nLmF0dHIoJ2hlaWdodCcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW1nLmF0dHIoJ3dpZHRoJykpICRzdmcucmVtb3ZlQXR0cignd2lkdGgnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGltZy5yZXBsYWNlV2l0aCgkc3ZnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGluaXQgY29kZVxuICAgICAgICBVSS5yZWFkeShmdW5jdGlvbihjb250ZXh0KSB7XG4gICAgICAgICAgICBVSS5VdGlscy5pbmxpbmVTdmcoJ1tkYXRhLXVrLXN2Z10nLCBjb250ZXh0KTtcbiAgICAgICAgfSk7XG5cbiAgICB9KSh7fSk7XG5cbiAgICBVSS5VdGlscy5nZXRDc3NWYXIgPSBmdW5jdGlvbihuYW1lKSB7XG5cbiAgICAgICAgLyogdXNhZ2UgaW4gY3NzOiAgLnZhci1uYW1lOmJlZm9yZSB7IGNvbnRlbnQ6XCJ4eXpcIiB9ICovXG5cbiAgICAgICAgdmFyIHZhbCwgZG9jID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBlbGVtZW50ID0gZG9jLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcblxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Zhci0nK25hbWUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YWwgPSBKU09OLnBhcnNlKHZhbCA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCwgJzpiZWZvcmUnKS5jb250ZW50LnJlcGxhY2UoL15bXCInXSguKilbXCInXSQvLCAnJDEnKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHZhbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvYy5yZW1vdmVDaGlsZChlbGVtZW50KTtcblxuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIFVJLmNvbXBvbmVudCgnc21vb3RoU2Nyb2xsJywge1xuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLiRodG1sLm9uKCdjbGljay5zbW9vdGgtc2Nyb2xsLnVpa2l0JywgJ1tkYXRhLXVrLXNtb290aC1zY3JvbGxdJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFlbGUuZGF0YSgnc21vb3RoU2Nyb2xsJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IFVJLnNtb290aFNjcm9sbChlbGUsIFVJLlV0aWxzLm9wdGlvbnMoZWxlLmF0dHIoJ2RhdGEtdWstc21vb3RoLXNjcm9sbCcpKSk7XG4gICAgICAgICAgICAgICAgICAgIGVsZS50cmlnZ2VyKCdjbGljaycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgc2Nyb2xsVG9FbGVtZW50KFVJLiQodGhpcy5oYXNoKS5sZW5ndGggPyBVSS4kKHRoaXMuaGFzaCkgOiBVSS4kKCdib2R5JyksICR0aGlzLm9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHNjcm9sbFRvRWxlbWVudChlbGUsIG9wdGlvbnMpIHtcblxuICAgICAgICBvcHRpb25zID0gVUkuJC5leHRlbmQoe1xuICAgICAgICAgICAgZHVyYXRpb246IDEwMDAsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiAnZWFzZU91dEV4cG8nLFxuICAgICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCl7fVxuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICAvLyBnZXQgLyBzZXQgcGFyYW1ldGVyc1xuICAgICAgICB2YXIgdGFyZ2V0ICAgID0gZWxlLm9mZnNldCgpLnRvcCAtIG9wdGlvbnMub2Zmc2V0LFxuICAgICAgICAgICAgZG9jaGVpZ2h0ID0gVUkuJGRvYy5oZWlnaHQoKSxcbiAgICAgICAgICAgIHdpbmhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcblxuICAgICAgICBpZiAoKHRhcmdldCArIHdpbmhlaWdodCkgPiBkb2NoZWlnaHQpIHtcbiAgICAgICAgICAgIHRhcmdldCA9IGRvY2hlaWdodCAtIHdpbmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFuaW1hdGUgdG8gdGFyZ2V0LCBmaXJlIGNhbGxiYWNrIHdoZW4gZG9uZVxuICAgICAgICBVSS4kKCdodG1sLGJvZHknKS5zdG9wKCkuYW5pbWF0ZSh7c2Nyb2xsVG9wOiB0YXJnZXR9LCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLnRyYW5zaXRpb24pLnByb21pc2UoKS5kb25lKG9wdGlvbnMuY29tcGxldGUpO1xuICAgIH1cblxuICAgIFVJLlV0aWxzLnNjcm9sbFRvRWxlbWVudCA9IHNjcm9sbFRvRWxlbWVudDtcblxuICAgIGlmICghVUkuJC5lYXNpbmcuZWFzZU91dEV4cG8pIHtcbiAgICAgICAgVUkuJC5lYXNpbmcuZWFzZU91dEV4cG8gPSBmdW5jdGlvbih4LCB0LCBiLCBjLCBkKSB7IHJldHVybiAodCA9PSBkKSA/IGIgKyBjIDogYyAqICgtTWF0aC5wb3coMiwgLTEwICogdCAvIGQpICsgMSkgKyBiOyB9O1xuICAgIH1cblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciAkd2luICAgICAgICAgICA9IFVJLiR3aW4sXG4gICAgICAgICRkb2MgICAgICAgICAgID0gVUkuJGRvYyxcbiAgICAgICAgc2Nyb2xsc3BpZXMgICAgPSBbXSxcbiAgICAgICAgY2hlY2tTY3JvbGxTcHkgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpIDwgc2Nyb2xsc3BpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmFwcGx5KHdpbmRvdywgW3Njcm9sbHNwaWVzW2ldLmNoZWNrXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICBVSS5jb21wb25lbnQoJ3Njcm9sbHNweScsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgdGFyZ2V0ICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgY2xzICAgICAgICA6ICd1ay1zY3JvbGxzcHktaW52aWV3JyxcbiAgICAgICAgICAgIGluaXRjbHMgICAgOiAndWstc2Nyb2xsc3B5LWluaXQtaW52aWV3JyxcbiAgICAgICAgICAgIHRvcG9mZnNldCAgOiAwLFxuICAgICAgICAgICAgbGVmdG9mZnNldCA6IDAsXG4gICAgICAgICAgICByZXBlYXQgICAgIDogZmFsc2UsXG4gICAgICAgICAgICBkZWxheSAgICAgIDogMFxuICAgICAgICB9LFxuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBsaXN0ZW4gdG8gc2Nyb2xsIGFuZCByZXNpemVcbiAgICAgICAgICAgICRkb2Mub24oJ3Njcm9sbGluZy51ay5kb2N1bWVudCcsIGNoZWNrU2Nyb2xsU3B5KTtcbiAgICAgICAgICAgICR3aW4ub24oJ2xvYWQgcmVzaXplIG9yaWVudGF0aW9uY2hhbmdlJywgVUkuVXRpbHMuZGVib3VuY2UoY2hlY2tTY3JvbGxTcHksIDUwKSk7XG5cbiAgICAgICAgICAgIC8vIGluaXQgY29kZVxuICAgICAgICAgICAgVUkucmVhZHkoZnVuY3Rpb24oY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgVUkuJCgnW2RhdGEtdWstc2Nyb2xsc3B5XScsIGNvbnRleHQpLmVhY2goZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5kYXRhKCdzY3JvbGxzcHknKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IFVJLnNjcm9sbHNweShlbGVtZW50LCBVSS5VdGlscy5vcHRpb25zKGVsZW1lbnQuYXR0cignZGF0YS11ay1zY3JvbGxzcHknKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcywgaW52aWV3c3RhdGUsIGluaXRpbnZpZXcsIHRvZ2dsZWNscyA9IHRoaXMub3B0aW9ucy5jbHMuc3BsaXQoLywvKSwgZm4gPSBmdW5jdGlvbigpe1xuXG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRzICAgICA9ICR0aGlzLm9wdGlvbnMudGFyZ2V0ID8gJHRoaXMuZWxlbWVudC5maW5kKCR0aGlzLm9wdGlvbnMudGFyZ2V0KSA6ICR0aGlzLmVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGRlbGF5SWR4ICAgICA9IGVsZW1lbnRzLmxlbmd0aCA9PT0gMSA/IDEgOiAwLFxuICAgICAgICAgICAgICAgICAgICB0b2dnbGVjbHNJZHggPSAwO1xuXG4gICAgICAgICAgICAgICAgZWxlbWVudHMuZWFjaChmdW5jdGlvbihpZHgpe1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ICAgICA9IFVJLiQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnZpZXdzdGF0ZSA9IGVsZW1lbnQuZGF0YSgnaW52aWV3c3RhdGUnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGludmlldyAgICAgID0gVUkuVXRpbHMuaXNJblZpZXcoZWxlbWVudCwgJHRoaXMub3B0aW9ucyksXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGUgICAgICA9IGVsZW1lbnQuYXR0cignZGF0YS11ay1zY3JvbGxzcHktY2xzJykgfHwgdG9nZ2xlY2xzW3RvZ2dsZWNsc0lkeF0udHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnZpZXcgJiYgIWludmlld3N0YXRlICYmICFlbGVtZW50LmRhdGEoJ3Njcm9sbHNweS1pZGxlJykpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbml0aW52aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hZGRDbGFzcygkdGhpcy5vcHRpb25zLmluaXRjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLm9mZnNldCA9IGVsZW1lbnQub2Zmc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGludmlldyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnRyaWdnZXIoJ2luaXQudWsuc2Nyb2xsc3B5Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnc2Nyb2xsc3B5LWlkbGUnLCBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFkZENsYXNzKCd1ay1zY3JvbGxzcHktaW52aWV3JykudG9nZ2xlQ2xhc3ModG9nZ2xlKS53aWR0aCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQudHJpZ2dlcignaW52aWV3LnVrLnNjcm9sbHNweScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kYXRhKCdzY3JvbGxzcHktaWRsZScsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRhdGEoJ2ludmlld3N0YXRlJywgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sICR0aGlzLm9wdGlvbnMuZGVsYXkgKiBkZWxheUlkeCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxheUlkeCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnZpZXcgJiYgaW52aWV3c3RhdGUgJiYgJHRoaXMub3B0aW9ucy5yZXBlYXQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGF0YSgnc2Nyb2xsc3B5LWlkbGUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50LmRhdGEoJ3Njcm9sbHNweS1pZGxlJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnc2Nyb2xsc3B5LWlkbGUnLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ3VrLXNjcm9sbHNweS1pbnZpZXcnKS50b2dnbGVDbGFzcyh0b2dnbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kYXRhKCdpbnZpZXdzdGF0ZScsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC50cmlnZ2VyKCdvdXR2aWV3LnVrLnNjcm9sbHNweScpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlY2xzSWR4ID0gdG9nZ2xlY2xzW3RvZ2dsZWNsc0lkeCArIDFdID8gKHRvZ2dsZWNsc0lkeCArIDEpIDogMDtcblxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZm4oKTtcblxuICAgICAgICAgICAgdGhpcy5jaGVjayA9IGZuO1xuXG4gICAgICAgICAgICBzY3JvbGxzcGllcy5wdXNoKHRoaXMpO1xuICAgICAgICB9XG4gICAgfSk7XG5cblxuICAgIHZhciBzY3JvbGxzcHluYXZzID0gW10sXG4gICAgICAgIGNoZWNrU2Nyb2xsU3B5TmF2cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZm9yKHZhciBpPTA7IGkgPCBzY3JvbGxzcHluYXZzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5hcHBseSh3aW5kb3csIFtzY3JvbGxzcHluYXZzW2ldLmNoZWNrXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICBVSS5jb21wb25lbnQoJ3Njcm9sbHNweW5hdicsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgY2xzICAgICAgICAgIDogJ3VrLWFjdGl2ZScsXG4gICAgICAgICAgICBjbG9zZXN0ICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHRvcG9mZnNldCAgICA6IDAsXG4gICAgICAgICAgICBsZWZ0b2Zmc2V0ICAgOiAwLFxuICAgICAgICAgICAgc21vb3Roc2Nyb2xsIDogZmFsc2VcbiAgICAgICAgfSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gbGlzdGVuIHRvIHNjcm9sbCBhbmQgcmVzaXplXG4gICAgICAgICAgICAkZG9jLm9uKCdzY3JvbGxpbmcudWsuZG9jdW1lbnQnLCBjaGVja1Njcm9sbFNweU5hdnMpO1xuICAgICAgICAgICAgJHdpbi5vbigncmVzaXplIG9yaWVudGF0aW9uY2hhbmdlJywgVUkuVXRpbHMuZGVib3VuY2UoY2hlY2tTY3JvbGxTcHlOYXZzLCA1MCkpO1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLnJlYWR5KGZ1bmN0aW9uKGNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIFVJLiQoJ1tkYXRhLXVrLXNjcm9sbHNweS1uYXZdJywgY29udGV4dCkuZWFjaChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50LmRhdGEoJ3Njcm9sbHNweW5hdicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gVUkuc2Nyb2xsc3B5bmF2KGVsZW1lbnQsIFVJLlV0aWxzLm9wdGlvbnMoZWxlbWVudC5hdHRyKCdkYXRhLXVrLXNjcm9sbHNweS1uYXYnKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIGlkcyAgICAgPSBbXSxcbiAgICAgICAgICAgICAgICBsaW5rcyAgID0gdGhpcy5maW5kKFwiYVtocmVmXj0nIyddXCIpLmVhY2goZnVuY3Rpb24oKXsgaWYodGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS50cmltKCkhPT0nIycpIGlkcy5wdXNoKHRoaXMuZ2V0QXR0cmlidXRlKCdocmVmJykpOyB9KSxcbiAgICAgICAgICAgICAgICB0YXJnZXRzID0gVUkuJChpZHMuam9pbihcIixcIikpLFxuXG4gICAgICAgICAgICAgICAgY2xzQWN0aXZlICA9IHRoaXMub3B0aW9ucy5jbHMsXG4gICAgICAgICAgICAgICAgY2xzQ2xvc2VzdCA9IHRoaXMub3B0aW9ucy5jbG9zZXN0IHx8IHRoaXMub3B0aW9ucy5jbG9zZXN0O1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzLCBpbnZpZXdzLCBmbiA9IGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgICAgICBpbnZpZXdzID0gW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTAgOyBpIDwgdGFyZ2V0cy5sZW5ndGggOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFVJLlV0aWxzLmlzSW5WaWV3KHRhcmdldHMuZXEoaSksICR0aGlzLm9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnZpZXdzLnB1c2godGFyZ2V0cy5lcShpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoaW52aWV3cy5sZW5ndGgpIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgbmF2aXRlbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3AgPSAkd2luLnNjcm9sbFRvcCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBpPTA7IGk8IGludmlld3MubGVuZ3RoO2krKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnZpZXdzW2ldLm9mZnNldCgpLnRvcCAtICR0aGlzLm9wdGlvbnMudG9wb2Zmc2V0ID49IHNjcm9sbFRvcCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW52aWV3c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMub3B0aW9ucy5jbG9zZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rcy5ibHVyKCkuY2xvc2VzdChjbHNDbG9zZXN0KS5yZW1vdmVDbGFzcyhjbHNBY3RpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aXRlbXMgPSBsaW5rcy5maWx0ZXIoXCJhW2hyZWY9JyNcIit0YXJnZXQuYXR0cignaWQnKStcIiddXCIpLmNsb3Nlc3QoY2xzQ2xvc2VzdCkuYWRkQ2xhc3MoY2xzQWN0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdml0ZW1zID0gbGlua3MucmVtb3ZlQ2xhc3MoY2xzQWN0aXZlKS5maWx0ZXIoXCJhW2hyZWY9JyNcIit0YXJnZXQuYXR0cihcImlkXCIpK1wiJ11cIikuYWRkQ2xhc3MoY2xzQWN0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICR0aGlzLmVsZW1lbnQudHJpZ2dlcignaW52aWV3LnVrLnNjcm9sbHNweW5hdicsIFt0YXJnZXQsIG5hdml0ZW1zXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zbW9vdGhzY3JvbGwgJiYgVUkuc21vb3RoU2Nyb2xsKSB7XG4gICAgICAgICAgICAgICAgbGlua3MuZWFjaChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICBVSS5zbW9vdGhTY3JvbGwodGhpcywgJHRoaXMub3B0aW9ucy5zbW9vdGhzY3JvbGwpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbigpO1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGF0YSgnc2Nyb2xsc3B5bmF2JywgdGhpcyk7XG5cbiAgICAgICAgICAgIHRoaXMuY2hlY2sgPSBmbjtcbiAgICAgICAgICAgIHNjcm9sbHNweW5hdnMucHVzaCh0aGlzKTtcblxuICAgICAgICB9XG4gICAgfSk7XG5cbn0pKFVJa2l0Mik7XG5cbihmdW5jdGlvbihVSSl7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciB0b2dnbGVzID0gW107XG5cbiAgICBVSS5jb21wb25lbnQoJ3RvZ2dsZScsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgdGFyZ2V0ICAgIDogZmFsc2UsXG4gICAgICAgICAgICBjbHMgICAgICAgOiAndWstaGlkZGVuJyxcbiAgICAgICAgICAgIGFuaW1hdGlvbiA6IGZhbHNlLFxuICAgICAgICAgICAgZHVyYXRpb24gIDogMjAwXG4gICAgICAgIH0sXG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS5yZWFkeShmdW5jdGlvbihjb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICBVSS4kKCdbZGF0YS11ay10b2dnbGVdJywgY29udGV4dCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGUuZGF0YSgndG9nZ2xlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSBVSS50b2dnbGUoZWxlLCBVSS5VdGlscy5vcHRpb25zKGVsZS5hdHRyKCdkYXRhLXVrLXRvZ2dsZScpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgICAgICB0b2dnbGVzLmZvckVhY2goZnVuY3Rpb24odG9nZ2xlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZS5nZXRUb2dnbGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5hcmlhID0gKHRoaXMub3B0aW9ucy5jbHMuaW5kZXhPZigndWstaGlkZGVuJykgIT09IC0xKTtcblxuICAgICAgICAgICAgdGhpcy5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoJHRoaXMuZWxlbWVudC5pcygnYVtocmVmPVwiI1wiXScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAkdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0b2dnbGVzLnB1c2godGhpcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9nZ2xlOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdGhpcy5nZXRUb2dnbGVzKCk7XG5cbiAgICAgICAgICAgIGlmKCF0aGlzLnRvdG9nZ2xlLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFuaW1hdGlvbiAmJiBVSS5zdXBwb3J0LmFuaW1hdGlvbikge1xuXG4gICAgICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcywgYW5pbWF0aW9ucyA9IHRoaXMub3B0aW9ucy5hbmltYXRpb24uc3BsaXQoJywnKTtcblxuICAgICAgICAgICAgICAgIGlmIChhbmltYXRpb25zLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbnNbMV0gPSBhbmltYXRpb25zWzBdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGFuaW1hdGlvbnNbMF0gPSBhbmltYXRpb25zWzBdLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBhbmltYXRpb25zWzFdID0gYW5pbWF0aW9uc1sxXS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRvdG9nZ2xlLmNzcygnYW5pbWF0aW9uLWR1cmF0aW9uJywgdGhpcy5vcHRpb25zLmR1cmF0aW9uKydtcycpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy50b3RvZ2dsZS5lYWNoKGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZS5oYXNDbGFzcygkdGhpcy5vcHRpb25zLmNscykpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlLnRvZ2dsZUNsYXNzKCR0aGlzLm9wdGlvbnMuY2xzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgVUkuVXRpbHMuYW5pbWF0ZShlbGUsIGFuaW1hdGlvbnNbMF0pLnRoZW4oZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGUuY3NzKCdhbmltYXRpb24tZHVyYXRpb24nLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUkuVXRpbHMuY2hlY2tEaXNwbGF5KGVsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBVSS5VdGlscy5hbmltYXRlKHRoaXMsIGFuaW1hdGlvbnNbMV0rJyB1ay1hbmltYXRpb24tcmV2ZXJzZScpLnRoZW4oZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGUudG9nZ2xlQ2xhc3MoJHRoaXMub3B0aW9ucy5jbHMpLmNzcygnYW5pbWF0aW9uLWR1cmF0aW9uJywgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJLlV0aWxzLmNoZWNrRGlzcGxheShlbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RvZ2dsZS50b2dnbGVDbGFzcyh0aGlzLm9wdGlvbnMuY2xzKTtcbiAgICAgICAgICAgICAgICBVSS5VdGlscy5jaGVja0Rpc3BsYXkodGhpcy50b3RvZ2dsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlQXJpYSgpO1xuXG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0VG9nZ2xlczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLnRvdG9nZ2xlID0gdGhpcy5vcHRpb25zLnRhcmdldCA/IFVJLiQodGhpcy5vcHRpb25zLnRhcmdldCk6W107XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFyaWEoKTtcbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGVBcmlhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFyaWEgJiYgdGhpcy50b3RvZ2dsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvdG9nZ2xlLm5vdCgnW2FyaWEtaGlkZGVuXScpLmVhY2goZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgVUkuJCh0aGlzKS5hdHRyKCdhcmlhLWhpZGRlbicsIFVJLiQodGhpcykuaGFzQ2xhc3MoJ3VrLWhpZGRlbicpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG59KShVSWtpdDIpO1xuXG4oZnVuY3Rpb24oVUkpIHtcblxuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgVUkuY29tcG9uZW50KCdhbGVydCcsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgZmFkZTogdHJ1ZSxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXG4gICAgICAgICAgICB0cmlnZ2VyOiAnLnVrLWFsZXJ0LWNsb3NlJ1xuICAgICAgICB9LFxuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLiRodG1sLm9uKCdjbGljay5hbGVydC51aWtpdCcsICdbZGF0YS11ay1hbGVydF0nLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgZWxlID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ2FsZXJ0JykpIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgYWxlcnQgPSBVSS5hbGVydChlbGUsIFVJLlV0aWxzLm9wdGlvbnMoZWxlLmF0dHIoJ2RhdGEtdWstYWxlcnQnKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChVSS4kKGUudGFyZ2V0KS5pcyhhbGVydC5vcHRpb25zLnRyaWdnZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGVydC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2NsaWNrJywgdGhpcy5vcHRpb25zLnRyaWdnZXIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgJHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNsb3NlOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIGVsZW1lbnQgICAgICAgPSB0aGlzLnRyaWdnZXIoJ2Nsb3NlLnVrLmFsZXJ0JyksXG4gICAgICAgICAgICAgICAgcmVtb3ZlRWxlbWVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdjbG9zZWQudWsuYWxlcnQnKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFkZSkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuY3NzKCdvdmVyZmxvdycsICdoaWRkZW4nKS5jc3MoXCJtYXgtaGVpZ2h0XCIsIGVsZW1lbnQuaGVpZ2h0KCkpLmFuaW1hdGUoe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQgICAgICAgICA6IDAsXG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHkgICAgICAgIDogMCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1RvcCAgICA6IDAsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdCb3R0b20gOiAwLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3AgICAgIDogMCxcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luQm90dG9tICA6IDBcbiAgICAgICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24sIHJlbW92ZUVsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZW1vdmVFbGVtZW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH0pO1xuXG59KShVSWtpdDIpO1xuXG4oZnVuY3Rpb24oVUkpIHtcblxuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgVUkuY29tcG9uZW50KCdidXR0b25SYWRpbycsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgYWN0aXZlQ2xhc3M6ICd1ay1hY3RpdmUnLFxuICAgICAgICAgICAgdGFyZ2V0OiAnLnVrLWJ1dHRvbidcbiAgICAgICAgfSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS4kaHRtbC5vbignY2xpY2suYnV0dG9ucmFkaW8udWlraXQnLCAnW2RhdGEtdWstYnV0dG9uLXJhZGlvXScsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFlbGUuZGF0YSgnYnV0dG9uUmFkaW8nKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBvYmogICAgPSBVSS5idXR0b25SYWRpbyhlbGUsIFVJLlV0aWxzLm9wdGlvbnMoZWxlLmF0dHIoJ2RhdGEtdWstYnV0dG9uLXJhZGlvJykpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IFVJLiQoZS50YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaXMob2JqLm9wdGlvbnMudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgLy8gSW5pdCBBUklBXG4gICAgICAgICAgICB0aGlzLmZpbmQoJHRoaXMub3B0aW9ucy50YXJnZXQpLmF0dHIoJ2FyaWEtY2hlY2tlZCcsICdmYWxzZScpLmZpbHRlcignLicgKyAkdGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKS5hdHRyKCdhcmlhLWNoZWNrZWQnLCAndHJ1ZScpO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdjbGljaycsIHRoaXMub3B0aW9ucy50YXJnZXQsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZS5pcygnYVtocmVmPVwiI1wiXScpKSBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICAkdGhpcy5maW5kKCR0aGlzLm9wdGlvbnMudGFyZ2V0KS5ub3QoZWxlKS5yZW1vdmVDbGFzcygkdGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKS5ibHVyKCk7XG4gICAgICAgICAgICAgICAgZWxlLmFkZENsYXNzKCR0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpO1xuXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIEFSSUFcbiAgICAgICAgICAgICAgICAkdGhpcy5maW5kKCR0aGlzLm9wdGlvbnMudGFyZ2V0KS5ub3QoZWxlKS5hdHRyKCdhcmlhLWNoZWNrZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgICAgICAgICBlbGUuYXR0cignYXJpYS1jaGVja2VkJywgJ3RydWUnKTtcblxuICAgICAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoJ2NoYW5nZS51ay5idXR0b24nLCBbZWxlXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIGdldFNlbGVjdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmQoJy4nICsgdGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgVUkuY29tcG9uZW50KCdidXR0b25DaGVja2JveCcsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgYWN0aXZlQ2xhc3M6ICd1ay1hY3RpdmUnLFxuICAgICAgICAgICAgdGFyZ2V0OiAnLnVrLWJ1dHRvbidcbiAgICAgICAgfSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgVUkuJGh0bWwub24oJ2NsaWNrLmJ1dHRvbmNoZWNrYm94LnVpa2l0JywgJ1tkYXRhLXVrLWJ1dHRvbi1jaGVja2JveF0nLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWVsZS5kYXRhKCdidXR0b25DaGVja2JveCcpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiAgICA9IFVJLmJ1dHRvbkNoZWNrYm94KGVsZSwgVUkuVXRpbHMub3B0aW9ucyhlbGUuYXR0cignZGF0YS11ay1idXR0b24tY2hlY2tib3gnKSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gVUkuJChlLnRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5pcyhvYmoub3B0aW9ucy50YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQudHJpZ2dlcignY2xpY2snKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICAvLyBJbml0IEFSSUFcbiAgICAgICAgICAgIHRoaXMuZmluZCgkdGhpcy5vcHRpb25zLnRhcmdldCkuYXR0cignYXJpYS1jaGVja2VkJywgJ2ZhbHNlJykuZmlsdGVyKCcuJyArICR0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLmF0dHIoJ2FyaWEtY2hlY2tlZCcsICd0cnVlJyk7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2NsaWNrJywgdGhpcy5vcHRpb25zLnRhcmdldCwgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZS5pcygnYVtocmVmPVwiI1wiXScpKSBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICBlbGUudG9nZ2xlQ2xhc3MoJHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcykuYmx1cigpO1xuXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIEFSSUFcbiAgICAgICAgICAgICAgICBlbGUuYXR0cignYXJpYS1jaGVja2VkJywgZWxlLmhhc0NsYXNzKCR0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpKTtcblxuICAgICAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoJ2NoYW5nZS51ay5idXR0b24nLCBbZWxlXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIGdldFNlbGVjdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmQoJy4nICsgdGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG5cbiAgICBVSS5jb21wb25lbnQoJ2J1dHRvbicsIHtcblxuICAgICAgICBkZWZhdWx0czoge30sXG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIFVJLiRodG1sLm9uKCdjbGljay5idXR0b24udWlraXQnLCAnW2RhdGEtdWstYnV0dG9uXScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZWxlID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ2J1dHRvbicpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IFVJLmJ1dHRvbihlbGUsIFVJLlV0aWxzLm9wdGlvbnMoZWxlLmF0dHIoJ2RhdGEtdWstYnV0dG9uJykpKTtcbiAgICAgICAgICAgICAgICAgICAgZWxlLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIC8vIEluaXQgQVJJQVxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmF0dHIoJ2FyaWEtcHJlc3NlZCcsIHRoaXMuZWxlbWVudC5oYXNDbGFzcyhcInVrLWFjdGl2ZVwiKSk7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKCR0aGlzLmVsZW1lbnQuaXMoJ2FbaHJlZj1cIiNcIl0nKSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgJHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgJHRoaXMudHJpZ2dlcignY2hhbmdlLnVrLmJ1dHRvbicsIFskdGhpcy5lbGVtZW50LmJsdXIoKS5oYXNDbGFzcygndWstYWN0aXZlJyldKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9nZ2xlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC50b2dnbGVDbGFzcygndWstYWN0aXZlJyk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBBUklBXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXR0cignYXJpYS1wcmVzc2VkJywgdGhpcy5lbGVtZW50Lmhhc0NsYXNzKCd1ay1hY3RpdmUnKSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciBhY3RpdmUgPSBmYWxzZSwgaG92ZXJJZGxlLCBmbGlwcyA9IHtcbiAgICAgICAgeDoge1xuICAgICAgICAgICAgJ2JvdHRvbS1sZWZ0JyAgIDogJ2JvdHRvbS1yaWdodCcsXG4gICAgICAgICAgICAnYm90dG9tLXJpZ2h0JyAgOiAnYm90dG9tLWxlZnQnLFxuICAgICAgICAgICAgJ2JvdHRvbS1jZW50ZXInIDogJ2JvdHRvbS1jZW50ZXInLFxuICAgICAgICAgICAgJ3RvcC1sZWZ0JyAgICAgIDogJ3RvcC1yaWdodCcsXG4gICAgICAgICAgICAndG9wLXJpZ2h0JyAgICAgOiAndG9wLWxlZnQnLFxuICAgICAgICAgICAgJ3RvcC1jZW50ZXInICAgIDogJ3RvcC1jZW50ZXInLFxuICAgICAgICAgICAgJ2xlZnQtdG9wJyAgICAgIDogJ3JpZ2h0LXRvcCcsXG4gICAgICAgICAgICAnbGVmdC1ib3R0b20nICAgOiAncmlnaHQtYm90dG9tJyxcbiAgICAgICAgICAgICdsZWZ0LWNlbnRlcicgICA6ICdyaWdodC1jZW50ZXInLFxuICAgICAgICAgICAgJ3JpZ2h0LXRvcCcgICAgIDogJ2xlZnQtdG9wJyxcbiAgICAgICAgICAgICdyaWdodC1ib3R0b20nICA6ICdsZWZ0LWJvdHRvbScsXG4gICAgICAgICAgICAncmlnaHQtY2VudGVyJyAgOiAnbGVmdC1jZW50ZXInXG4gICAgICAgIH0sXG4gICAgICAgIHk6IHtcbiAgICAgICAgICAgICdib3R0b20tbGVmdCcgICA6ICd0b3AtbGVmdCcsXG4gICAgICAgICAgICAnYm90dG9tLXJpZ2h0JyAgOiAndG9wLXJpZ2h0JyxcbiAgICAgICAgICAgICdib3R0b20tY2VudGVyJyA6ICd0b3AtY2VudGVyJyxcbiAgICAgICAgICAgICd0b3AtbGVmdCcgICAgICA6ICdib3R0b20tbGVmdCcsXG4gICAgICAgICAgICAndG9wLXJpZ2h0JyAgICAgOiAnYm90dG9tLXJpZ2h0JyxcbiAgICAgICAgICAgICd0b3AtY2VudGVyJyAgICA6ICdib3R0b20tY2VudGVyJyxcbiAgICAgICAgICAgICdsZWZ0LXRvcCcgICAgICA6ICdsZWZ0LWJvdHRvbScsXG4gICAgICAgICAgICAnbGVmdC1ib3R0b20nICAgOiAnbGVmdC10b3AnLFxuICAgICAgICAgICAgJ2xlZnQtY2VudGVyJyAgIDogJ2xlZnQtY2VudGVyJyxcbiAgICAgICAgICAgICdyaWdodC10b3AnICAgICA6ICdyaWdodC1ib3R0b20nLFxuICAgICAgICAgICAgJ3JpZ2h0LWJvdHRvbScgIDogJ3JpZ2h0LXRvcCcsXG4gICAgICAgICAgICAncmlnaHQtY2VudGVyJyAgOiAncmlnaHQtY2VudGVyJ1xuICAgICAgICB9LFxuICAgICAgICB4eToge1xuICAgICAgICAgICAgJ2JvdHRvbS1sZWZ0JyAgIDogJ3RvcC1yaWdodCcsXG4gICAgICAgICAgICAnYm90dG9tLXJpZ2h0JyAgOiAndG9wLWxlZnQnLFxuICAgICAgICAgICAgJ2JvdHRvbS1jZW50ZXInIDogJ3RvcC1jZW50ZXInLFxuICAgICAgICAgICAgJ3RvcC1sZWZ0JyAgICAgIDogJ2JvdHRvbS1yaWdodCcsXG4gICAgICAgICAgICAndG9wLXJpZ2h0JyAgICAgOiAnYm90dG9tLWxlZnQnLFxuICAgICAgICAgICAgJ3RvcC1jZW50ZXInICAgIDogJ2JvdHRvbS1jZW50ZXInLFxuICAgICAgICAgICAgJ2xlZnQtdG9wJyAgICAgIDogJ3JpZ2h0LWJvdHRvbScsXG4gICAgICAgICAgICAnbGVmdC1ib3R0b20nICAgOiAncmlnaHQtdG9wJyxcbiAgICAgICAgICAgICdsZWZ0LWNlbnRlcicgICA6ICdyaWdodC1jZW50ZXInLFxuICAgICAgICAgICAgJ3JpZ2h0LXRvcCcgICAgIDogJ2xlZnQtYm90dG9tJyxcbiAgICAgICAgICAgICdyaWdodC1ib3R0b20nICA6ICdsZWZ0LXRvcCcsXG4gICAgICAgICAgICAncmlnaHQtY2VudGVyJyAgOiAnbGVmdC1jZW50ZXInXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgVUkuY29tcG9uZW50KCdkcm9wZG93bicsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICBtb2RlICAgICAgICAgICAgOiAnaG92ZXInLFxuICAgICAgICAgICBwb3MgICAgICAgICAgICAgOiAnYm90dG9tLWxlZnQnLFxuICAgICAgICAgICBvZmZzZXQgICAgICAgICAgOiAwLFxuICAgICAgICAgICByZW1haW50aW1lICAgICAgOiA4MDAsXG4gICAgICAgICAgIGp1c3RpZnkgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICBib3VuZGFyeSAgICAgICAgOiBVSS4kd2luLFxuICAgICAgICAgICBkZWxheSAgICAgICAgICAgOiAwLFxuICAgICAgICAgICBkcm9wZG93blNlbGVjdG9yOiAnLnVrLWRyb3Bkb3duLC51ay1kcm9wZG93bi1ibGFuaycsXG4gICAgICAgICAgIGhvdmVyRGVsYXlJZGxlICA6IDI1MCxcbiAgICAgICAgICAgcHJldmVudGZsaXAgICAgIDogZmFsc2VcbiAgICAgICAgfSxcblxuICAgICAgICByZW1haW5JZGxlOiBmYWxzZSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIHRyaWdnZXJldmVudCA9IFVJLnN1cHBvcnQudG91Y2ggPyAnY2xpY2snIDogJ21vdXNlZW50ZXInO1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLiRodG1sLm9uKHRyaWdnZXJldmVudCsnLmRyb3Bkb3duLnVpa2l0IGZvY3VzIHBvaW50ZXJkb3duJywgJ1tkYXRhLXVrLWRyb3Bkb3duXScsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFlbGUuZGF0YSgnZHJvcGRvd24nKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBkcm9wZG93biA9IFVJLmRyb3Bkb3duKGVsZSwgVUkuVXRpbHMub3B0aW9ucyhlbGUuYXR0cignZGF0YS11ay1kcm9wZG93bicpKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudHlwZT09J2NsaWNrJyB8fCAoZS50eXBlPT0nbW91c2VlbnRlcicgJiYgZHJvcGRvd24ub3B0aW9ucy5tb2RlPT0naG92ZXInKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHJvcGRvd24uZWxlbWVudC50cmlnZ2VyKHRyaWdnZXJldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZHJvcGRvd24uZHJvcGRvd24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5kcm9wZG93biAgICAgPSB0aGlzLmZpbmQodGhpcy5vcHRpb25zLmRyb3Bkb3duU2VsZWN0b3IpO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXRQYXJlbnQgPSB0aGlzLmRyb3Bkb3duLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVJLiQuaW5BcnJheShVSS4kKHRoaXMpLmNzcygncG9zaXRpb24nKSwgWydyZWxhdGl2ZScsICdmaXhlZCcsICdhYnNvbHV0ZSddKSAhPT0gLTE7XG4gICAgICAgICAgICB9KS5zbGljZSgwLDEpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMub2Zmc2V0UGFyZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0UGFyZW50ID0gdGhpcy5lbGVtZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNlbnRlcmVkICA9IHRoaXMuZHJvcGRvd24uaGFzQ2xhc3MoJ3VrLWRyb3Bkb3duLWNlbnRlcicpO1xuICAgICAgICAgICAgdGhpcy5qdXN0aWZpZWQgPSB0aGlzLm9wdGlvbnMuanVzdGlmeSA/IFVJLiQodGhpcy5vcHRpb25zLmp1c3RpZnkpIDogZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMuYm91bmRhcnkgID0gVUkuJCh0aGlzLm9wdGlvbnMuYm91bmRhcnkpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuYm91bmRhcnkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ib3VuZGFyeSA9IFVJLiR3aW47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGxlZ2FjeSBERVBSRUNBVEVEIVxuICAgICAgICAgICAgaWYgKHRoaXMuZHJvcGRvd24uaGFzQ2xhc3MoJ3VrLWRyb3Bkb3duLXVwJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zID0gJ3RvcC1sZWZ0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmRyb3Bkb3duLmhhc0NsYXNzKCd1ay1kcm9wZG93bi1mbGlwJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zID0gdGhpcy5vcHRpb25zLnBvcy5yZXBsYWNlKCdsZWZ0JywncmlnaHQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmRyb3Bkb3duLmhhc0NsYXNzKCd1ay1kcm9wZG93bi1jZW50ZXInKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wb3MgPSB0aGlzLm9wdGlvbnMucG9zLnJlcGxhY2UoLyhsZWZ0fHJpZ2h0KS8sJ2NlbnRlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8tLSBlbmQgbGVnYWN5XG5cbiAgICAgICAgICAgIC8vIEluaXQgQVJJQVxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmF0dHIoJ2FyaWEtaGFzcG9wdXAnLCAndHJ1ZScpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0aGlzLmVsZW1lbnQuaGFzQ2xhc3MoJ3VrLW9wZW4nKSk7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tb2RlID09ICdjbGljaycgfHwgVUkuc3VwcG9ydC50b3VjaCkge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vbignY2xpY2sudWsuZHJvcGRvd24nLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyICR0YXJnZXQgPSBVSS4kKGUudGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISR0YXJnZXQucGFyZW50cygkdGhpcy5vcHRpb25zLmRyb3Bkb3duU2VsZWN0b3IpLmxlbmd0aCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRhcmdldC5pcyhcImFbaHJlZj0nIyddXCIpIHx8ICR0YXJnZXQucGFyZW50KCkuaXMoXCJhW2hyZWY9JyMnXVwiKSB8fCAoJHRoaXMuZHJvcGRvd24ubGVuZ3RoICYmICEkdGhpcy5kcm9wZG93bi5pcygnOnZpc2libGUnKSkgKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQuYmx1cigpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpcy5lbGVtZW50Lmhhc0NsYXNzKCd1ay1vcGVuJykpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXMuZHJvcGRvd24uZmluZChlLnRhcmdldCkubGVuZ3RoIHx8ICR0YXJnZXQuaXMoJy51ay1kcm9wZG93bi1jbG9zZScpIHx8ICR0YXJnZXQucGFyZW50cygnLnVrLWRyb3Bkb3duLWNsb3NlJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9uKCdtb3VzZWVudGVyJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoJ3BvaW50ZXJlbnRlci51ay5kcm9wZG93bicsIFskdGhpc10pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy5yZW1haW5JZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoJHRoaXMucmVtYWluSWRsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoaG92ZXJJZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaG92ZXJJZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmUgJiYgYWN0aXZlID09ICR0aGlzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBwc2V1ZG8gbWFudUFpbVxuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlICYmIGFjdGl2ZSAhPSAkdGhpcykge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBob3ZlcklkbGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVySWRsZSA9IHNldFRpbWVvdXQoJHRoaXMuc2hvdy5iaW5kKCR0aGlzKSwgJHRoaXMub3B0aW9ucy5kZWxheSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAkdGhpcy5vcHRpb25zLmhvdmVyRGVsYXlJZGxlKTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBob3ZlcklkbGUgPSBzZXRUaW1lb3V0KCR0aGlzLnNob3cuYmluZCgkdGhpcyksICR0aGlzLm9wdGlvbnMuZGVsYXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9KS5vbignbW91c2VsZWF2ZScsIGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChob3ZlcklkbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChob3ZlcklkbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgJHRoaXMucmVtYWluSWRsZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlICYmIGFjdGl2ZSA9PSAkdGhpcykgJHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICB9LCAkdGhpcy5vcHRpb25zLnJlbWFpbnRpbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoJ3BvaW50ZXJsZWF2ZS51ay5kcm9wZG93bicsIFskdGhpc10pO1xuXG4gICAgICAgICAgICAgICAgfSkub24oJ2NsaWNrJywgZnVuY3Rpb24oZSl7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyICR0YXJnZXQgPSBVSS4kKGUudGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMucmVtYWluSWRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KCR0aGlzLnJlbWFpbklkbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSAmJiBhY3RpdmUgPT0gJHRoaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXMuZHJvcGRvd24uZmluZChlLnRhcmdldCkubGVuZ3RoIHx8ICR0YXJnZXQuaXMoJy51ay1kcm9wZG93bi1jbG9zZScpIHx8ICR0YXJnZXQucGFyZW50cygnLnVrLWRyb3Bkb3duLWNsb3NlJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCR0YXJnZXQuaXMoXCJhW2hyZWY9JyMnXVwiKSB8fCAkdGFyZ2V0LnBhcmVudCgpLmlzKFwiYVtocmVmPScjJ11cIikpe1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgJHRoaXMuc2hvdygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHNob3c6IGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgIFVJLiRodG1sLm9mZignY2xpY2sub3V0ZXIuZHJvcGRvd24nKTtcblxuICAgICAgICAgICAgaWYgKGFjdGl2ZSAmJiBhY3RpdmUgIT0gdGhpcykge1xuICAgICAgICAgICAgICAgIGFjdGl2ZS5oaWRlKHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaG92ZXJJZGxlKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhvdmVySWRsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignYmVmb3Jlc2hvdy51ay5kcm9wZG93bicsIFt0aGlzXSk7XG5cbiAgICAgICAgICAgIHRoaXMuY2hlY2tEaW1lbnNpb25zKCk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoJ3VrLW9wZW4nKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIEFSSUFcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcblxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdzaG93LnVrLmRyb3Bkb3duJywgW3RoaXNdKTtcblxuICAgICAgICAgICAgVUkuVXRpbHMuY2hlY2tEaXNwbGF5KHRoaXMuZHJvcGRvd24sIHRydWUpO1xuICAgICAgICAgICAgVUkuVXRpbHMuZm9jdXModGhpcy5kcm9wZG93bik7XG4gICAgICAgICAgICBhY3RpdmUgPSB0aGlzO1xuXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyT3V0ZXJDbGljaygpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGhpZGU6IGZ1bmN0aW9uKGZvcmNlKSB7XG5cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignYmVmb3JlaGlkZS51ay5kcm9wZG93bicsIFt0aGlzLCBmb3JjZV0pO1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoJ3VrLW9wZW4nKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucmVtYWluSWRsZSkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlbWFpbklkbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJlbWFpbklkbGUgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIEFSSUFcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcblxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdoaWRlLnVrLmRyb3Bkb3duJywgW3RoaXMsIGZvcmNlXSk7XG5cbiAgICAgICAgICAgIGlmIChhY3RpdmUgPT0gdGhpcykgYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVnaXN0ZXJPdXRlckNsaWNrOiBmdW5jdGlvbigpe1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICBVSS4kaHRtbC5vZmYoJ2NsaWNrLm91dGVyLmRyb3Bkb3duJyk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICBVSS4kaHRtbC5vbignY2xpY2sub3V0ZXIuZHJvcGRvd24nLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVySWRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhvdmVySWRsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgJHRhcmdldCA9IFVJLiQoZS50YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmUgPT0gJHRoaXMgJiYgISR0aGlzLmVsZW1lbnQuZmluZChlLnRhcmdldCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy5oaWRlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgVUkuJGh0bWwub2ZmKCdjbGljay5vdXRlci5kcm9wZG93bicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCAxMCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2hlY2tEaW1lbnNpb25zOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmRyb3Bkb3duLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyByZXNldFxuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5yZW1vdmVDbGFzcygndWstZHJvcGRvd24tdG9wIHVrLWRyb3Bkb3duLWJvdHRvbSB1ay1kcm9wZG93bi1sZWZ0IHVrLWRyb3Bkb3duLXJpZ2h0IHVrLWRyb3Bkb3duLXN0YWNrIHVrLWRyb3Bkb3duLWF1dG9mbGlwJykuY3NzKHtcbiAgICAgICAgICAgICAgICB0b3BMZWZ0IDonJyxcbiAgICAgICAgICAgICAgICBsZWZ0IDonJyxcbiAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0IDonJyxcbiAgICAgICAgICAgICAgICBtYXJnaW5SaWdodCA6JydcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5qdXN0aWZpZWQgJiYgdGhpcy5qdXN0aWZpZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5jc3MoJ21pbi13aWR0aCcsICcnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyICR0aGlzICAgICAgICAgID0gdGhpcyxcbiAgICAgICAgICAgICAgICBwb3MgICAgICAgICAgICA9IFVJLiQuZXh0ZW5kKHt9LCB0aGlzLm9mZnNldFBhcmVudC5vZmZzZXQoKSwge3dpZHRoOiB0aGlzLm9mZnNldFBhcmVudFswXS5vZmZzZXRXaWR0aCwgaGVpZ2h0OiB0aGlzLm9mZnNldFBhcmVudFswXS5vZmZzZXRIZWlnaHR9KSxcbiAgICAgICAgICAgICAgICBwb3NvZmZzZXQgICAgICA9IHRoaXMub3B0aW9ucy5vZmZzZXQsXG4gICAgICAgICAgICAgICAgZHJvcGRvd24gICAgICAgPSB0aGlzLmRyb3Bkb3duLFxuICAgICAgICAgICAgICAgIG9mZnNldCAgICAgICAgID0gZHJvcGRvd24uc2hvdygpLm9mZnNldCgpIHx8IHtsZWZ0OiAwLCB0b3A6IDB9LFxuICAgICAgICAgICAgICAgIHdpZHRoICAgICAgICAgID0gZHJvcGRvd24ub3V0ZXJXaWR0aCgpLFxuICAgICAgICAgICAgICAgIGhlaWdodCAgICAgICAgID0gZHJvcGRvd24ub3V0ZXJIZWlnaHQoKSxcbiAgICAgICAgICAgICAgICBib3VuZGFyeXdpZHRoICA9IHRoaXMuYm91bmRhcnkud2lkdGgoKSxcbiAgICAgICAgICAgICAgICBib3VuZGFyeW9mZnNldCA9IHRoaXMuYm91bmRhcnlbMF0gIT09IHdpbmRvdyAmJiB0aGlzLmJvdW5kYXJ5Lm9mZnNldCgpID8gdGhpcy5ib3VuZGFyeS5vZmZzZXQoKToge3RvcDowLCBsZWZ0OjB9LFxuICAgICAgICAgICAgICAgIGRwb3MgICAgICAgICAgID0gdGhpcy5vcHRpb25zLnBvcztcblxuICAgICAgICAgICAgdmFyIHZhcmlhbnRzID0gIHtcbiAgICAgICAgICAgICAgICAgICAgJ2JvdHRvbS1sZWZ0JyAgIDoge3RvcDogMCArIHBvcy5oZWlnaHQgKyBwb3NvZmZzZXQsIGxlZnQ6IDB9LFxuICAgICAgICAgICAgICAgICAgICAnYm90dG9tLXJpZ2h0JyAgOiB7dG9wOiAwICsgcG9zLmhlaWdodCArIHBvc29mZnNldCwgbGVmdDogMCArIHBvcy53aWR0aCAtIHdpZHRofSxcbiAgICAgICAgICAgICAgICAgICAgJ2JvdHRvbS1jZW50ZXInIDoge3RvcDogMCArIHBvcy5oZWlnaHQgKyBwb3NvZmZzZXQsIGxlZnQ6IDAgKyBwb3Mud2lkdGggLyAyIC0gd2lkdGggLyAyfSxcbiAgICAgICAgICAgICAgICAgICAgJ3RvcC1sZWZ0JyAgICAgIDoge3RvcDogMCAtIGhlaWdodCAtIHBvc29mZnNldCwgbGVmdDogMH0sXG4gICAgICAgICAgICAgICAgICAgICd0b3AtcmlnaHQnICAgICA6IHt0b3A6IDAgLSBoZWlnaHQgLSBwb3NvZmZzZXQsIGxlZnQ6IDAgKyBwb3Mud2lkdGggLSB3aWR0aH0sXG4gICAgICAgICAgICAgICAgICAgICd0b3AtY2VudGVyJyAgICA6IHt0b3A6IDAgLSBoZWlnaHQgLSBwb3NvZmZzZXQsIGxlZnQ6IDAgKyBwb3Mud2lkdGggLyAyIC0gd2lkdGggLyAyfSxcbiAgICAgICAgICAgICAgICAgICAgJ2xlZnQtdG9wJyAgICAgIDoge3RvcDogMCwgbGVmdDogMCAtIHdpZHRoIC0gcG9zb2Zmc2V0fSxcbiAgICAgICAgICAgICAgICAgICAgJ2xlZnQtYm90dG9tJyAgIDoge3RvcDogMCArIHBvcy5oZWlnaHQgLSBoZWlnaHQsIGxlZnQ6IDAgLSB3aWR0aCAtIHBvc29mZnNldH0sXG4gICAgICAgICAgICAgICAgICAgICdsZWZ0LWNlbnRlcicgICA6IHt0b3A6IDAgKyBwb3MuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDIsIGxlZnQ6IDAgLSB3aWR0aCAtIHBvc29mZnNldH0sXG4gICAgICAgICAgICAgICAgICAgICdyaWdodC10b3AnICAgICA6IHt0b3A6IDAsIGxlZnQ6IDAgKyBwb3Mud2lkdGggKyBwb3NvZmZzZXR9LFxuICAgICAgICAgICAgICAgICAgICAncmlnaHQtYm90dG9tJyAgOiB7dG9wOiAwICsgcG9zLmhlaWdodCAtIGhlaWdodCwgbGVmdDogMCArIHBvcy53aWR0aCArIHBvc29mZnNldH0sXG4gICAgICAgICAgICAgICAgICAgICdyaWdodC1jZW50ZXInICA6IHt0b3A6IDAgKyBwb3MuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDIsIGxlZnQ6IDAgKyBwb3Mud2lkdGggKyBwb3NvZmZzZXR9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjc3MgPSB7fSxcbiAgICAgICAgICAgICAgICBwcDtcblxuICAgICAgICAgICAgcHAgPSBkcG9zLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBjc3MgPSB2YXJpYW50c1tkcG9zXSA/IHZhcmlhbnRzW2Rwb3NdIDogdmFyaWFudHNbJ2JvdHRvbS1sZWZ0J107XG5cbiAgICAgICAgICAgIC8vIGp1c3RpZnkgZHJvcGRvd25cbiAgICAgICAgICAgIGlmICh0aGlzLmp1c3RpZmllZCAmJiB0aGlzLmp1c3RpZmllZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBqdXN0aWZ5KGRyb3Bkb3duLmNzcyh7bGVmdDowfSksIHRoaXMuanVzdGlmaWVkLCBib3VuZGFyeXdpZHRoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnByZXZlbnRmbGlwICE9PSB0cnVlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGZkcG9zO1xuXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCh0aGlzLmNoZWNrQm91bmRhcnkocG9zLmxlZnQgKyBjc3MubGVmdCwgcG9zLnRvcCArIGNzcy50b3AsIHdpZHRoLCBoZWlnaHQsIGJvdW5kYXJ5d2lkdGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwieFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5wcmV2ZW50ZmxpcCAhPT0neCcpIGZkcG9zID0gZmxpcHNbJ3gnXVtkcG9zXSB8fCAncmlnaHQtdG9wJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5vcHRpb25zLnByZXZlbnRmbGlwICE9PSd5JykgZmRwb3MgPSBmbGlwc1sneSddW2Rwb3NdIHx8ICd0b3AtbGVmdCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwieHlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5vcHRpb25zLnByZXZlbnRmbGlwKSBmZHBvcyA9IGZsaXBzWyd4eSddW2Rwb3NdIHx8ICdyaWdodC1ib3R0b20nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZkcG9zKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHBwICA9IGZkcG9zLnNwbGl0KCctJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjc3MgPSB2YXJpYW50c1tmZHBvc10gPyB2YXJpYW50c1tmZHBvc10gOiB2YXJpYW50c1snYm90dG9tLWxlZnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLmFkZENsYXNzKCd1ay1kcm9wZG93bi1hdXRvZmxpcCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmbGlwcGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja0JvdW5kYXJ5KHBvcy5sZWZ0ICsgY3NzLmxlZnQsIHBvcy50b3AgKyBjc3MudG9wLCB3aWR0aCwgaGVpZ2h0LCBib3VuZGFyeXdpZHRoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwICA9IGRwb3Muc3BsaXQoJy0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3MgPSB2YXJpYW50c1tkcG9zXSA/IHZhcmlhbnRzW2Rwb3NdIDogdmFyaWFudHNbJ2JvdHRvbS1sZWZ0J107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh3aWR0aCA+IGJvdW5kYXJ5d2lkdGgpIHtcbiAgICAgICAgICAgICAgICBkcm9wZG93bi5hZGRDbGFzcygndWstZHJvcGRvd24tc3RhY2snKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3N0YWNrLnVrLmRyb3Bkb3duJywgW3RoaXNdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZHJvcGRvd24uY3NzKGNzcykuY3NzKCdkaXNwbGF5JywgJycpLmFkZENsYXNzKCd1ay1kcm9wZG93bi0nK3BwWzBdKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjaGVja0JvdW5kYXJ5OiBmdW5jdGlvbihsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQsIGJvdW5kYXJ5d2lkdGgpIHtcblxuICAgICAgICAgICAgdmFyIGF4aXMgPSBcIlwiO1xuXG4gICAgICAgICAgICBpZiAobGVmdCA8IDAgfHwgKChsZWZ0IC0gVUkuJHdpbi5zY3JvbGxMZWZ0KCkpK3dpZHRoKSA+IGJvdW5kYXJ5d2lkdGgpIHtcbiAgICAgICAgICAgICAgIGF4aXMgKz0gXCJ4XCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgodG9wIC0gVUkuJHdpbi5zY3JvbGxUb3AoKSkgPCAwIHx8ICgodG9wIC0gVUkuJHdpbi5zY3JvbGxUb3AoKSkraGVpZ2h0KSA+IHdpbmRvdy5pbm5lckhlaWdodCkge1xuICAgICAgICAgICAgICAgYXhpcyArPSBcInlcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGF4aXM7XG4gICAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgVUkuY29tcG9uZW50KCdkcm9wZG93bk92ZXJsYXknLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAganVzdGlmeSA6IGZhbHNlLFxuICAgICAgICAgICBjbHMgICAgIDogJycsXG4gICAgICAgICAgIGR1cmF0aW9uOiAyMDBcbiAgICAgICAgfSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS5yZWFkeShmdW5jdGlvbihjb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICBVSS4kKCdbZGF0YS11ay1kcm9wZG93bi1vdmVybGF5XScsIGNvbnRleHQpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ2Ryb3Bkb3duT3ZlcmxheScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBVSS5kcm9wZG93bk92ZXJsYXkoZWxlLCBVSS5VdGlscy5vcHRpb25zKGVsZS5hdHRyKCdkYXRhLXVrLWRyb3Bkb3duLW92ZXJsYXknKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5qdXN0aWZpZWQgPSB0aGlzLm9wdGlvbnMuanVzdGlmeSA/IFVJLiQodGhpcy5vcHRpb25zLmp1c3RpZnkpIDogZmFsc2U7XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXkgICA9IHRoaXMuZWxlbWVudC5maW5kKCd1ay1kcm9wZG93bi1vdmVybGF5Jyk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5vdmVybGF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheSA9IFVJLiQoJzxkaXYgY2xhc3M9XCJ1ay1kcm9wZG93bi1vdmVybGF5XCI+PC9kaXY+JykuYXBwZW5kVG8odGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5vdmVybGF5LmFkZENsYXNzKHRoaXMub3B0aW9ucy5jbHMpO1xuXG4gICAgICAgICAgICB0aGlzLm9uKHtcblxuICAgICAgICAgICAgICAgICdiZWZvcmVzaG93LnVrLmRyb3Bkb3duJzogZnVuY3Rpb24oZSwgZHJvcGRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgJHRoaXMuZHJvcGRvd24gPSBkcm9wZG93bjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMuanVzdGlmaWVkICYmICR0aGlzLmp1c3RpZmllZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnkoJHRoaXMub3ZlcmxheS5jc3Moe2Rpc3BsYXk6J2Jsb2NrJywgbWFyZ2luTGVmdDonJywgbWFyZ2luUmlnaHQ6Jyd9KSwgJHRoaXMuanVzdGlmaWVkLCAkdGhpcy5qdXN0aWZpZWQub3V0ZXJXaWR0aCgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAnc2hvdy51ay5kcm9wZG93bic6IGZ1bmN0aW9uKGUsIGRyb3Bkb3duKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGggPSAkdGhpcy5kcm9wZG93bi5kcm9wZG93bi5vdXRlckhlaWdodCh0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAkdGhpcy5kcm9wZG93bi5lbGVtZW50LnJlbW92ZUNsYXNzKCd1ay1vcGVuJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgJHRoaXMub3ZlcmxheS5zdG9wKCkuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJykuYW5pbWF0ZSh7aGVpZ2h0OiBofSwgJHRoaXMub3B0aW9ucy5kdXJhdGlvbiwgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuZHJvcGRvd24uZHJvcGRvd24uY3NzKCd2aXNpYmlsaXR5JywgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy5kcm9wZG93bi5lbGVtZW50LmFkZENsYXNzKCd1ay1vcGVuJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgVUkuVXRpbHMuY2hlY2tEaXNwbGF5KCR0aGlzLmRyb3Bkb3duLmRyb3Bkb3duLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgJHRoaXMucG9pbnRlcmxlYXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgICdoaWRlLnVrLmRyb3Bkb3duJzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICR0aGlzLm92ZXJsYXkuc3RvcCgpLmFuaW1hdGUoe2hlaWdodDogMH0sICR0aGlzLm9wdGlvbnMuZHVyYXRpb24pO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAncG9pbnRlcmVudGVyLnVrLmRyb3Bkb3duJzogZnVuY3Rpb24oZSwgZHJvcGRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KCR0aGlzLnJlbWFpbklkbGUpO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAncG9pbnRlcmxlYXZlLnVrLmRyb3Bkb3duJzogZnVuY3Rpb24oZSwgZHJvcGRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgJHRoaXMucG9pbnRlcmxlYXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICB0aGlzLm92ZXJsYXkub24oe1xuXG4gICAgICAgICAgICAgICAgJ21vdXNlZW50ZXInOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLnJlbWFpbklkbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCgkdGhpcy5kcm9wZG93bi5yZW1haW5JZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCgkdGhpcy5yZW1haW5JZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAnbW91c2VsZWF2ZSc6IGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLnBvaW50ZXJsZWF2ZSAmJiBhY3RpdmUpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMucmVtYWluSWRsZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhY3RpdmUpIGFjdGl2ZS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBhY3RpdmUub3B0aW9ucy5yZW1haW50aW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgIH0pO1xuXG5cbiAgICBmdW5jdGlvbiBqdXN0aWZ5KGVsZSwganVzdGlmeVRvLCBib3VuZGFyeXdpZHRoLCBvZmZzZXQpIHtcblxuICAgICAgICBlbGUgICAgICAgICAgID0gVUkuJChlbGUpO1xuICAgICAgICBqdXN0aWZ5VG8gICAgID0gVUkuJChqdXN0aWZ5VG8pO1xuICAgICAgICBib3VuZGFyeXdpZHRoID0gYm91bmRhcnl3aWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgICAgb2Zmc2V0ICAgICAgICA9IG9mZnNldCB8fCBlbGUub2Zmc2V0KCk7XG5cbiAgICAgICAgaWYgKGp1c3RpZnlUby5sZW5ndGgpIHtcblxuICAgICAgICAgICAgdmFyIGp3aWR0aCA9IGp1c3RpZnlUby5vdXRlcldpZHRoKCk7XG5cbiAgICAgICAgICAgIGVsZS5jc3MoJ21pbi13aWR0aCcsIGp3aWR0aCk7XG5cbiAgICAgICAgICAgIGlmIChVSS5sYW5nZGlyZWN0aW9uID09ICdyaWdodCcpIHtcblxuICAgICAgICAgICAgICAgIHZhciByaWdodDEgICA9IGJvdW5kYXJ5d2lkdGggLSAoanVzdGlmeVRvLm9mZnNldCgpLmxlZnQgKyBqd2lkdGgpLFxuICAgICAgICAgICAgICAgICAgICByaWdodDIgICA9IGJvdW5kYXJ5d2lkdGggLSAoZWxlLm9mZnNldCgpLmxlZnQgKyBlbGUub3V0ZXJXaWR0aCgpKTtcblxuICAgICAgICAgICAgICAgIGVsZS5jc3MoJ21hcmdpbi1yaWdodCcsIHJpZ2h0MSAtIHJpZ2h0Mik7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZWxlLmNzcygnbWFyZ2luLWxlZnQnLCBqdXN0aWZ5VG8ub2Zmc2V0KCkubGVmdCAtIG9mZnNldC5sZWZ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciBncmlkcyA9IFtdO1xuXG4gICAgVUkuY29tcG9uZW50KCdncmlkTWF0Y2hIZWlnaHQnLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIHRhcmdldCAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHJvdyAgICAgICAgICAgOiB0cnVlLFxuICAgICAgICAgICAgaWdub3Jlc3RhY2tlZCA6IGZhbHNlLFxuICAgICAgICAgICAgb2JzZXJ2ZSAgICAgICA6IGZhbHNlXG4gICAgICAgIH0sXG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIC8vIGluaXQgY29kZVxuICAgICAgICAgICAgVUkucmVhZHkoZnVuY3Rpb24oY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgVUkuJCgnW2RhdGEtdWstZ3JpZC1tYXRjaF0nLCBjb250ZXh0KS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZ3JpZCA9IFVJLiQodGhpcyksIG9iajtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWdyaWQuZGF0YSgnZ3JpZE1hdGNoSGVpZ2h0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IFVJLmdyaWRNYXRjaEhlaWdodChncmlkLCBVSS5VdGlscy5vcHRpb25zKGdyaWQuYXR0cignZGF0YS11ay1ncmlkLW1hdGNoJykpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMuY29sdW1ucyAgPSB0aGlzLmVsZW1lbnQuY2hpbGRyZW4oKTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHMgPSB0aGlzLm9wdGlvbnMudGFyZ2V0ID8gdGhpcy5maW5kKHRoaXMub3B0aW9ucy50YXJnZXQpIDogdGhpcy5jb2x1bW5zO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29sdW1ucy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAgICAgVUkuJHdpbi5vbignbG9hZCByZXNpemUgb3JpZW50YXRpb25jaGFuZ2UnLCAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLmVsZW1lbnQuaXMoJzp2aXNpYmxlJykpICR0aGlzLm1hdGNoKCk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIFVJLiQoZnVuY3Rpb24oKSB7IGZuKCk7IH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFVJLlV0aWxzLmRlYm91bmNlKGZuLCA1MCk7XG4gICAgICAgICAgICB9KSgpKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5vYnNlcnZlKSB7XG5cbiAgICAgICAgICAgICAgICBVSS5kb21PYnNlcnZlKHRoaXMuZWxlbWVudCwgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMuZWxlbWVudC5pcygnOnZpc2libGUnKSkgJHRoaXMubWF0Y2goKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5vbignZGlzcGxheS51ay5jaGVjaycsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBpZih0aGlzLmVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHRoaXMubWF0Y2goKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgICAgIGdyaWRzLnB1c2godGhpcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbWF0Y2g6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgZmlyc3R2aXNpYmxlID0gdGhpcy5jb2x1bW5zLmZpbHRlcignOnZpc2libGU6Zmlyc3QnKTtcblxuICAgICAgICAgICAgaWYgKCFmaXJzdHZpc2libGUubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgICAgIHZhciBzdGFja2VkID0gTWF0aC5jZWlsKDEwMCAqIHBhcnNlRmxvYXQoZmlyc3R2aXNpYmxlLmNzcygnd2lkdGgnKSkgLyBwYXJzZUZsb2F0KGZpcnN0dmlzaWJsZS5wYXJlbnQoKS5jc3MoJ3dpZHRoJykpKSA+PSAxMDA7XG5cbiAgICAgICAgICAgIGlmIChzdGFja2VkICYmICF0aGlzLm9wdGlvbnMuaWdub3Jlc3RhY2tlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJ0KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIFVJLlV0aWxzLm1hdGNoSGVpZ2h0cyh0aGlzLmVsZW1lbnRzLCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICByZXZlcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5jc3MoJ21pbi1oZWlnaHQnLCAnJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgVUkuY29tcG9uZW50KCdncmlkTWFyZ2luJywge1xuXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBjbHMgICAgICA6ICd1ay1ncmlkLW1hcmdpbicsXG4gICAgICAgICAgICByb3dmaXJzdCA6ICd1ay1yb3ctZmlyc3QnXG4gICAgICAgIH0sXG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIC8vIGluaXQgY29kZVxuICAgICAgICAgICAgVUkucmVhZHkoZnVuY3Rpb24oY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgVUkuJCgnW2RhdGEtdWstZ3JpZC1tYXJnaW5dJywgY29udGV4dCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGdyaWQgPSBVSS4kKHRoaXMpLCBvYmo7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFncmlkLmRhdGEoJ2dyaWRNYXJnaW4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gVUkuZ3JpZE1hcmdpbihncmlkLCBVSS5VdGlscy5vcHRpb25zKGdyaWQuYXR0cignZGF0YS11ay1ncmlkLW1hcmdpbicpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgc3RhY2tNYXJnaW4gPSBVSS5zdGFja01hcmdpbih0aGlzLmVsZW1lbnQsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciBhY3RpdmUgPSBmYWxzZSwgYWN0aXZlQ291bnQgPSAwLCAkaHRtbCA9IFVJLiRodG1sLCBib2R5O1xuXG4gICAgVUkuJHdpbi5vbigncmVzaXplIG9yaWVudGF0aW9uY2hhbmdlJywgVUkuVXRpbHMuZGVib3VuY2UoZnVuY3Rpb24oKXtcbiAgICAgICAgVUkuJCgnLnVrLW1vZGFsLnVrLW9wZW4nKS5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICByZXR1cm4gVUkuJCh0aGlzKS5kYXRhKCdtb2RhbCcpICYmIFVJLiQodGhpcykuZGF0YSgnbW9kYWwnKS5yZXNpemUoKTtcbiAgICAgICAgfSk7XG4gICAgfSwgMTUwKSk7XG5cbiAgICBVSS5jb21wb25lbnQoJ21vZGFsJywge1xuXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBrZXlib2FyZDogdHJ1ZSxcbiAgICAgICAgICAgIGJnY2xvc2U6IHRydWUsXG4gICAgICAgICAgICBtaW5TY3JvbGxIZWlnaHQ6IDE1MCxcbiAgICAgICAgICAgIGNlbnRlcjogZmFsc2UsXG4gICAgICAgICAgICBtb2RhbDogdHJ1ZVxuICAgICAgICB9LFxuXG4gICAgICAgIHNjcm9sbGFibGU6IGZhbHNlLFxuICAgICAgICB0cmFuc2l0aW9uOiBmYWxzZSxcbiAgICAgICAgaGFzVHJhbnNpdGlvbmVkOiB0cnVlLFxuXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICBpZiAoIWJvZHkpIGJvZHkgPSBVSS4kKCdib2R5Jyk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5lbGVtZW50Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICB0aGlzLnBhZGRpbmdkaXIgPSAncGFkZGluZy0nICsgKFVJLmxhbmdkaXJlY3Rpb24gPT0gJ2xlZnQnID8gJ3JpZ2h0JzonbGVmdCcpO1xuICAgICAgICAgICAgdGhpcy5kaWFsb2cgICAgID0gdGhpcy5maW5kKCcudWstbW9kYWwtZGlhbG9nJyk7XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlICAgICA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgQVJJQVxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmF0dHIoJ2FyaWEtaGlkZGVuJywgdGhpcy5lbGVtZW50Lmhhc0NsYXNzKCd1ay1vcGVuJykpO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdjbGljaycsICcudWstbW9kYWwtY2xvc2UnLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICR0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgIH0pLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBVSS4kKGUudGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRbMF0gPT0gJHRoaXMuZWxlbWVudFswXSAmJiAkdGhpcy5vcHRpb25zLmJnY2xvc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgJHRoaXMuaGlkZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBVSS5kb21PYnNlcnZlKHRoaXMuZWxlbWVudCwgZnVuY3Rpb24oZSkgeyAkdGhpcy5yZXNpemUoKTsgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdG9nZ2xlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW3RoaXMuaXNBY3RpdmUoKSA/ICdoaWRlJyA6ICdzaG93J10oKTtcbiAgICAgICAgfSxcblxuICAgICAgICBzaG93OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnQubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tb2RhbCAmJiBhY3RpdmUpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmUuaGlkZSh0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCd1ay1vcGVuJykuc2hvdygpO1xuICAgICAgICAgICAgdGhpcy5yZXNpemUodHJ1ZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubW9kYWwpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmUgPSB0aGlzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgICAgIGFjdGl2ZUNvdW50Kys7XG5cbiAgICAgICAgICAgIGlmIChVSS5zdXBwb3J0LnRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc1RyYW5zaXRpb25lZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5vbmUoVUkuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgJHRoaXMuaGFzVHJhbnNpdGlvbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgVUkuVXRpbHMuZm9jdXMoJHRoaXMuZGlhbG9nLCAnYVtocmVmXScpO1xuICAgICAgICAgICAgICAgIH0pLmFkZENsYXNzKCd1ay1vcGVuJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hZGRDbGFzcygndWstb3BlbicpO1xuICAgICAgICAgICAgICAgIFVJLlV0aWxzLmZvY3VzKHRoaXMuZGlhbG9nLCAnYVtocmVmXScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkaHRtbC5hZGRDbGFzcygndWstbW9kYWwtcGFnZScpLmhlaWdodCgpOyAvLyBmb3JjZSBicm93c2VyIGVuZ2luZSByZWRyYXdcblxuICAgICAgICAgICAgLy8gVXBkYXRlIEFSSUFcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hdHRyKCdhcmlhLWhpZGRlbicsICdmYWxzZScpO1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQudHJpZ2dlcignc2hvdy51ay5tb2RhbCcpO1xuXG4gICAgICAgICAgICBVSS5VdGlscy5jaGVja0Rpc3BsYXkodGhpcy5kaWFsb2csIHRydWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICBoaWRlOiBmdW5jdGlvbihmb3JjZSkge1xuXG4gICAgICAgICAgICBpZiAoIWZvcmNlICYmIFVJLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLmhhc1RyYW5zaXRpb25lZCkge1xuXG4gICAgICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgICAgIHRoaXMub25lKFVJLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAkdGhpcy5faGlkZSgpO1xuICAgICAgICAgICAgICAgIH0pLnJlbW92ZUNsYXNzKCd1ay1vcGVuJyk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9oaWRlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZm9yY2UpIHtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzQWN0aXZlKCkgJiYgIWZvcmNlKSByZXR1cm47XG5cbiAgICAgICAgICAgIHZhciBib2R5d2lkdGggID0gYm9keS53aWR0aCgpO1xuXG4gICAgICAgICAgICB0aGlzLnNjcm9sbGJhcndpZHRoID0gd2luZG93LmlubmVyV2lkdGggLSBib2R5d2lkdGg7XG5cbiAgICAgICAgICAgIGJvZHkuY3NzKHRoaXMucGFkZGluZ2RpciwgdGhpcy5zY3JvbGxiYXJ3aWR0aCk7XG5cbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jc3MoJ292ZXJmbG93LXknLCB0aGlzLnNjcm9sbGJhcndpZHRoID8gJ3Njcm9sbCcgOiAnYXV0bycpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMudXBkYXRlU2Nyb2xsYWJsZSgpICYmIHRoaXMub3B0aW9ucy5jZW50ZXIpIHtcblxuICAgICAgICAgICAgICAgIHZhciBkaCAgPSB0aGlzLmRpYWxvZy5vdXRlckhlaWdodCgpLFxuICAgICAgICAgICAgICAgIHBhZCA9IHBhcnNlSW50KHRoaXMuZGlhbG9nLmNzcygnbWFyZ2luLXRvcCcpLCAxMCkgKyBwYXJzZUludCh0aGlzLmRpYWxvZy5jc3MoJ21hcmdpbi1ib3R0b20nKSwgMTApO1xuXG4gICAgICAgICAgICAgICAgaWYgKChkaCArIHBhZCkgPCB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2cuY3NzKHt0b3A6ICh3aW5kb3cuaW5uZXJIZWlnaHQvMiAtIGRoLzIpIC0gcGFkIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nLmNzcyh7dG9wOiAnJ30pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGVTY3JvbGxhYmxlOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gaGFzIHNjcm9sbGFibGU/XG4gICAgICAgICAgICB2YXIgc2Nyb2xsYWJsZSA9IHRoaXMuZGlhbG9nLmZpbmQoJy51ay1vdmVyZmxvdy1jb250YWluZXI6dmlzaWJsZTpmaXJzdCcpO1xuXG4gICAgICAgICAgICBpZiAoc2Nyb2xsYWJsZS5sZW5ndGgpIHtcblxuICAgICAgICAgICAgICAgIHNjcm9sbGFibGUuY3NzKCdoZWlnaHQnLCAwKTtcblxuICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSBNYXRoLmFicyhwYXJzZUludCh0aGlzLmRpYWxvZy5jc3MoJ21hcmdpbi10b3AnKSwgMTApKSxcbiAgICAgICAgICAgICAgICBkaCAgICAgPSB0aGlzLmRpYWxvZy5vdXRlckhlaWdodCgpLFxuICAgICAgICAgICAgICAgIHdoICAgICA9IHdpbmRvdy5pbm5lckhlaWdodCxcbiAgICAgICAgICAgICAgICBoICAgICAgPSB3aCAtIDIqKG9mZnNldCA8IDIwID8gMjA6b2Zmc2V0KSAtIGRoO1xuXG4gICAgICAgICAgICAgICAgc2Nyb2xsYWJsZS5jc3Moe1xuICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IChoIDwgdGhpcy5vcHRpb25zLm1pblNjcm9sbEhlaWdodCA/ICcnOmgpLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6JydcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2hpZGU6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKGFjdGl2ZUNvdW50ID4gMCkgYWN0aXZlQ291bnQtLTtcbiAgICAgICAgICAgIGVsc2UgYWN0aXZlQ291bnQgPSAwO1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuaGlkZSgpLnJlbW92ZUNsYXNzKCd1ay1vcGVuJyk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBBUklBXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXR0cignYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuXG4gICAgICAgICAgICBpZiAoIWFjdGl2ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgJGh0bWwucmVtb3ZlQ2xhc3MoJ3VrLW1vZGFsLXBhZ2UnKTtcbiAgICAgICAgICAgICAgICBib2R5LmNzcyh0aGlzLnBhZGRpbmdkaXIsIFwiXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYWN0aXZlPT09dGhpcykgYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignaGlkZS51ay5tb2RhbCcpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGlzQWN0aXZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuaGFzQ2xhc3MoJ3VrLW9wZW4nKTtcbiAgICAgICAgfVxuXG4gICAgfSk7XG5cbiAgICBVSS5jb21wb25lbnQoJ21vZGFsVHJpZ2dlcicsIHtcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS4kaHRtbC5vbignY2xpY2subW9kYWwudWlraXQnLCAnW2RhdGEtdWstbW9kYWxdJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWxlLmlzKCdhJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ21vZGFsVHJpZ2dlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtb2RhbCA9IFVJLm1vZGFsVHJpZ2dlcihlbGUsIFVJLlV0aWxzLm9wdGlvbnMoZWxlLmF0dHIoJ2RhdGEtdWstbW9kYWwnKSkpO1xuICAgICAgICAgICAgICAgICAgICBtb2RhbC5zaG93KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gY2xvc2UgbW9kYWwgb24gZXNjIGJ1dHRvblxuICAgICAgICAgICAgVUkuJGh0bWwub24oJ2tleWRvd24ubW9kYWwudWlraXQnLCBmdW5jdGlvbiAoZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSAmJiBlLmtleUNvZGUgPT09IDI3ICYmIGFjdGl2ZS5vcHRpb25zLmtleWJvYXJkKSB7IC8vIEVTQ1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IFVJLiQuZXh0ZW5kKHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6ICR0aGlzLmVsZW1lbnQuaXMoJ2EnKSA/ICR0aGlzLmVsZW1lbnQuYXR0cignaHJlZicpIDogZmFsc2VcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgICAgIHRoaXMubW9kYWwgPSBVSS5tb2RhbCh0aGlzLm9wdGlvbnMudGFyZ2V0LCB0aGlzLm9wdGlvbnMpO1xuXG4gICAgICAgICAgICB0aGlzLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAkdGhpcy5zaG93KCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy9tZXRob2RzXG4gICAgICAgICAgICB0aGlzLnByb3h5KHRoaXMubW9kYWwsICdzaG93IGhpZGUgaXNBY3RpdmUnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgVUkubW9kYWwuZGlhbG9nID0gZnVuY3Rpb24oY29udGVudCwgb3B0aW9ucykge1xuXG4gICAgICAgIHZhciBtb2RhbCA9IFVJLm1vZGFsKFVJLiQoVUkubW9kYWwuZGlhbG9nLnRlbXBsYXRlKS5hcHBlbmRUbygnYm9keScpLCBvcHRpb25zKTtcblxuICAgICAgICBtb2RhbC5vbignaGlkZS51ay5tb2RhbCcsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBpZiAobW9kYWwucGVyc2lzdCkge1xuICAgICAgICAgICAgICAgIG1vZGFsLnBlcnNpc3QuYXBwZW5kVG8obW9kYWwucGVyc2lzdC5kYXRhKCdtb2RhbFBlcnNpc3RQYXJlbnQnKSk7XG4gICAgICAgICAgICAgICAgbW9kYWwucGVyc2lzdCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbW9kYWwuZWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2V0Q29udGVudChjb250ZW50LCBtb2RhbCk7XG5cbiAgICAgICAgcmV0dXJuIG1vZGFsO1xuICAgIH07XG5cbiAgICBVSS5tb2RhbC5kaWFsb2cudGVtcGxhdGUgPSAnPGRpdiBjbGFzcz1cInVrLW1vZGFsXCI+PGRpdiBjbGFzcz1cInVrLW1vZGFsLWRpYWxvZ1wiIHN0eWxlPVwibWluLWhlaWdodDowO1wiPjwvZGl2PjwvZGl2Pic7XG5cbiAgICBVSS5tb2RhbC5hbGVydCA9IGZ1bmN0aW9uKGNvbnRlbnQsIG9wdGlvbnMpIHtcblxuICAgICAgICBvcHRpb25zID0gVUkuJC5leHRlbmQodHJ1ZSwge2JnY2xvc2U6ZmFsc2UsIGtleWJvYXJkOmZhbHNlLCBtb2RhbDpmYWxzZSwgbGFiZWxzOlVJLm1vZGFsLmxhYmVsc30sIG9wdGlvbnMpO1xuXG4gICAgICAgIHZhciBtb2RhbCA9IFVJLm1vZGFsLmRpYWxvZygoW1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ1ay1tYXJnaW4gdWstbW9kYWwtY29udGVudFwiPicrU3RyaW5nKGNvbnRlbnQpKyc8L2Rpdj4nLFxuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ1ay1tb2RhbC1mb290ZXIgdWstdGV4dC1yaWdodFwiPjxidXR0b24gY2xhc3M9XCJ1ay1idXR0b24gdWstYnV0dG9uLXByaW1hcnkgdWstbW9kYWwtY2xvc2VcIj4nK29wdGlvbnMubGFiZWxzLk9rKyc8L2J1dHRvbj48L2Rpdj4nXG4gICAgICAgIF0pLmpvaW4oXCJcIiksIG9wdGlvbnMpO1xuXG4gICAgICAgIG1vZGFsLm9uKCdzaG93LnVrLm1vZGFsJywgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBtb2RhbC5lbGVtZW50LmZpbmQoJ2J1dHRvbjpmaXJzdCcpLmZvY3VzKCk7XG4gICAgICAgICAgICB9LCA1MCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBtb2RhbC5zaG93KCk7XG4gICAgfTtcblxuICAgIFVJLm1vZGFsLmNvbmZpcm0gPSBmdW5jdGlvbihjb250ZW50LCBvbmNvbmZpcm0sIG9uY2FuY2VsKSB7XG5cbiAgICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0xXSA/IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTFdIDoge307XG5cbiAgICAgICAgb25jb25maXJtID0gVUkuJC5pc0Z1bmN0aW9uKG9uY29uZmlybSkgPyBvbmNvbmZpcm0gOiBmdW5jdGlvbigpe307XG4gICAgICAgIG9uY2FuY2VsICA9IFVJLiQuaXNGdW5jdGlvbihvbmNhbmNlbCkgPyBvbmNhbmNlbCA6IGZ1bmN0aW9uKCl7fTtcbiAgICAgICAgb3B0aW9ucyAgID0gVUkuJC5leHRlbmQodHJ1ZSwge2JnY2xvc2U6ZmFsc2UsIGtleWJvYXJkOmZhbHNlLCBtb2RhbDpmYWxzZSwgbGFiZWxzOlVJLm1vZGFsLmxhYmVsc30sIFVJLiQuaXNGdW5jdGlvbihvcHRpb25zKSA/IHt9Om9wdGlvbnMpO1xuXG4gICAgICAgIHZhciBtb2RhbCA9IFVJLm1vZGFsLmRpYWxvZygoW1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ1ay1tYXJnaW4gdWstbW9kYWwtY29udGVudFwiPicrU3RyaW5nKGNvbnRlbnQpKyc8L2Rpdj4nLFxuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ1ay1tb2RhbC1mb290ZXIgdWstdGV4dC1yaWdodFwiPjxidXR0b24gY2xhc3M9XCJ1ay1idXR0b24ganMtbW9kYWwtY29uZmlybS1jYW5jZWxcIj4nK29wdGlvbnMubGFiZWxzLkNhbmNlbCsnPC9idXR0b24+IDxidXR0b24gY2xhc3M9XCJ1ay1idXR0b24gdWstYnV0dG9uLXByaW1hcnkganMtbW9kYWwtY29uZmlybVwiPicrb3B0aW9ucy5sYWJlbHMuT2srJzwvYnV0dG9uPjwvZGl2PidcbiAgICAgICAgXSkuam9pbihcIlwiKSwgb3B0aW9ucyk7XG5cbiAgICAgICAgbW9kYWwuZWxlbWVudC5maW5kKFwiLmpzLW1vZGFsLWNvbmZpcm0sIC5qcy1tb2RhbC1jb25maXJtLWNhbmNlbFwiKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBVSS4kKHRoaXMpLmlzKCcuanMtbW9kYWwtY29uZmlybScpID8gb25jb25maXJtKCkgOiBvbmNhbmNlbCgpO1xuICAgICAgICAgICAgbW9kYWwuaGlkZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBtb2RhbC5vbignc2hvdy51ay5tb2RhbCcsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgbW9kYWwuZWxlbWVudC5maW5kKCcuanMtbW9kYWwtY29uZmlybScpLmZvY3VzKCk7XG4gICAgICAgICAgICB9LCA1MCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBtb2RhbC5zaG93KCk7XG4gICAgfTtcblxuICAgIFVJLm1vZGFsLnByb21wdCA9IGZ1bmN0aW9uKHRleHQsIHZhbHVlLCBvbnN1Ym1pdCwgb3B0aW9ucykge1xuXG4gICAgICAgIG9uc3VibWl0ID0gVUkuJC5pc0Z1bmN0aW9uKG9uc3VibWl0KSA/IG9uc3VibWl0IDogZnVuY3Rpb24odmFsdWUpe307XG4gICAgICAgIG9wdGlvbnMgID0gVUkuJC5leHRlbmQodHJ1ZSwge2JnY2xvc2U6ZmFsc2UsIGtleWJvYXJkOmZhbHNlLCBtb2RhbDpmYWxzZSwgbGFiZWxzOlVJLm1vZGFsLmxhYmVsc30sIG9wdGlvbnMpO1xuXG4gICAgICAgIHZhciBtb2RhbCA9IFVJLm1vZGFsLmRpYWxvZygoW1xuICAgICAgICAgICAgdGV4dCA/ICc8ZGl2IGNsYXNzPVwidWstbW9kYWwtY29udGVudCB1ay1mb3JtXCI+JytTdHJpbmcodGV4dCkrJzwvZGl2Pic6JycsXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInVrLW1hcmdpbi1zbWFsbC10b3AgdWstbW9kYWwtY29udGVudCB1ay1mb3JtXCI+PHA+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJ1ay13aWR0aC0xLTFcIj48L3A+PC9kaXY+JyxcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwidWstbW9kYWwtZm9vdGVyIHVrLXRleHQtcmlnaHRcIj48YnV0dG9uIGNsYXNzPVwidWstYnV0dG9uIHVrLW1vZGFsLWNsb3NlXCI+JytvcHRpb25zLmxhYmVscy5DYW5jZWwrJzwvYnV0dG9uPiA8YnV0dG9uIGNsYXNzPVwidWstYnV0dG9uIHVrLWJ1dHRvbi1wcmltYXJ5IGpzLW1vZGFsLW9rXCI+JytvcHRpb25zLmxhYmVscy5PaysnPC9idXR0b24+PC9kaXY+J1xuICAgICAgICBdKS5qb2luKFwiXCIpLCBvcHRpb25zKSxcblxuICAgICAgICBpbnB1dCA9IG1vZGFsLmVsZW1lbnQuZmluZChcImlucHV0W3R5cGU9J3RleHQnXVwiKS52YWwodmFsdWUgfHwgJycpLm9uKCdrZXl1cCcsIGZ1bmN0aW9uKGUpe1xuICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAxMykge1xuICAgICAgICAgICAgICAgIG1vZGFsLmVsZW1lbnQuZmluZCgnLmpzLW1vZGFsLW9rJykudHJpZ2dlcignY2xpY2snKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbW9kYWwuZWxlbWVudC5maW5kKCcuanMtbW9kYWwtb2snKS5vbignY2xpY2snLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYgKG9uc3VibWl0KGlucHV0LnZhbCgpKSE9PWZhbHNlKXtcbiAgICAgICAgICAgICAgICBtb2RhbC5oaWRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBtb2RhbC5zaG93KCk7XG4gICAgfTtcblxuICAgIFVJLm1vZGFsLmJsb2NrVUkgPSBmdW5jdGlvbihjb250ZW50LCBvcHRpb25zKSB7XG5cbiAgICAgICAgdmFyIG1vZGFsID0gVUkubW9kYWwuZGlhbG9nKChbXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInVrLW1hcmdpbiB1ay1tb2RhbC1jb250ZW50XCI+JytTdHJpbmcoY29udGVudCB8fCAnPGRpdiBjbGFzcz1cInVrLXRleHQtY2VudGVyXCI+Li4uPC9kaXY+JykrJzwvZGl2PidcbiAgICAgICAgXSkuam9pbihcIlwiKSwgVUkuJC5leHRlbmQoe2JnY2xvc2U6ZmFsc2UsIGtleWJvYXJkOmZhbHNlLCBtb2RhbDpmYWxzZX0sIG9wdGlvbnMpKTtcblxuICAgICAgICBtb2RhbC5jb250ZW50ID0gbW9kYWwuZWxlbWVudC5maW5kKCcudWstbW9kYWwtY29udGVudDpmaXJzdCcpO1xuXG4gICAgICAgIHJldHVybiBtb2RhbC5zaG93KCk7XG4gICAgfTtcblxuICAgIFVJLm1vZGFsLmxhYmVscyA9IHtcbiAgICAgICAgT2s6ICdPaycsXG4gICAgICAgIENhbmNlbDogJ0NhbmNlbCdcbiAgICB9O1xuXG4gICAgLy8gaGVscGVyIGZ1bmN0aW9uc1xuICAgIGZ1bmN0aW9uIHNldENvbnRlbnQoY29udGVudCwgbW9kYWwpe1xuXG4gICAgICAgIGlmKCFtb2RhbCkgcmV0dXJuO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ29iamVjdCcpIHtcblxuICAgICAgICAgICAgLy8gY29udmVydCBET00gb2JqZWN0IHRvIGEgalF1ZXJ5IG9iamVjdFxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZW50IDogVUkuJChjb250ZW50KTtcblxuICAgICAgICAgICAgaWYoY29udGVudC5wYXJlbnQoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBtb2RhbC5wZXJzaXN0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICBtb2RhbC5wZXJzaXN0LmRhdGEoJ21vZGFsUGVyc2lzdFBhcmVudCcsIGNvbnRlbnQucGFyZW50KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9ZWxzZSBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjb250ZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIC8vIGp1c3QgaW5zZXJ0IHRoZSBkYXRhIGFzIGlubmVySFRNTFxuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBVSS4kKCc8ZGl2PjwvZGl2PicpLmh0bWwoY29udGVudCk7XG4gICAgICAgIH1lbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB1bnN1cHBvcnRlZCBkYXRhIHR5cGUhXG4gICAgICAgICAgICAgICAgY29udGVudCA9IFVJLiQoJzxkaXY+PC9kaXY+JykuaHRtbCgnVUlraXQyLm1vZGFsIEVycm9yOiBVbnN1cHBvcnRlZCBkYXRhIHR5cGU6ICcgKyB0eXBlb2YgY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZW50LmFwcGVuZFRvKG1vZGFsLmVsZW1lbnQuZmluZCgnLnVrLW1vZGFsLWRpYWxvZycpKTtcblxuICAgICAgICByZXR1cm4gbW9kYWw7XG4gICAgfVxuXG59KShVSWtpdDIpO1xuXG4oZnVuY3Rpb24oVUkpIHtcblxuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgVUkuY29tcG9uZW50KCduYXYnLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIHRvZ2dsZTogJz5saS51ay1wYXJlbnQgPiBhW2hyZWY9XCIjXCJdJyxcbiAgICAgICAgICAgIGxpc3RzOiAnPmxpLnVrLXBhcmVudCA+IHVsJyxcbiAgICAgICAgICAgIG11bHRpcGxlOiBmYWxzZVxuICAgICAgICB9LFxuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLnJlYWR5KGZ1bmN0aW9uKGNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIFVJLiQoJ1tkYXRhLXVrLW5hdl0nLCBjb250ZXh0KS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmF2ID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5hdi5kYXRhKCduYXYnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IFVJLm5hdihuYXYsIFVJLlV0aWxzLm9wdGlvbnMobmF2LmF0dHIoJ2RhdGEtdWstbmF2JykpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2NsaWNrLnVrLm5hdicsIHRoaXMub3B0aW9ucy50b2dnbGUsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyk7XG4gICAgICAgICAgICAgICAgJHRoaXMub3BlbihlbGUucGFyZW50KClbMF0gPT0gJHRoaXMuZWxlbWVudFswXSA/IGVsZSA6IGVsZS5wYXJlbnQoXCJsaVwiKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcblxuICAgICAgICAgICAgVUkuZG9tT2JzZXJ2ZSh0aGlzLmVsZW1lbnQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoJHRoaXMuZWxlbWVudC5maW5kKCR0aGlzLm9wdGlvbnMubGlzdHMpLm5vdCgnW3JvbGVdJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICR0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMuZmluZCh0aGlzLm9wdGlvbnMubGlzdHMpLmVhY2goZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgJGVsZSAgID0gVUkuJCh0aGlzKS5hdHRyKCdyb2xlJywgJ21lbnUnKSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gJGVsZS5jbG9zZXN0KCdsaScpLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmUgPSBwYXJlbnQuaGFzQ2xhc3MoXCJ1ay1hY3RpdmVcIik7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudC5kYXRhKCdsaXN0LWNvbnRhaW5lcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICRlbGUud3JhcCgnPGRpdiBzdHlsZT1cIm92ZXJmbG93OmhpZGRlbjtoZWlnaHQ6MDtwb3NpdGlvbjpyZWxhdGl2ZTtcIj48L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50LmRhdGEoJ2xpc3QtY29udGFpbmVyJywgJGVsZS5wYXJlbnQoKVthY3RpdmUgPyAncmVtb3ZlQ2xhc3MnOidhZGRDbGFzcyddKCd1ay1oaWRkZW4nKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSW5pdCBBUklBXG4gICAgICAgICAgICAgICAgcGFyZW50LmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBwYXJlbnQuaGFzQ2xhc3MoXCJ1ay1vcGVuXCIpKTtcblxuICAgICAgICAgICAgICAgIGlmIChhY3RpdmUpICR0aGlzLm9wZW4ocGFyZW50LCB0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIG9wZW46IGZ1bmN0aW9uKGxpLCBub2FuaW1hdGlvbikge1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzLCBlbGVtZW50ID0gdGhpcy5lbGVtZW50LCAkbGkgPSBVSS4kKGxpKSwgJGNvbnRhaW5lciA9ICRsaS5kYXRhKCdsaXN0LWNvbnRhaW5lcicpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5tdWx0aXBsZSkge1xuXG4gICAgICAgICAgICAgICAgZWxlbWVudC5jaGlsZHJlbignLnVrLW9wZW4nKS5ub3QobGkpLmVhY2goZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZS5kYXRhKCdsaXN0LWNvbnRhaW5lcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGUuZGF0YSgnbGlzdC1jb250YWluZXInKS5zdG9wKCkuYW5pbWF0ZSh7aGVpZ2h0OiAwfSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUkuJCh0aGlzKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygndWstb3BlbicpLmVuZCgpLmFkZENsYXNzKCd1ay1oaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICRsaS50b2dnbGVDbGFzcygndWstb3BlbicpO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgQVJJQVxuICAgICAgICAgICAgJGxpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAkbGkuaGFzQ2xhc3MoJ3VrLW9wZW4nKSk7XG5cbiAgICAgICAgICAgIGlmICgkY29udGFpbmVyKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoJGxpLmhhc0NsYXNzKCd1ay1vcGVuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgJGNvbnRhaW5lci5yZW1vdmVDbGFzcygndWstaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5vYW5pbWF0aW9uKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgJGNvbnRhaW5lci5zdG9wKCkuaGVpZ2h0KCRsaS5oYXNDbGFzcygndWstb3BlbicpID8gJ2F1dG8nIDogMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEkbGkuaGFzQ2xhc3MoJ3VrLW9wZW4nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRhaW5lci5hZGRDbGFzcygndWstaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2Rpc3BsYXkudWsuY2hlY2snKTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgJGNvbnRhaW5lci5zdG9wKCkuYW5pbWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICgkbGkuaGFzQ2xhc3MoJ3VrLW9wZW4nKSA/IGdldEhlaWdodCgkY29udGFpbmVyLmZpbmQoJ3VsOmZpcnN0JykpIDogMClcbiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJGxpLmhhc0NsYXNzKCd1ay1vcGVuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29udGFpbmVyLmFkZENsYXNzKCd1ay1oaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRhaW5lci5jc3MoJ2hlaWdodCcsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMudHJpZ2dlcignZGlzcGxheS51ay5jaGVjaycpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgLy8gaGVscGVyXG5cbiAgICBmdW5jdGlvbiBnZXRIZWlnaHQoZWxlKSB7XG5cbiAgICAgICAgdmFyICRlbGUgPSBVSS4kKGVsZSksIGhlaWdodCA9ICdhdXRvJztcblxuICAgICAgICBpZiAoJGVsZS5pcygnOnZpc2libGUnKSkge1xuICAgICAgICAgICAgaGVpZ2h0ID0gJGVsZS5vdXRlckhlaWdodCgpO1xuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICB2YXIgdG1wID0ge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAkZWxlLmNzcygncG9zaXRpb24nKSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiAkZWxlLmNzcygndmlzaWJpbGl0eScpLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICRlbGUuY3NzKCdkaXNwbGF5JylcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGhlaWdodCA9ICRlbGUuY3NzKHtwb3NpdGlvbjogJ2Fic29sdXRlJywgdmlzaWJpbGl0eTogJ2hpZGRlbicsIGRpc3BsYXk6ICdibG9jayd9KS5vdXRlckhlaWdodCgpO1xuXG4gICAgICAgICAgICAkZWxlLmNzcyh0bXApOyAvLyByZXNldCBlbGVtZW50XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaGVpZ2h0O1xuICAgIH1cblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciBzY3JvbGxwb3MgPSB7eDogd2luZG93LnNjcm9sbFgsIHk6IHdpbmRvdy5zY3JvbGxZfSxcbiAgICAgICAgJHdpbiAgICAgID0gVUkuJHdpbixcbiAgICAgICAgJGRvYyAgICAgID0gVUkuJGRvYyxcbiAgICAgICAgJGh0bWwgICAgID0gVUkuJGh0bWwsXG4gICAgICAgIE9mZmNhbnZhcyA9IHtcblxuICAgICAgICBzaG93OiBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7XG5cbiAgICAgICAgICAgIGVsZW1lbnQgPSBVSS4kKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgICAgIG9wdGlvbnMgPSBVSS4kLmV4dGVuZCh7bW9kZTogJ3B1c2gnfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIHZhciAkYm9keSAgICAgPSBVSS4kKCdib2R5JyksXG4gICAgICAgICAgICAgICAgYmFyICAgICAgID0gZWxlbWVudC5maW5kKCcudWstb2ZmY2FudmFzLWJhcjpmaXJzdCcpLFxuICAgICAgICAgICAgICAgIHJ0bCAgICAgICA9IChVSS5sYW5nZGlyZWN0aW9uID09ICdyaWdodCcpLFxuICAgICAgICAgICAgICAgIGZsaXAgICAgICA9IGJhci5oYXNDbGFzcygndWstb2ZmY2FudmFzLWJhci1mbGlwJykgPyAtMToxLFxuICAgICAgICAgICAgICAgIGRpciAgICAgICA9IGZsaXAgKiAocnRsID8gLTEgOiAxKSxcblxuICAgICAgICAgICAgICAgIHNjcm9sbGJhcndpZHRoID0gIHdpbmRvdy5pbm5lcldpZHRoIC0gJGJvZHkud2lkdGgoKTtcblxuICAgICAgICAgICAgc2Nyb2xscG9zID0ge3g6IHdpbmRvdy5wYWdlWE9mZnNldCwgeTogd2luZG93LnBhZ2VZT2Zmc2V0fTtcblxuICAgICAgICAgICAgYmFyLmF0dHIoJ21vZGUnLCBvcHRpb25zLm1vZGUpO1xuICAgICAgICAgICAgZWxlbWVudC5hZGRDbGFzcygndWstYWN0aXZlJyk7XG5cbiAgICAgICAgICAgICRib2R5LmNzcyh7d2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoIC0gc2Nyb2xsYmFyd2lkdGgsIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0fSkuYWRkQ2xhc3MoJ3VrLW9mZmNhbnZhcy1wYWdlJyk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLm1vZGUgPT0gJ3B1c2gnIHx8IG9wdGlvbnMubW9kZSA9PSAncmV2ZWFsJykge1xuICAgICAgICAgICAgICAgICRib2R5LmNzcygocnRsID8gJ21hcmdpbi1yaWdodCcgOiAnbWFyZ2luLWxlZnQnKSwgKHJ0bCA/IC0xIDogMSkgKiAoYmFyLm91dGVyV2lkdGgoKSAqIGRpcikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5tb2RlID09ICdyZXZlYWwnKSB7XG4gICAgICAgICAgICAgICAgYmFyLmNzcygnY2xpcCcsICdyZWN0KDAsICcrYmFyLm91dGVyV2lkdGgoKSsncHgsIDEwMHZoLCAwKScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkaHRtbC5jc3MoJ21hcmdpbi10b3AnLCBzY3JvbGxwb3MueSAqIC0xKS53aWR0aCgpOyAvLyAud2lkdGgoKSAtIGZvcmNlIHJlZHJhd1xuXG5cbiAgICAgICAgICAgIGJhci5hZGRDbGFzcygndWstb2ZmY2FudmFzLWJhci1zaG93Jyk7XG5cbiAgICAgICAgICAgIHRoaXMuX2luaXRFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBiYXIudHJpZ2dlcignc2hvdy51ay5vZmZjYW52YXMnLCBbZWxlbWVudCwgYmFyXSk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBBUklBXG4gICAgICAgICAgICBlbGVtZW50LmF0dHIoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaGlkZTogZnVuY3Rpb24oZm9yY2UpIHtcblxuICAgICAgICAgICAgdmFyICRib2R5ID0gVUkuJCgnYm9keScpLFxuICAgICAgICAgICAgICAgIHBhbmVsID0gVUkuJCgnLnVrLW9mZmNhbnZhcy51ay1hY3RpdmUnKSxcbiAgICAgICAgICAgICAgICBydGwgICA9IChVSS5sYW5nZGlyZWN0aW9uID09ICdyaWdodCcpLFxuICAgICAgICAgICAgICAgIGJhciAgID0gcGFuZWwuZmluZCgnLnVrLW9mZmNhbnZhcy1iYXI6Zmlyc3QnKSxcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAkYm9keS5yZW1vdmVDbGFzcygndWstb2ZmY2FudmFzLXBhZ2UnKS5jc3Moe3dpZHRoOiAnJywgaGVpZ2h0OiAnJywgbWFyZ2luTGVmdDogJycsIG1hcmdpblJpZ2h0OiAnJ30pO1xuICAgICAgICAgICAgICAgICAgICBwYW5lbC5yZW1vdmVDbGFzcygndWstYWN0aXZlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgYmFyLnJlbW92ZUNsYXNzKCd1ay1vZmZjYW52YXMtYmFyLXNob3cnKTtcbiAgICAgICAgICAgICAgICAgICAgJGh0bWwuY3NzKCdtYXJnaW4tdG9wJywgJycpO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oc2Nyb2xscG9zLngsIHNjcm9sbHBvcy55KTtcbiAgICAgICAgICAgICAgICAgICAgYmFyLnRyaWdnZXIoJ2hpZGUudWsub2ZmY2FudmFzJywgW3BhbmVsLCBiYXJdKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgQVJJQVxuICAgICAgICAgICAgICAgICAgICBwYW5lbC5hdHRyKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKCFwYW5lbC5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChiYXIuYXR0cignbW9kZScpID09ICdub25lJykgZm9yY2UgPSB0cnVlO1xuXG4gICAgICAgICAgICBpZiAoVUkuc3VwcG9ydC50cmFuc2l0aW9uICYmICFmb3JjZSkge1xuXG4gICAgICAgICAgICAgICAgJGJvZHkub25lKFVJLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZSgpO1xuICAgICAgICAgICAgICAgIH0pLmNzcygocnRsID8gJ21hcmdpbi1yaWdodCcgOiAnbWFyZ2luLWxlZnQnKSwgJycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJhci5hdHRyKCdtb2RlJykgPT0gJ3JldmVhbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgYmFyLmNzcygnY2xpcCcsICcnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIGJhci5yZW1vdmVDbGFzcygndWstb2ZmY2FudmFzLWJhci1zaG93Jyk7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmluYWxpemUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfaW5pdEVsZW1lbnQ6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGF0YSgnT2ZmY2FudmFzSW5pdCcpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGVsZW1lbnQub24oJ2NsaWNrLnVrLm9mZmNhbnZhcyBzd2lwZVJpZ2h0LnVrLm9mZmNhbnZhcyBzd2lwZUxlZnQudWsub2ZmY2FudmFzJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IFVJLiQoZS50YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFlLnR5cGUubWF0Y2goL3N3aXBlLykpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhcmdldC5oYXNDbGFzcygndWstb2ZmY2FudmFzLWNsb3NlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaGFzQ2xhc3MoJ3VrLW9mZmNhbnZhcy1iYXInKSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5wYXJlbnRzKCcudWstb2ZmY2FudmFzLWJhcjpmaXJzdCcpLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBPZmZjYW52YXMuaGlkZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGVsZW1lbnQub24oJ2NsaWNrJywgJ2FbaHJlZio9XCIjXCJdJywgZnVuY3Rpb24oZSl7XG5cbiAgICAgICAgICAgICAgICB2YXIgbGluayA9IFVJLiQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgIGhyZWYgPSBsaW5rLmF0dHIoJ2hyZWYnKTtcblxuICAgICAgICAgICAgICAgIGlmIChocmVmID09ICcjJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgVUkuJGRvYy5vbmUoJ2hpZGUudWsub2ZmY2FudmFzJywgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldDtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gVUkuJChsaW5rWzBdLmhhc2gpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBVSS4kKCdbbmFtZT1cIicrbGlua1swXS5oYXNoLnJlcGxhY2UoJyMnLCcnKSsnXCJdJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Lmxlbmd0aCAmJiBVSS5VdGlscy5zY3JvbGxUb0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFVJLlV0aWxzLnNjcm9sbFRvRWxlbWVudCh0YXJnZXQsIFVJLlV0aWxzLm9wdGlvbnMobGluay5hdHRyKCdkYXRhLXVrLXNtb290aC1zY3JvbGwnKSB8fCAne30nKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGhyZWY7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIE9mZmNhbnZhcy5oaWRlKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZWxlbWVudC5kYXRhKCdPZmZjYW52YXNJbml0JywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgVUkuY29tcG9uZW50KCdvZmZjYW52YXNUcmlnZ2VyJywge1xuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgICRodG1sLm9uKCdjbGljay5vZmZjYW52YXMudWlraXQnLCAnW2RhdGEtdWstb2ZmY2FudmFzXScsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFlbGUuZGF0YSgnb2ZmY2FudmFzVHJpZ2dlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSBVSS5vZmZjYW52YXNUcmlnZ2VyKGVsZSwgVUkuVXRpbHMub3B0aW9ucyhlbGUuYXR0cignZGF0YS11ay1vZmZjYW52YXMnKSkpO1xuICAgICAgICAgICAgICAgICAgICBlbGUudHJpZ2dlcihcImNsaWNrXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAkaHRtbC5vbigna2V5ZG93bi51ay5vZmZjYW52YXMnLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAyNykgeyAvLyBFU0NcbiAgICAgICAgICAgICAgICAgICAgT2ZmY2FudmFzLmhpZGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gVUkuJC5leHRlbmQoe1xuICAgICAgICAgICAgICAgIHRhcmdldDogJHRoaXMuZWxlbWVudC5pcygnYScpID8gJHRoaXMuZWxlbWVudC5hdHRyKCdocmVmJykgOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBtb2RlOiAncHVzaCdcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucyk7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBPZmZjYW52YXMuc2hvdygkdGhpcy5vcHRpb25zLnRhcmdldCwgJHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgVUkub2ZmY2FudmFzID0gT2ZmY2FudmFzO1xuXG59KShVSWtpdDIpO1xuXG4oZnVuY3Rpb24oVUkpIHtcblxuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgdmFyIEFuaW1hdGlvbnM7XG5cbiAgICBVSS5jb21wb25lbnQoJ3N3aXRjaGVyJywge1xuXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBjb25uZWN0ICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHRvZ2dsZSAgICA6ICc+KicsXG4gICAgICAgICAgICBhY3RpdmUgICAgOiAwLFxuICAgICAgICAgICAgYW5pbWF0aW9uIDogZmFsc2UsXG4gICAgICAgICAgICBkdXJhdGlvbiAgOiAyMDAsXG4gICAgICAgICAgICBzd2lwaW5nICAgOiB0cnVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgYW5pbWF0aW5nOiBmYWxzZSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS5yZWFkeShmdW5jdGlvbihjb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICBVSS4kKCdbZGF0YS11ay1zd2l0Y2hlcl0nLCBjb250ZXh0KS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3dpdGNoZXIgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghc3dpdGNoZXIuZGF0YSgnc3dpdGNoZXInKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IFVJLnN3aXRjaGVyKHN3aXRjaGVyLCBVSS5VdGlscy5vcHRpb25zKHN3aXRjaGVyLmF0dHIoJ2RhdGEtdWstc3dpdGNoZXInKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5vbignY2xpY2sudWsuc3dpdGNoZXInLCB0aGlzLm9wdGlvbnMudG9nZ2xlLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICR0aGlzLnNob3codGhpcyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuY29ubmVjdCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jb25uZWN0ID0gVUkuJCh0aGlzLm9wdGlvbnMuY29ubmVjdCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5jb25uZWN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jb25uZWN0Lm9uKCdjbGljay51ay5zd2l0Y2hlcicsICdbZGF0YS11ay1zd2l0Y2hlci1pdGVtXScsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gVUkuJCh0aGlzKS5hdHRyKCdkYXRhLXVrLXN3aXRjaGVyLWl0ZW0nKTtcblxuICAgICAgICAgICAgICAgIGlmICgkdGhpcy5pbmRleCA9PSBpdGVtKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2goaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICduZXh0JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncHJldmlvdXMnOlxuICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuc2hvdygkdGhpcy5pbmRleCArIChpdGVtPT0nbmV4dCcgPyAxOi0xKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLnNob3cocGFyc2VJbnQoaXRlbSwgMTApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zd2lwaW5nKSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Qub24oJ3N3aXBlUmlnaHQgc3dpcGVMZWZ0JywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLnNob3coJHRoaXMuaW5kZXggKyAoZS50eXBlID09ICdzd2lwZUxlZnQnID8gMSA6IC0xKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3QuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcygndWstYWN0aXZlJykuYXR0cignYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuXG4gICAgICAgICAgICB2YXIgdG9nZ2xlcyA9IHRoaXMuZmluZCh0aGlzLm9wdGlvbnMudG9nZ2xlKSxcbiAgICAgICAgICAgICAgICBhY3RpdmUgID0gdG9nZ2xlcy5maWx0ZXIoJy51ay1hY3RpdmUnKTtcblxuICAgICAgICAgICAgaWYgKGFjdGl2ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3coYWN0aXZlLCBmYWxzZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hY3RpdmU9PT1mYWxzZSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgYWN0aXZlID0gdG9nZ2xlcy5lcSh0aGlzLm9wdGlvbnMuYWN0aXZlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3coYWN0aXZlLmxlbmd0aCA/IGFjdGl2ZSA6IHRvZ2dsZXMuZXEoMCksIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5pdCBBUklBIGZvciB0b2dnbGVzXG4gICAgICAgICAgICB0b2dnbGVzLm5vdChhY3RpdmUpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgICAgIGFjdGl2ZS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICAgICAgfSxcblxuICAgICAgICBzaG93OiBmdW5jdGlvbih0YWIsIGFuaW1hdGUpIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW5nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdG9nZ2xlcyA9IHRoaXMuZmluZCh0aGlzLm9wdGlvbnMudG9nZ2xlKTtcblxuICAgICAgICAgICAgaWYgKGlzTmFOKHRhYikpIHtcbiAgICAgICAgICAgICAgICB0YWIgPSBVSS4kKHRhYik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhYiA9IHRhYiA8IDAgPyB0b2dnbGVzLmxlbmd0aC0xIDogdGFiO1xuICAgICAgICAgICAgICAgIHRhYiA9IHRvZ2dsZXMuZXEodG9nZ2xlc1t0YWJdID8gdGFiIDogMCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyAgICAgPSB0aGlzLFxuICAgICAgICAgICAgICAgIGFjdGl2ZSAgICA9IFVJLiQodGFiKSxcbiAgICAgICAgICAgICAgICBhbmltYXRpb24gPSBBbmltYXRpb25zW3RoaXMub3B0aW9ucy5hbmltYXRpb25dIHx8IGZ1bmN0aW9uKGN1cnJlbnQsIG5leHQpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQW5pbWF0aW9ucy5ub25lLmFwcGx5KCR0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBhbmltID0gJHRoaXMub3B0aW9ucy5hbmltYXRpb24uc3BsaXQoJywnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbS5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5pbVsxXSA9IGFuaW1bMF07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBhbmltWzBdID0gYW5pbVswXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGFuaW1bMV0gPSBhbmltWzFdLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29yZUFuaW1hdGlvbi5hcHBseSgkdGhpcywgW2FuaW0sIGN1cnJlbnQsIG5leHRdKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoYW5pbWF0ZT09PWZhbHNlIHx8ICFVSS5zdXBwb3J0LmFuaW1hdGlvbikge1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbiA9IEFuaW1hdGlvbnMubm9uZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFjdGl2ZS5oYXNDbGFzcyhcInVrLWRpc2FibGVkXCIpKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBBUklBIGZvciBUb2dnbGVzXG4gICAgICAgICAgICB0b2dnbGVzLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgICAgIGFjdGl2ZS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcblxuICAgICAgICAgICAgdG9nZ2xlcy5maWx0ZXIoXCIudWstYWN0aXZlXCIpLnJlbW92ZUNsYXNzKFwidWstYWN0aXZlXCIpO1xuICAgICAgICAgICAgYWN0aXZlLmFkZENsYXNzKFwidWstYWN0aXZlXCIpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbm5lY3QgJiYgdGhpcy5jb25uZWN0Lmxlbmd0aCkge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IHRoaXMuZmluZCh0aGlzLm9wdGlvbnMudG9nZ2xlKS5pbmRleChhY3RpdmUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXggPT0gLTEgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdC5lYWNoKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBVSS4kKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gID0gVUkuJChjb250YWluZXIuY2hpbGRyZW4oKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ICAgPSBVSS4kKGNoaWxkcmVuLmZpbHRlcignLnVrLWFjdGl2ZScpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgICAgICA9IFVJLiQoY2hpbGRyZW4uZXEoJHRoaXMuaW5kZXgpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuYW5pbWF0aW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLmFwcGx5KCR0aGlzLCBbY3VycmVudCwgbmV4dF0pLnRoZW4oZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQucmVtb3ZlQ2xhc3MoXCJ1ay1hY3RpdmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5hZGRDbGFzcyhcInVrLWFjdGl2ZVwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBBUklBIGZvciBjb25uZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hdHRyKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5hdHRyKCdhcmlhLWhpZGRlbicsICdmYWxzZScpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVUkuVXRpbHMuY2hlY2tEaXNwbGF5KG5leHQsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuYW5pbWF0aW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoXCJzaG93LnVrLnN3aXRjaGVyXCIsIFthY3RpdmVdKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgQW5pbWF0aW9ucyA9IHtcblxuICAgICAgICAnbm9uZSc6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIGQgPSBVSS4kLkRlZmVycmVkKCk7XG4gICAgICAgICAgICBkLnJlc29sdmUoKTtcbiAgICAgICAgICAgIHJldHVybiBkLnByb21pc2UoKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnZmFkZSc6IGZ1bmN0aW9uKGN1cnJlbnQsIG5leHQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3JlQW5pbWF0aW9uLmFwcGx5KHRoaXMsIFsndWstYW5pbWF0aW9uLWZhZGUnLCBjdXJyZW50LCBuZXh0XSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgJ3NsaWRlLWJvdHRvbSc6IGZ1bmN0aW9uKGN1cnJlbnQsIG5leHQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3JlQW5pbWF0aW9uLmFwcGx5KHRoaXMsIFsndWstYW5pbWF0aW9uLXNsaWRlLWJvdHRvbScsIGN1cnJlbnQsIG5leHRdKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnc2xpZGUtdG9wJzogZnVuY3Rpb24oY3VycmVudCwgbmV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvcmVBbmltYXRpb24uYXBwbHkodGhpcywgWyd1ay1hbmltYXRpb24tc2xpZGUtdG9wJywgY3VycmVudCwgbmV4dF0pO1xuICAgICAgICB9LFxuXG4gICAgICAgICdzbGlkZS12ZXJ0aWNhbCc6IGZ1bmN0aW9uKGN1cnJlbnQsIG5leHQsIGRpcikge1xuXG4gICAgICAgICAgICB2YXIgYW5pbSA9IFsndWstYW5pbWF0aW9uLXNsaWRlLXRvcCcsICd1ay1hbmltYXRpb24tc2xpZGUtYm90dG9tJ107XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnQuaW5kZXgoKSA+IG5leHQuaW5kZXgoKSkge1xuICAgICAgICAgICAgICAgIGFuaW0ucmV2ZXJzZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY29yZUFuaW1hdGlvbi5hcHBseSh0aGlzLCBbYW5pbSwgY3VycmVudCwgbmV4dF0pO1xuICAgICAgICB9LFxuXG4gICAgICAgICdzbGlkZS1sZWZ0JzogZnVuY3Rpb24oY3VycmVudCwgbmV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvcmVBbmltYXRpb24uYXBwbHkodGhpcywgWyd1ay1hbmltYXRpb24tc2xpZGUtbGVmdCcsIGN1cnJlbnQsIG5leHRdKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnc2xpZGUtcmlnaHQnOiBmdW5jdGlvbihjdXJyZW50LCBuZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gY29yZUFuaW1hdGlvbi5hcHBseSh0aGlzLCBbJ3VrLWFuaW1hdGlvbi1zbGlkZS1yaWdodCcsIGN1cnJlbnQsIG5leHRdKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnc2xpZGUtaG9yaXpvbnRhbCc6IGZ1bmN0aW9uKGN1cnJlbnQsIG5leHQsIGRpcikge1xuXG4gICAgICAgICAgICB2YXIgYW5pbSA9IFsndWstYW5pbWF0aW9uLXNsaWRlLXJpZ2h0JywgJ3VrLWFuaW1hdGlvbi1zbGlkZS1sZWZ0J107XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnQuaW5kZXgoKSA+IG5leHQuaW5kZXgoKSkge1xuICAgICAgICAgICAgICAgIGFuaW0ucmV2ZXJzZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY29yZUFuaW1hdGlvbi5hcHBseSh0aGlzLCBbYW5pbSwgY3VycmVudCwgbmV4dF0pO1xuICAgICAgICB9LFxuXG4gICAgICAgICdzY2FsZSc6IGZ1bmN0aW9uKGN1cnJlbnQsIG5leHQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3JlQW5pbWF0aW9uLmFwcGx5KHRoaXMsIFsndWstYW5pbWF0aW9uLXNjYWxlLXVwJywgY3VycmVudCwgbmV4dF0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIFVJLnN3aXRjaGVyLmFuaW1hdGlvbnMgPSBBbmltYXRpb25zO1xuXG5cbiAgICAvLyBoZWxwZXJzXG5cbiAgICBmdW5jdGlvbiBjb3JlQW5pbWF0aW9uKGNscywgY3VycmVudCwgbmV4dCkge1xuXG4gICAgICAgIHZhciBkID0gVUkuJC5EZWZlcnJlZCgpLCBjbHNJbiA9IGNscywgY2xzT3V0ID0gY2xzLCByZWxlYXNlO1xuXG4gICAgICAgIGlmIChuZXh0WzBdPT09Y3VycmVudFswXSkge1xuICAgICAgICAgICAgZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICByZXR1cm4gZC5wcm9taXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mKGNscykgPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNsc0luICA9IGNsc1swXTtcbiAgICAgICAgICAgIGNsc091dCA9IGNsc1sxXSB8fCBjbHNbMF07XG4gICAgICAgIH1cblxuICAgICAgICBVSS4kYm9keS5jc3MoJ292ZXJmbG93LXgnLCAnaGlkZGVuJyk7IC8vIGZpeCBzY3JvbGwganVtcGluZyBpbiBpT1NcblxuICAgICAgICByZWxlYXNlID0gZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50KSBjdXJyZW50LmhpZGUoKS5yZW1vdmVDbGFzcygndWstYWN0aXZlICcrY2xzT3V0KycgdWstYW5pbWF0aW9uLXJldmVyc2UnKTtcblxuICAgICAgICAgICAgbmV4dC5hZGRDbGFzcyhjbHNJbikub25lKFVJLnN1cHBvcnQuYW5pbWF0aW9uLmVuZCwgZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZW1vdmVDbGFzcygnJytjbHNJbisnJykuY3NzKHtvcGFjaXR5OicnLCBkaXNwbGF5OicnfSk7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG5cbiAgICAgICAgICAgICAgICBkLnJlc29sdmUoKTtcblxuICAgICAgICAgICAgICAgIFVJLiRib2R5LmNzcygnb3ZlcmZsb3cteCcsICcnKTtcblxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSBjdXJyZW50LmNzcyh7b3BhY2l0eTonJywgZGlzcGxheTonJ30pO1xuXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpLnNob3coKTtcbiAgICAgICAgfTtcblxuICAgICAgICBuZXh0LmNzcygnYW5pbWF0aW9uLWR1cmF0aW9uJywgdGhpcy5vcHRpb25zLmR1cmF0aW9uKydtcycpO1xuXG4gICAgICAgIGlmIChjdXJyZW50ICYmIGN1cnJlbnQubGVuZ3RoKSB7XG5cbiAgICAgICAgICAgIGN1cnJlbnQuY3NzKCdhbmltYXRpb24tZHVyYXRpb24nLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24rJ21zJyk7XG5cbiAgICAgICAgICAgIGN1cnJlbnQuY3NzKCdkaXNwbGF5JywgJ25vbmUnKS5hZGRDbGFzcyhjbHNPdXQrJyB1ay1hbmltYXRpb24tcmV2ZXJzZScpLm9uZShVSS5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSkuY3NzKCdkaXNwbGF5JywgJycpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0LmFkZENsYXNzKCd1ay1hY3RpdmUnKTtcbiAgICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkLnByb21pc2UoKTtcbiAgICB9XG5cbn0pKFVJa2l0Mik7XG5cbihmdW5jdGlvbihVSSkge1xuXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBVSS5jb21wb25lbnQoJ3RhYicsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgdGFyZ2V0ICAgIDogJz5saTpub3QoLnVrLXRhYi1yZXNwb25zaXZlLCAudWstZGlzYWJsZWQpJyxcbiAgICAgICAgICAgIGNvbm5lY3QgICA6IGZhbHNlLFxuICAgICAgICAgICAgYWN0aXZlICAgIDogMCxcbiAgICAgICAgICAgIGFuaW1hdGlvbiA6IGZhbHNlLFxuICAgICAgICAgICAgZHVyYXRpb24gIDogMjAwLFxuICAgICAgICAgICAgc3dpcGluZyAgIDogdHJ1ZVxuICAgICAgICB9LFxuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLnJlYWR5KGZ1bmN0aW9uKGNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIFVJLiQoJ1tkYXRhLXVrLXRhYl0nLCBjb250ZXh0KS5lYWNoKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciB0YWIgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFiLmRhdGEoJ3RhYicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gVUkudGFiKHRhYiwgVUkuVXRpbHMub3B0aW9ucyh0YWIuYXR0cignZGF0YS11ay10YWInKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50ID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2NsaWNrLnVrLnRhYicsIHRoaXMub3B0aW9ucy50YXJnZXQsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgIGlmICgkdGhpcy5zd2l0Y2hlciAmJiAkdGhpcy5zd2l0Y2hlci5hbmltYXRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50ID0gJHRoaXMuZmluZCgkdGhpcy5vcHRpb25zLnRhcmdldCkubm90KHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgY3VycmVudC5yZW1vdmVDbGFzcygndWstYWN0aXZlJykuYmx1cigpO1xuXG4gICAgICAgICAgICAgICAgJHRoaXMudHJpZ2dlcignY2hhbmdlLnVrLnRhYicsIFtVSS4kKHRoaXMpLmFkZENsYXNzKCd1ay1hY3RpdmUnKSwgJHRoaXMuY3VycmVudF0pO1xuXG4gICAgICAgICAgICAgICAgJHRoaXMuY3VycmVudCA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgQVJJQVxuICAgICAgICAgICAgICAgIGlmICghJHRoaXMub3B0aW9ucy5jb25uZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuYXR0cignYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuICAgICAgICAgICAgICAgICAgICBVSS4kKHRoaXMpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QgPSBVSS4kKHRoaXMub3B0aW9ucy5jb25uZWN0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW5pdCByZXNwb25zaXZlIHRhYlxuICAgICAgICAgICAgdGhpcy5yZXNwb25zaXZldGFiID0gVUkuJCgnPGxpIGNsYXNzPVwidWstdGFiLXJlc3BvbnNpdmUgdWstYWN0aXZlXCI+PGE+PC9hPjwvbGk+JykuYXBwZW5kKCc8ZGl2IGNsYXNzPVwidWstZHJvcGRvd24gdWstZHJvcGRvd24tc21hbGxcIj48dWwgY2xhc3M9XCJ1ay1uYXYgdWstbmF2LWRyb3Bkb3duXCI+PC91bD48ZGl2PicpO1xuXG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNpdmV0YWIuZHJvcGRvd24gPSB0aGlzLnJlc3BvbnNpdmV0YWIuZmluZCgnLnVrLWRyb3Bkb3duJyk7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNpdmV0YWIubHN0ICAgICAgPSB0aGlzLnJlc3BvbnNpdmV0YWIuZHJvcGRvd24uZmluZCgndWwnKTtcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2l2ZXRhYi5jYXB0aW9uICA9IHRoaXMucmVzcG9uc2l2ZXRhYi5maW5kKCdhOmZpcnN0Jyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQuaGFzQ2xhc3MoJ3VrLXRhYi1ib3R0b20nKSkgdGhpcy5yZXNwb25zaXZldGFiLmRyb3Bkb3duLmFkZENsYXNzKCd1ay1kcm9wZG93bi11cCcpO1xuXG4gICAgICAgICAgICAvLyBoYW5kbGUgY2xpY2tcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2l2ZXRhYi5sc3Qub24oJ2NsaWNrLnVrLnRhYicsICdhJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICB2YXIgbGluayA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICAkdGhpcy5lbGVtZW50LmNoaWxkcmVuKCdsaTpub3QoLnVrLXRhYi1yZXNwb25zaXZlKScpLmVxKGxpbmsuZGF0YSgnaW5kZXgnKSkudHJpZ2dlcignY2xpY2snKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdzaG93LnVrLnN3aXRjaGVyIGNoYW5nZS51ay50YWInLCBmdW5jdGlvbihlLCB0YWIpIHtcbiAgICAgICAgICAgICAgICAkdGhpcy5yZXNwb25zaXZldGFiLmNhcHRpb24uaHRtbCh0YWIudGV4dCgpKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kKHRoaXMucmVzcG9uc2l2ZXRhYik7XG5cbiAgICAgICAgICAgIC8vIGluaXQgVUlraXQgY29tcG9uZW50c1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb25uZWN0KSB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaGVyID0gVUkuc3dpdGNoZXIodGhpcy5lbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZSAgICA6ICc+bGk6bm90KC51ay10YWItcmVzcG9uc2l2ZSknLFxuICAgICAgICAgICAgICAgICAgICBjb25uZWN0ICAgOiB0aGlzLm9wdGlvbnMuY29ubmVjdCxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlICAgIDogdGhpcy5vcHRpb25zLmFjdGl2ZSxcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uIDogdGhpcy5vcHRpb25zLmFuaW1hdGlvbixcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gIDogdGhpcy5vcHRpb25zLmR1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICBzd2lwaW5nICAgOiB0aGlzLm9wdGlvbnMuc3dpcGluZ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBVSS5kcm9wZG93bih0aGlzLnJlc3BvbnNpdmV0YWIsIHttb2RlOiAnY2xpY2snLCBwcmV2ZW50ZmxpcDogJ3knfSk7XG5cbiAgICAgICAgICAgIC8vIGluaXRcbiAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoJ2NoYW5nZS51ay50YWInLCBbdGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLnRhcmdldCkubm90KCcudWstdGFiLXJlc3BvbnNpdmUnKS5maWx0ZXIoJy51ay1hY3RpdmUnKV0pO1xuXG4gICAgICAgICAgICB0aGlzLmNoZWNrKCk7XG5cbiAgICAgICAgICAgIFVJLiR3aW4ub24oJ3Jlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZScsIFVJLlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgaWYgKCR0aGlzLmVsZW1lbnQuaXMoJzp2aXNpYmxlJykpICAkdGhpcy5jaGVjaygpO1xuICAgICAgICAgICAgfSwgMTAwKSk7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2Rpc3BsYXkudWsuY2hlY2snLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIGlmICgkdGhpcy5lbGVtZW50LmlzKCc6dmlzaWJsZScpKSAgJHRoaXMuY2hlY2soKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNoZWNrOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuKCdsaTpub3QoLnVrLXRhYi1yZXNwb25zaXZlKScpLnJlbW92ZUNsYXNzKCd1ay1oaWRkZW4nKTtcblxuICAgICAgICAgICAgaWYgKCFjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNpdmV0YWIuYWRkQ2xhc3MoJ3VrLWhpZGRlbicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRvcCAgICAgICAgICA9IChjaGlsZHJlbi5lcSgwKS5vZmZzZXQoKS50b3AgKyBNYXRoLmNlaWwoY2hpbGRyZW4uZXEoMCkuaGVpZ2h0KCkvMikpLFxuICAgICAgICAgICAgICAgIGRvcmVzcG9uc2l2ZSA9IGZhbHNlLFxuICAgICAgICAgICAgICAgIGl0ZW0sIGxpbmssIGNsb25lO1xuXG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNpdmV0YWIubHN0LmVtcHR5KCk7XG5cbiAgICAgICAgICAgIGNoaWxkcmVuLmVhY2goZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgIGlmIChVSS4kKHRoaXMpLm9mZnNldCgpLnRvcCA+IHRvcCkge1xuICAgICAgICAgICAgICAgICAgICBkb3Jlc3BvbnNpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoZG9yZXNwb25zaXZlKSB7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaXRlbSAgPSBVSS4kKGNoaWxkcmVuLmVxKGkpKTtcbiAgICAgICAgICAgICAgICAgICAgbGluayAgPSBpdGVtLmZpbmQoJ2EnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5jc3MoJ2Zsb2F0JykgIT0gJ25vbmUnICYmICFpdGVtLmF0dHIoJ3VrLWRyb3Bkb3duJykpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmhhc0NsYXNzKCd1ay1kaXNhYmxlZCcpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZSA9IFVJLiQoaXRlbVswXS5vdXRlckhUTUwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lLmZpbmQoJ2EnKS5kYXRhKCdpbmRleCcsIGkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zaXZldGFiLmxzdC5hcHBlbmQoY2xvbmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFkZENsYXNzKCd1ay1oaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZXNwb25zaXZldGFiW3RoaXMucmVzcG9uc2l2ZXRhYi5sc3QuY2hpbGRyZW4oJ2xpJykubGVuZ3RoID8gJ3JlbW92ZUNsYXNzJzonYWRkQ2xhc3MnXSgndWstaGlkZGVuJyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKXtcblxuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgVUkuY29tcG9uZW50KCdjb3ZlcicsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgYXV0b211dGUgOiB0cnVlXG4gICAgICAgIH0sXG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIC8vIGF1dG8gaW5pdFxuICAgICAgICAgICAgVUkucmVhZHkoZnVuY3Rpb24oY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgVUkuJCgnW2RhdGEtdWstY292ZXJdJywgY29udGV4dCkuZWFjaChmdW5jdGlvbigpe1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmKCFlbGUuZGF0YSgnY292ZXInKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBsdWdpbiA9IFVJLmNvdmVyKGVsZSwgVUkuVXRpbHMub3B0aW9ucyhlbGUuYXR0cignZGF0YS11ay1jb3ZlcicpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB0aGlzLnBhcmVudCA9IHRoaXMuZWxlbWVudC5wYXJlbnQoKTtcblxuICAgICAgICAgICAgVUkuJHdpbi5vbignbG9hZCByZXNpemUgb3JpZW50YXRpb25jaGFuZ2UnLCBVSS5VdGlscy5kZWJvdW5jZShmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2soKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgMTAwKSk7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2Rpc3BsYXkudWsuY2hlY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5pcygnOnZpc2libGUnKSkgdGhpcy5jaGVjaygpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICAgICAgdGhpcy5jaGVjaygpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50LmlzKCdpZnJhbWUnKSAmJiB0aGlzLm9wdGlvbnMuYXV0b211dGUpIHtcblxuICAgICAgICAgICAgICAgIHZhciBzcmMgPSB0aGlzLmVsZW1lbnQuYXR0cignc3JjJyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXR0cignc3JjJywgJycpLm9uKCdsb2FkJywgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCd7IFwiZXZlbnRcIjogXCJjb21tYW5kXCIsIFwiZnVuY1wiOiBcIm11dGVcIiwgXCJtZXRob2RcIjpcInNldFZvbHVtZVwiLCBcInZhbHVlXCI6MH0nLCAnKicpO1xuICAgICAgICAgICAgICAgIH0pLmF0dHIoJ3NyYycsIFtzcmMsIChzcmMuaW5kZXhPZignPycpID4gLTEgPyAnJic6Jz8nKSwgJ2VuYWJsZWpzYXBpPTEmYXBpPTEnXS5qb2luKCcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2hlY2s6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY3NzKHsgd2lkdGggIDogJycsIGhlaWdodCA6ICcnIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmRpbWVuc2lvbiA9IHt3OiB0aGlzLmVsZW1lbnQud2lkdGgoKSwgaDogdGhpcy5lbGVtZW50LmhlaWdodCgpfTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5hdHRyKCd3aWR0aCcpICYmICFpc05hTih0aGlzLmVsZW1lbnQuYXR0cignd2lkdGgnKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpbWVuc2lvbi53ID0gdGhpcy5lbGVtZW50LmF0dHIoJ3dpZHRoJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQuYXR0cignaGVpZ2h0JykgJiYgIWlzTmFOKHRoaXMuZWxlbWVudC5hdHRyKCdoZWlnaHQnKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpbWVuc2lvbi5oID0gdGhpcy5lbGVtZW50LmF0dHIoJ2hlaWdodCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJhdGlvID0gdGhpcy5kaW1lbnNpb24udyAvIHRoaXMuZGltZW5zaW9uLmg7XG5cbiAgICAgICAgICAgIHZhciB3ID0gdGhpcy5wYXJlbnQud2lkdGgoKSwgaCA9IHRoaXMucGFyZW50LmhlaWdodCgpLCB3aWR0aCwgaGVpZ2h0O1xuXG4gICAgICAgICAgICAvLyBpZiBlbGVtZW50IGhlaWdodCA8IHBhcmVudCBoZWlnaHQgKGdhcCB1bmRlcm5lYXRoKVxuICAgICAgICAgICAgaWYgKCh3IC8gdGhpcy5yYXRpbykgPCBoKSB7XG5cbiAgICAgICAgICAgICAgICB3aWR0aCAgPSBNYXRoLmNlaWwoaCAqIHRoaXMucmF0aW8pO1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IGg7XG5cbiAgICAgICAgICAgIC8vIGVsZW1lbnQgd2lkdGggPCBwYXJlbnQgd2lkdGggKGdhcCB0byByaWdodClcbiAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICB3aWR0aCAgPSB3O1xuICAgICAgICAgICAgICAgIGhlaWdodCA9IE1hdGguY2VpbCh3IC8gdGhpcy5yYXRpbyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jc3MoeyB3aWR0aCAgOiB3aWR0aCwgaGVpZ2h0IDogaGVpZ2h0IH0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbn0pKFVJa2l0Mik7XG4iLCJ3aW5kb3cuJCA9IHdpbmRvdy5qUXVlcnkgPSByZXF1aXJlKCcuL3ZlbmRvci9qcXVlcnknKTtcblxuLy8gdmVuZG9yXG5yZXF1aXJlKCdzdmc0ZXZlcnlib2R5JykoKTtcbnJlcXVpcmUoJ3Vpa2l0Jyk7XG5cbi8vIHJlcXVpcmUoJy4vdmVuZG9yL3Vpa2l0L3Vpa2l0Lm1pbicpO1xucmVxdWlyZSgnLi92ZW5kb3IvdWlraXQvbW9kYWwubWluJyk7XG5yZXF1aXJlKCcuL3ZlbmRvci91aWtpdC9saWdodGJveC5taW4nKTtcbnJlcXVpcmUoJy4vdmVuZG9yL3Vpa2l0L2FjY29yZGlvbi5taW4nKTtcbnJlcXVpcmUoJy4vdmVuZG9yL3Vpa2l0L3NsaWRlci5taW4nKTtcbnJlcXVpcmUoJy4vdmVuZG9yL3Vpa2l0L3NsaWRlc2V0Lm1pbicpO1xucmVxdWlyZSgnLi92ZW5kb3IvdWlraXQvc2xpZGVzaG93Lm1pbicpO1xucmVxdWlyZSgnLi92ZW5kb3IvdWlraXQvc3RpY2t5Lm1pbicpO1xucmVxdWlyZSgnLi92ZW5kb3IvdWlraXQvdG9vbHRpcC5taW4nKTtcblxucmVxdWlyZSgnLi92ZW5kb3Ivb3dsLmNhcm91c2VsJyk7XG4vLyByZXF1aXJlKCdzZWxlY3QyJyk7XG5yZXF1aXJlKCcuL3ZlbmRvci9waWN0dXJlZmlsbC5taW4nKTtcblxuLy8gbW9kdWxlc1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2NoYW5nZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9zbGlkZXNob3cnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy92aWRlbycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL2ZpbHRlci1hY2NvcmRpb24nKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9zdGlja3ktaGVhZGVyJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvc3RpY2t5LXN1Ym1lbnUnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9vbmVwYWdlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3Ntb290aC1zY3JvbGwnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jbGVhcmFibGUtaW5wdXQnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9Pd2xDb250cm9sJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvZXZlbnRzJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvZm9ybWhhbmRsZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9zaGFyZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy90YWJsZScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3RvZ2dsZS1kb3dubG9hZC1idXR0b24nKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9tYXNvbnJ5LWxheW91dCcpO1xuXG4vLyBkb24ndCB1cGxvYWQhXG4vLyByZXF1aXJlKCcuL3ZlbmRvci9jb25maWd1cmF0b3InKTtcblxuXG4vLyBuZWVkcyByZWZhY3RvclxucmVxdWlyZSgnLi9zaGFtZScpO1xuIiwiKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICAvKlxuICAgICAqIENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgdmFyIE93bENvbnRyb2wgPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7XG5cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgICB0aGlzLiRlbGVtZW50ID0gJChlbGVtZW50KTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIHRoaXMubWV0YU9wdGlvbnMgPSB0aGlzLiRlbGVtZW50LmRhdGEoJ293bGNvbnRyb2wnKTtcblxuICAgICAgICB0aGlzLnNldHRpbmdzID0gJC5leHRlbmQoe30sIE93bENvbnRyb2wuRGVmYXVsdHMsIHRoaXMub3B0aW9ucywgdGhpcy5tZXRhT3B0aW9ucyk7XG5cbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBEZWZhdWx0c1xuICAgICAqL1xuICAgIE93bENvbnRyb2wuRGVmYXVsdHMgPSB7fTtcblxuICAgIC8qXG4gICAgICogSW5pdGlhbGl6ZVxuICAgICAqL1xuICAgIE93bENvbnRyb2wucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2luaXRpYWxpemluZyBPd2xDb250cm9sJyk7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5zZXR0aW5ncyk7XG5cbiAgICAgICAgdGhpcy4kZWxlbWVudC5vd2xDYXJvdXNlbCh0aGlzLnNldHRpbmdzKTtcbiAgICB9O1xuXG5cbiAgICAvKlxuICAgICAqIGpRdWVyeSBQbHVnaW4gUmVnaXN0ZXJcbiAgICAgKi9cbiAgICAkLmZuLm93bENvbnRyb2wgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBuZXcgT3dsQ29udHJvbCh0aGlzLCBvcHRpb25zKS5pbml0aWFsaXplKCk7XG4gICAgICAgIH0pXG4gICAgfTtcblxufSkoalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCk7IiwiKGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBDaGFuZ2VyID0gZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucykge1xuICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLFxuICAgICAgICAgICAgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmVsZW1lbnQub24oJ21vdXNlZW50ZXInLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBfdGhpcy5jaGFuZ2VNZWRpYSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgJC5leHRlbmQoQ2hhbmdlci5wcm90b3R5cGUsIHtcblxuICAgICAgICBkZWZhdWx0czoge30sXG5cbiAgICAgICAgY2hhbmdlTWVkaWE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnBhcmVudHMoJy5qcy1wYW5lbC1zdG9yeScpLmZpbmQoJ3BpY3R1cmUgc291cmNlOmZpcnN0LWNoaWxkJykuYXR0cignc3Jjc2V0JywgdGhpcy5vcHRpb25zLnNyYyk7XG4gICAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgLy8gaW5pdFxuICAgICQoZnVuY3Rpb24oKSB7XG4gICAgICAgICQoJ1tkYXRhLWNoYW5nZXJdJykuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBjaGFuZ2VyID0gJCh0aGlzKTtcbiAgICAgICAgICAgIG5ldyBDaGFuZ2VyKGNoYW5nZXIsIHRyYW5zZm9ybU9wdGlvbnMoY2hhbmdlci5kYXRhKCdjaGFuZ2VyJykpKTtcbiAgICAgICAgfSlcbiAgICB9KTtcblxuICAgIC8vIGhlbHBlclxuICAgIHZhciB0cmFuc2Zvcm1PcHRpb25zID0gZnVuY3Rpb24oc3RyaW5nKSB7XG5cbiAgICAgICAgaWYgKCQuaXNQbGFpbk9iamVjdChzdHJpbmcpKSByZXR1cm4gc3RyaW5nO1xuXG4gICAgICAgIHZhciBzdGFydCA9IHN0cmluZy5pbmRleE9mKFwie1wiKSwgb3B0aW9ucyA9IHt9O1xuXG4gICAgICAgIGlmIChzdGFydCAhPSAtMSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gKG5ldyBGdW5jdGlvbihcIlwiLCBcInZhciBqc29uID0gXCIgKyBzdHJpbmcuc3Vic3RyKHN0YXJ0KSArIFwiOyByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShqc29uKSk7XCIpKSgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH07XG5cbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpO1xuIiwiKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgJGVsZW1lbnQgPSAkKCcuanMtY2xlYXJhYmxlLWlucHV0JyksXG4gICAgICAgIGRlZmF1bHRzID0ge1xuICAgICAgICAgICAgXCJzdWJtaXRvbmNsaWNrXCI6IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAkZWxlbWVudC5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKSxcbiAgICAgICAgICAgIG9wdGlvbnMgPSAkdGhpcy5hdHRyKCdkYXRhLWNsZWFyYWJsZScpID8gSlNPTi5wYXJzZSgkdGhpcy5hdHRyKCdkYXRhLWNsZWFyYWJsZScpKSA6IHt9LFxuICAgICAgICAgICAgc2V0dGluZ3MgPSAkLmV4dGVuZCh0cnVlLCB7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICR0aGlzLndyYXAoJzxzcGFuIGNsYXNzPVwidG0taW5wdXQgdG0taW5wdXQtLXdpdGgtY2xlYXItaWNvblwiIC8+JykuYWZ0ZXIoJCgnPHNwYW4gLz4nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKHRoaXMpLnByZXYoJ2lucHV0JykudmFsKCcnKS5mb2N1cygpO1xuXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3Muc3VibWl0b25jbGljaykge1xuICAgICAgICAgICAgICAgIHZhciAkZm9ybSA9ICR0aGlzLmNsb3Nlc3QoJ2Zvcm0nKTtcblxuICAgICAgICAgICAgICAgIGlmICgkZm9ybS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgJGZvcm0uc3VibWl0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfSk7XG5cbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpOyIsIihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyICRldmVudHNDb250YWluZXIgPSAkKCcuanMtZXZlbnQtbGlzdC1jb250YWluZXInKTtcbiAgICB2YXIgJGZpbHRlckJ1dHRvbiA9ICQoJy5qcy1maWx0ZXItZXZlbnQtbGlzdCcpO1xuICAgIHZhciBidXR0b25BY3RpdmUgPSAndG0tYnV0dG9uLWJhc2ljLS1hY3RpdmUnO1xuXG4gICAgdmFyICRldmVudHNDYXRlZ29yeSA9ICQoJ1tkYXRhLWZpbHRlci10eXBlPVwiY2F0ZWdvcnlcIl0nKTtcbiAgICB2YXIgJGV2ZW50c0xvY2F0aW9uID0gJCgnW2RhdGEtZmlsdGVyLXR5cGU9XCJsb2NhdGlvblwiXScpO1xuXG4gICAgLy92YXIgZmlsdGVyVXJsID0gJ2h0dHA6Ly9raXNrLW1lbm5la2VzLXd3dy0yMDE1MTAxOS1yZWxhdW5jaC4xMC42LjAuMTA5LnhpcC5pbzo4ODg4L3NjaHVsdW5nZW4vZmlsdGVyLyc7XG4gICAgdmFyIGZpbHRlclVybENvbnRyb2xsZXIgPSAnP3R4X3NmZXZlbnRtZ3RfcGlldmVudFthY3Rpb25dPWxpc3QmdHhfc2ZldmVudG1ndF9waWV2ZW50W2NvbnRyb2xsZXJdPUV2ZW50JztcbiAgICB2YXIgZmlsdGVyVXJsRGVtYW5kQ2F0ZWdvcnkgPSAnJnR4X3NmZXZlbnRtZ3RfcGlldmVudFtvdmVyd3JpdGVEZW1hbmRdW2NhdGVnb3J5XT0nO1xuICAgIHZhciBmaWx0ZXJVcmxEZW1hbmRMb2NhdGlvbiA9ICcmdHhfc2ZldmVudG1ndF9waWV2ZW50W292ZXJ3cml0ZURlbWFuZF1bbG9jYXRpb25dPSc7XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVFdmVudHMoKSB7XG5cbiAgICAgICAgJCgnLmpzLXRtLWZvcm0tc2V0LWxhYmVsJykub24oJ2JsdXInLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYoJCh0aGlzKS52YWwoKSkge1xuICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2lzLWVtcHR5Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2lzLWVtcHR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoJy5qcy1maWx0ZXItZXZlbnQtbGlzdC1tb2JpbGUnKS5vbignc2VsZWN0MjpzZWxlY3QnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgdmFyIHVybCA9IGZpbHRlclVybCArIGZpbHRlclVybENvbnRyb2xsZXI7XG5cbiAgICAgICAgICAgIHZhciBkZW1hbmRDYXRlZ29yeSA9ICQoJy5qcy1maWx0ZXItZXZlbnQtbGlzdC1tb2JpbGVbZGF0YS1maWx0ZXItdHlwZT1cImNhdGVnb3J5XCJdJykuc2VsZWN0MigpLmZpbmQoXCI6c2VsZWN0ZWRcIikuZGF0YShcInVpZFwiKTtcbiAgICAgICAgICAgIGlmKGRlbWFuZENhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGZpbHRlclVybERlbWFuZENhdGVnb3J5ICsgZGVtYW5kQ2F0ZWdvcnk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBkZW1hbmRMb2NhdGlvbiA9ICQoJy5qcy1maWx0ZXItZXZlbnQtbGlzdC1tb2JpbGVbZGF0YS1maWx0ZXItdHlwZT1cImNhdGVnb3J5XCJdJykuc2VsZWN0MigpLmZpbmQoXCI6c2VsZWN0ZWRcIikuZGF0YShcInVpZFwiKTtcbiAgICAgICAgICAgIGlmKGRlbWFuZExvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGZpbHRlclVybERlbWFuZExvY2F0aW9uICsgZGVtYW5kTG9jYXRpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdldERhdGEodXJsKTtcbiAgICAgICAgfSk7XG5cblxuICAgICAgICAkKCcuanMtZmlsdGVyLWV2ZW50LWxpc3QnKS5vbignY2xpY2snLCBmdW5jdGlvbiBmaWx0ZXJCdXR0b24oZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQodGhpcyk7XG4gICAgICAgICAgICB2YXIgdXJsID0gZmlsdGVyVXJsICsgZmlsdGVyVXJsQ29udHJvbGxlcjtcbiAgICAgICAgICAgIHZhciBhcnJEZW1hbmRDYXRlZ29yeSA9IFtdO1xuICAgICAgICAgICAgdmFyIGFyckRlbWFuZExvY2F0aW9uID0gW107XG5cbiAgICAgICAgICAgIGlmKGJ1dHRvbi5wYXJlbnRzKCdbZGF0YS1maWx0ZXItdHlwZV0nKS5kYXRhKCdmaWx0ZXJUeXBlJykgPT0gJ2NhdGVnb3J5Jykge1xuICAgICAgICAgICAgICAgICRldmVudHNDYXRlZ29yeS5maW5kKCdhJykucmVtb3ZlQ2xhc3MoYnV0dG9uQWN0aXZlKTtcbiAgICAgICAgICAgICAgICBidXR0b24uYWRkQ2xhc3MoYnV0dG9uQWN0aXZlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYoYnV0dG9uLnBhcmVudHMoJ1tkYXRhLWZpbHRlci10eXBlXScpLmRhdGEoJ2ZpbHRlclR5cGUnKSA9PSAnbG9jYXRpb24nKSB7XG4gICAgICAgICAgICAgICAgJGV2ZW50c0xvY2F0aW9uLmZpbmQoJ2EnKS5ub3QoJCh0aGlzKSkucmVtb3ZlQ2xhc3MoYnV0dG9uQWN0aXZlKTtcbiAgICAgICAgICAgICAgICBidXR0b24udG9nZ2xlQ2xhc3MoYnV0dG9uQWN0aXZlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJGV2ZW50c0NhdGVnb3J5LmZpbmQoJy4nICsgYnV0dG9uQWN0aXZlKS5lYWNoKGZ1bmN0aW9uKGksIGUpIHtcbiAgICAgICAgICAgICAgICBpZigkKGUpLmRhdGEoJ2lkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyRGVtYW5kQ2F0ZWdvcnlbaV0gPSAkKGUpLmRhdGEoJ2lkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICRldmVudHNMb2NhdGlvbi5maW5kKCcuJyArIGJ1dHRvbkFjdGl2ZSkuZWFjaChmdW5jdGlvbihpLCBlKSB7XG4gICAgICAgICAgICAgICAgaWYoJChlKS5kYXRhKCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyckRlbWFuZExvY2F0aW9uW2ldID0gJChlKS5kYXRhKCdpZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZihhcnJEZW1hbmRDYXRlZ29yeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGZpbHRlclVybERlbWFuZENhdGVnb3J5ICsgYXJyRGVtYW5kQ2F0ZWdvcnkuam9pbignLCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihhcnJEZW1hbmRMb2NhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGZpbHRlclVybERlbWFuZExvY2F0aW9uICsgYXJyRGVtYW5kTG9jYXRpb24uam9pbignLCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihhcnJEZW1hbmRDYXRlZ29yeS5sZW5ndGggPT0gMCAmJiBhcnJEZW1hbmRMb2NhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgJCgnLmpzLWZpbHRlci1ldmVudC1saXN0LWFsbCcpLnJlbW92ZUNsYXNzKGJ1dHRvbkFjdGl2ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKGFyckRlbWFuZENhdGVnb3J5Lmxlbmd0aCA9PSAwICYmIGFyckRlbWFuZExvY2F0aW9uLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgJCgnLmpzLWZpbHRlci1ldmVudC1saXN0LWFsbCcpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnZXREYXRhKHVybCk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgJCgnLmpzLWZpbHRlci1ldmVudC1saXN0LWFsbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uIGZpbHRlckJ1dHRvbihlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB2YXIgdXJsID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7XG5cbiAgICAgICAgICAgICRmaWx0ZXJCdXR0b24ucmVtb3ZlQ2xhc3MoYnV0dG9uQWN0aXZlKTtcbiAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoYnV0dG9uQWN0aXZlKTtcblxuICAgICAgICAgICAgZ2V0RGF0YSh1cmwpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZigkKCcudG0tYmxvY2stLW1vYmlsZS1zdGlja3knKS5sZW5ndGgpIHtcblxuICAgICAgICAgICAgdmFyIHNjcm9sbFRpbWVvdXQ7XG4gICAgICAgICAgICB2YXIgdGhyb3R0bGUgPSAxMDA7XG4gICAgICAgICAgICAkKHdpbmRvdykub24oJ3Njcm9sbCByZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzY3JvbGxUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkKHdpbmRvdykud2lkdGgoKSA8IDc2OCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSW5WaWV3cG9ydCgkKCcuanMtZXZlbnRzLXN0aWNreS10cmlnZ2VyJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy50bS1ibG9jay0tbW9iaWxlLXN0aWNreScpLmFkZENsYXNzKCd0bS1ibG9jay0tbW9iaWxlLXN0aWNreS0tdW5zZXQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcudG0tYmxvY2stLW1vYmlsZS1zdGlja3knKS5yZW1vdmVDbGFzcygndG0tYmxvY2stLW1vYmlsZS1zdGlja3ktLXVuc2V0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhyb3R0bGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCgnLnRtLWJsb2NrLS1tb2JpbGUtc3RpY2t5JykuYWRkQ2xhc3MoJ3RtLWJsb2NrLS1tb2JpbGUtc3RpY2t5LS11bnNldCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZigkKCcuanMtc2Nyb2xsLXRvLWVycm9yJykuZmluZCgnLmYzLWZvcm0tZXJyb3InKS5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gc2Nyb2xsVG9FcnJvcigpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9FcnJvclBvc2l0aW9uID0gJCgnLmpzLXNjcm9sbC10by1lcnJvcicpLmZpcnN0KCcuZjMtZm9ybS1lcnJvcicpLm9mZnNldCgpLnRvcDtcbiAgICAgICAgICAgICAgICAkKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9FcnJvclBvc2l0aW9uXG4gICAgICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgICB9LCA3NTApO1xuXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXREYXRhKHVybCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIGFqYXhEYXRhKHVybCkudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICAgICB2YXIgZmlyc3RSdW4gPSAxO1xuXG4gICAgICAgICAgICAkZXZlbnRzQ29udGFpbmVyLmFkZENsYXNzKCd0bS1ldmVudHMtb3ZlcnZpZXdfX2NvbnRhaW5lci0tZmFkZS1vdXQnKTtcbiAgICAgICAgICAgICRldmVudHNDb250YWluZXIub25lKCd3ZWJraXRUcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kIG9UcmFuc2l0aW9uRW5kIG1zVHJhbnNpdGlvbkVuZCB0cmFuc2l0aW9uZW5kJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZpcnN0UnVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgZXZlbnRzID0gJChkYXRhKS5maW5kKCcuanMtZXZlbnQtbGlzdCcpO1xuICAgICAgICAgICAgICAgIGZpcnN0UnVuID0gMDtcblxuICAgICAgICAgICAgICAgICQoJy5qcy1ldmVudC1saXN0JykucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgJGV2ZW50c0NvbnRhaW5lci5hcHBlbmQoZXZlbnRzKTtcblxuICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ3RtLWV2ZW50cy1vdmVydmlld19fY29udGFpbmVyLS1mYWRlLW91dCcpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBudWxsLCAkKF90aGlzKS5hdHRyKCdocmVmJykpO1xuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7fSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWpheERhdGEodXJsKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgICAgICByZXEub3BlbignR0VUJywgdXJsKTtcbiAgICAgICAgICAgIHJlcS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcS5zdGF0dXMgPT09IDIwMCA/IHJlc29sdmUocmVxLnJlc3BvbnNlKSA6IHJlamVjdChFcnJvcihyZXEuc3RhdHVzVGV4dCkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KEVycm9yKCdOZXR3b3JrIEVycm9yOiAnICsgZSkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcS5zZW5kKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldEJ1dHRvblN0YXRlKGJ1dHRvbikge1xuICAgICAgJGZpbHRlckJ1dHRvbi5yZW1vdmVDbGFzcyhidXR0b25BY3RpdmUpO1xuICAgICAgYnV0dG9uLmFkZENsYXNzKGJ1dHRvbkFjdGl2ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNJblZpZXdwb3J0KGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIGVsZW1lbnRUb3AgPSAkKGVsZW1lbnQpLm9mZnNldCgpLnRvcDtcbiAgICAgICAgdmFyIGVsZW1lbnRCb3R0b20gPSBlbGVtZW50VG9wICsgJChlbGVtZW50KS5vdXRlckhlaWdodCgpO1xuICAgICAgICB2YXIgdmlld3BvcnRUb3AgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCk7XG4gICAgICAgIHZhciB2aWV3cG9ydEJvdHRvbSA9IHZpZXdwb3J0VG9wICsgJCh3aW5kb3cpLmhlaWdodCgpO1xuICAgICAgICByZXR1cm4gZWxlbWVudEJvdHRvbSA+IHZpZXdwb3J0VG9wICYmIGVsZW1lbnRUb3AgPCB2aWV3cG9ydEJvdHRvbTtcbiAgICB9XG5cbiAgICBoYW5kbGVFdmVudHMoKTtcblxufSkoalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCk7XG4iLCIoZnVuY3Rpb24gKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBhY2NvcmRpb25FbmFibGVkID0gZmFsc2U7XG4gICAgdmFyIGFjY29yZGlvbiA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiBjaGVja01lZGlhUXVlcnkoKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cubWF0Y2hNZWRpYShcIihtaW4td2lkdGg6IDc2OHB4KVwiKS5tYXRjaGVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrQWNjb3JkaW9uKCkge1xuICAgICAgICBpZiAoY2hlY2tNZWRpYVF1ZXJ5KCkpIHtcbiAgICAgICAgICAgIGRpc2FibGVBY2NvcmRpb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVuYWJsZUFjY29yZGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGlzYWJsZUFjY29yZGlvbigpIHtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZygnZGlzYWJsZUFjY29yZGlvbiBiZWNhdXNlIG1pbi13aWR0aCBpcyA3NjhweCcpO1xuXG4gICAgICAgIGlmIChhY2NvcmRpb25FbmFibGVkKSB7XG4gICAgICAgICAgICAkKCcuanMtZmlsdGVyLWFjY29yZGlvbicpLm9mZignY2xpY2sudWsuYWNjb3JkaW9uJyk7XG4gICAgICAgICAgICAkKCcuanMtZmlsdGVyLWFjY29yZGlvbiAudWstYWNjb3JkaW9uLXRpdGxlJykucmVtb3ZlQ2xhc3MoJ3VrLWFjdGl2ZScpO1xuICAgICAgICAgICAgJCgnLmpzLWZpbHRlci1hY2NvcmRpb24gLnVrLWFjY29yZGlvbi1jb250ZW50JykudW53cmFwKCkucmVtb3ZlQ2xhc3MoJ3VrLWFjdGl2ZScpO1xuXG4gICAgICAgICAgICBhY2NvcmRpb24gPSBudWxsO1xuICAgICAgICAgICAgYWNjb3JkaW9uRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBlbmFibGVBY2NvcmRpb24oKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdlbmFibGVBY2NvcmRpb24gYmVjYXVzZSBtYXgtd2lkdGggaXMgNzY3cHgnKTtcblxuICAgICAgICBpZiAoIWFjY29yZGlvbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIGFjY29yZGlvbiA9IFVJa2l0LmFjY29yZGlvbigkKCcuanMtZmlsdGVyLWFjY29yZGlvbicpLCB7Y29sbGFwc2U6IGZhbHNlfSk7XG4gICAgICAgICAgICBhY2NvcmRpb25FbmFibGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYWNjb3JkaW9uKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgICQoJy5qcy1maWx0ZXItYWNjb3JkaW9uJykuZmluZCgnLnRtLXRvb2x0aXAtaWNvbicpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuXG4gICAgVUlraXQub24oJ2FmdGVycmVhZHkudWsuZG9tJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoJCgnLmpzLWZpbHRlci1hY2NvcmRpb24nKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNoZWNrQWNjb3JkaW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICAkKHdpbmRvdykub24oJ3Jlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZScsIFVJa2l0LlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgaWYgKCQoJy5qcy1maWx0ZXItYWNjb3JkaW9uJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tBY2NvcmRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKSk7XG5cbiAgICAgICAgJCgnaHRtbCcpLm9uKCd1cGRhdGUuZmlsdGVyLmFjY29yZGlvbicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3VwZGF0ZS5maWx0ZXIuYWNjb3JkaW9uJyk7XG5cbiAgICAgICAgICAgIGlmICgkKCcuanMtZmlsdGVyLWFjY29yZGlvbicpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGFjY29yZGlvbkVuYWJsZWQgPSBmYWxzZTsgLy8gcmVpbml0IGFmdGVyIGFqYXhcbiAgICAgICAgICAgICAgICBjaGVja0FjY29yZGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pO1xuXG59KShqUXVlcnksIHdpbmRvdywgd2luZG93LmRvY3VtZW50KTsiLCIoZnVuY3Rpb24gKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBzY3JvbGxUb0Zvcm1FcnJvciA9IChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgdmFyIGNvbnRhaW5lciA9ICQoJy5qcy1zY3JvbGwtdG8tZXJyb3InKTtcbiAgICAgICAgdmFyIGFuY2hvciA9ICQoJy5qcy1zY3JvbGwtdG8tYW5jaG9yJyk7XG4gICAgICAgIHZhciBlcnJvciA9ICcuaW52YWxpZCc7XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgICAgIGlmIChjb250YWluZXIuZmluZChlcnJvcikubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAkKCdib2R5LCBodG1sJykuYW5pbWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3A6IGFuY2hvci5vZmZzZXQoKS50b3BcbiAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICAgICAgICB9LCAzMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluaXQ6IGluaXRcbiAgICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgdmFyIHZhbGlkYXRlQ29udGFjdEZvcm0gPSAoZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIHZhciBjb250YWluZXIgPSAkKCcjY29udGFjdC1mb3JtJyk7XG4gICAgICAgIHZhciBlcnJvckNsYXNzID0gJ2ludmFsaWQnO1xuXG4gICAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XG5cbiAgICAgICAgICAgIGNvbnRhaW5lci5maW5kKCcuanMtc3VibWl0LWZvcm0nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5maW5kKCcudmFsaWRhdGlvbldyYXBwZXInKS5yZW1vdmVDbGFzcyhlcnJvckNsYXNzKTtcblxuICAgICAgICAgICAgICAgIHZhciByZXF1aXJlZCA9IGNvbnRhaW5lci5maW5kKCcucmVxdWlyZWQnKTtcbiAgICAgICAgICAgICAgICAkLmVhY2gocmVxdWlyZWQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEkKHRoaXMpLnZhbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnBhcmVudHMoJy52YWxpZGF0aW9uV3JhcHBlcicpLmFkZENsYXNzKGVycm9yQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLmZpbmQoJy4nICsgZXJyb3JDbGFzcykubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICBncmVjYXB0Y2hhLmV4ZWN1dGUoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluaXQ6IGluaXRcbiAgICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgc2Nyb2xsVG9Gb3JtRXJyb3IuaW5pdCgpO1xuICAgIHZhbGlkYXRlQ29udGFjdEZvcm0uaW5pdCgpO1xufSkoalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCk7XG4iLCIoZnVuY3Rpb24oJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGltYWdlc0xvYWRlZCA9IHJlcXVpcmUoJ2ltYWdlc2xvYWRlZCcpO1xuICAgIHZhciBNYXNvbnJ5ID0gcmVxdWlyZSgnbWFzb25yeS1sYXlvdXQnKTtcbiAgICB2YXIgZ3JpZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1tc25yeS1ncmlkJyk7XG4gICAgdmFyIG1zbnJ5O1xuXG4gICAgaWYgKCFncmlkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbWFnZXNMb2FkZWQoIGdyaWQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBtc25yeSA9IG5ldyBNYXNvbnJ5KGdyaWQsIHtcbiAgICAgICAgICAgIGd1dHRlcjogMTAsXG4gICAgICAgICAgICBpdGVtU2VsZWN0b3I6ICcubXNucnktZ3JpZF9faXRlbScsXG4gICAgICAgICAgICBjb2x1bW5XaWR0aDogJy5tc25yeS1ncmlkX19zaXplcicsXG4gICAgICAgICAgICBwZXJjZW50UG9zaXRpb246IHRydWVcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpO1xuIiwiKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgaW5pdCA9IG51bGw7XG4gICAgdmFyICRlbGVtZW50ID0gJCgnLmpzLXN0aWNreS1jdGEnKTtcblxuICAgIGZ1bmN0aW9uIHN0aWNreUNUQSgpIHtcblxuICAgICAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICAgICAgcmV0dXJuIFVJa2l0LnN0aWNreSgkZWxlbWVudCwge3RvcDogMjAwfSk7XG4gICAgICAgIH1cblxuICAgICAgICAkZWxlbWVudC5vbih7XG4gICAgICAgICAgICAnYWN0aXZlLnVrLnN0aWNreScgOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkZWxlbWVudC5jc3Moe3RvcDogJ2luaGVyaXQnLCBib3R0b206IDB9KTtcbiAgICAgICAgICAgICAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ3N0aWNreS1jdGEnKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnaW5hY3RpdmUudWsuc3RpY2t5JyA6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICRlbGVtZW50LmNzcyh7dG9wOiAnJywgYm90dG9tOiAnJ30pO1xuICAgICAgICAgICAgICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcygnc3RpY2t5LWN0YScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAkKHdpbmRvdykub24oJ3Njcm9sbCBsb2FkJywgZnVuY3Rpb24gKGV2ZW50KSB7XG5cbiAgICAgICAgICAgIHZhciB0b3AgPSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSArICQod2luZG93KS5oZWlnaHQoKTtcbiAgICAgICAgICAgIHZhciBmb290ZXIgPSAkKGRvY3VtZW50KS5vdXRlckhlaWdodCgpIC0gJCgnLnRtLWZvb3RlcicpLm91dGVySGVpZ2h0KCk7XG5cbiAgICAgICAgICAgIGlmICghJGVsZW1lbnQuaGFzQ2xhc3MoJ3VrLWFjdGl2ZScpICkge1xuICAgICAgICAgICAgICAgICRlbGVtZW50LmNzcyh7IHRvcDogJycsIHBvc2l0aW9uOiAnJyB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0b3AgPj0gZm9vdGVyKSB7XG4gICAgICAgICAgICAgICAgJGVsZW1lbnQuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBmb290ZXIgLSAkZWxlbWVudC5vdXRlckhlaWdodCgpIC0gJCgnLmpzLXN0aWNreS1oZWFkZXInKS5vdXRlckhlaWdodCgpLFxuICAgICAgICAgICAgICAgICAgICBib3R0b206ICcnLFxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkZWxlbWVudC5jc3Moe1xuICAgICAgICAgICAgICAgICAgICBib3R0b206IDAsXG4gICAgICAgICAgICAgICAgICAgIHRvcDogJ2luaGVyaXQnLFxuICAgICAgICAgICAgICAgICAgICAvLyB0b3A6ICQod2luZG93KS5oZWlnaHQoKSAtICRlbGVtZW50Lm91dGVySGVpZ2h0KCksXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaW5pdCA9IGluaXQoKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFRhYnMgc2l6ZXJcbiAgICAqKi9cbiAgICBmdW5jdGlvbiB0bVRhYnMoKSB7XG4gICAgICAgIHZhciBjb250YWluZXIgPSAkKCcuanMtdG0tdGFicy1pbm5lcicpO1xuICAgICAgICB2YXIgZWxlbXMgPSBjb250YWluZXIuZmluZCgnLnRtLXRhYnMtY2FyZCcpO1xuICAgICAgICB2YXIgY29udGFpbmVyVyA9IDA7XG5cbiAgICAgICAgZWxlbXMuZWFjaChmdW5jdGlvbihpLCBlKXtcbiAgICAgICAgICAgIGNvbnRhaW5lclcgKz0gJChlKS5vdXRlcldpZHRoKHRydWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29udGFpbmVyLmNzcyh7IHdpZHRoOiBjb250YWluZXJXIH0pO1xuICAgICAgICBjb250YWluZXIucGFyZW50cygnLnVrLXN0aWNreS1wbGFjZWhvbGRlcicpLmNzcyh7IGhlaWdodDogY29udGFpbmVyLmZpbmQoJy50bS10YWJzLWNhcmQnKS5maXJzdCgpLm91dGVySGVpZ2h0KHRydWUpIH0pO1xuICAgIH1cblxuICAgICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gJCgnLmpzLXRtLXRhYnMtaW5uZXInKTtcbiAgICAgICAgdmFyIGVsZW1zID0gY29udGFpbmVyLmZpbmQoJy50bS10YWJzLWNhcmQnKTtcbiAgICAgICAgdmFyIGNvbnRhaW5lclcgPSAwO1xuICAgICAgICBjb250YWluZXIuY3NzKHsgd2lkdGg6IDE0MDAgfSk7XG5cbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGVsZW1zLmVhY2goZnVuY3Rpb24oaSwgZSl7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyVyArPSAkKGUpLm91dGVyV2lkdGgodHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5jc3MoeyB3aWR0aDogY29udGFpbmVyVyB9KTtcbiAgICAgICAgfSwgMjUwKTtcbiAgICB9KTtcblxuICAgIHZhciBzdGlja3lDVEEgPSBzdGlja3lDVEEoKTtcbiAgICB2YXIgdG1UYWJzID0gdG1UYWJzKCk7XG5cbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpO1xuIiwiLypcblBvc3NpYmxlIEZpZWxkczpcblx0dXJpICAgICBBbGlhczogdXJsLCBGYWxsYmFjazogbG9jYXRpb24uaHJlZlxuXHR0aXRsZSAgIEZhbGxiYWNrOiBvZzp0aXRsZSwgPHRpdGxlPlxuXHRtZXNzYWdlIEZhbGxiYWNrOiBmaWVsZCB0aXRsZVxuXHRpbWFnZSAgIEZhbGxiYWNrOiBvZzppbWFnZVxuXG5BbGwgZmllbGRzIGNhbiBiZSBkZWZpbmVkIGF0IGEgc3BlY2lmaWMgc2hhcmVyIG9yIGF0IHRoZSBwYXJlbnQgZWxlbWVudCBhcyBkYXRhIHRhZzpcbjx1bCBjbGFzcz1cInNoYXJlclwiIGRhdGEtdGl0bGU9XCJTaGFyZXIgdGl0bGVcIiBkYXRhLW1lc3NhZ2U9XCJGdWxsIHNoYXJpbmcgbWVzc2FnZVwiPlxuXHQ8bGkgY2xhc3M9XCJ0d2l0dGVyXCIgZGF0YS1tZXNzYWdlPVwiU2hvcnQgdHdpdHRlciBtZXNzYWdlXCI+PC9saT5cblx0PGxpIGNsYXNzPVwiZmFjZWJvb2tcIj48L2xpPlxuPC91bD5cblxuU2hhcmVycyB3aXRoIHVzZWQgZmllbGRzOlxuXHRmYWNlYm9vazogICB0aXRsZSwgdXJpXG5cdHR3aXR0ZXI6ICAgIG1lc3NhZ2UsIHVyaVxuXHRnb29nbGVwbHVzOiB1cmlcblx0cGludGVyZXN0OiAgdXJpLCBpbWFnZSwgbWVzc2FnZVxuXHRtYWlsOiAgICAgICB0aXRsZSwgbWVzc2FnZSwgdXJpXHQtIHVzZSAmIzEwOyBmw7xyIGxpbmUgYnJlYWtzIGluIG1lc3NhZ2VcblxuKi9cbihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBnZXR0ZXIgPSB7fTtcblxuICBnZXR0ZXIudXJpID0gZnVuY3Rpb24gZ2V0VXJpKGVsKSB7XG4gICAgdmFyIHVyaTtcblxuICAgIHVyaSA9IHVyaSB8fCBlbC5kYXRhKCd1cmknKTtcbiAgICB1cmkgPSB1cmkgfHwgZWwuZGF0YSgndXJsJyk7XG4gICAgdXJpID0gdXJpIHx8IGVsLmNsb3Nlc3QoJy5zaGFyZXInKS5kYXRhKCd1cmknKTtcbiAgICB1cmkgPSB1cmkgfHwgZWwuY2xvc2VzdCgnLnNoYXJlcicpLmRhdGEoJ3VybCcpO1xuICAgIHVyaSA9IHVyaSB8fCBsb2NhdGlvbi5ocmVmO1xuXG4gICAgcmV0dXJuIHVyaTtcbiAgfTtcblxuICBnZXR0ZXIudGl0bGUgPSBmdW5jdGlvbiBnZXRUaXRsZShlbCkge1xuICAgIHZhciB0aXRsZTtcblxuICAgIHRpdGxlID0gdGl0bGUgfHwgZWwuZGF0YSgndGl0bGUnKTtcbiAgICB0aXRsZSA9IHRpdGxlIHx8IGVsLmNsb3Nlc3QoJy5zaGFyZXInKS5kYXRhKCd0aXRsZScpO1xuICAgIHRpdGxlID0gdGl0bGUgfHwgJCgnbWV0YVtwcm9wZXJ0eT1cIm9nOnRpdGxlXCJdJykucHJvcCgnY29udGVudCcpO1xuICAgIHRpdGxlID0gdGl0bGUgfHwgJCgndGl0bGUnKS50ZXh0KCk7XG5cbiAgICByZXR1cm4gdGl0bGU7XG4gIH07XG5cbiAgZ2V0dGVyLm1lc3NhZ2UgPSBmdW5jdGlvbiBnZXRNZXNzYWdlKGVsKSB7XG4gICAgdmFyIG1lc3NhZ2U7XG5cbiAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCBlbC5kYXRhKCdtZXNzYWdlJyk7XG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgZWwuY2xvc2VzdCgnLnNoYXJlcicpLmRhdGEoJ21lc3NhZ2UnKTtcbiAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCBnZXR0ZXIudGl0bGUoZWwpO1xuXG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH07XG5cbiAgZ2V0dGVyLmltYWdlID0gZnVuY3Rpb24gZ2V0TWVzc2FnZShlbCkge1xuICAgIHZhciBpbWFnZTtcblxuICAgIGltYWdlID0gaW1hZ2UgfHwgZWwuZGF0YSgnaW1hZ2UnKTtcbiAgICBpbWFnZSA9IGltYWdlIHx8IGVsLmNsb3Nlc3QoJy5zaGFyZXInKS5kYXRhKCdpbWFnZScpO1xuICAgIGltYWdlID0gaW1hZ2UgfHwgJCgnbWV0YVtwcm9wZXJ0eT1cIm9nOmltYWdlXCJdJykucHJvcCgnY29udGVudCcpO1xuXG4gICAgcmV0dXJuIGltYWdlO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHBvcHVwKHVyaSwgd2lkdGgsIGhlaWdodCkge1xuICAgIG9wZW4odXJpLCAnc2hhcmVyJywgJ3dpZHRoPScgKyB3aWR0aCArICcsaGVpZ2h0PScgKyBoZWlnaHQpO1xuICB9XG5cbiAgdmFyIHNoYXJlSGFuZGxlcnMgPSB7XG4gICAgZmFjZWJvb2s6IHtcbiAgICAgIHVyaTogJ2h0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9zaGFyZXIvc2hhcmVyLnBocD91PSV1cmklJnBbdGl0bGVdPSV0aXRsZSUmZGlzcGxheT1wb3B1cCcsXG4gICAgICByZXBsYWNlbWVudHM6IFsndGl0bGUnLCAndXJpJ10sXG4gICAgICB3aWR0aDogNjUwLFxuICAgICAgaGVpZ2h0OiAzMjBcbiAgICB9LFxuICAgIHR3aXR0ZXI6IHtcbiAgICAgIHVyaTogJ2h0dHBzOi8vdHdpdHRlci5jb20vaW50ZW50L3R3ZWV0P3RleHQ9JW1lc3NhZ2UlJnVybD0ldXJpJScsXG4gICAgICByZXBsYWNlbWVudHM6IFsnbWVzc2FnZScsICd1cmknXSxcbiAgICAgIHdpZHRoOiA1MjAsXG4gICAgICBoZWlnaHQ6IDI2MFxuICAgIH0sXG4gICAgZ29vZ2xlcGx1czoge1xuICAgICAgdXJpOiAnaHR0cHM6Ly9wbHVzLmdvb2dsZS5jb20vc2hhcmU/dXJsPSV1cmklJyxcbiAgICAgIHJlcGxhY2VtZW50czogWyd1cmknXSxcbiAgICAgIHdpZHRoOiA1MTAsXG4gICAgICBoZWlnaHQ6IDM5MFxuICAgIH0sXG4gICAgcGludGVyZXN0OiB7XG4gICAgICB1cmk6ICdodHRwOi8vcGludGVyZXN0LmNvbS9waW4vY3JlYXRlL2J1dHRvbi8/dXJsPSV1cmklJm1lZGlhPSVpbWFnZSUmZGVzY3JpcHRpb249JW1lc3NhZ2UlJyxcbiAgICAgIHJlcGxhY2VtZW50czogWyd1cmknLCAnaW1hZ2UnLCAnbWVzc2FnZSddLFxuICAgICAgd2lkdGg6IDUxMCxcbiAgICAgIGhlaWdodDogMzkwXG4gICAgfSxcbiAgICBtYWlsOiB7XG4gICAgICB1cmk6ICdtYWlsdG86P3N1YmplY3Q9JXRpdGxlJSZib2R5PSVtZXNzYWdlJSAldXJpJScsXG4gICAgICByZXBsYWNlbWVudHM6IFsndGl0bGUnLCAnbWVzc2FnZScsICd1cmknXSxcbiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uICh1cmkpIHtcbiAgICAgICAgbG9jYXRpb24uaHJlZiA9IHVyaTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIGluaXQgPSBmdW5jdGlvbiBpbml0U2hhcmVyKCkge1xuICAgICQuZWFjaChzaGFyZUhhbmRsZXJzLCBmdW5jdGlvbiAobmFtZSwgdmFsdWVzKSB7XG4gICAgICAkKCdib2R5Jykub24oJ2NsaWNrIHRvdWNoZW5kJywgJy5zaGFyZXIgLicgKyBuYW1lLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHZhciBlbCA9ICQodGhpcyk7XG4gICAgICAgIHZhciB1cmkgPSB2YWx1ZXMudXJpO1xuICAgICAgICAkLmVhY2godmFsdWVzLnJlcGxhY2VtZW50cywgZnVuY3Rpb24gKGssIHYpIHtcbiAgICAgICAgICB1cmkgPSB1cmkucmVwbGFjZShuZXcgUmVnRXhwKCclJyArIHYgKyAnJScpLCBlbmNvZGVVUklDb21wb25lbnQoZ2V0dGVyW3ZdKGVsKSkpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGhhbmRsZXIgPSB2YWx1ZXMuaGFuZGxlciB8fCBwb3B1cDtcbiAgICAgICAgaGFuZGxlcih1cmksIHZhbHVlcy53aWR0aCwgdmFsdWVzLmhlaWdodCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcblxuICB2YXIgc2VsZiA9IHtcbiAgICBpbml0OiBpbml0LFxuICAgIGdldHRlcjogZ2V0dGVyLFxuICAgIHBvcHVwOiBwb3B1cCxcbiAgICBoYW5kbGVyczogc2hhcmVIYW5kbGVyc1xuICB9O1xuXG4gIHNlbGYuaW5pdCgpO1xuXG59KShqUXVlcnksIHdpbmRvdywgd2luZG93LmRvY3VtZW50KTtcbiIsIihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLy8gb24gc2xpZGUgY2hhbmdlIHJlc2V0IHZpZGVvIGluc2lkZSBsYXN0IHNsaWRlXG4gICAgJCgnW2RhdGEtdWstc2xpZGVzaG93XScpLm9uKCdzaG93LnVrLnNsaWRlc2hvdycsIGZ1bmN0aW9uIChldmVudCwgbmV4dFNsaWRlLCBjdXJyZW50U2xpZGUpIHtcbiAgICAgICAgdmFyICRzbGlkZSA9ICQoY3VycmVudFNsaWRlKSxcbiAgICAgICAgICAgICR2aWRlbyA9ICRzbGlkZS5maW5kKCd2aWRlbycpLFxuICAgICAgICAgICAgJHZpZGVvQ29udGFpbmVyID0gJHNsaWRlLmZpbmQoJy5qcy12aWRlbycpLFxuICAgICAgICAgICAgJHBsYXlDb250cm9sID0gJHNsaWRlLmZpbmQoJy5qcy12aWRlby1wbGF5JyksXG4gICAgICAgICAgICAkcGF1c2VDb250cm9sID0gJHNsaWRlLmZpbmQoJy5qcy12aWRlby1wYXVzZScpLFxuICAgICAgICAgICAgJG11dGVDb250cm9sID0gJHNsaWRlLmZpbmQoJy5qcy12aWRlby1tdXRlJyk7XG5cbiAgICAgICAgaWYgKCR2aWRlby5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAkdmlkZW8uY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICR2aWRlb1swXS5wYXVzZSgpO1xuICAgICAgICAgICAgJHZpZGVvQ29udGFpbmVyLnJlbW92ZUNsYXNzKCd0bS12aWRlby0taXMtcGxheWluZycpO1xuXG4gICAgICAgICAgICAkcGF1c2VDb250cm9sLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICAkbXV0ZUNvbnRyb2wuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICRwbGF5Q29udHJvbC5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWJsb2NrJyk7XG5cbiAgICAgICAgICAgICR2aWRlb1swXS5jdXJyZW50VGltZSA9IDA7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIGNhcGl0YWxpemVIZWFkbGluZXMoKSB7XG4gICAgICAgIHZhciBoZWFkbGluZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZmFuY3ktaGVhZGxpbmUnKTtcblxuICAgICAgICBoZWFkbGluZXMuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7XG5cbiAgICAgICAgICAgIHZhciBzdHIgPSBlbGVtZW50LmlubmVySFRNTDtcbiAgICAgICAgICAgIHZhciBsZXR0ZXJzID0gc3RyLnNwbGl0KCcnKTtcbiAgICAgICAgICAgIHZhciAgIG91dHB1dCA9ICcnO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaTxsZXR0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNVcHBlckNhc2UobGV0dGVyc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9ICc8c3BhbiBjbGFzcz1cImNhcFwiPicgKyBsZXR0ZXJzW2ldICsgJzwvc3Bhbj4nO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBsZXR0ZXJzW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSBvdXRwdXQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVXBwZXJDYXNlKGNoYXIpe1xuICAgICAgICByZXR1cm4gY2hhciA9PSBjaGFyLnRvVXBwZXJDYXNlKCkgJiYgY2hhciAhPSBjaGFyLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgY2FwaXRhbGl6ZUhlYWRsaW5lcygpO1xuXG59KShqUXVlcnksIHdpbmRvdywgd2luZG93LmRvY3VtZW50KTtcbiIsIihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIHNtb290aFNjcm9sbGVyID0gbnVsbCxcbiAgICAgICAgJGVsZW1lbnQgPSAkKCcuanMtc21vb3RoLXNjcm9sbCcpO1xuXG4gICAgJGVsZW1lbnQuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7XG5cbiAgICAgICAgJHRoaXMub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG9mZnNldEFkZCA9IDA7XG5cbiAgICAgICAgICAgIGlmICgkKHdpbmRvdykud2lkdGgoKSA8IDk2MCkge1xuICAgICAgICAgICAgICAgIG9mZnNldEFkZCA9ICQoJyN0bS1oZWFkZXInKS5vdXRlckhlaWdodCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvZmZzZXRBZGQgPSAkKCcjdG0taGVhZGVyJykub3V0ZXJIZWlnaHQoKSAvIDI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSAkdGhpcy5wYXJlbnRzKCcudG0tYmxvY2snKS5vdXRlckhlaWdodCgpICsgb2Zmc2V0QWRkO1xuXG4gICAgICAgICAgICAkKFwiaHRtbCxib2R5XCIpLnN0b3AoKS5hbmltYXRlKHtzY3JvbGxUb3A6IG9mZnNldH0sIDEwMDAsICdlYXNlT3V0RXhwbycpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxufSkoalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCk7IiwiKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgc3RpY2t5SGVhZGVyID0gbnVsbCxcbiAgICAgICAgJGVsZW1lbnQgPSAkKCcuanMtc3RpY2t5LWhlYWRlcicpLFxuICAgICAgICAkaGVhZGVyID0gJGVsZW1lbnQuZmluZCgnLnRtLWhlYWRlcicpLFxuICAgICAgICAkbW9iaWxlTWVudSA9ICQoJyN0bS1tZW51LW1vYmlsZScpLFxuICAgICAgICAkbW9iaWxlTWVudUhvb2sgPSAkKCcuanMtc3RpY2t5LW1vYmlsZS1tZW51JyksXG4gICAgICAgIG1vYmlsZU1lbnVJc0Nsb3NlZCA9ICRtb2JpbGVNZW51Lmhhc0NsYXNzKCd0bS1tZW51LW1vYmlsZS0taXMtY2xvc2VkJyksXG4gICAgICAgIHNocmlua1RyaWdnZXJPZmZzZXQgPSAxMDgsXG4gICAgICAgIHBsYWNlaG9sZGVyTWluSGVpZ2h0ID0gNjI7XG5cbiAgICBmdW5jdGlvbiBpc01vYmlsZSgpIHtcbiAgICAgICAgcmV0dXJuICF3aW5kb3cubWF0Y2hNZWRpYSgnKG1pbi13aWR0aDogOTYwcHgpJykubWF0Y2hlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblNjcm9sbFNocmluaygpIHtcbiAgICAgICAgdmFyIHNjcm9sbFRvcCA9ICQod2luZG93KS5zY3JvbGxUb3AoKSxcbiAgICAgICAgICAgIHNocmlua09uID0gc2hyaW5rVHJpZ2dlck9mZnNldCxcbiAgICAgICAgICAgIGNsc2FjdGl2ZSA9ICd0bS1oZWFkZXItLXNtYWxsJztcblxuICAgICAgICBpZiAoc2Nyb2xsVG9wID4gc2hyaW5rT24pIHtcbiAgICAgICAgICAgICRoZWFkZXIuYWRkQ2xhc3MoY2xzYWN0aXZlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRoZWFkZXIucmVtb3ZlQ2xhc3MoY2xzYWN0aXZlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTW9iaWxlTWVudUNsaWNrKCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnb25Nb2JpbGVNZW51Q2xpY2snKTtcbiAgICAgICAgbW9iaWxlTWVudUlzQ2xvc2VkID0gIW1vYmlsZU1lbnVJc0Nsb3NlZDtcblxuICAgICAgICAkZWxlbWVudC5jc3Moe1xuICAgICAgICAgICAgJ3Bvc2l0aW9uJzogJ2ZpeGVkJyxcbiAgICAgICAgICAgICd0b3AnOiAwLFxuICAgICAgICAgICAgJ3dpZHRoJzogJCh3aW5kb3cpLndpZHRoKClcbiAgICAgICAgfSkuYWRkQ2xhc3MoJ3VrLWFjdGl2ZScpO1xuXG4gICAgICAgIGlmIChtb2JpbGVNZW51SXNDbG9zZWQpIHtcbiAgICAgICAgICAgICRlbGVtZW50LmNzcyh7XG4gICAgICAgICAgICAgICAgJ2hlaWdodCc6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICAnb3ZlcmZsb3cteSc6ICd2aXNpYmxlJ1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICQoJ2JvZHksIGh0bWwnKS5yZW1vdmVDbGFzcygnanMtZGlzYWJsZWQtc2Nyb2xsaW5nJyk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRlbGVtZW50LmNzcyh7XG4gICAgICAgICAgICAgICAgJ2hlaWdodCc6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICAnb3ZlcmZsb3cteSc6ICdzY3JvbGwnXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgJCgnYm9keSwgaHRtbCcpLmFkZENsYXNzKCdqcy1kaXNhYmxlZC1zY3JvbGxpbmcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0aWNreUhlYWRlci5zdGlja3kub3B0aW9ucy5zaG93dXAgPSBtb2JpbGVNZW51SXNDbG9zZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVjYWxjV3JhcHBlckhlaWdodCgpIHtcbiAgICAgICAgdmFyIHBsYWNlaG9sZGVySGVpZ2h0ID0gJGVsZW1lbnQub3V0ZXJIZWlnaHQoKSA+IHBsYWNlaG9sZGVyTWluSGVpZ2h0ID8gJGVsZW1lbnQub3V0ZXJIZWlnaHQoKSA6IHBsYWNlaG9sZGVyTWluSGVpZ2h0O1xuICAgICAgICAkZWxlbWVudC5wYXJlbnQoKS5oZWlnaHQocGxhY2Vob2xkZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluaXRTdGlja3koKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgYW5pbWF0aW9uOiAndWstYW5pbWF0aW9uLXNsaWRlLXRvcCdcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoIWlzTW9iaWxlKCkpIHtcbiAgICAgICAgICAgICQod2luZG93KS5vbignc2Nyb2xsJywgb25TY3JvbGxTaHJpbmspO1xuICAgICAgICB9XG5cbiAgICAgICAgJG1vYmlsZU1lbnVIb29rLm9uKCdjbGljaycsIG9uTW9iaWxlTWVudUNsaWNrKTtcblxuICAgICAgICByZXR1cm4gVUlraXQuc3RpY2t5KCRlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAkKHdpbmRvdykub24oJ3Jlc2l6ZScsIFVJa2l0LlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uIChldmVudCkge1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdzdGF0ZUlzTW9iaWxlJywgaXNNb2JpbGUoKSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdzdGlja3lIZWFkZXIub3B0aW9ucy5zaG93dXAnLCBzdGlja3lIZWFkZXIub3B0aW9ucy5zaG93dXApO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnc3RpY2t5SGVhZGVyLm9wdGlvbnMuc2hvd3VwICE9PSBzdGF0ZUlzTW9iaWxlJywgc3RpY2t5SGVhZGVyLm9wdGlvbnMuc2hvd3VwICE9PSBpc01vYmlsZSgpKTtcblxuICAgICAgICAvLyBpZiBtb2JpbGUgKDwgOTYwcHgpLCByZW1vdmUgbGlzdGVuZXIgZm9yIGhlYWRlciBzaHJpbmtpbmcgYW5kIGFjdGl2YXRlIHNob3d1cCBmZWF0dXJlXG4gICAgICAgIGlmIChpc01vYmlsZSgpKSB7XG4gICAgICAgICAgICAkKHdpbmRvdykub2ZmKCdzY3JvbGwnLCBvblNjcm9sbFNocmluayk7XG5cbiAgICAgICAgICAgIGlmICgkaGVhZGVyLmhhc0NsYXNzKCd0bS1oZWFkZXItLXNtYWxsJykpIHtcbiAgICAgICAgICAgICAgICAkaGVhZGVyLnJlbW92ZUNsYXNzKCd0bS1oZWFkZXItLXNtYWxsJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICQod2luZG93KS5vbignc2Nyb2xsJywgb25TY3JvbGxTaHJpbmspO1xuICAgICAgICAgICAgb25TY3JvbGxTaHJpbmsoKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgcmVjYWxjV3JhcHBlckhlaWdodCgpO1xuXG4gICAgfSwgMjAwKSk7XG5cbiAgICBzdGlja3lIZWFkZXIgPSBpbml0U3RpY2t5KCk7XG5cbiAgICAkKGRvY3VtZW50KS5vbigndG91Y2htb3ZlJywgJy5qcy1kaXNhYmxlZC1zY3JvbGxpbmcnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICB2YXIgbWVudUhlaWdodCA9ICRtb2JpbGVNZW51Lm91dGVySGVpZ2h0KCkgKyAkKCcjdG0taGVhZGVyJykub3V0ZXJIZWlnaHQoKSxcbiAgICAgICAgICAgIHZpZXdwb3J0SGVpZ2h0ID0gJCh3aW5kb3cpLm91dGVySGVpZ2h0KCk7XG5cbiAgICAgICAgaWYgKG1lbnVIZWlnaHQgPCB2aWV3cG9ydEhlaWdodCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG59KShqUXVlcnksIHdpbmRvdywgd2luZG93LmRvY3VtZW50KTtcbiIsIihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGluaXQgPSBudWxsO1xuICAgIHZhciBvZmZzZXRUb3AgPSBudWxsO1xuICAgIHZhciAkc3VibWVudSA9ICQoJy5qcy1zdGlja3ktc3VibWVudScpO1xuICAgIHZhciAkdGFibWVudSA9ICQoJy5qcy1zdGlja3ktdGFibWVudScpO1xuICAgIHZhciAkaGVhZGVyID0gJCgnLmpzLXN0aWNreS1oZWFkZXIgLnRtLWhlYWRlcicpO1xuICAgIHZhciBvZmZzZXRUb3BNZWRpdW0gPSAxMDI7XG4gICAgdmFyIG9mZnNldFRvcFNtYWxsID0gNjI7XG5cbiAgICAvLyBTbGlkZSB0byBhbmNob3JcbiAgICAkKCcuanMtc2VjdGlvbi1tZW51IGEnKS5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB2YXIgaHJlZiA9ICQodGhpcykuYXR0cignaHJlZicpO1xuXG4gICAgICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdqcy1saW5rJykgfHwgaHJlZi5pbmRleE9mKCcjJykgPT0gJy0xJykge1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgYVRhZyA9ICQoJCh0aGlzKS5hdHRyKCdocmVmJykpO1xuXG4gICAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJ3VsJykuZmluZCgnLmFjdGl2ZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnbGknKS5hZGRDbGFzcygnYWN0aXZlJyk7XG5cbiAgICAgICAgICAgIHNjcm9sbFRvcChhVGFnKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgJCgnLmpzLXNlY3Rpb24tbWVudS1tb2JpbGUnKS5vbignc2VsZWN0MjpzZWxlY3RpbmcnLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIHZhciBhVGFnID0gJCgkKCcuanMtc2VjdGlvbi1tZW51LW1vYmlsZScpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmF0dHIoJ2RhdGEtaHJlZicpKTtcblxuICAgICAgICBpZiAoJCh0aGlzKS5maW5kKFwiOnNlbGVjdGVkXCIpLmhhc0NsYXNzKCdqcy1saW5rJykpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICQodGhpcykuZmluZChcIjpzZWxlY3RlZFwiKS5kYXRhKCdocmVmJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY3JvbGxUb3AoYVRhZyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIHNjcm9sbFRvcChhVGFnKSB7XG4gICAgICAgIGlmICghYVRhZy5vZmZzZXQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG9mZnNldCA9IHNldE9mZnNldFRvcCgpICsgJHN1Ym1lbnUub3V0ZXJIZWlnaHQodHJ1ZSk7XG4gICAgICAgICQoJ2h0bWwsYm9keScpLmFuaW1hdGUoe3Njcm9sbFRvcDogYVRhZy5vZmZzZXQoKS50b3AsIGVhc2U6ICdlYXNlaW5vdXQnfSwgNTAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc01vYmlsZSgpIHtcbiAgICAgICAgcmV0dXJuICF3aW5kb3cubWF0Y2hNZWRpYSgnKG1pbi13aWR0aDogMTIyMHB4KScpLm1hdGNoZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9wKCkge1xuXG4gICAgICAgIHZhciBvZmZzZXRUb3AgPSBvZmZzZXRUb3BTbWFsbDtcblxuICAgICAgICBpZighaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgb2Zmc2V0VG9wID0gb2Zmc2V0VG9wTWVkaXVtO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9mZnNldFRvcDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb3BUYWJzKCkge1xuXG4gICAgICAgIHZhciBvZmZzZXRUb3AgPSBvZmZzZXRUb3BTbWFsbDtcblxuICAgICAgICBpZighaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgb2Zmc2V0VG9wID0gb2Zmc2V0VG9wTWVkaXVtO1xuICAgICAgICB9XG5cblxuICAgICAgICByZXR1cm4gb2Zmc2V0VG9wO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0aWNreVN1Ym1lbnUoKSB7XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHRvcDogc2V0T2Zmc2V0VG9wKCksXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uOiAndWstYW5pbWF0aW9uLXNsaWRlLXRvcCdcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiBVSWtpdC5zdGlja3koJHN1Ym1lbnUsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgJHN1Ym1lbnUub24oe1xuICAgICAgICAgICAgJ2FjdGl2ZS51ay5zdGlja3knIDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgJCgnYm9keScpLmFkZENsYXNzKCdzdGlja3ktc3VibWVudScpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdpbmFjdGl2ZS51ay5zdGlja3knIDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdzdGlja3ktc3VibWVudScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAkKHdpbmRvdykub24oJ3Jlc2l6ZScsIFVJa2l0LlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uIChldmVudCkge1xuXG4gICAgICAgICAgICBVSWtpdC5zdGlja3koJHN1Ym1lbnUpLm9wdGlvbnMudG9wID0gc2V0T2Zmc2V0VG9wKCk7XG5cbiAgICAgICAgfSwgMjAwKSk7XG5cbiAgICAgICAgaW5pdCA9IGluaXQoKTtcbiAgICB9XG5cbiAgICB2YXIgc3RpY2t5U3VibWVudSA9IHN0aWNreVN1Ym1lbnUoKTtcblxuXG4gICAgZnVuY3Rpb24gc3RpY2t5VGFibWVudSgpIHtcbiAgICAgICAgdmFyIGVsZW0gPSAkKCcuanMtc3RpY2t5LXRhYm1lbnUnKTtcblxuICAgICAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdG9wOiBzZXRPZmZzZXRUb3BUYWJzKCksXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uOiAndWstYW5pbWF0aW9uLXNsaWRlLXRvcCcsXG4gICAgICAgICAgICAgICAgYm91bmRhcnk6ICcjYm91bmRhcnknXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICByZXR1cm4gVUlraXQuc3RpY2t5KGVsZW0sIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxlbS5vbih7XG4gICAgICAgICAgICAnYWN0aXZlLnVrLnN0aWNreScgOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ3N0aWNreS10YWJtZW51Jyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ2luYWN0aXZlLnVrLnN0aWNreScgOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ3N0aWNreS10YWJtZW51Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQod2luZG93KS5vbigncmVzaXplJywgVUlraXQuVXRpbHMuZGVib3VuY2UoZnVuY3Rpb24gKGV2ZW50KSB7XG5cbiAgICAgICAgICAgIFVJa2l0LnN0aWNreShlbGVtKS5vcHRpb25zLnRvcCA9IHNldE9mZnNldFRvcFRhYnMoKTtcblxuICAgICAgICB9LCAyMDApKTtcblxuICAgICAgICBpbml0ID0gaW5pdCgpO1xuICAgIH1cblxuICAgIHZhciBzdGlja3lUYWJtZW51ID0gc3RpY2t5VGFibWVudSgpO1xuXG4gICAgJCgnLmpzLXN0aWNreS10YWJtZW51Jykub24oJ3Nob3cudWsuc3dpdGNoZXInLCBmdW5jdGlvbigpIHtcblxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9ICQoJy5qcy10YWJzLWNvbnRlbnQnKS5vZmZzZXQoKS50b3AgLSAkKCcuanMtc3RpY2t5LXRhYm1lbnUnKS5vdXRlckhlaWdodCh0cnVlKSAtIHNldE9mZnNldFRvcCgpO1xuICAgICAgICAgICAgJCgnaHRtbCxib2R5JykuYW5pbWF0ZSh7c2Nyb2xsVG9wOiBvZmZzZXQsIGVhc2U6ICdlYXNlaW5vdXQnfSwgMCk7XG5cbiAgICAgICAgfSwgNTApO1xuXG4gICAgfSk7XG5cblxufSkoalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCk7XG4iLCIoZnVuY3Rpb24gKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIC8vIEZpbGwgVGFibGUgd2l0aCBlbXB0eSBpdGVtcyBpZiBuZWVkZWRcbiAgICBmdW5jdGlvbiBmaWxsVGFibGUoKSB7XG4gICAgICAgIHZhciBjb250YWluZXIgPSAkKCcuanMtdG0tdGFibGUnKTtcbiAgICAgICAgdmFyIGVtcHR5ID0gJzxkaXYgY2xhc3M9XCJ0bS10YWJsZV9fZ3JpZCB0bS10YWJsZV9fZ3JpZF9faXRlbSB0bS10YWJsZV9fZ3JpZC0tZW1wdHlcIj48L2Rpdj4nXG4gICAgICAgIHZhciBpdGVtc0FycmF5ID0gW107XG4gICAgICAgIHZhciBtYXhSb3dzID0gW107XG4gICAgICAgIHZhciBmaWxsID0gMDtcblxuICAgICAgICAkLmVhY2goY29udGFpbmVyLCBmdW5jdGlvbiBnZXRJdGVtcyhpKSB7XG4gICAgICAgICAgICBpdGVtc0FycmF5W2ldID0gW107XG4gICAgICAgICAgICAkKHRoaXMpLmZpbmQoJy50bS10YWJsZS1pdGVtJykuZWFjaChmdW5jdGlvbiBnZXRJdGVtc0lubmVyIChmKSB7XG4gICAgICAgICAgICAgICAgdmFyIGl0ZW1zID0gJCh0aGlzKS5kYXRhKCdpdGVtcycpO1xuICAgICAgICAgICAgICAgIHZhciBjb2xzID0gJCh0aGlzKS5kYXRhKCdjb2xzJyk7XG4gICAgICAgICAgICAgICAgdmFyIHJvd3MgPSBNYXRoLmNlaWwoaXRlbXMgLyBjb2xzKTtcblxuICAgICAgICAgICAgICAgIGl0ZW1zQXJyYXlbaV1bZl0gPSBbaXRlbXMsIGNvbHMsIHJvd3NdO1xuXG4gICAgICAgICAgICAgICAgaWYobWF4Um93c1tpXSA8IHJvd3MgfHwgbWF4Um93c1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1heFJvd3NbaV0gPSByb3dzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICAkLmVhY2goaXRlbXNBcnJheSwgZnVuY3Rpb24gc2V0SXRlbXMoaSwgZSkge1xuXG4gICAgICAgICAgICAkLmVhY2goZSwgZnVuY3Rpb24gc2V0SXRlbXNJbm5lciAoZiwgZykge1xuXG4gICAgICAgICAgICAgICAgaWYoZ1sxXSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGdbM10gIT0gbWF4Um93c1tpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IG1heFJvd3NbaV0gLSBnWzBdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IodmFyIG0gPSAwOyBtIDwgZmlsbDsgbSsrICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5qcy10bS10YWJsZTplcSgnICsgaSArICcpJykuZmluZCgnLnRtLXRhYmxlLWl0ZW06ZXEoJyArIGYgKyAnKScpLmFwcGVuZCgkKGVtcHR5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZihnWzFdID09IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoZ1szXSAhPSBtYXhSb3dzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gbWF4Um93c1tpXSAqIGdbMV0gLSBnWzBdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IodmFyIG0gPSAwOyBtIDwgZmlsbDsgbSsrICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5qcy10bS10YWJsZTplcSgnICsgaSArICcpJykuZmluZCgnLnRtLXRhYmxlLWl0ZW06ZXEoJyArIGYgKyAnKScpLmZpbmQoJy50bS10YWJsZV9fZ3JpZF9fY29udGFpbmVyJykuYXBwZW5kKCQoZW1wdHkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmaWxsVGFibGUoKTtcblxufSkoalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCk7XG4iLCIoZnVuY3Rpb24gKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBzZWxlY3RvciA9ICQoJy5qcy1kb3dubG9hZC10b2dnbGUgaW5wdXRbdHlwZT1jaGVja2JveF0nKTtcbiAgICB2YXIgdGFyZ2V0ID0gJCgnLmpzLWRvd25sb2FkLWJ1dHRvbicpO1xuXG4gICAgc2VsZWN0b3Iub24oJ2NoYW5nZScsIGZ1bmN0aW9uIHRvZ2dsZURvd25sb2FkQnV0dG9uKCkge1xuXG4gICAgICAgIGlmKHRhcmdldC5oYXNDbGFzcygncGFuZWwtZG93bmxvYWQtLWhpZGRlbicpKSB7XG4gICAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJ2RpdicpLmZhZGVPdXQoZnVuY3Rpb24gYnV0dG9uRmFkZUluKCkge1xuICAgICAgICAgICAgICAgIHRhcmdldC5mYWRlSW4oKS5yZW1vdmVDbGFzcygncGFuZWwtZG93bmxvYWQtLWhpZGRlbicpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfVxuICAgIH0pO1xuXG59KShqUXVlcnksIHdpbmRvdywgd2luZG93LmRvY3VtZW50KTtcbiIsIihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIHZpZGVvSG92ZXIgPSAoZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgICAgICAkKCcuanMtdmlkZW8taG92ZXInKS5ob3ZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCd2aWRlbycpWzBdLnBsYXkoKTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ3ZpZGVvJylbMF0ucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ3ZpZGVvJylbMF0uY3VycmVudFRpbWUgPSAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5pdDogaW5pdFxuICAgICAgICB9O1xuICAgIH0pKCk7XG5cbiAgICB2YXIgdmlkZW9MaW5rcyA9IChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgICAgICQoJy5qcy12aWRlby1saW5rcycpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciAkbGlua3MgPSAkKHRoaXMpLmZpbmQoJy50bS1wYW5lbC1zdG9yeV9fbGlua3MgbGknKTtcbiAgICAgICAgICAgICAgICB2YXIgbnVtYmVyT2ZMaW5rcyA9ICRsaW5rcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAvLyBicmVhayBpZiBsZXNzIHRoYW4gMiBsaW5rc1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXJPZkxpbmtzIDw9IDEpIHJldHVybjtcblxuICAgICAgICAgICAgICAgICRsaW5rcy5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgJGxpbmsgPSAkKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgJHBhcmVudFBhbmVsID0gJGxpbmsucGFyZW50cygnLmpzLXBhbmVsLXN0b3J5Jyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciAkdmlkZW9FbGVtZW50ID0gJHBhcmVudFBhbmVsLmZpbmQoJ3ZpZGVvJykuZXEoaW5kZXgpO1xuXG4gICAgICAgICAgICAgICAgICAgICRsaW5rLmhvdmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgYWxsIHZpZGVvc1xuICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmVudFBhbmVsLmZpbmQoJ3ZpZGVvJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3cgdGhlIGNvcnJlY3QgdmlkZW9cbiAgICAgICAgICAgICAgICAgICAgICAgICR2aWRlb0VsZW1lbnQuY3NzKCdkaXNwbGF5JywgJ2lubGluZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgcGxheWluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgJHZpZGVvRWxlbWVudFswXS5wbGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3AgcGxheWluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgJHZpZGVvRWxlbWVudFswXS5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdmlkZW9cbiAgICAgICAgICAgICAgICAgICAgICAgICR2aWRlb0VsZW1lbnRbMF0uY3VycmVudFRpbWUgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluaXQ6IGluaXRcbiAgICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgdmFyIHZpZGVvU3dpdGNoUG9zdGVyID0gKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBmdW5jdGlvbiBpbml0KCkge1xuXG4gICAgICAgICAgICAvLyQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIC8vICAgIGNoZWNrV2luZG93V2lkdGgoKTtcbiAgICAgICAgICAgIC8vfSk7XG5cbiAgICAgICAgICAgIGNoZWNrV2luZG93V2lkdGgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrV2luZG93V2lkdGgoKSB7XG4gICAgICAgICAgICB2YXIgd1dpZHRoID0gJCh3aW5kb3cpLndpZHRoKCk7XG5cbiAgICAgICAgICAgIGlmICh3V2lkdGggPiA3NjcpIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VWaWRlb1Bvc3RlcignbGFyZ2UnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod1dpZHRoID4gMzIwKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlVmlkZW9Qb3N0ZXIoJ21lZGl1bScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VWaWRlb1Bvc3Rlcignc21hbGwnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gY2hhbmdlVmlkZW9Qb3N0ZXIocG9zdGVyU2l6ZSkge1xuXG4gICAgICAgICAgICAkKCd2aWRlbycpLmVhY2goZnVuY3Rpb24gKGksIGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB2YXIgcG9zdGVyVXJsID0gJChlbGVtZW50KS5kYXRhKCdwb3N0ZXItJyArIHBvc3RlclNpemUpO1xuICAgICAgICAgICAgICAgICQoZWxlbWVudCkuYXR0cigncG9zdGVyJywgcG9zdGVyVXJsKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5pdDogaW5pdFxuICAgICAgICB9O1xuICAgIH0pKCk7XG5cbiAgICB2YXIgdmlkZW9Db250cm9scyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkdmlkZW9Db250YWluZXIgPSAkKCcuanMtdmlkZW8nKSxcbiAgICAgICAgICAgICR2aWRlbyA9ICR2aWRlb0NvbnRhaW5lci5maW5kKCd2aWRlbycpLFxuICAgICAgICAgICAgJHBsYXlDb250cm9sID0gJCgnLmpzLXZpZGVvLXBsYXknKSxcbiAgICAgICAgICAgICRwYXVzZUNvbnRyb2wgPSAkKCcuanMtdmlkZW8tcGF1c2UnKSxcbiAgICAgICAgICAgICRtdXRlQ29udHJvbCA9ICQoJy5qcy12aWRlby1tdXRlJyk7XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcblxuICAgICAgICAgICAgJHBsYXlDb250cm9sLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICB2aWRlbyA9ICR0aGlzLnBhcmVudHMoJy5qcy12aWRlbycpLmZpbmQoJ3ZpZGVvJylbMF07XG5cbiAgICAgICAgICAgICAgICAkKHZpZGVvKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcblxuICAgICAgICAgICAgICAgIHZpZGVvLnBsYXkoKTtcblxuICAgICAgICAgICAgICAgIGlmICgkKCdodG1sJykuaGFzQ2xhc3MoJ3VrLXRvdWNoJykgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhtYXgtd2lkdGg6IDEwMjRweCknKS5tYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZUZ1bGxTY3JlZW4odmlkZW8pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW8ucmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5yZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlby5tb3pSZXF1ZXN0RnVsbFNjcmVlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLm1velJlcXVlc3RGdWxsU2NyZWVuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZpZGVvLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8ud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW8ud2Via2l0RW50ZXJGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8ud2Via2l0RW50ZXJGdWxsU2NyZWVuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJHRoaXMuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICAgICAgICAgJHBhdXNlQ29udHJvbC5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWJsb2NrJyk7XG4gICAgICAgICAgICAgICAgICAgICRtdXRlQ29udHJvbC5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWJsb2NrJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEkdmlkZW9Db250YWluZXIuaGFzQ2xhc3MoJ3RtLXZpZGVvLS0taXMtcGxheWluZycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkdmlkZW9Db250YWluZXIuYWRkQ2xhc3MoJ3RtLXZpZGVvLS1pcy1wbGF5aW5nJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBpZiB2aWRlbyBlbmRlZCBoaWRlIGl0IGFuZCBzaG93IGltYWdlXG4gICAgICAgICAgICAgICAgJCh2aWRlbykub24oJ2VuZGVkJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgJCh2aWRlbykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSAwO1xuICAgICAgICAgICAgICAgICAgICAkdmlkZW9Db250YWluZXIucmVtb3ZlQ2xhc3MoJ3RtLXZpZGVvLS1pcy1wbGF5aW5nJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgJHBhdXNlQ29udHJvbC5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAgICAgICAgICAgICAkbXV0ZUNvbnRyb2wuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICAgICAgICAgJHBsYXlDb250cm9sLmNzcygnZGlzcGxheScsICdpbmxpbmUtYmxvY2snKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICRwYXVzZUNvbnRyb2wub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcztcbiAgICAgICAgICAgICAgICBoYW5kbGVQYXVzZShlbGVtZW50KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAkbXV0ZUNvbnRyb2wub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgIHZpZGVvID0gJHRoaXMucGFyZW50cygnLmpzLXZpZGVvJykuZmluZCgndmlkZW8nKVswXTtcblxuICAgICAgICAgICAgICAgICh2aWRlby5tdXRlZCkgPyB2aWRlby5tdXRlZCA9IGZhbHNlIDogdmlkZW8ubXV0ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgJHRoaXMudG9nZ2xlQ2xhc3MoJ3RtLXZpZGVvLWNvbnRyb2xzX19tdXRlLS1pcy1tdXRlZCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVQYXVzZShlbGVtZW50KSB7XG4gICAgICAgICAgICB2YXIgJHRoaXMgPSAkKGVsZW1lbnQpIHx8ICQodGhpcyksXG4gICAgICAgICAgICAgICAgdmlkZW8gPSAkdGhpcy5wYXJlbnRzKCcuanMtdmlkZW8nKS5maW5kKCd2aWRlbycpWzBdO1xuXG4gICAgICAgICAgICAkdGhpcy5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAgICAgJG11dGVDb250cm9sLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICAkcGxheUNvbnRyb2wuY3NzKCdkaXNwbGF5JywgJ2lubGluZS1ibG9jaycpO1xuXG4gICAgICAgICAgICB2aWRlby5wYXVzZSgpO1xuICAgICAgICAgICAgJHZpZGVvQ29udGFpbmVyLnJlbW92ZUNsYXNzKCd0bS12aWRlby0taXMtcGxheWluZycpO1xuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIiQoJ2h0bWwnKS5oYXNDbGFzcygndWstdG91Y2gnKSB8fCB3aW5kb3cubWF0Y2hNZWRpYSgnKG1heC13aWR0aDogNzY4cHgpJykubWF0Y2hlc1wiLCAkKCdodG1sJykuaGFzQ2xhc3MoJ3VrLXRvdWNoJykgfHwgd2luZG93Lm1hdGNoTWVkaWEoJyhtYXgtd2lkdGg6IDc2OHB4KScpLm1hdGNoZXMpO1xuXG4gICAgICAgICAgICBpZiAoJCgnaHRtbCcpLmhhc0NsYXNzKCd1ay10b3VjaCcpIHx8IHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiA3NjhweCknKS5tYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgJCh2aWRlbykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZUZ1bGxTY3JlZW4odmlkZW8pIHtcbiAgICAgICAgICAgIHZhciBpc0Z1bGxTY3JlZW47XG5cbiAgICAgICAgICAgIC8vIGRlc2t0b3AgY2hyb21lL3NhZmFyaS9vcGVyYS9maXJlZm94IC8gbW9iaWxlIGNocm9tZVxuICAgICAgICAgICAgJChkb2N1bWVudCkub24oJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UgbW96ZnVsbHNjcmVlbmNoYW5nZSBmdWxsc2NyZWVuY2hhbmdlICcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgICAgIGlzRnVsbFNjcmVlbiA9IGNoZWNrRnVsbFNjcmVlbih2aWRlbyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWlzRnVsbFNjcmVlbikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYXVzZSh2aWRlbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGlvcyBzYWZhcmlcbiAgICAgICAgICAgICQodmlkZW8pLm9uKCd3ZWJraXRiZWdpbmZ1bGxzY3JlZW4gd2Via2l0ZW5kZnVsbHNjcmVlbicsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaXNGdWxsU2NyZWVuID0gY2hlY2tGdWxsU2NyZWVuKHZpZGVvKTtcblxuICAgICAgICAgICAgICAgIGlmICghaXNGdWxsU2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVBhdXNlKHZpZGVvKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrRnVsbFNjcmVlbih2aWRlbykge1xuICAgICAgICAgICAgdmFyIGlzRnVsbFNjcmVlbjtcblxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICBpc0Z1bGxTY3JlZW4gPSBkb2N1bWVudC5mdWxsc2NyZWVuO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5tb3pGdWxsU2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgaXNGdWxsU2NyZWVuID0gZG9jdW1lbnQubW96RnVsbFNjcmVlbjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQud2Via2l0SXNGdWxsU2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgaXNGdWxsU2NyZWVuID0gZG9jdW1lbnQud2Via2l0SXNGdWxsU2NyZWVuO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlby53ZWJraXREaXNwbGF5aW5nRnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgIGlzRnVsbFNjcmVlbiA9IHZpZGVvLndlYmtpdERpc3BsYXlpbmdGdWxsc2NyZWVuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpc0Z1bGxTY3JlZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coaXNGdWxsU2NyZWVuKTtcblxuICAgICAgICAgICAgcmV0dXJuIGlzRnVsbFNjcmVlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbml0OiBpbml0XG4gICAgICAgIH07XG5cbiAgICB9KSgpO1xuXG4gICAgdmlkZW9Ib3Zlci5pbml0KCk7XG4gICAgdmlkZW9MaW5rcy5pbml0KCk7XG4gICAgdmlkZW9Td2l0Y2hQb3N0ZXIuaW5pdCgpO1xuICAgIHZpZGVvQ29udHJvbHMuaW5pdCgpO1xuXG59KShqUXVlcnksIHdpbmRvdywgd2luZG93LmRvY3VtZW50KTtcbiIsIiQoZnVuY3Rpb24oKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIFV0aWxzTWF0Y2hIZWlnaHRzID0gKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIGZ1bmN0aW9uIG1hdGNoSGVpZ2h0cyhzZWxlY3Rvcikge1xuICAgICAgICAgICAgVUlraXQuVXRpbHMubWF0Y2hIZWlnaHRzKHNlbGVjdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtYXRjaDogbWF0Y2hIZWlnaHRzXG4gICAgICAgIH07XG4gICAgfSkoKTtcblxuXG4gICAgaWYgKCQoJy5qcy1wYW5lbC1zdG9yeSA+IC50bS1wYW5lbC1zdG9yeV9fYm90dG9tJykubGVuZ3RoID4gMSkge1xuICAgICAgICAkKHdpbmRvdykub24oJ2xvYWQgcmVzaXplIG9yaWVudGF0aW9uY2hhbmdlJywgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgVUlraXQuVXRpbHMuZGVib3VuY2UoVXRpbHNNYXRjaEhlaWdodHMubWF0Y2goJy5qcy1wYW5lbC1zdG9yeSA+IC50bS1wYW5lbC1zdG9yeV9fYm90dG9tJyksIDUwKTtcbiAgICAgICAgfSkoKSk7XG4gICAgfVxuXG4gICAgJCgnLnRtLWhlYWRlciBbZGF0YS11ay1kcm9wZG93bl0nKS5vbignc2hvdy51ay5kcm9wZG93bicsIGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIHZhciAkc2xpZGVyRWxlbWVudCA9ICQodGhpcykuZmluZCgnLmpzLW1lbnUtZGVza3RvcCcpO1xuICAgICAgICB2YXIgJHNsaWRlckVsZW1lbnRzID0gJHNsaWRlckVsZW1lbnQuZmluZCgnbGknKTtcbiAgICAgICAgdmFyIHNsaWRlckNvbmYgPSB7IGluZmluaXRlOiBmYWxzZSB9O1xuXG4gICAgICAgIGlmICgkc2xpZGVyRWxlbWVudC5sZW5ndGgpIHtcblxuICAgICAgICAgICAgaWYgKCRzbGlkZXJFbGVtZW50cy5sZW5ndGggPj0gNCkge1xuICAgICAgICAgICAgICAgIHNsaWRlckNvbmYgPSB7IGluZmluaXRlOiB0cnVlIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFVJa2l0LnNsaWRlcigkc2xpZGVyRWxlbWVudCwgc2xpZGVyQ29uZik7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgLy8gJCh3aW5kb3cpLnRyaWdnZXIoJ3Jlc2l6ZScpO1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3RyaWdnZXIgd2luZG93IHJlc2l6ZScpO1xuICAgICAgICAgICAgfSwgMjAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBVdGlsc01hdGNoSGVpZ2h0cy5tYXRjaCgnLmpzLXBhbmVsLXN0b3J5ID4gLnRtLXBhbmVsLXN0b3J5X19ib3R0b20nKTtcbiAgICAgICAgICAgIFV0aWxzTWF0Y2hIZWlnaHRzLm1hdGNoKCcuanMtbWVudS1kZXNrdG9wLWRyb3Bkb3duLW5hdl9faXRlbScpO1xuXG4gICAgICAgICAgICAvLyAkKHdpbmRvdykudHJpZ2dlcigncmVzaXplJyk7XG4gICAgICAgIH0sIDEwMClcblxuICAgIH0pO1xuXG4gICAgJCgnc2VsZWN0Jykuc2VsZWN0Mih7XG4gICAgICAgIHBsYWNlaG9sZGVyOiAnJyxcbiAgICAgICAgbWluaW11bVJlc3VsdHNGb3JTZWFyY2g6IEluZmluaXR5XG4gICAgfSk7XG5cbiAgICAkKCdbZGF0YS1vd2xjb250cm9sXScpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICQodGhpcykub3dsQ29udHJvbCgpO1xuICAgIH0pO1xuXG59KTtcbiIsIi8qIVxuICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2Mi4yLjRcbiAqIGh0dHA6Ly9qcXVlcnkuY29tL1xuICpcbiAqIEluY2x1ZGVzIFNpenpsZS5qc1xuICogaHR0cDovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxNi0wNS0yMFQxNzoyM1pcbiAqL1xuXG4oZnVuY3Rpb24oIGdsb2JhbCwgZmFjdG9yeSApIHtcblxuXHRpZiAoIHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSBcIm9iamVjdFwiICkge1xuXHRcdC8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVudHMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2Bcblx0XHQvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LlxuXHRcdC8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgXG5cdFx0Ly8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuXG5cdFx0Ly8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC5cblx0XHQvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpKHdpbmRvdyk7XG5cdFx0Ly8gU2VlIHRpY2tldCAjMTQ1NDkgZm9yIG1vcmUgaW5mby5cblx0XHRtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG5cdFx0XHRmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6XG5cdFx0XHRmdW5jdGlvbiggdyApIHtcblx0XHRcdFx0aWYgKCAhdy5kb2N1bWVudCApIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIFwialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoIHcgKTtcblx0XHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0ZmFjdG9yeSggZ2xvYmFsICk7XG5cdH1cblxuLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBpcyBub3QgZGVmaW5lZCB5ZXRcbn0odHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFsICkge1xuXG4vLyBTdXBwb3J0OiBGaXJlZm94IDE4K1xuLy8gQ2FuJ3QgYmUgaW4gc3RyaWN0IG1vZGUsIHNldmVyYWwgbGlicyBpbmNsdWRpbmcgQVNQLk5FVCB0cmFjZVxuLy8gdGhlIHN0YWNrIHZpYSBhcmd1bWVudHMuY2FsbGVyLmNhbGxlZSBhbmQgRmlyZWZveCBkaWVzIGlmXG4vLyB5b3UgdHJ5IHRvIHRyYWNlIHRocm91Z2ggXCJ1c2Ugc3RyaWN0XCIgY2FsbCBjaGFpbnMuICgjMTMzMzUpXG4vL1widXNlIHN0cmljdFwiO1xudmFyIGFyciA9IFtdO1xuXG52YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG5cbnZhciBzbGljZSA9IGFyci5zbGljZTtcblxudmFyIGNvbmNhdCA9IGFyci5jb25jYXQ7XG5cbnZhciBwdXNoID0gYXJyLnB1c2g7XG5cbnZhciBpbmRleE9mID0gYXJyLmluZGV4T2Y7XG5cbnZhciBjbGFzczJ0eXBlID0ge307XG5cbnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7XG5cbnZhciBoYXNPd24gPSBjbGFzczJ0eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgc3VwcG9ydCA9IHt9O1xuXG5cblxudmFyXG5cdHZlcnNpb24gPSBcIjIuMi40XCIsXG5cblx0Ly8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnlcblx0alF1ZXJ5ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXG5cdFx0Ly8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnXG5cdFx0Ly8gTmVlZCBpbml0IGlmIGpRdWVyeSBpcyBjYWxsZWQgKGp1c3QgYWxsb3cgZXJyb3IgdG8gYmUgdGhyb3duIGlmIG5vdCBpbmNsdWRlZClcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xXG5cdC8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUFxuXHRydHJpbSA9IC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZyxcblxuXHQvLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmdcblx0cm1zUHJlZml4ID0gL14tbXMtLyxcblx0cmRhc2hBbHBoYSA9IC8tKFtcXGRhLXpdKS9naSxcblxuXHQvLyBVc2VkIGJ5IGpRdWVyeS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5cdGZjYW1lbENhc2UgPSBmdW5jdGlvbiggYWxsLCBsZXR0ZXIgKSB7XG5cdFx0cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xuXHR9O1xuXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xuXG5cdC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWRcblx0anF1ZXJ5OiB2ZXJzaW9uLFxuXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXG5cblx0Ly8gU3RhcnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvclxuXHRzZWxlY3RvcjogXCJcIixcblxuXHQvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDBcblx0bGVuZ3RoOiAwLFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzbGljZS5jYWxsKCB0aGlzICk7XG5cdH0sXG5cblx0Ly8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUlxuXHQvLyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheVxuXHRnZXQ6IGZ1bmN0aW9uKCBudW0gKSB7XG5cdFx0cmV0dXJuIG51bSAhPSBudWxsID9cblxuXHRcdFx0Ly8gUmV0dXJuIGp1c3QgdGhlIG9uZSBlbGVtZW50IGZyb20gdGhlIHNldFxuXHRcdFx0KCBudW0gPCAwID8gdGhpc1sgbnVtICsgdGhpcy5sZW5ndGggXSA6IHRoaXNbIG51bSBdICkgOlxuXG5cdFx0XHQvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyBpbiBhIGNsZWFuIGFycmF5XG5cdFx0XHRzbGljZS5jYWxsKCB0aGlzICk7XG5cdH0sXG5cblx0Ly8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFja1xuXHQvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldClcblx0cHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cblx0XHQvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldFxuXHRcdHZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTtcblxuXHRcdC8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpXG5cdFx0cmV0LnByZXZPYmplY3QgPSB0aGlzO1xuXHRcdHJldC5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuXG5cdFx0Ly8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXRcblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdC8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuXG5cdGVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7XG5cdH0sXG5cblx0bWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0c2xpY2U6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApICk7XG5cdH0sXG5cblx0Zmlyc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVxKCAwICk7XG5cdH0sXG5cblx0bGFzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIC0xICk7XG5cdH0sXG5cblx0ZXE6IGZ1bmN0aW9uKCBpICkge1xuXHRcdHZhciBsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdGogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApO1xuXHR9LFxuXG5cdGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCB0aGlzLmNvbnN0cnVjdG9yKCk7XG5cdH0sXG5cblx0Ly8gRm9yIGludGVybmFsIHVzZSBvbmx5LlxuXHQvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC5cblx0cHVzaDogcHVzaCxcblx0c29ydDogYXJyLnNvcnQsXG5cdHNwbGljZTogYXJyLnNwbGljZVxufTtcblxualF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHtcblx0dmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lLFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgMCBdIHx8IHt9LFxuXHRcdGkgPSAxLFxuXHRcdGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cdFx0ZGVlcCA9IGZhbHNlO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKCB0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRkZWVwID0gdGFyZ2V0O1xuXG5cdFx0Ly8gU2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgaSBdIHx8IHt9O1xuXHRcdGkrKztcblx0fVxuXG5cdC8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KVxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgIT09IFwib2JqZWN0XCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKCB0YXJnZXQgKSApIHtcblx0XHR0YXJnZXQgPSB7fTtcblx0fVxuXG5cdC8vIEV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHBhc3NlZFxuXHRpZiAoIGkgPT09IGxlbmd0aCApIHtcblx0XHR0YXJnZXQgPSB0aGlzO1xuXHRcdGktLTtcblx0fVxuXG5cdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXG5cdFx0Ly8gT25seSBkZWFsIHdpdGggbm9uLW51bGwvdW5kZWZpbmVkIHZhbHVlc1xuXHRcdGlmICggKCBvcHRpb25zID0gYXJndW1lbnRzWyBpIF0gKSAhPSBudWxsICkge1xuXG5cdFx0XHQvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0XG5cdFx0XHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRcdHNyYyA9IHRhcmdldFsgbmFtZSBdO1xuXHRcdFx0XHRjb3B5ID0gb3B0aW9uc1sgbmFtZSBdO1xuXG5cdFx0XHRcdC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3Bcblx0XHRcdFx0aWYgKCB0YXJnZXQgPT09IGNvcHkgKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcblx0XHRcdFx0aWYgKCBkZWVwICYmIGNvcHkgJiYgKCBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29weSApIHx8XG5cdFx0XHRcdFx0KCBjb3B5SXNBcnJheSA9IGpRdWVyeS5pc0FycmF5KCBjb3B5ICkgKSApICkge1xuXG5cdFx0XHRcdFx0aWYgKCBjb3B5SXNBcnJheSApIHtcblx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNBcnJheSggc3JjICkgPyBzcmMgOiBbXTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggc3JjICkgPyBzcmMgOiB7fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW1cblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlc1xuXHRcdFx0XHR9IGVsc2UgaWYgKCBjb3B5ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0dGFyZ2V0WyBuYW1lIF0gPSBjb3B5O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBtb2RpZmllZCBvYmplY3Rcblx0cmV0dXJuIHRhcmdldDtcbn07XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2Vcblx0ZXhwYW5kbzogXCJqUXVlcnlcIiArICggdmVyc2lvbiArIE1hdGgucmFuZG9tKCkgKS5yZXBsYWNlKCAvXFxEL2csIFwiXCIgKSxcblxuXHQvLyBBc3N1bWUgalF1ZXJ5IGlzIHJlYWR5IHdpdGhvdXQgdGhlIHJlYWR5IG1vZHVsZVxuXHRpc1JlYWR5OiB0cnVlLFxuXG5cdGVycm9yOiBmdW5jdGlvbiggbXNnICkge1xuXHRcdHRocm93IG5ldyBFcnJvciggbXNnICk7XG5cdH0sXG5cblx0bm9vcDogZnVuY3Rpb24oKSB7fSxcblxuXHRpc0Z1bmN0aW9uOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHJldHVybiBqUXVlcnkudHlwZSggb2JqICkgPT09IFwiZnVuY3Rpb25cIjtcblx0fSxcblxuXHRpc0FycmF5OiBBcnJheS5pc0FycmF5LFxuXG5cdGlzV2luZG93OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7XG5cdH0sXG5cblx0aXNOdW1lcmljOiBmdW5jdGlvbiggb2JqICkge1xuXG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKG51bGx8dHJ1ZXxmYWxzZXxcIlwiKVxuXHRcdC8vIC4uLmJ1dCBtaXNpbnRlcnByZXRzIGxlYWRpbmctbnVtYmVyIHN0cmluZ3MsIHBhcnRpY3VsYXJseSBoZXggbGl0ZXJhbHMgKFwiMHguLi5cIilcblx0XHQvLyBzdWJ0cmFjdGlvbiBmb3JjZXMgaW5maW5pdGllcyB0byBOYU5cblx0XHQvLyBhZGRpbmcgMSBjb3JyZWN0cyBsb3NzIG9mIHByZWNpc2lvbiBmcm9tIHBhcnNlRmxvYXQgKCMxNTEwMClcblx0XHR2YXIgcmVhbFN0cmluZ09iaiA9IG9iaiAmJiBvYmoudG9TdHJpbmcoKTtcblx0XHRyZXR1cm4gIWpRdWVyeS5pc0FycmF5KCBvYmogKSAmJiAoIHJlYWxTdHJpbmdPYmogLSBwYXJzZUZsb2F0KCByZWFsU3RyaW5nT2JqICkgKyAxICkgPj0gMDtcblx0fSxcblxuXHRpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBrZXk7XG5cblx0XHQvLyBOb3QgcGxhaW4gb2JqZWN0czpcblx0XHQvLyAtIEFueSBvYmplY3Qgb3IgdmFsdWUgd2hvc2UgaW50ZXJuYWwgW1tDbGFzc11dIHByb3BlcnR5IGlzIG5vdCBcIltvYmplY3QgT2JqZWN0XVwiXG5cdFx0Ly8gLSBET00gbm9kZXNcblx0XHQvLyAtIHdpbmRvd1xuXHRcdGlmICggalF1ZXJ5LnR5cGUoIG9iaiApICE9PSBcIm9iamVjdFwiIHx8IG9iai5ub2RlVHlwZSB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIE5vdCBvd24gY29uc3RydWN0b3IgcHJvcGVydHkgbXVzdCBiZSBPYmplY3Rcblx0XHRpZiAoIG9iai5jb25zdHJ1Y3RvciAmJlxuXHRcdFx0XHQhaGFzT3duLmNhbGwoIG9iaiwgXCJjb25zdHJ1Y3RvclwiICkgJiZcblx0XHRcdFx0IWhhc093bi5jYWxsKCBvYmouY29uc3RydWN0b3IucHJvdG90eXBlIHx8IHt9LCBcImlzUHJvdG90eXBlT2ZcIiApICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIE93biBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhdGVkIGZpcnN0bHksIHNvIHRvIHNwZWVkIHVwLFxuXHRcdC8vIGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duXG5cdFx0Zm9yICgga2V5IGluIG9iaiApIHt9XG5cblx0XHRyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgfHwgaGFzT3duLmNhbGwoIG9iaiwga2V5ICk7XG5cdH0sXG5cblx0aXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblx0XHR2YXIgbmFtZTtcblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0dHlwZTogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRpZiAoIG9iaiA9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIG9iaiArIFwiXCI7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjAsIGlPUzw2IChmdW5jdGlvbmlzaCBSZWdFeHApXG5cdFx0cmV0dXJuIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiID9cblx0XHRcdGNsYXNzMnR5cGVbIHRvU3RyaW5nLmNhbGwoIG9iaiApIF0gfHwgXCJvYmplY3RcIiA6XG5cdFx0XHR0eXBlb2Ygb2JqO1xuXHR9LFxuXG5cdC8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0XG5cdGdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBjb2RlICkge1xuXHRcdHZhciBzY3JpcHQsXG5cdFx0XHRpbmRpcmVjdCA9IGV2YWw7XG5cblx0XHRjb2RlID0galF1ZXJ5LnRyaW0oIGNvZGUgKTtcblxuXHRcdGlmICggY29kZSApIHtcblxuXHRcdFx0Ly8gSWYgdGhlIGNvZGUgaW5jbHVkZXMgYSB2YWxpZCwgcHJvbG9ndWUgcG9zaXRpb25cblx0XHRcdC8vIHN0cmljdCBtb2RlIHByYWdtYSwgZXhlY3V0ZSBjb2RlIGJ5IGluamVjdGluZyBhXG5cdFx0XHQvLyBzY3JpcHQgdGFnIGludG8gdGhlIGRvY3VtZW50LlxuXHRcdFx0aWYgKCBjb2RlLmluZGV4T2YoIFwidXNlIHN0cmljdFwiICkgPT09IDEgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2NyaXB0XCIgKTtcblx0XHRcdFx0c2NyaXB0LnRleHQgPSBjb2RlO1xuXHRcdFx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHQgKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTtcblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBhdm9pZCB0aGUgRE9NIG5vZGUgY3JlYXRpb24sIGluc2VydGlvblxuXHRcdFx0XHQvLyBhbmQgcmVtb3ZhbCBieSB1c2luZyBhbiBpbmRpcmVjdCBnbG9iYWwgZXZhbFxuXG5cdFx0XHRcdGluZGlyZWN0KCBjb2RlICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXNcblx0Ly8gU3VwcG9ydDogSUU5LTExK1xuXHQvLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpXG5cdGNhbWVsQ2FzZTogZnVuY3Rpb24oIHN0cmluZyApIHtcblx0XHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHJtc1ByZWZpeCwgXCJtcy1cIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTtcblx0fSxcblxuXHRub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cdH0sXG5cblx0ZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGxlbmd0aCwgaSA9IDA7XG5cblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHtcblx0XHRcdGxlbmd0aCA9IG9iai5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBvYmogKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iajtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMVxuXHR0cmltOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRyZXR1cm4gdGV4dCA9PSBudWxsID9cblx0XHRcdFwiXCIgOlxuXHRcdFx0KCB0ZXh0ICsgXCJcIiApLnJlcGxhY2UoIHJ0cmltLCBcIlwiICk7XG5cdH0sXG5cblx0Ly8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnIsIHJlc3VsdHMgKSB7XG5cdFx0dmFyIHJldCA9IHJlc3VsdHMgfHwgW107XG5cblx0XHRpZiAoIGFyciAhPSBudWxsICkge1xuXHRcdFx0aWYgKCBpc0FycmF5TGlrZSggT2JqZWN0KCBhcnIgKSApICkge1xuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHJldCxcblx0XHRcdFx0XHR0eXBlb2YgYXJyID09PSBcInN0cmluZ1wiID9cblx0XHRcdFx0XHRbIGFyciBdIDogYXJyXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmNhbGwoIHJldCwgYXJyICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHRpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyLCBpICkge1xuXHRcdHJldHVybiBhcnIgPT0gbnVsbCA/IC0xIDogaW5kZXhPZi5jYWxsKCBhcnIsIGVsZW0sIGkgKTtcblx0fSxcblxuXHRtZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7XG5cdFx0dmFyIGxlbiA9ICtzZWNvbmQubGVuZ3RoLFxuXHRcdFx0aiA9IDAsXG5cdFx0XHRpID0gZmlyc3QubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTtcblx0XHR9XG5cblx0XHRmaXJzdC5sZW5ndGggPSBpO1xuXG5cdFx0cmV0dXJuIGZpcnN0O1xuXHR9LFxuXG5cdGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHtcblx0XHR2YXIgY2FsbGJhY2tJbnZlcnNlLFxuXHRcdFx0bWF0Y2hlcyA9IFtdLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0XHRjYWxsYmFja0V4cGVjdCA9ICFpbnZlcnQ7XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zXG5cdFx0Ly8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cblx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdGNhbGxiYWNrSW52ZXJzZSA9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApO1xuXHRcdFx0aWYgKCBjYWxsYmFja0ludmVyc2UgIT09IGNhbGxiYWNrRXhwZWN0ICkge1xuXHRcdFx0XHRtYXRjaGVzLnB1c2goIGVsZW1zWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlcztcblx0fSxcblxuXHQvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7XG5cdFx0dmFyIGxlbmd0aCwgdmFsdWUsXG5cdFx0XHRpID0gMCxcblx0XHRcdHJldCA9IFtdO1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyIG5ldyB2YWx1ZXNcblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBlbGVtcyApICkge1xuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCxcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBlbGVtcyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRcdHJldHVybiBjb25jYXQuYXBwbHkoIFtdLCByZXQgKTtcblx0fSxcblxuXHQvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHNcblx0Z3VpZDogMSxcblxuXHQvLyBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0LCBvcHRpb25hbGx5IHBhcnRpYWxseSBhcHBseWluZyBhbnlcblx0Ly8gYXJndW1lbnRzLlxuXHRwcm94eTogZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkge1xuXHRcdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xuXG5cdFx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHRtcCA9IGZuWyBjb250ZXh0IF07XG5cdFx0XHRjb250ZXh0ID0gZm47XG5cdFx0XHRmbiA9IHRtcDtcblx0XHR9XG5cblx0XHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHRcdC8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuXG5cdFx0aWYgKCAhalF1ZXJ5LmlzRnVuY3Rpb24oIGZuICkgKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIFNpbXVsYXRlZCBiaW5kXG5cdFx0YXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMiApO1xuXHRcdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZm4uYXBwbHkoIGNvbnRleHQgfHwgdGhpcywgYXJncy5jb25jYXQoIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTtcblx0XHR9O1xuXG5cdFx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdFx0cHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKys7XG5cblx0XHRyZXR1cm4gcHJveHk7XG5cdH0sXG5cblx0bm93OiBEYXRlLm5vdyxcblxuXHQvLyBqUXVlcnkuc3VwcG9ydCBpcyBub3QgdXNlZCBpbiBDb3JlIGJ1dCBvdGhlciBwcm9qZWN0cyBhdHRhY2ggdGhlaXJcblx0Ly8gcHJvcGVydGllcyB0byBpdCBzbyBpdCBuZWVkcyB0byBleGlzdC5cblx0c3VwcG9ydDogc3VwcG9ydFxufSApO1xuXG4vLyBKU0hpbnQgd291bGQgZXJyb3Igb24gdGhpcyBjb2RlIGR1ZSB0byB0aGUgU3ltYm9sIG5vdCBiZWluZyBkZWZpbmVkIGluIEVTNS5cbi8vIERlZmluaW5nIHRoaXMgZ2xvYmFsIGluIC5qc2hpbnRyYyB3b3VsZCBjcmVhdGUgYSBkYW5nZXIgb2YgdXNpbmcgdGhlIGdsb2JhbFxuLy8gdW5ndWFyZGVkIGluIGFub3RoZXIgcGxhY2UsIGl0IHNlZW1zIHNhZmVyIHRvIGp1c3QgZGlzYWJsZSBKU0hpbnQgZm9yIHRoZXNlXG4vLyB0aHJlZSBsaW5lcy5cbi8qIGpzaGludCBpZ25vcmU6IHN0YXJ0ICovXG5pZiAoIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiApIHtcblx0alF1ZXJ5LmZuWyBTeW1ib2wuaXRlcmF0b3IgXSA9IGFyclsgU3ltYm9sLml0ZXJhdG9yIF07XG59XG4vKiBqc2hpbnQgaWdub3JlOiBlbmQgKi9cblxuLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwXG5qUXVlcnkuZWFjaCggXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbFwiLnNwbGl0KCBcIiBcIiApLFxuZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xufSApO1xuXG5mdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkge1xuXG5cdC8vIFN1cHBvcnQ6IGlPUyA4LjIgKG5vdCByZXByb2R1Y2libGUgaW4gc2ltdWxhdG9yKVxuXHQvLyBgaW5gIGNoZWNrIHVzZWQgdG8gcHJldmVudCBKSVQgZXJyb3IgKGdoLTIxNDUpXG5cdC8vIGhhc093biBpc24ndCB1c2VkIGhlcmUgZHVlIHRvIGZhbHNlIG5lZ2F0aXZlc1xuXHQvLyByZWdhcmRpbmcgTm9kZWxpc3QgbGVuZ3RoIGluIElFXG5cdHZhciBsZW5ndGggPSAhIW9iaiAmJiBcImxlbmd0aFwiIGluIG9iaiAmJiBvYmoubGVuZ3RoLFxuXHRcdHR5cGUgPSBqUXVlcnkudHlwZSggb2JqICk7XG5cblx0aWYgKCB0eXBlID09PSBcImZ1bmN0aW9uXCIgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fFxuXHRcdHR5cGVvZiBsZW5ndGggPT09IFwibnVtYmVyXCIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7XG59XG52YXIgU2l6emxlID1cbi8qIVxuICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMi4xXG4gKiBodHRwOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE1LTEwLTE3XG4gKi9cbihmdW5jdGlvbiggd2luZG93ICkge1xuXG52YXIgaSxcblx0c3VwcG9ydCxcblx0RXhwcixcblx0Z2V0VGV4dCxcblx0aXNYTUwsXG5cdHRva2VuaXplLFxuXHRjb21waWxlLFxuXHRzZWxlY3QsXG5cdG91dGVybW9zdENvbnRleHQsXG5cdHNvcnRJbnB1dCxcblx0aGFzRHVwbGljYXRlLFxuXG5cdC8vIExvY2FsIGRvY3VtZW50IHZhcnNcblx0c2V0RG9jdW1lbnQsXG5cdGRvY3VtZW50LFxuXHRkb2NFbGVtLFxuXHRkb2N1bWVudElzSFRNTCxcblx0cmJ1Z2d5UVNBLFxuXHRyYnVnZ3lNYXRjaGVzLFxuXHRtYXRjaGVzLFxuXHRjb250YWlucyxcblxuXHQvLyBJbnN0YW5jZS1zcGVjaWZpYyBkYXRhXG5cdGV4cGFuZG8gPSBcInNpenpsZVwiICsgMSAqIG5ldyBEYXRlKCksXG5cdHByZWZlcnJlZERvYyA9IHdpbmRvdy5kb2N1bWVudCxcblx0ZGlycnVucyA9IDAsXG5cdGRvbmUgPSAwLFxuXHRjbGFzc0NhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0dG9rZW5DYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdGNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHtcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gMDtcblx0fSxcblxuXHQvLyBHZW5lcmFsLXB1cnBvc2UgY29uc3RhbnRzXG5cdE1BWF9ORUdBVElWRSA9IDEgPDwgMzEsXG5cblx0Ly8gSW5zdGFuY2UgbWV0aG9kc1xuXHRoYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaF9uYXRpdmUgPSBhcnIucHVzaCxcblx0cHVzaCA9IGFyci5wdXNoLFxuXHRzbGljZSA9IGFyci5zbGljZSxcblx0Ly8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlXG5cdC8vIGh0dHA6Ly9qc3BlcmYuY29tL3Rob3ItaW5kZXhvZi12cy1mb3IvNVxuXHRpbmRleE9mID0gZnVuY3Rpb24oIGxpc3QsIGVsZW0gKSB7XG5cdFx0dmFyIGkgPSAwLFxuXHRcdFx0bGVuID0gbGlzdC5sZW5ndGg7XG5cdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRpZiAoIGxpc3RbaV0gPT09IGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gLTE7XG5cdH0sXG5cblx0Ym9vbGVhbnMgPSBcImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkXCIsXG5cblx0Ly8gUmVndWxhciBleHByZXNzaW9uc1xuXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc2VsZWN0b3JzLyN3aGl0ZXNwYWNlXG5cdHdoaXRlc3BhY2UgPSBcIltcXFxceDIwXFxcXHRcXFxcclxcXFxuXFxcXGZdXCIsXG5cblx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI3ZhbHVlLWRlZi1pZGVudGlmaWVyXG5cdGlkZW50aWZpZXIgPSBcIig/OlxcXFxcXFxcLnxbXFxcXHctXXxbXlxcXFx4MDAtXFxcXHhhMF0pK1wiLFxuXG5cdC8vIEF0dHJpYnV0ZSBzZWxlY3RvcnM6IGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9yc1xuXHRhdHRyaWJ1dGVzID0gXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF1cIlxuXHRcdFwiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIgKyBpZGVudGlmaWVyICsgXCIpKXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcXFxcXVwiLFxuXG5cdHBzZXVkb3MgPSBcIjooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XFxcXCgoXCIgK1xuXHRcdC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6XG5cdFx0Ly8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpXG5cdFx0XCIoJygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwiKXxcIiArXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXHRcdC8vIDMuIGFueXRoaW5nIGVsc2UgKGNhcHR1cmUgMilcblx0XHRcIi4qXCIgK1xuXHRcdFwiKVxcXFwpfClcIixcblxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXG5cdHJ3aGl0ZXNwYWNlID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwiK1wiLCBcImdcIiApLFxuXHRydHJpbSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIiArIHdoaXRlc3BhY2UgKyBcIiskXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXG5cdHJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCBcIj1cIiArIHdoaXRlc3BhY2UgKyBcIiooW15cXFxcXSdcXFwiXSo/KVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsIFwiZ1wiICksXG5cblx0cnBzZXVkbyA9IG5ldyBSZWdFeHAoIHBzZXVkb3MgKSxcblx0cmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCBcIl5cIiArIGlkZW50aWZpZXIgKyBcIiRcIiApLFxuXG5cdG1hdGNoRXhwciA9IHtcblx0XHRcIklEXCI6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIkNMQVNTXCI6IG5ldyBSZWdFeHAoIFwiXlxcXFwuKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0XCJUQUdcIjogbmV3IFJlZ0V4cCggXCJeKFwiICsgaWRlbnRpZmllciArIFwifFsqXSlcIiApLFxuXHRcdFwiQVRUUlwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRcIlBTRVVET1wiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHBzZXVkb3MgKSxcblx0XHRcIkNISUxEXCI6IG5ldyBSZWdFeHAoIFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKGV2ZW58b2RkfCgoWystXXwpKFxcXFxkKilufClcIiArIHdoaXRlc3BhY2UgKyBcIiooPzooWystXXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdFwiYm9vbFwiOiBuZXcgUmVnRXhwKCBcIl4oPzpcIiArIGJvb2xlYW5zICsgXCIpJFwiLCBcImlcIiApLFxuXHRcdC8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKVxuXHRcdC8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0Y2hpbmcgaW4gYHNlbGVjdGBcblx0XHRcIm5lZWRzQ29udGV4dFwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIgK1xuXHRcdFx0d2hpdGVzcGFjZSArIFwiKigoPzotXFxcXGQpP1xcXFxkKilcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpKD89W14tXXwkKVwiLCBcImlcIiApXG5cdH0sXG5cblx0cmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJoZWFkZXIgPSAvXmhcXGQkL2ksXG5cblx0cm5hdGl2ZSA9IC9eW157XStcXHtcXHMqXFxbbmF0aXZlIFxcdy8sXG5cblx0Ly8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mgc2VsZWN0b3JzXG5cdHJxdWlja0V4cHIgPSAvXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxcblxuXHRyc2libGluZyA9IC9bK35dLyxcblx0cmVzY2FwZSA9IC8nfFxcXFwvZyxcblxuXHQvLyBDU1MgZXNjYXBlcyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjZXNjYXBlZC1jaGFyYWN0ZXJzXG5cdHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoIFwiXFxcXFxcXFwoW1xcXFxkYS1mXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICsgXCI/fChcIiArIHdoaXRlc3BhY2UgKyBcIil8LilcIiwgXCJpZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBfLCBlc2NhcGVkLCBlc2NhcGVkV2hpdGVzcGFjZSApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZWQgLSAweDEwMDAwO1xuXHRcdC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50XG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyNFxuXHRcdC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgK1wiMHhcIlxuXHRcdHJldHVybiBoaWdoICE9PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID9cblx0XHRcdGVzY2FwZWQgOlxuXHRcdFx0aGlnaCA8IDAgP1xuXHRcdFx0XHQvLyBCTVAgY29kZXBvaW50XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHQvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcilcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7XG5cdH0sXG5cblx0Ly8gVXNlZCBmb3IgaWZyYW1lc1xuXHQvLyBTZWUgc2V0RG9jdW1lbnQoKVxuXHQvLyBSZW1vdmluZyB0aGUgZnVuY3Rpb24gd3JhcHBlciBjYXVzZXMgYSBcIlBlcm1pc3Npb24gRGVuaWVkXCJcblx0Ly8gZXJyb3IgaW4gSUVcblx0dW5sb2FkSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuXHRcdHNldERvY3VtZW50KCk7XG5cdH07XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdChhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSxcblx0XHRwcmVmZXJyZWREb2MuY2hpbGROb2Rlc1xuXHQpO1xuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMFxuXHQvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5XG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoX25hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKGVscykgKTtcblx0XHR9IDpcblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5XG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0dmFyIGogPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0XHRpID0gMDtcblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAodGFyZ2V0W2orK10gPSBlbHNbaSsrXSkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbmlkc2VsZWN0LCBtYXRjaCwgZ3JvdXBzLCBuZXdTZWxlY3Rvcixcblx0XHRuZXdDb250ZXh0ID0gY29udGV4dCAmJiBjb250ZXh0Lm93bmVyRG9jdW1lbnQsXG5cblx0XHQvLyBub2RlVHlwZSBkZWZhdWx0cyB0byA5LCBzaW5jZSBjb250ZXh0IGRlZmF1bHRzIHRvIGRvY3VtZW50XG5cdFx0bm9kZVR5cGUgPSBjb250ZXh0ID8gY29udGV4dC5ub2RlVHlwZSA6IDk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gUmV0dXJuIGVhcmx5IGZyb20gY2FsbHMgd2l0aCBpbnZhbGlkIHNlbGVjdG9yIG9yIGNvbnRleHRcblx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgfHwgIXNlbGVjdG9yIHx8XG5cdFx0bm9kZVR5cGUgIT09IDEgJiYgbm9kZVR5cGUgIT09IDkgJiYgbm9kZVR5cGUgIT09IDExICkge1xuXG5cdFx0cmV0dXJuIHJlc3VsdHM7XG5cdH1cblxuXHQvLyBUcnkgdG8gc2hvcnRjdXQgZmluZCBvcGVyYXRpb25zIChhcyBvcHBvc2VkIHRvIGZpbHRlcnMpIGluIEhUTUwgZG9jdW1lbnRzXG5cdGlmICggIXNlZWQgKSB7XG5cblx0XHRpZiAoICggY29udGV4dCA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogcHJlZmVycmVkRG9jICkgIT09IGRvY3VtZW50ICkge1xuXHRcdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0XHR9XG5cdFx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XG5cblx0XHRpZiAoIGRvY3VtZW50SXNIVE1MICkge1xuXG5cdFx0XHQvLyBJZiB0aGUgc2VsZWN0b3IgaXMgc3VmZmljaWVudGx5IHNpbXBsZSwgdHJ5IHVzaW5nIGEgXCJnZXQqQnkqXCIgRE9NIG1ldGhvZFxuXHRcdFx0Ly8gKGV4Y2VwdGluZyBEb2N1bWVudEZyYWdtZW50IGNvbnRleHQsIHdoZXJlIHRoZSBtZXRob2RzIGRvbid0IGV4aXN0KVxuXHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMTEgJiYgKG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApKSApIHtcblxuXHRcdFx0XHQvLyBJRCBzZWxlY3RvclxuXHRcdFx0XHRpZiAoIChtID0gbWF0Y2hbMV0pICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9jdW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdGlmICggbm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggbSApKSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSwgT3BlcmEsIFdlYmtpdFxuXHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBpZGVudGlmeSB2ZXJzaW9uc1xuXHRcdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRcdGlmICggZWxlbS5pZCA9PT0gbSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBFbGVtZW50IGNvbnRleHRcblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSwgT3BlcmEsIFdlYmtpdFxuXHRcdFx0XHRcdFx0Ly8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnNcblx0XHRcdFx0XHRcdC8vIGdldEVsZW1lbnRCeUlkIGNhbiBtYXRjaCBlbGVtZW50cyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdGlmICggbmV3Q29udGV4dCAmJiAoZWxlbSA9IG5ld0NvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgJiZcblx0XHRcdFx0XHRcdFx0Y29udGFpbnMoIGNvbnRleHQsIGVsZW0gKSAmJlxuXHRcdFx0XHRcdFx0XHRlbGVtLmlkID09PSBtICkge1xuXG5cdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVHlwZSBzZWxlY3RvclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFsyXSApIHtcblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdFx0Ly8gQ2xhc3Mgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggKG0gPSBtYXRjaFszXSkgJiYgc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmXG5cdFx0XHRcdFx0Y29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICkge1xuXG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBtICkgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUYWtlIGFkdmFudGFnZSBvZiBxdWVyeVNlbGVjdG9yQWxsXG5cdFx0XHRpZiAoIHN1cHBvcnQucXNhICYmXG5cdFx0XHRcdCFjb21waWxlckNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF0gJiZcblx0XHRcdFx0KCFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBzZWxlY3RvciApKSApIHtcblxuXHRcdFx0XHRpZiAoIG5vZGVUeXBlICE9PSAxICkge1xuXHRcdFx0XHRcdG5ld0NvbnRleHQgPSBjb250ZXh0O1xuXHRcdFx0XHRcdG5ld1NlbGVjdG9yID0gc2VsZWN0b3I7XG5cblx0XHRcdFx0Ly8gcVNBIGxvb2tzIG91dHNpZGUgRWxlbWVudCBjb250ZXh0LCB3aGljaCBpcyBub3Qgd2hhdCB3ZSB3YW50XG5cdFx0XHRcdC8vIFRoYW5rcyB0byBBbmRyZXcgRHVwb250IGZvciB0aGlzIHdvcmthcm91bmQgdGVjaG5pcXVlXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OFxuXHRcdFx0XHQvLyBFeGNsdWRlIG9iamVjdCBlbGVtZW50c1xuXHRcdFx0XHR9IGVsc2UgaWYgKCBjb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHRcdFx0XHQvLyBDYXB0dXJlIHRoZSBjb250ZXh0IElELCBzZXR0aW5nIGl0IGZpcnN0IGlmIG5lY2Vzc2FyeVxuXHRcdFx0XHRcdGlmICggKG5pZCA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCBcImlkXCIgKSkgKSB7XG5cdFx0XHRcdFx0XHRuaWQgPSBuaWQucmVwbGFjZSggcmVzY2FwZSwgXCJcXFxcJCZcIiApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb250ZXh0LnNldEF0dHJpYnV0ZSggXCJpZFwiLCAobmlkID0gZXhwYW5kbykgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmVmaXggZXZlcnkgc2VsZWN0b3IgaW4gdGhlIGxpc3Rcblx0XHRcdFx0XHRncm91cHMgPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblx0XHRcdFx0XHRpID0gZ3JvdXBzLmxlbmd0aDtcblx0XHRcdFx0XHRuaWRzZWxlY3QgPSByaWRlbnRpZmllci50ZXN0KCBuaWQgKSA/IFwiI1wiICsgbmlkIDogXCJbaWQ9J1wiICsgbmlkICsgXCInXVwiO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0Z3JvdXBzW2ldID0gbmlkc2VsZWN0ICsgXCIgXCIgKyB0b1NlbGVjdG9yKCBncm91cHNbaV0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bmV3U2VsZWN0b3IgPSBncm91cHMuam9pbiggXCIsXCIgKTtcblxuXHRcdFx0XHRcdC8vIEV4cGFuZCBjb250ZXh0IGZvciBzaWJsaW5nIHNlbGVjdG9yc1xuXHRcdFx0XHRcdG5ld0NvbnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fFxuXHRcdFx0XHRcdFx0Y29udGV4dDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggbmV3U2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsXG5cdFx0XHRcdFx0XHRcdG5ld0NvbnRleHQucXVlcnlTZWxlY3RvckFsbCggbmV3U2VsZWN0b3IgKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKCBxc2FFcnJvciApIHtcblx0XHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdFx0aWYgKCBuaWQgPT09IGV4cGFuZG8gKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRleHQucmVtb3ZlQXR0cmlidXRlKCBcImlkXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBBbGwgb3RoZXJzXG5cdHJldHVybiBzZWxlY3QoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApO1xufVxuXG4vKipcbiAqIENyZWF0ZSBrZXktdmFsdWUgY2FjaGVzIG9mIGxpbWl0ZWQgc2l6ZVxuICogQHJldHVybnMge2Z1bmN0aW9uKHN0cmluZywgb2JqZWN0KX0gUmV0dXJucyB0aGUgT2JqZWN0IGRhdGEgYWZ0ZXIgc3RvcmluZyBpdCBvbiBpdHNlbGYgd2l0aFxuICpcdHByb3BlcnR5IG5hbWUgdGhlIChzcGFjZS1zdWZmaXhlZCkgc3RyaW5nIGFuZCAoaWYgdGhlIGNhY2hlIGlzIGxhcmdlciB0aGFuIEV4cHIuY2FjaGVMZW5ndGgpXG4gKlx0ZGVsZXRpbmcgdGhlIG9sZGVzdCBlbnRyeVxuICovXG5mdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHtcblx0dmFyIGtleXMgPSBbXTtcblxuXHRmdW5jdGlvbiBjYWNoZSgga2V5LCB2YWx1ZSApIHtcblx0XHQvLyBVc2UgKGtleSArIFwiIFwiKSB0byBhdm9pZCBjb2xsaXNpb24gd2l0aCBuYXRpdmUgcHJvdG90eXBlIHByb3BlcnRpZXMgKHNlZSBJc3N1ZSAjMTU3KVxuXHRcdGlmICgga2V5cy5wdXNoKCBrZXkgKyBcIiBcIiApID4gRXhwci5jYWNoZUxlbmd0aCApIHtcblx0XHRcdC8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllc1xuXHRcdFx0ZGVsZXRlIGNhY2hlWyBrZXlzLnNoaWZ0KCkgXTtcblx0XHR9XG5cdFx0cmV0dXJuIChjYWNoZVsga2V5ICsgXCIgXCIgXSA9IHZhbHVlKTtcblx0fVxuXHRyZXR1cm4gY2FjaGU7XG59XG5cbi8qKlxuICogTWFyayBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVzZSBieSBTaXp6bGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byBtYXJrXG4gKi9cbmZ1bmN0aW9uIG1hcmtGdW5jdGlvbiggZm4gKSB7XG5cdGZuWyBleHBhbmRvIF0gPSB0cnVlO1xuXHRyZXR1cm4gZm47XG59XG5cbi8qKlxuICogU3VwcG9ydCB0ZXN0aW5nIHVzaW5nIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFBhc3NlZCB0aGUgY3JlYXRlZCBkaXYgYW5kIGV4cGVjdHMgYSBib29sZWFuIHJlc3VsdFxuICovXG5mdW5jdGlvbiBhc3NlcnQoIGZuICkge1xuXHR2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiAhIWZuKCBkaXYgKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBmaW5hbGx5IHtcblx0XHQvLyBSZW1vdmUgZnJvbSBpdHMgcGFyZW50IGJ5IGRlZmF1bHRcblx0XHRpZiAoIGRpdi5wYXJlbnROb2RlICkge1xuXHRcdFx0ZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGRpdiApO1xuXHRcdH1cblx0XHQvLyByZWxlYXNlIG1lbW9yeSBpbiBJRVxuXHRcdGRpdiA9IG51bGw7XG5cdH1cbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBzYW1lIGhhbmRsZXIgZm9yIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGF0dHJzXG4gKiBAcGFyYW0ge1N0cmluZ30gYXR0cnMgUGlwZS1zZXBhcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyIFRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGFwcGxpZWRcbiAqL1xuZnVuY3Rpb24gYWRkSGFuZGxlKCBhdHRycywgaGFuZGxlciApIHtcblx0dmFyIGFyciA9IGF0dHJzLnNwbGl0KFwifFwiKSxcblx0XHRpID0gYXJyLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRFeHByLmF0dHJIYW5kbGVbIGFycltpXSBdID0gaGFuZGxlcjtcblx0fVxufVxuXG4vKipcbiAqIENoZWNrcyBkb2N1bWVudCBvcmRlciBvZiB0d28gc2libGluZ3NcbiAqIEBwYXJhbSB7RWxlbWVudH0gYVxuICogQHBhcmFtIHtFbGVtZW50fSBiXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBSZXR1cm5zIGxlc3MgdGhhbiAwIGlmIGEgcHJlY2VkZXMgYiwgZ3JlYXRlciB0aGFuIDAgaWYgYSBmb2xsb3dzIGJcbiAqL1xuZnVuY3Rpb24gc2libGluZ0NoZWNrKCBhLCBiICkge1xuXHR2YXIgY3VyID0gYiAmJiBhLFxuXHRcdGRpZmYgPSBjdXIgJiYgYS5ub2RlVHlwZSA9PT0gMSAmJiBiLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHQoIH5iLnNvdXJjZUluZGV4IHx8IE1BWF9ORUdBVElWRSApIC1cblx0XHRcdCggfmEuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICk7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7XG5cdFx0XHRpZiAoIGN1ciA9PT0gYiApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhID8gMSA6IC0xO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgaW5wdXQgdHlwZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0UHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gKG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFsc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkge1xuXHRcdGFyZ3VtZW50ID0gK2FyZ3VtZW50O1xuXHRcdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHR2YXIgaixcblx0XHRcdFx0bWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSxcblx0XHRcdFx0aSA9IG1hdGNoSW5kZXhlcy5sZW5ndGg7XG5cblx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlc1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggc2VlZFsgKGogPSBtYXRjaEluZGV4ZXNbaV0pIF0gKSB7XG5cdFx0XHRcdFx0c2VlZFtqXSA9ICEobWF0Y2hlc1tqXSA9IHNlZWRbal0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBhIG5vZGUgZm9yIHZhbGlkaXR5IGFzIGEgU2l6emxlIGNvbnRleHRcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3Q9fSBjb250ZXh0XG4gKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdGVzdENvbnRleHQoIGNvbnRleHQgKSB7XG5cdHJldHVybiBjb250ZXh0ICYmIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGNvbnRleHQ7XG59XG5cbi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlXG5zdXBwb3J0ID0gU2l6emxlLnN1cHBvcnQgPSB7fTtcblxuLyoqXG4gKiBEZXRlY3RzIFhNTCBub2Rlc1xuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbSBBbiBlbGVtZW50IG9yIGEgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGVcbiAqL1xuaXNYTUwgPSBTaXp6bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0Ly8gZG9jdW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVyZSBpdCBkb2Vzbid0IHlldCBleGlzdFxuXHQvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMylcblx0dmFyIGRvY3VtZW50RWxlbWVudCA9IGVsZW0gJiYgKGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtKS5kb2N1bWVudEVsZW1lbnQ7XG5cdHJldHVybiBkb2N1bWVudEVsZW1lbnQgPyBkb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09IFwiSFRNTFwiIDogZmFsc2U7XG59O1xuXG4vKipcbiAqIFNldHMgZG9jdW1lbnQtcmVsYXRlZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gW2RvY10gQW4gZWxlbWVudCBvciBkb2N1bWVudCBvYmplY3QgdG8gdXNlIHRvIHNldCB0aGUgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAqL1xuc2V0RG9jdW1lbnQgPSBTaXp6bGUuc2V0RG9jdW1lbnQgPSBmdW5jdGlvbiggbm9kZSApIHtcblx0dmFyIGhhc0NvbXBhcmUsIHBhcmVudCxcblx0XHRkb2MgPSBub2RlID8gbm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUgOiBwcmVmZXJyZWREb2M7XG5cblx0Ly8gUmV0dXJuIGVhcmx5IGlmIGRvYyBpcyBpbnZhbGlkIG9yIGFscmVhZHkgc2VsZWN0ZWRcblx0aWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHtcblx0XHRyZXR1cm4gZG9jdW1lbnQ7XG5cdH1cblxuXHQvLyBVcGRhdGUgZ2xvYmFsIHZhcmlhYmxlc1xuXHRkb2N1bWVudCA9IGRvYztcblx0ZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblx0ZG9jdW1lbnRJc0hUTUwgPSAhaXNYTUwoIGRvY3VtZW50ICk7XG5cblx0Ly8gU3VwcG9ydDogSUUgOS0xMSwgRWRnZVxuXHQvLyBBY2Nlc3NpbmcgaWZyYW1lIGRvY3VtZW50cyBhZnRlciB1bmxvYWQgdGhyb3dzIFwicGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvcnMgKGpRdWVyeSAjMTM5MzYpXG5cdGlmICggKHBhcmVudCA9IGRvY3VtZW50LmRlZmF1bHRWaWV3KSAmJiBwYXJlbnQudG9wICE9PSBwYXJlbnQgKSB7XG5cdFx0Ly8gU3VwcG9ydDogSUUgMTFcblx0XHRpZiAoIHBhcmVudC5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0cGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwidW5sb2FkXCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTAgb25seVxuXHRcdH0gZWxzZSBpZiAoIHBhcmVudC5hdHRhY2hFdmVudCApIHtcblx0XHRcdHBhcmVudC5hdHRhY2hFdmVudCggXCJvbnVubG9hZFwiLCB1bmxvYWRIYW5kbGVyICk7XG5cdFx0fVxuXHR9XG5cblx0LyogQXR0cmlidXRlc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gU3VwcG9ydDogSUU8OFxuXHQvLyBWZXJpZnkgdGhhdCBnZXRBdHRyaWJ1dGUgcmVhbGx5IHJldHVybnMgYXR0cmlidXRlcyBhbmQgbm90IHByb3BlcnRpZXNcblx0Ly8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpXG5cdHN1cHBvcnQuYXR0cmlidXRlcyA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdGRpdi5jbGFzc05hbWUgPSBcImlcIjtcblx0XHRyZXR1cm4gIWRpdi5nZXRBdHRyaWJ1dGUoXCJjbGFzc05hbWVcIik7XG5cdH0pO1xuXG5cdC8qIGdldEVsZW1lbnQocylCeSpcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSByZXR1cm5zIG9ubHkgZWxlbWVudHNcblx0c3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdGRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIlwiKSApO1xuXHRcdHJldHVybiAhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKS5sZW5ndGg7XG5cdH0pO1xuXG5cdC8vIFN1cHBvcnQ6IElFPDlcblx0c3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICk7XG5cblx0Ly8gU3VwcG9ydDogSUU8MTBcblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lXG5cdC8vIFRoZSBicm9rZW4gZ2V0RWxlbWVudEJ5SWQgbWV0aG9kcyBkb24ndCBwaWNrIHVwIHByb2dyYW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBkaXYgKS5pZCA9IGV4cGFuZG87XG5cdFx0cmV0dXJuICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSB8fCAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIGV4cGFuZG8gKS5sZW5ndGg7XG5cdH0pO1xuXG5cdC8vIElEIGZpbmQgYW5kIGZpbHRlclxuXHRpZiAoIHN1cHBvcnQuZ2V0QnlJZCApIHtcblx0XHRFeHByLmZpbmRbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblx0XHRcdFx0cmV0dXJuIG0gPyBbIG0gXSA6IFtdO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdC8vIFN1cHBvcnQ6IElFNi83XG5cdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgaXMgbm90IHJlbGlhYmxlIGFzIGEgZmluZCBzaG9ydGN1dFxuXHRcdGRlbGV0ZSBFeHByLmZpbmRbXCJJRFwiXTtcblxuXHRcdEV4cHIuZmlsdGVyW1wiSURcIl0gPSAgZnVuY3Rpb24oIGlkICkge1xuXHRcdFx0dmFyIGF0dHJJZCA9IGlkLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuXHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlTm9kZShcImlkXCIpO1xuXHRcdFx0XHRyZXR1cm4gbm9kZSAmJiBub2RlLnZhbHVlID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cdH1cblxuXHQvLyBUYWdcblx0RXhwci5maW5kW1wiVEFHXCJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA/XG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROXG5cdFx0XHR9IGVsc2UgaWYgKCBzdXBwb3J0LnFzYSApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7XG5cdFx0XHR9XG5cdFx0fSA6XG5cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0dmFyIGVsZW0sXG5cdFx0XHRcdHRtcCA9IFtdLFxuXHRcdFx0XHRpID0gMCxcblx0XHRcdFx0Ly8gQnkgaGFwcHkgY29pbmNpZGVuY2UsIGEgKGJyb2tlbikgZ0VCVE4gYXBwZWFycyBvbiBEb2N1bWVudEZyYWdtZW50IG5vZGVzIHRvb1xuXHRcdFx0XHRyZXN1bHRzID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIEZpbHRlciBvdXQgcG9zc2libGUgY29tbWVudHNcblx0XHRcdGlmICggdGFnID09PSBcIipcIiApIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0dG1wLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdG1wO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0fTtcblxuXHQvLyBDbGFzc1xuXHRFeHByLmZpbmRbXCJDTEFTU1wiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0ICkge1xuXHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIGNsYXNzTmFtZSApO1xuXHRcdH1cblx0fTtcblxuXHQvKiBRU0EvbWF0Y2hlc1NlbGVjdG9yXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBRU0EgYW5kIG1hdGNoZXNTZWxlY3RvciBzdXBwb3J0XG5cblx0Ly8gbWF0Y2hlc1NlbGVjdG9yKDphY3RpdmUpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChJRTkvT3BlcmEgMTEuNSlcblx0cmJ1Z2d5TWF0Y2hlcyA9IFtdO1xuXG5cdC8vIHFTYSg6Zm9jdXMpIHJlcG9ydHMgZmFsc2Ugd2hlbiB0cnVlIChDaHJvbWUgMjEpXG5cdC8vIFdlIGFsbG93IHRoaXMgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBJRTgvOSB0aGF0IHRocm93cyBhbiBlcnJvclxuXHQvLyB3aGVuZXZlciBgZG9jdW1lbnQuYWN0aXZlRWxlbWVudGAgaXMgYWNjZXNzZWQgb24gYW4gaWZyYW1lXG5cdC8vIFNvLCB3ZSBhbGxvdyA6Zm9jdXMgdG8gcGFzcyB0aHJvdWdoIFFTQSBhbGwgdGhlIHRpbWUgdG8gYXZvaWQgdGhlIElFIGVycm9yXG5cdC8vIFNlZSBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM3OFxuXHRyYnVnZ3lRU0EgPSBbXTtcblxuXHRpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApKSApIHtcblx0XHQvLyBCdWlsZCBRU0EgcmVnZXhcblx0XHQvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdFx0XHQvLyBTZWxlY3QgaXMgc2V0IHRvIGVtcHR5IHN0cmluZyBvbiBwdXJwb3NlXG5cdFx0XHQvLyBUaGlzIGlzIHRvIHRlc3QgSUUncyB0cmVhdG1lbnQgb2Ygbm90IGV4cGxpY2l0bHlcblx0XHRcdC8vIHNldHRpbmcgYSBib29sZWFuIGNvbnRlbnQgYXR0cmlidXRlLFxuXHRcdFx0Ly8gc2luY2UgaXRzIHByZXNlbmNlIHNob3VsZCBiZSBlbm91Z2hcblx0XHRcdC8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzU5XG5cdFx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBkaXYgKS5pbm5lckhUTUwgPSBcIjxhIGlkPSdcIiArIGV4cGFuZG8gKyBcIic+PC9hPlwiICtcblx0XHRcdFx0XCI8c2VsZWN0IGlkPSdcIiArIGV4cGFuZG8gKyBcIi1cXHJcXFxcJyBtc2FsbG93Y2FwdHVyZT0nJz5cIiArXG5cdFx0XHRcdFwiPG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD5cIjtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4LCBPcGVyYSAxMS0xMi4xNlxuXHRcdFx0Ly8gTm90aGluZyBzaG91bGQgYmUgc2VsZWN0ZWQgd2hlbiBlbXB0eSBzdHJpbmdzIGZvbGxvdyBePSBvciAkPSBvciAqPVxuXHRcdFx0Ly8gVGhlIHRlc3QgYXR0cmlidXRlIG11c3QgYmUgdW5rbm93biBpbiBPcGVyYSBidXQgXCJzYWZlXCIgZm9yIFdpblJUXG5cdFx0XHQvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvblxuXHRcdFx0aWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbChcIlttc2FsbG93Y2FwdHVyZV49JyddXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiWypeJF09XCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86Jyd8XFxcIlxcXCIpXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBCb29sZWFuIGF0dHJpYnV0ZXMgYW5kIFwidmFsdWVcIiBhcmUgbm90IHRyZWF0ZWQgY29ycmVjdGx5XG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbChcIltzZWxlY3RlZF1cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKig/OnZhbHVlfFwiICsgYm9vbGVhbnMgKyBcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWU8MjksIEFuZHJvaWQ8NC40LCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuOCtcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKCBcIltpZH49XCIgKyBleHBhbmRvICsgXCItXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIn49XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIHNlbGVjdGVkIG9wdGlvbiBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbChcIjpjaGVja2VkXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCI6Y2hlY2tlZFwiKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDgrLCBpT1MgOCtcblx0XHRcdC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzY4NTFcblx0XHRcdC8vIEluLXBhZ2UgYHNlbGVjdG9yI2lkIHNpYmluZy1jb21iaW5hdG9yIHNlbGVjdG9yYCBmYWlsc1xuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIFwiYSNcIiArIGV4cGFuZG8gKyBcIisqXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwiLiMuK1srfl1cIik7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRcdC8vIFN1cHBvcnQ6IFdpbmRvd3MgOCBOYXRpdmUgQXBwc1xuXHRcdFx0Ly8gVGhlIHR5cGUgYW5kIG5hbWUgYXR0cmlidXRlcyBhcmUgcmVzdHJpY3RlZCBkdXJpbmcgLmlubmVySFRNTCBhc3NpZ25tZW50XG5cdFx0XHR2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG5cdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcImhpZGRlblwiICk7XG5cdFx0XHRkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJEXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGVcblx0XHRcdGlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbmFtZT1kXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIm5hbWVcIiArIHdoaXRlc3BhY2UgKyBcIipbKl4kfCF+XT89XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRkYgMy41IC0gOmVuYWJsZWQvOmRpc2FibGVkIGFuZCBoaWRkZW4gZWxlbWVudHMgKGhpZGRlbiBlbGVtZW50cyBhcmUgc3RpbGwgZW5hYmxlZClcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbChcIjplbmFibGVkXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvc1xuXHRcdFx0ZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqLDp4XCIpO1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCIsLio6XCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCAoc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgPSBybmF0aXZlLnRlc3QoIChtYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzIHx8XG5cdFx0ZG9jRWxlbS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ub01hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubXNNYXRjaGVzU2VsZWN0b3IpICkpICkge1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdFx0XHQvLyBDaGVjayB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkbyBtYXRjaGVzU2VsZWN0b3Jcblx0XHRcdC8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkpXG5cdFx0XHRzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoID0gbWF0Y2hlcy5jYWxsKCBkaXYsIFwiZGl2XCIgKTtcblxuXHRcdFx0Ly8gVGhpcyBzaG91bGQgZmFpbCB3aXRoIGFuIGV4Y2VwdGlvblxuXHRcdFx0Ly8gR2Vja28gZG9lcyBub3QgZXJyb3IsIHJldHVybnMgZmFsc2UgaW5zdGVhZFxuXHRcdFx0bWF0Y2hlcy5jYWxsKCBkaXYsIFwiW3MhPScnXTp4XCIgKTtcblx0XHRcdHJidWdneU1hdGNoZXMucHVzaCggXCIhPVwiLCBwc2V1ZG9zICk7XG5cdFx0fSk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKFwifFwiKSApO1xuXHRyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKFwifFwiKSApO1xuXG5cdC8qIENvbnRhaW5zXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApO1xuXG5cdC8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlclxuXHQvLyBQdXJwb3NlZnVsbHkgc2VsZi1leGNsdXNpdmVcblx0Ly8gQXMgaW4sIGFuIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBpdHNlbGZcblx0Y29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID9cblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdHZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsXG5cdFx0XHRcdGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlO1xuXHRcdFx0cmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiAoXG5cdFx0XHRcdGFkb3duLmNvbnRhaW5zID9cblx0XHRcdFx0XHRhZG93bi5jb250YWlucyggYnVwICkgOlxuXHRcdFx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNlxuXHRcdFx0KSk7XG5cdFx0fSA6XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHRpZiAoIGIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGIgPSBiLnBhcmVudE5vZGUpICkge1xuXHRcdFx0XHRcdGlmICggYiA9PT0gYSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0LyogU29ydGluZ1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gRG9jdW1lbnQgb3JkZXIgc29ydGluZ1xuXHRzb3J0T3JkZXIgPSBoYXNDb21wYXJlID9cblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cblx0XHQvLyBGbGFnIGZvciBkdXBsaWNhdGUgcmVtb3ZhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHQvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVuY2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uXG5cdFx0dmFyIGNvbXBhcmUgPSAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO1xuXHRcdGlmICggY29tcGFyZSApIHtcblx0XHRcdHJldHVybiBjb21wYXJlO1xuXHRcdH1cblxuXHRcdC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnRcblx0XHRjb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgP1xuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkXG5cdFx0XHQxO1xuXG5cdFx0Ly8gRGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0aWYgKCBjb21wYXJlICYgMSB8fFxuXHRcdFx0KCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkge1xuXG5cdFx0XHQvLyBDaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIG91ciBwcmVmZXJyZWQgZG9jdW1lbnRcblx0XHRcdGlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBiID09PSBkb2N1bWVudCB8fCBiLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGIpICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxO1xuXHR9IDpcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdXAgPSBhLnBhcmVudE5vZGUsXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXG5cdFx0XHRhcCA9IFsgYSBdLFxuXHRcdFx0YnAgPSBbIGIgXTtcblxuXHRcdC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkXG5cdFx0aWYgKCAhYXVwIHx8ICFidXAgKSB7XG5cdFx0XHRyZXR1cm4gYSA9PT0gZG9jdW1lbnQgPyAtMSA6XG5cdFx0XHRcdGIgPT09IGRvY3VtZW50ID8gMSA6XG5cdFx0XHRcdGF1cCA/IC0xIDpcblx0XHRcdFx0YnVwID8gMSA6XG5cdFx0XHRcdHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblxuXHRcdC8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXG5cdFx0fSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb25cblx0XHRjdXIgPSBhO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGFwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblx0XHRjdXIgPSBiO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGJwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblxuXHRcdC8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5XG5cdFx0d2hpbGUgKCBhcFtpXSA9PT0gYnBbaV0gKSB7XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGkgP1xuXHRcdFx0Ly8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yXG5cdFx0XHRzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0XG5cdFx0XHRhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOlxuXHRcdFx0YnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOlxuXHRcdFx0MDtcblx0fTtcblxuXHRyZXR1cm4gZG9jdW1lbnQ7XG59O1xuXG5TaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTtcbn07XG5cblNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkXG5cdGV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsIFwiPSckMSddXCIgKTtcblxuXHRpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0IWNvbXBpbGVyQ2FjaGVbIGV4cHIgKyBcIiBcIiBdICYmXG5cdFx0KCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJlxuXHRcdCggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblx0XHRcdFx0XHQvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudFxuXHRcdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcblx0XHRcdFx0XHRlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHt9XG5cdH1cblxuXHRyZXR1cm4gU2l6emxlKCBleHByLCBkb2N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xufTtcblxuU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXHRyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTtcbn07XG5cblNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cdFx0Ly8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgP1xuXHRcdHZhbCA6XG5cdFx0c3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDpcblx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xufTtcblxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcblx0dGhyb3cgbmV3IEVycm9yKCBcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiICsgbXNnICk7XG59O1xuXG4vKipcbiAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzXG4gKi9cblNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7XG5cdHZhciBlbGVtLFxuXHRcdGR1cGxpY2F0ZXMgPSBbXSxcblx0XHRqID0gMCxcblx0XHRpID0gMDtcblxuXHQvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlXG5cdGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7XG5cdHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApO1xuXHRyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApO1xuXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xuXHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0aWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7XG5cdFx0XHRcdGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2xlYXIgaW5wdXQgYWZ0ZXIgc29ydGluZyB0byByZWxlYXNlIG9iamVjdHNcblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1XG5cdHNvcnRJbnB1dCA9IG51bGw7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW1cbiAqL1xuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBub2RlLFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0aSA9IDAsXG5cdFx0bm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdGlmICggIW5vZGVUeXBlICkge1xuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XG5cdFx0d2hpbGUgKCAobm9kZSA9IGVsZW1baSsrXSkgKSB7XG5cdFx0XHQvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlc1xuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcblx0XHQvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzXG5cdFx0Ly8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1Mylcblx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdHJldCArPSBnZXRUZXh0KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XG5cdH1cblx0Ly8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzXG5cblx0cmV0dXJuIHJldDtcbn07XG5cbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFszXSA9ICggbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgXCJcIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbMl0gPT09IFwifj1cIiApIHtcblx0XHRcdFx0bWF0Y2hbM10gPSBcIiBcIiArIG1hdGNoWzNdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJbXCJDSElMRFwiXVxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcblx0XHRcdFx0MiB3aGF0IChjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHQzIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxuXHRcdFx0XHQ0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xcZCpufClcblx0XHRcdFx0NSBzaWduIG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ2IHggb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDcgc2lnbiBvZiB5LWNvbXBvbmVudFxuXHRcdFx0XHQ4IHkgb2YgeS1jb21wb25lbnRcblx0XHRcdCovXG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmICggbWF0Y2hbMV0uc2xpY2UoIDAsIDMgKSA9PT0gXCJudGhcIiApIHtcblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbM10gKSB7XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEXG5cdFx0XHRcdC8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzFcblx0XHRcdFx0bWF0Y2hbNF0gPSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09IFwiZXZlblwiIHx8IG1hdGNoWzNdID09PSBcIm9kZFwiICkgKTtcblx0XHRcdFx0bWF0Y2hbNV0gPSArKCAoIG1hdGNoWzddICsgbWF0Y2hbOF0gKSB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApO1xuXG5cdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0dmFyIGV4Y2Vzcyxcblx0XHRcdFx0dW5xdW90ZWQgPSAhbWF0Y2hbNl0gJiYgbWF0Y2hbMl07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByW1wiQ0hJTERcIl0udGVzdCggbWF0Y2hbMF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRtYXRjaFsyXSA9IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCI7XG5cblx0XHRcdC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiZcblx0XHRcdFx0Ly8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSlcblx0XHRcdFx0KGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApKSAmJlxuXHRcdFx0XHQvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0KGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7XG5cblx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcblx0XHRcdFx0bWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHRcdG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudClcblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApO1xuXHRcdH1cblx0fSxcblxuXHRmaWx0ZXI6IHtcblxuXHRcdFwiVEFHXCI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIG5vZGVOYW1lID0gbm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWVTZWxlY3RvciA9PT0gXCIqXCIgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XG5cdFx0XHR2YXIgcGF0dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArIFwiIFwiIF07XG5cblx0XHRcdHJldHVybiBwYXR0ZXJuIHx8XG5cdFx0XHRcdChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggXCIoXnxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIGNsYXNzTmFtZSArIFwiKFwiICsgd2hpdGVzcGFjZSArIFwifCQpXCIgKSkgJiZcblx0XHRcdFx0Y2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiApO1xuXHRcdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIiE9XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQgKz0gXCJcIjtcblxuXHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiPVwiID8gcmVzdWx0ID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiIT1cIiA/IHJlc3VsdCAhPT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIl49XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiKj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiQ9XCIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIn49XCIgPyAoIFwiIFwiICsgcmVzdWx0LnJlcGxhY2UoIHJ3aGl0ZXNwYWNlLCBcIiBcIiApICsgXCIgXCIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcInw9XCIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiIDpcblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIHR5cGUsIHdoYXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHtcblx0XHRcdHZhciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09IFwibnRoXCIsXG5cdFx0XHRcdGZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSBcImxhc3RcIixcblx0XHRcdFx0b2ZUeXBlID0gd2hhdCA9PT0gXCJvZi10eXBlXCI7XG5cblx0XHRcdHJldHVybiBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID9cblxuXHRcdFx0XHQvLyBTaG9ydGN1dCBmb3IgOm50aC0qKG4pXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiAhIWVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0fSA6XG5cblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LFxuXHRcdFx0XHRcdFx0ZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gXCJuZXh0U2libGluZ1wiIDogXCJwcmV2aW91c1NpYmxpbmdcIixcblx0XHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRcdG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0dXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGUsXG5cdFx0XHRcdFx0XHRkaWZmID0gZmFsc2U7XG5cblx0XHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHRcdFx0aWYgKCBzaW1wbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggZGlyICkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbylcblx0XHRcdFx0XHRcdFx0XHRzdGFydCA9IGRpciA9IHR5cGUgPT09IFwib25seVwiICYmICFzdGFydCAmJiBcIm5leHRTaWJsaW5nXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07XG5cblx0XHRcdFx0XHRcdC8vIG5vbi14bWwgOm50aC1jaGlsZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgXG5cdFx0XHRcdFx0XHRpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU2VlayBgZWxlbWAgZnJvbSBhIHByZXZpb3VzbHktY2FjaGVkIGluZGV4XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRub2RlID0gcGFyZW50O1xuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4ICYmIGNhY2hlWyAyIF07XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBVc2UgcHJldmlvdXNseS1jYWNoZWQgZWxlbWVudCBpbmRleCBpZiBhdmFpbGFibGVcblx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4O1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8geG1sIDpudGgtY2hpbGQoLi4uKVxuXHRcdFx0XHRcdFx0XHQvLyBvciA6bnRoLWxhc3QtY2hpbGQoLi4uKSBvciA6bnRoKC1sYXN0KT8tb2YtdHlwZSguLi4pXG5cdFx0XHRcdFx0XHRcdGlmICggZGlmZiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBzYW1lIGxvb3AgYXMgYWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0KytkaWZmICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNpemVcblx0XHRcdFx0XHRcdGRpZmYgLT0gbGFzdDtcblx0XHRcdFx0XHRcdHJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIHBzZXVkbywgYXJndW1lbnQgKSB7XG5cdFx0XHQvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmVcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXNcblx0XHRcdC8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzXG5cdFx0XHQvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zXG5cdFx0XHR2YXIgYXJncyxcblx0XHRcdFx0Zm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiICsgcHNldWRvICk7XG5cblx0XHRcdC8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXRcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG5cdFx0XHQvLyBqdXN0IGFzIFNpenpsZSBkb2VzXG5cdFx0XHRpZiAoIGZuWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHJldHVybiBmbiggYXJndW1lbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzXG5cdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdGFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCBcIlwiLCBhcmd1bWVudCBdO1xuXHRcdFx0XHRyZXR1cm4gRXhwci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID9cblx0XHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaWR4LFxuXHRcdFx0XHRcdFx0XHRtYXRjaGVkID0gZm4oIHNlZWQsIGFyZ3VtZW50ICksXG5cdFx0XHRcdFx0XHRcdGkgPSBtYXRjaGVkLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHRcdHNlZWRbIGlkeCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSkgOlxuXHRcdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZuO1xuXHRcdH1cblx0fSxcblxuXHRwc2V1ZG9zOiB7XG5cdFx0Ly8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zXG5cdFx0XCJub3RcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlXG5cdFx0XHQvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXG5cdFx0XHR2YXIgaW5wdXQgPSBbXSxcblx0XHRcdFx0cmVzdWx0cyA9IFtdLFxuXHRcdFx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApICk7XG5cblx0XHRcdHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gP1xuXHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0XHRcdHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSxcblx0XHRcdFx0XHRcdGkgPSBzZWVkLmxlbmd0aDtcblxuXHRcdFx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBieSBgbWF0Y2hlcmBcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0XHRcdFx0XHRzZWVkW2ldID0gIShtYXRjaGVzW2ldID0gZWxlbSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0aW5wdXRbMF0gPSBlbGVtO1xuXHRcdFx0XHRcdG1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTtcblx0XHRcdFx0XHQvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0XHRcdGlucHV0WzBdID0gbnVsbDtcblx0XHRcdFx0XHRyZXR1cm4gIXJlc3VsdHMucG9wKCk7XG5cdFx0XHRcdH07XG5cdFx0fSksXG5cblx0XHRcImhhc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJjb250YWluc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8IGdldFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIFwiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3RvclxuXHRcdC8vIGlzIGJhc2VkIHNvbGVseSBvbiB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlXG5cdFx0Ly8gYmVpbmcgZXF1YWwgdG8gdGhlIGlkZW50aWZpZXIgQyxcblx0XHQvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRlbnRpZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IFwiLVwiLlxuXHRcdC8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuXHRcdC8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuXCJcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvXG5cdFx0XCJsYW5nXCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7XG5cdFx0XHQvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyXG5cdFx0XHRpZiAoICFyaWRlbnRpZmllci50ZXN0KGxhbmcgfHwgXCJcIikgKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIiArIGxhbmcgKTtcblx0XHRcdH1cblx0XHRcdGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIGVsZW1MYW5nO1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRcdFx0XHRlbGVtLmxhbmcgOlxuXHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImxhbmdcIikpICkge1xuXG5cdFx0XHRcdFx0XHRlbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArIFwiLVwiICkgPT09IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IHdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIE1pc2NlbGxhbmVvdXNcblx0XHRcInRhcmdldFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXHRcdFx0cmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkO1xuXHRcdH0sXG5cblx0XHRcInJvb3RcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jRWxlbTtcblx0XHR9LFxuXG5cdFx0XCJmb2N1c1wiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmICghZG9jdW1lbnQuaGFzRm9jdXMgfHwgZG9jdW1lbnQuaGFzRm9jdXMoKSkgJiYgISEoZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCk7XG5cdFx0fSxcblxuXHRcdC8vIEJvb2xlYW4gcHJvcGVydGllc1xuXHRcdFwiZW5hYmxlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZTtcblx0XHR9LFxuXG5cdFx0XCJkaXNhYmxlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlO1xuXHRcdH0sXG5cblx0XHRcImNoZWNrZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHNcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gKG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgISFlbGVtLmNoZWNrZWQpIHx8IChub2RlTmFtZSA9PT0gXCJvcHRpb25cIiAmJiAhIWVsZW0uc2VsZWN0ZWQpO1xuXHRcdH0sXG5cblx0XHRcInNlbGVjdGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdFxuXHRcdFx0Ly8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseVxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0Ly8gQ29udGVudHNcblx0XHRcImVtcHR5XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG9cblx0XHRcdC8vIDplbXB0eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9kZXMgKHRleHQ6IDM7IGNkYXRhOiA0OyBlbnRpdHkgcmVmOiA1KSxcblx0XHRcdC8vICAgYnV0IG5vdCBieSBvdGhlcnMgKGNvbW1lbnQ6IDg7IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246IDc7IGV0Yy4pXG5cdFx0XHQvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRcInBhcmVudFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAhRXhwci5wc2V1ZG9zW1wiZW1wdHlcIl0oIGVsZW0gKTtcblx0XHR9LFxuXG5cdFx0Ly8gRWxlbWVudC9pbnB1dCB0eXBlc1xuXHRcdFwiaGVhZGVyXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImlucHV0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImJ1dHRvblwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFwiYnV0dG9uXCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIjtcblx0XHR9LFxuXG5cdFx0XCJ0ZXh0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiZcblx0XHRcdFx0ZWxlbS50eXBlID09PSBcInRleHRcIiAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDhcblx0XHRcdFx0Ly8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sIFwic2VhcmNoXCIpIGFwcGVhciB3aXRoIGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCJcblx0XHRcdFx0KCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkgPT0gbnVsbCB8fCBhdHRyLnRvTG93ZXJDYXNlKCkgPT09IFwidGV4dFwiICk7XG5cdFx0fSxcblxuXHRcdC8vIFBvc2l0aW9uLWluLWNvbGxlY3Rpb25cblx0XHRcImZpcnN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gWyAwIF07XG5cdFx0fSksXG5cblx0XHRcImxhc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gWyBsZW5ndGggLSAxIF07XG5cdFx0fSksXG5cblx0XHRcImVxXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTtcblx0XHR9KSxcblxuXHRcdFwiZXZlblwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwib2RkXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAxO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJsdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7IC0taSA+PSAwOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcImd0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSlcblx0fVxufTtcblxuRXhwci5wc2V1ZG9zW1wibnRoXCJdID0gRXhwci5wc2V1ZG9zW1wiZXFcIl07XG5cbi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zXG5mb3IgKCBpIGluIHsgcmFkaW86IHRydWUsIGNoZWNrYm94OiB0cnVlLCBmaWxlOiB0cnVlLCBwYXNzd29yZDogdHJ1ZSwgaW1hZ2U6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApO1xufVxuZm9yICggaSBpbiB7IHN1Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVCdXR0b25Qc2V1ZG8oIGkgKTtcbn1cblxuLy8gRWFzeSBBUEkgZm9yIGNyZWF0aW5nIG5ldyBzZXRGaWx0ZXJzXG5mdW5jdGlvbiBzZXRGaWx0ZXJzKCkge31cbnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zO1xuRXhwci5zZXRGaWx0ZXJzID0gbmV3IHNldEZpbHRlcnMoKTtcblxudG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHtcblx0dmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsXG5cdFx0c29GYXIsIGdyb3VwcywgcHJlRmlsdGVycyxcblx0XHRjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCBjYWNoZWQgKSB7XG5cdFx0cmV0dXJuIHBhcnNlT25seSA/IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTtcblx0fVxuXG5cdHNvRmFyID0gc2VsZWN0b3I7XG5cdGdyb3VwcyA9IFtdO1xuXHRwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7XG5cblx0d2hpbGUgKCBzb0ZhciApIHtcblxuXHRcdC8vIENvbW1hIGFuZCBmaXJzdCBydW5cblx0XHRpZiAoICFtYXRjaGVkIHx8IChtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdGlmICggbWF0Y2ggKSB7XG5cdFx0XHRcdC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyO1xuXHRcdFx0fVxuXHRcdFx0Z3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTtcblx0XHR9XG5cblx0XHRtYXRjaGVkID0gZmFsc2U7XG5cblx0XHQvLyBDb21iaW5hdG9yc1xuXHRcdGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkge1xuXHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2Vcblx0XHRcdFx0dHlwZTogbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sIFwiIFwiIClcblx0XHRcdH0pO1xuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGaWx0ZXJzXG5cdFx0Zm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHtcblx0XHRcdGlmICggKG1hdGNoID0gbWF0Y2hFeHByWyB0eXBlIF0uZXhlYyggc29GYXIgKSkgJiYgKCFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcblx0XHRcdFx0KG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0XHRtYXRjaGVzOiBtYXRjaFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoICFtYXRjaGVkICkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzXG5cdC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZ1xuXHQvLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnNcblx0cmV0dXJuIHBhcnNlT25seSA/XG5cdFx0c29GYXIubGVuZ3RoIDpcblx0XHRzb0ZhciA/XG5cdFx0XHRTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkgOlxuXHRcdFx0Ly8gQ2FjaGUgdGhlIHRva2Vuc1xuXHRcdFx0dG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7XG59O1xuXG5mdW5jdGlvbiB0b1NlbGVjdG9yKCB0b2tlbnMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdHNlbGVjdG9yID0gXCJcIjtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0c2VsZWN0b3IgKz0gdG9rZW5zW2ldLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHtcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxuXHRcdGNoZWNrTm9uRWxlbWVudHMgPSBiYXNlICYmIGRpciA9PT0gXCJwYXJlbnROb2RlXCIsXG5cdFx0ZG9uZU5hbWUgPSBkb25lKys7XG5cblx0cmV0dXJuIGNvbWJpbmF0b3IuZmlyc3QgP1xuXHRcdC8vIENoZWNrIGFnYWluc3QgY2xvc2VzdCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudFxuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IDpcblxuXHRcdC8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50c1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgb2xkQ2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLFxuXHRcdFx0XHRuZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTtcblxuXHRcdFx0Ly8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFyeSBkYXRhIG9uIFhNTCBub2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gY29tYmluYXRvciBjYWNoaW5nXG5cdFx0XHRpZiAoIHhtbCApIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIGVsZW0udW5pcXVlSUQgXSB8fCAob3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRpZiAoIChvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBkaXIgXSkgJiZcblx0XHRcdFx0XHRcdFx0b2xkQ2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBvbGRDYWNoZVsgMSBdID09PSBkb25lTmFtZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBc3NpZ24gdG8gbmV3Q2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG5ld0NhY2hlWyAyIF0gPSBvbGRDYWNoZVsgMiBdKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJldXNlIG5ld2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIGRpciBdID0gbmV3Q2FjaGU7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nXG5cdFx0XHRcdFx0XHRcdGlmICggKG5ld0NhY2hlWyAyIF0gPSBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xufVxuXG5mdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7XG5cdHJldHVybiBtYXRjaGVycy5sZW5ndGggPiAxID9cblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSA6XG5cdFx0bWF0Y2hlcnNbMF07XG59XG5cbmZ1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IGNvbnRleHRzLmxlbmd0aDtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0U2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbaV0sIHJlc3VsdHMgKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHtcblx0dmFyIGVsZW0sXG5cdFx0bmV3VW5tYXRjaGVkID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bGVuID0gdW5tYXRjaGVkLmxlbmd0aCxcblx0XHRtYXBwZWQgPSBtYXAgIT0gbnVsbDtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHtcblx0XHRcdGlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRuZXdVbm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRpZiAoIG1hcHBlZCApIHtcblx0XHRcdFx0XHRtYXAucHVzaCggaSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5ld1VubWF0Y2hlZDtcbn1cblxuZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkge1xuXHRpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmlsdGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbHRlciApO1xuXHR9XG5cdGlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTtcblx0fVxuXHRyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCByZXN1bHRzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0dmFyIHRlbXAsIGksIGVsZW0sXG5cdFx0XHRwcmVNYXAgPSBbXSxcblx0XHRcdHBvc3RNYXAgPSBbXSxcblx0XHRcdHByZWV4aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsXG5cblx0XHRcdC8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0XG5cdFx0XHRlbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IgfHwgXCIqXCIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksXG5cblx0XHRcdC8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvblxuXHRcdFx0bWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0ZWxlbXMsXG5cblx0XHRcdG1hdGNoZXJPdXQgPSBtYXRjaGVyID9cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIHBvc3RGaW5kZXIsIG9yIGZpbHRlcmVkIHNlZWQsIG9yIG5vbi1zZWVkIHBvc3RGaWx0ZXIgb3IgcHJlZXhpc3RpbmcgcmVzdWx0cyxcblx0XHRcdFx0cG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVleGlzdGluZyB8fCBwb3N0RmlsdGVyICkgP1xuXG5cdFx0XHRcdFx0Ly8gLi4uaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0W10gOlxuXG5cdFx0XHRcdFx0Ly8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5XG5cdFx0XHRcdFx0cmVzdWx0cyA6XG5cdFx0XHRcdG1hdGNoZXJJbjtcblxuXHRcdC8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzXG5cdFx0aWYgKCBtYXRjaGVyICkge1xuXHRcdFx0bWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwb3N0RmlsdGVyXG5cdFx0aWYgKCBwb3N0RmlsdGVyICkge1xuXHRcdFx0dGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7XG5cdFx0XHRwb3N0RmlsdGVyKCB0ZW1wLCBbXSwgY29udGV4dCwgeG1sICk7XG5cblx0XHRcdC8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW5cblx0XHRcdGkgPSB0ZW1wLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoIChlbGVtID0gdGVtcFtpXSkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlck91dFsgcG9zdE1hcFtpXSBdID0gIShtYXRjaGVySW5bIHBvc3RNYXBbaV0gXSA9IGVsZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHtcblx0XHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRcdC8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJtZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0c1xuXHRcdFx0XHRcdHRlbXAgPSBbXTtcblx0XHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgbWF0Y2hlckluIHNpbmNlIGVsZW0gaXMgbm90IHlldCBhIGZpbmFsIG1hdGNoXG5cdFx0XHRcdFx0XHRcdHRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBvc3RGaW5kZXIoIG51bGwsIChtYXRjaGVyT3V0ID0gW10pLCB0ZW1wLCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkXG5cdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9IG1hdGNoZXJPdXRbaV0pICYmXG5cdFx0XHRcdFx0XHQodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7XG5cblx0XHRcdFx0XHRcdHNlZWRbdGVtcF0gPSAhKHJlc3VsdHNbdGVtcF0gPSBlbGVtKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyT3V0ID0gY29uZGVuc2UoXG5cdFx0XHRcdG1hdGNoZXJPdXQgPT09IHJlc3VsdHMgP1xuXHRcdFx0XHRcdG1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6XG5cdFx0XHRcdFx0bWF0Y2hlck91dFxuXHRcdFx0KTtcblx0XHRcdGlmICggcG9zdEZpbmRlciApIHtcblx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgcmVzdWx0cywgbWF0Y2hlck91dCwgeG1sICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHtcblx0dmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaixcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdGxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sXG5cdFx0aW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlW1wiIFwiXSxcblx0XHRpID0gbGVhZGluZ1JlbGF0aXZlID8gMSA6IDAsXG5cblx0XHQvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKVxuXHRcdG1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hBbnlDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZiggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8IChcblx0XHRcdFx0KGNoZWNrQ29udGV4dCA9IGNvbnRleHQpLm5vZGVUeXBlID9cblx0XHRcdFx0XHRtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0XHRtYXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7XG5cdFx0XHQvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdGNoZWNrQ29udGV4dCA9IG51bGw7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH0gXTtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoIChtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2ldLnR5cGUgXSkgKSB7XG5cdFx0XHRtYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlciA9IEV4cHIuZmlsdGVyWyB0b2tlbnNbaV0udHlwZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbaV0ubWF0Y2hlcyApO1xuXG5cdFx0XHQvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlclxuXHRcdFx0aWYgKCBtYXRjaGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdC8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZ1xuXHRcdFx0XHRqID0gKytpO1xuXHRcdFx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbIHRva2Vuc1tqXS50eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNldE1hdGNoZXIoXG5cdFx0XHRcdFx0aSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksXG5cdFx0XHRcdFx0aSA+IDEgJiYgdG9TZWxlY3Rvcihcblx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcmVjZWRpbmcgdG9rZW4gd2FzIGEgZGVzY2VuZGFudCBjb21iaW5hdG9yLCBpbnNlcnQgYW4gaW1wbGljaXQgYW55LWVsZW1lbnQgYCpgXG5cdFx0XHRcdFx0XHR0b2tlbnMuc2xpY2UoIDAsIGkgLSAxICkuY29uY2F0KHsgdmFsdWU6IHRva2Vuc1sgaSAtIDIgXS50eXBlID09PSBcIiBcIiA/IFwiKlwiIDogXCJcIiB9KVxuXHRcdFx0XHRcdCkucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLFxuXHRcdFx0XHRcdG1hdGNoZXIsXG5cdFx0XHRcdFx0aSA8IGogJiYgbWF0Y2hlckZyb21Ub2tlbnMoIHRva2Vucy5zbGljZSggaSwgaiApICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiBtYXRjaGVyRnJvbVRva2VucyggKHRva2VucyA9IHRva2Vucy5zbGljZSggaiApKSApLFxuXHRcdFx0XHRcdGogPCBsZW4gJiYgdG9TZWxlY3RvciggdG9rZW5zIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG1hdGNoZXJzLnB1c2goIG1hdGNoZXIgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApIHtcblx0dmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7XG5cdFx0XHR2YXIgZWxlbSwgaiwgbWF0Y2hlcixcblx0XHRcdFx0bWF0Y2hlZENvdW50ID0gMCxcblx0XHRcdFx0aSA9IFwiMFwiLFxuXHRcdFx0XHR1bm1hdGNoZWQgPSBzZWVkICYmIFtdLFxuXHRcdFx0XHRzZXRNYXRjaGVkID0gW10sXG5cdFx0XHRcdGNvbnRleHRCYWNrdXAgPSBvdXRlcm1vc3RDb250ZXh0LFxuXHRcdFx0XHQvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0XG5cdFx0XHRcdGVsZW1zID0gc2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5kW1wiVEFHXCJdKCBcIipcIiwgb3V0ZXJtb3N0ICksXG5cdFx0XHRcdC8vIFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyXG5cdFx0XHRcdGRpcnJ1bnNVbmlxdWUgPSAoZGlycnVucyArPSBjb250ZXh0QmFja3VwID09IG51bGwgPyAxIDogTWF0aC5yYW5kb20oKSB8fCAwLjEpLFxuXHRcdFx0XHRsZW4gPSBlbGVtcy5sZW5ndGg7XG5cblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dCA9PT0gZG9jdW1lbnQgfHwgY29udGV4dCB8fCBvdXRlcm1vc3Q7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBlbGVtZW50cyBwYXNzaW5nIGVsZW1lbnRNYXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRzXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTw5LCBTYWZhcmlcblx0XHRcdC8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiBcImxlbmd0aFwiOyBTYWZhcmk6IDxudW1iZXI+KSBtYXRjaGluZyBlbGVtZW50cyBieSBpZFxuXHRcdFx0Zm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGJ5RWxlbWVudCAmJiBlbGVtICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdGlmICggIWNvbnRleHQgJiYgZWxlbS5vd25lckRvY3VtZW50ICE9PSBkb2N1bWVudCApIHtcblx0XHRcdFx0XHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdFx0XHRcdFx0XHR4bWwgPSAhZG9jdW1lbnRJc0hUTUw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBlbGVtZW50TWF0Y2hlcnNbaisrXSkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQgfHwgZG9jdW1lbnQsIHhtbCkgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdFx0XHRkaXJydW5zID0gZGlycnVuc1VuaXF1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUcmFjayB1bm1hdGNoZWQgZWxlbWVudHMgZm9yIHNldCBmaWx0ZXJzXG5cdFx0XHRcdGlmICggYnlTZXQgKSB7XG5cdFx0XHRcdFx0Ly8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVyc1xuXHRcdFx0XHRcdGlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHtcblx0XHRcdFx0XHRcdG1hdGNoZWRDb3VudC0tO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIExlbmd0aGVuIHRoZSBhcnJheSBmb3IgZXZlcnkgZWxlbWVudCwgbWF0Y2hlZCBvciBub3Rcblx0XHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBgaWAgaXMgbm93IHRoZSBjb3VudCBvZiBlbGVtZW50cyB2aXNpdGVkIGFib3ZlLCBhbmQgYWRkaW5nIGl0IHRvIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLlxuXHRcdFx0bWF0Y2hlZENvdW50ICs9IGk7XG5cblx0XHRcdC8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50c1xuXHRcdFx0Ly8gTk9URTogVGhpcyBjYW4gYmUgc2tpcHBlZCBpZiB0aGVyZSBhcmUgbm8gdW5tYXRjaGVkIGVsZW1lbnRzIChpLmUuLCBgbWF0Y2hlZENvdW50YFxuXHRcdFx0Ly8gZXF1YWxzIGBpYCksIHVubGVzcyB3ZSBkaWRuJ3QgdmlzaXQgX2FueV8gZWxlbWVudHMgaW4gdGhlIGFib3ZlIGxvb3AgYmVjYXVzZSB3ZSBoYXZlXG5cdFx0XHQvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLlxuXHRcdFx0Ly8gSW5jcmVtZW50aW5nIGFuIGluaXRpYWxseS1zdHJpbmcgXCIwXCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdFxuXHRcdFx0Ly8gY2FzZSwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSBcIjAwXCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvXG5cdFx0XHQvLyBudW1lcmljYWxseSB6ZXJvLlxuXHRcdFx0aWYgKCBieVNldCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7XG5cdFx0XHRcdGogPSAwO1xuXHRcdFx0XHR3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHQvLyBSZWludGVncmF0ZSBlbGVtZW50IG1hdGNoZXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBzb3J0aW5nXG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkQ291bnQgPiAwICkge1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggISh1bm1hdGNoZWRbaV0gfHwgc2V0TWF0Y2hlZFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0c2V0TWF0Y2hlZFtpXSA9IHBvcC5jYWxsKCByZXN1bHRzICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlc1xuXHRcdFx0XHRcdHNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQWRkIG1hdGNoZXMgdG8gcmVzdWx0c1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZXRNYXRjaGVkICk7XG5cblx0XHRcdFx0Ly8gU2VlZGxlc3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGluZyBtdWx0aXBsZSBzdWNjZXNzZnVsIG1hdGNoZXJzIHN0aXB1bGF0ZSBzb3J0aW5nXG5cdFx0XHRcdGlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdCggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkge1xuXG5cdFx0XHRcdFx0U2l6emxlLnVuaXF1ZVNvcnQoIHJlc3VsdHMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnNcblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRkaXJydW5zID0gZGlycnVuc1VuaXF1ZTtcblx0XHRcdFx0b3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHRCYWNrdXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB1bm1hdGNoZWQ7XG5cdFx0fTtcblxuXHRyZXR1cm4gYnlTZXQgP1xuXHRcdG1hcmtGdW5jdGlvbiggc3VwZXJNYXRjaGVyICkgOlxuXHRcdHN1cGVyTWF0Y2hlcjtcbn1cblxuY29tcGlsZSA9IFNpenpsZS5jb21waWxlID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBtYXRjaCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHtcblx0dmFyIGksXG5cdFx0c2V0TWF0Y2hlcnMgPSBbXSxcblx0XHRlbGVtZW50TWF0Y2hlcnMgPSBbXSxcblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCAhY2FjaGVkICkge1xuXHRcdC8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudFxuXHRcdGlmICggIW1hdGNoICkge1xuXHRcdFx0bWF0Y2ggPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblx0XHR9XG5cdFx0aSA9IG1hdGNoLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGNhY2hlZCA9IG1hdGNoZXJGcm9tVG9rZW5zKCBtYXRjaFtpXSApO1xuXHRcdFx0aWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0c2V0TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtZW50TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FjaGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZSggc2VsZWN0b3IsIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApICk7XG5cblx0XHQvLyBTYXZlIHNlbGVjdG9yIGFuZCB0b2tlbml6YXRpb25cblx0XHRjYWNoZWQuc2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0fVxuXHRyZXR1cm4gY2FjaGVkO1xufTtcblxuLyoqXG4gKiBBIGxvdy1sZXZlbCBzZWxlY3Rpb24gZnVuY3Rpb24gdGhhdCB3b3JrcyB3aXRoIFNpenpsZSdzIGNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb25zXG4gKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZFxuICogIHNlbGVjdG9yIGZ1bmN0aW9uIGJ1aWx0IHdpdGggU2l6emxlLmNvbXBpbGVcbiAqIEBwYXJhbSB7RWxlbWVudH0gY29udGV4dFxuICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdXG4gKiBAcGFyYW0ge0FycmF5fSBbc2VlZF0gQSBzZXQgb2YgZWxlbWVudHMgdG8gbWF0Y2ggYWdhaW5zdFxuICovXG5zZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkge1xuXHR2YXIgaSwgdG9rZW5zLCB0b2tlbiwgdHlwZSwgZmluZCxcblx0XHRjb21waWxlZCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICYmIHNlbGVjdG9yLFxuXHRcdG1hdGNoID0gIXNlZWQgJiYgdG9rZW5pemUoIChzZWxlY3RvciA9IGNvbXBpbGVkLnNlbGVjdG9yIHx8IHNlbGVjdG9yKSApO1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFRyeSB0byBtaW5pbWl6ZSBvcGVyYXRpb25zIGlmIHRoZXJlIGlzIG9ubHkgb25lIHNlbGVjdG9yIGluIHRoZSBsaXN0IGFuZCBubyBzZWVkXG5cdC8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dClcblx0aWYgKCBtYXRjaC5sZW5ndGggPT09IDEgKSB7XG5cblx0XHQvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRFxuXHRcdHRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTtcblx0XHRpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gXCJJRFwiICYmXG5cdFx0XHRcdHN1cHBvcnQuZ2V0QnlJZCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0XHRcdEV4cHIucmVsYXRpdmVbIHRva2Vuc1sxXS50eXBlIF0gKSB7XG5cblx0XHRcdGNvbnRleHQgPSAoIEV4cHIuZmluZFtcIklEXCJdKCB0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UocnVuZXNjYXBlLCBmdW5lc2NhcGUpLCBjb250ZXh0ICkgfHwgW10gKVswXTtcblx0XHRcdGlmICggIWNvbnRleHQgKSB7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHQvLyBQcmVjb21waWxlZCBtYXRjaGVycyB3aWxsIHN0aWxsIHZlcmlmeSBhbmNlc3RyeSwgc28gc3RlcCB1cCBhIGxldmVsXG5cdFx0XHR9IGVsc2UgaWYgKCBjb21waWxlZCApIHtcblx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQucGFyZW50Tm9kZTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZSggdG9rZW5zLnNoaWZ0KCkudmFsdWUubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZ1xuXHRcdGkgPSBtYXRjaEV4cHJbXCJuZWVkc0NvbnRleHRcIl0udGVzdCggc2VsZWN0b3IgKSA/IDAgOiB0b2tlbnMubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG9rZW4gPSB0b2tlbnNbaV07XG5cblx0XHRcdC8vIEFib3J0IGlmIHdlIGhpdCBhIGNvbWJpbmF0b3Jcblx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgKHR5cGUgPSB0b2tlbi50eXBlKSBdICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggKGZpbmQgPSBFeHByLmZpbmRbIHR5cGUgXSkgKSB7XG5cdFx0XHRcdC8vIFNlYXJjaCwgZXhwYW5kaW5nIGNvbnRleHQgZm9yIGxlYWRpbmcgc2libGluZyBjb21iaW5hdG9yc1xuXHRcdFx0XHRpZiAoIChzZWVkID0gZmluZChcblx0XHRcdFx0XHR0b2tlbi5tYXRjaGVzWzBdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICksXG5cdFx0XHRcdFx0cnNpYmxpbmcudGVzdCggdG9rZW5zWzBdLnR5cGUgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHRcdFx0XHQpKSApIHtcblxuXHRcdFx0XHRcdC8vIElmIHNlZWQgaXMgZW1wdHkgb3Igbm8gdG9rZW5zIHJlbWFpbiwgd2UgY2FuIHJldHVybiBlYXJseVxuXHRcdFx0XHRcdHRva2Vucy5zcGxpY2UoIGksIDEgKTtcblx0XHRcdFx0XHRzZWxlY3RvciA9IHNlZWQubGVuZ3RoICYmIHRvU2VsZWN0b3IoIHRva2VucyApO1xuXHRcdFx0XHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2VlZCApO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBDb21waWxlIGFuZCBleGVjdXRlIGEgZmlsdGVyaW5nIGZ1bmN0aW9uIGlmIG9uZSBpcyBub3QgcHJvdmlkZWRcblx0Ly8gUHJvdmlkZSBgbWF0Y2hgIHRvIGF2b2lkIHJldG9rZW5pemF0aW9uIGlmIHdlIG1vZGlmaWVkIHRoZSBzZWxlY3RvciBhYm92ZVxuXHQoIGNvbXBpbGVkIHx8IGNvbXBpbGUoIHNlbGVjdG9yLCBtYXRjaCApICkoXG5cdFx0c2VlZCxcblx0XHRjb250ZXh0LFxuXHRcdCFkb2N1bWVudElzSFRNTCxcblx0XHRyZXN1bHRzLFxuXHRcdCFjb250ZXh0IHx8IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0KTtcblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vLyBPbmUtdGltZSBhc3NpZ25tZW50c1xuXG4vLyBTb3J0IHN0YWJpbGl0eVxuc3VwcG9ydC5zb3J0U3RhYmxlID0gZXhwYW5kby5zcGxpdChcIlwiKS5zb3J0KCBzb3J0T3JkZXIgKS5qb2luKFwiXCIpID09PSBleHBhbmRvO1xuXG4vLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrXG4vLyBBbHdheXMgYXNzdW1lIGR1cGxpY2F0ZXMgaWYgdGhleSBhcmVuJ3QgcGFzc2VkIHRvIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uXG5zdXBwb3J0LmRldGVjdER1cGxpY2F0ZXMgPSAhIWhhc0R1cGxpY2F0ZTtcblxuLy8gSW5pdGlhbGl6ZSBhZ2FpbnN0IHRoZSBkZWZhdWx0IGRvY3VtZW50XG5zZXREb2N1bWVudCgpO1xuXG4vLyBTdXBwb3J0OiBXZWJraXQ8NTM3LjMyIC0gU2FmYXJpIDYuMC4zL0Nocm9tZSAyNSAoZml4ZWQgaW4gQ2hyb21lIDI3KVxuLy8gRGV0YWNoZWQgbm9kZXMgY29uZm91bmRpbmdseSBmb2xsb3cgKmVhY2ggb3RoZXIqXG5zdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydChmdW5jdGlvbiggZGl2MSApIHtcblx0Ly8gU2hvdWxkIHJldHVybiAxLCBidXQgcmV0dXJucyA0IChmb2xsb3dpbmcpXG5cdHJldHVybiBkaXYxLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpICkgJiAxO1xufSk7XG5cbi8vIFN1cHBvcnQ6IElFPDhcbi8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5IFwiaW50ZXJwb2xhdGlvblwiXG4vLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4XG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0ZGl2LmlubmVySFRNTCA9IFwiPGEgaHJlZj0nIyc+PC9hPlwiO1xuXHRyZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIgO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggXCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInR5cGVcIiA/IDEgOiAyICk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0ZGl2LmlubmVySFRNTCA9IFwiPGlucHV0Lz5cIjtcblx0ZGl2LmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCBcInZhbHVlXCIsIFwiXCIgKTtcblx0cmV0dXJuIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IFwiXCI7XG59KSApIHtcblx0YWRkSGFuZGxlKCBcInZhbHVlXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLmRlZmF1bHRWYWx1ZTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZ2V0QXR0cmlidXRlTm9kZSB0byBmZXRjaCBib29sZWFucyB3aGVuIGdldEF0dHJpYnV0ZSBsaWVzXG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0cmV0dXJuIGRpdi5nZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA9PSBudWxsO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgdmFsO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdFx0KHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdH1cblx0fSk7XG59XG5cbnJldHVybiBTaXp6bGU7XG5cbn0pKCB3aW5kb3cgKTtcblxuXG5cbmpRdWVyeS5maW5kID0gU2l6emxlO1xualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xualF1ZXJ5LmV4cHJbIFwiOlwiIF0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zO1xualF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7XG5qUXVlcnkudGV4dCA9IFNpenpsZS5nZXRUZXh0O1xualF1ZXJ5LmlzWE1MRG9jID0gU2l6emxlLmlzWE1MO1xualF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zO1xuXG5cblxudmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkge1xuXHR2YXIgbWF0Y2hlZCA9IFtdLFxuXHRcdHRydW5jYXRlID0gdW50aWwgIT09IHVuZGVmaW5lZDtcblxuXHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgJiYgZWxlbS5ub2RlVHlwZSAhPT0gOSApIHtcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdG1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbWF0Y2hlZDtcbn07XG5cblxudmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7XG5cdHZhciBtYXRjaGVkID0gW107XG5cblx0Zm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHtcblx0XHRpZiAoIG4ubm9kZVR5cGUgPT09IDEgJiYgbiAhPT0gZWxlbSApIHtcblx0XHRcdG1hdGNoZWQucHVzaCggbiApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtcblxudmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbXFx3LV0rKVxccypcXC8/Pig/OjxcXC9cXDE+fCkkLyApO1xuXG5cblxudmFyIHJpc1NpbXBsZSA9IC9eLlteOiNcXFtcXC4sXSokLztcblxuLy8gSW1wbGVtZW50IHRoZSBpZGVudGljYWwgZnVuY3Rpb25hbGl0eSBmb3IgZmlsdGVyIGFuZCBub3RcbmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkge1xuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdC8qIGpzaGludCAtVzAxOCAqL1xuXHRcdFx0cmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90O1xuXHRcdH0gKTtcblxuXHR9XG5cblx0aWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90O1xuXHRcdH0gKTtcblxuXHR9XG5cblx0aWYgKCB0eXBlb2YgcXVhbGlmaWVyID09PSBcInN0cmluZ1wiICkge1xuXHRcdGlmICggcmlzU2ltcGxlLnRlc3QoIHF1YWxpZmllciApICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApO1xuXHRcdH1cblxuXHRcdHF1YWxpZmllciA9IGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMgKTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiAoIGluZGV4T2YuY2FsbCggcXVhbGlmaWVyLCBlbGVtICkgPiAtMSApICE9PSBub3Q7XG5cdH0gKTtcbn1cblxualF1ZXJ5LmZpbHRlciA9IGZ1bmN0aW9uKCBleHByLCBlbGVtcywgbm90ICkge1xuXHR2YXIgZWxlbSA9IGVsZW1zWyAwIF07XG5cblx0aWYgKCBub3QgKSB7XG5cdFx0ZXhwciA9IFwiOm5vdChcIiArIGV4cHIgKyBcIilcIjtcblx0fVxuXG5cdHJldHVybiBlbGVtcy5sZW5ndGggPT09IDEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSA/XG5cdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBleHByICkgPyBbIGVsZW0gXSA6IFtdIDpcblx0XHRqUXVlcnkuZmluZC5tYXRjaGVzKCBleHByLCBqUXVlcnkuZ3JlcCggZWxlbXMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7XG5cdFx0fSApICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgaSxcblx0XHRcdGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0cmV0ID0gW10sXG5cdFx0XHRzZWxmID0gdGhpcztcblxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkoIHNlbGVjdG9yICkuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKSApO1xuXHRcdH1cblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRqUXVlcnkuZmluZCggc2VsZWN0b3IsIHNlbGZbIGkgXSwgcmV0ICk7XG5cdFx0fVxuXG5cdFx0Ly8gTmVlZGVkIGJlY2F1c2UgJCggc2VsZWN0b3IsIGNvbnRleHQgKSBiZWNvbWVzICQoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApXG5cdFx0cmV0ID0gdGhpcy5wdXNoU3RhY2soIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldCApO1xuXHRcdHJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgPyB0aGlzLnNlbGVjdG9yICsgXCIgXCIgKyBzZWxlY3RvciA6IHNlbGVjdG9yO1xuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cdGZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgZmFsc2UgKSApO1xuXHR9LFxuXHRub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyggdGhpcywgc2VsZWN0b3IgfHwgW10sIHRydWUgKSApO1xuXHR9LFxuXHRpczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiAhIXdpbm5vdyhcblx0XHRcdHRoaXMsXG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXRcblx0XHRcdC8vIHNvICQoXCJwOmZpcnN0XCIpLmlzKFwicDpsYXN0XCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3byBcInBcIi5cblx0XHRcdHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiAmJiBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9yICkgOlxuXHRcdFx0XHRzZWxlY3RvciB8fCBbXSxcblx0XHRcdGZhbHNlXG5cdFx0KS5sZW5ndGg7XG5cdH1cbn0gKTtcblxuXG4vLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdFxuXG5cbi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KVxudmFyIHJvb3RqUXVlcnksXG5cblx0Ly8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Ncblx0Ly8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKVxuXHQvLyBTdHJpY3QgSFRNTCByZWNvZ25pdGlvbiAoIzExMjkwOiBtdXN0IHN0YXJ0IHdpdGggPClcblx0cnF1aWNrRXhwciA9IC9eKD86XFxzKig8W1xcd1xcV10rPilbXj5dKnwjKFtcXHctXSopKSQvLFxuXG5cdGluaXQgPSBqUXVlcnkuZm4uaW5pdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcm9vdCApIHtcblx0XHR2YXIgbWF0Y2gsIGVsZW07XG5cblx0XHQvLyBIQU5ETEU6ICQoXCJcIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSlcblx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdC8vIE1ldGhvZCBpbml0KCkgYWNjZXB0cyBhbiBhbHRlcm5hdGUgcm9vdGpRdWVyeVxuXHRcdC8vIHNvIG1pZ3JhdGUgY2FuIHN1cHBvcnQgalF1ZXJ5LnN1YiAoZ2gtMjEwMSlcblx0XHRyb290ID0gcm9vdCB8fCByb290alF1ZXJ5O1xuXG5cdFx0Ly8gSGFuZGxlIEhUTUwgc3RyaW5nc1xuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0aWYgKCBzZWxlY3RvclsgMCBdID09PSBcIjxcIiAmJlxuXHRcdFx0XHRzZWxlY3Rvclsgc2VsZWN0b3IubGVuZ3RoIC0gMSBdID09PSBcIj5cIiAmJlxuXHRcdFx0XHRzZWxlY3Rvci5sZW5ndGggPj0gMyApIHtcblxuXHRcdFx0XHQvLyBBc3N1bWUgdGhhdCBzdHJpbmdzIHRoYXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBIVE1MIGFuZCBza2lwIHRoZSByZWdleCBjaGVja1xuXHRcdFx0XHRtYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1hdGNoIGh0bWwgb3IgbWFrZSBzdXJlIG5vIGNvbnRleHQgaXMgc3BlY2lmaWVkIGZvciAjaWRcblx0XHRcdGlmICggbWF0Y2ggJiYgKCBtYXRjaFsgMSBdIHx8ICFjb250ZXh0ICkgKSB7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpXG5cdFx0XHRcdGlmICggbWF0Y2hbIDEgXSApIHtcblx0XHRcdFx0XHRjb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbIDAgXSA6IGNvbnRleHQ7XG5cblx0XHRcdFx0XHQvLyBPcHRpb24gdG8gcnVuIHNjcmlwdHMgaXMgdHJ1ZSBmb3IgYmFjay1jb21wYXRcblx0XHRcdFx0XHQvLyBJbnRlbnRpb25hbGx5IGxldCB0aGUgZXJyb3IgYmUgdGhyb3duIGlmIHBhcnNlSFRNTCBpcyBub3QgcHJlc2VudFxuXHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcywgalF1ZXJ5LnBhcnNlSFRNTChcblx0XHRcdFx0XHRcdG1hdGNoWyAxIF0sXG5cdFx0XHRcdFx0XHRjb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IGRvY3VtZW50LFxuXHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdCkgKTtcblxuXHRcdFx0XHRcdC8vIEhBTkRMRTogJChodG1sLCBwcm9wcylcblx0XHRcdFx0XHRpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbIDEgXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCBtYXRjaCBpbiBjb250ZXh0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFByb3BlcnRpZXMgb2YgY29udGV4dCBhcmUgY2FsbGVkIGFzIG1ldGhvZHMgaWYgcG9zc2libGVcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IEJsYWNrYmVycnkgNC42XG5cdFx0XHRcdFx0Ly8gZ0VCSUQgcmV0dXJucyBub2RlcyBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICgjNjk2Mylcblx0XHRcdFx0XHRpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkge1xuXG5cdFx0XHRcdFx0XHQvLyBJbmplY3QgdGhlIGVsZW1lbnQgZGlyZWN0bHkgaW50byB0aGUgalF1ZXJ5IG9iamVjdFxuXHRcdFx0XHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0XHRcdFx0dGhpc1sgMCBdID0gZWxlbTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLmNvbnRleHQgPSBkb2N1bWVudDtcblx0XHRcdFx0XHR0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsICQoLi4uKSlcblx0XHRcdH0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkge1xuXHRcdFx0XHRyZXR1cm4gKCBjb250ZXh0IHx8IHJvb3QgKS5maW5kKCBzZWxlY3RvciApO1xuXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgY29udGV4dClcblx0XHRcdC8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3IoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0Ly8gSEFORExFOiAkKERPTUVsZW1lbnQpXG5cdFx0fSBlbHNlIGlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7XG5cdFx0XHR0aGlzLmNvbnRleHQgPSB0aGlzWyAwIF0gPSBzZWxlY3Rvcjtcblx0XHRcdHRoaXMubGVuZ3RoID0gMTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0Ly8gSEFORExFOiAkKGZ1bmN0aW9uKVxuXHRcdC8vIFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeVxuXHRcdH0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICkge1xuXHRcdFx0cmV0dXJuIHJvb3QucmVhZHkgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHJvb3QucmVhZHkoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0c2VsZWN0b3IoIGpRdWVyeSApO1xuXHRcdH1cblxuXHRcdGlmICggc2VsZWN0b3Iuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3Rvcjtcblx0XHRcdHRoaXMuY29udGV4dCA9IHNlbGVjdG9yLmNvbnRleHQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yLCB0aGlzICk7XG5cdH07XG5cbi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb25cbmluaXQucHJvdG90eXBlID0galF1ZXJ5LmZuO1xuXG4vLyBJbml0aWFsaXplIGNlbnRyYWwgcmVmZXJlbmNlXG5yb290alF1ZXJ5ID0galF1ZXJ5KCBkb2N1bWVudCApO1xuXG5cbnZhciBycGFyZW50c3ByZXYgPSAvXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxcblxuXHQvLyBNZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFydGluZyBmcm9tIGEgdW5pcXVlIHNldFxuXHRndWFyYW50ZWVkVW5pcXVlID0ge1xuXHRcdGNoaWxkcmVuOiB0cnVlLFxuXHRcdGNvbnRlbnRzOiB0cnVlLFxuXHRcdG5leHQ6IHRydWUsXG5cdFx0cHJldjogdHJ1ZVxuXHR9O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGhhczogZnVuY3Rpb24oIHRhcmdldCApIHtcblx0XHR2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksXG5cdFx0XHRsID0gdGFyZ2V0cy5sZW5ndGg7XG5cblx0XHRyZXR1cm4gdGhpcy5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGkgPSAwO1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1sgaSBdICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0Y2xvc2VzdDogZnVuY3Rpb24oIHNlbGVjdG9ycywgY29udGV4dCApIHtcblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRtYXRjaGVkID0gW10sXG5cdFx0XHRwb3MgPSBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApIHx8IHR5cGVvZiBzZWxlY3RvcnMgIT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9ycywgY29udGV4dCB8fCB0aGlzLmNvbnRleHQgKSA6XG5cdFx0XHRcdDA7XG5cblx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRmb3IgKCBjdXIgPSB0aGlzWyBpIF07IGN1ciAmJiBjdXIgIT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXG5cdFx0XHRcdC8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50c1xuXHRcdFx0XHRpZiAoIGN1ci5ub2RlVHlwZSA8IDExICYmICggcG9zID9cblx0XHRcdFx0XHRwb3MuaW5kZXgoIGN1ciApID4gLTEgOlxuXG5cdFx0XHRcdFx0Ly8gRG9uJ3QgcGFzcyBub24tZWxlbWVudHMgdG8gU2l6emxlXG5cdFx0XHRcdFx0Y3VyLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHtcblxuXHRcdFx0XHRcdG1hdGNoZWQucHVzaCggY3VyICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQubGVuZ3RoID4gMSA/IGpRdWVyeS51bmlxdWVTb3J0KCBtYXRjaGVkICkgOiBtYXRjaGVkICk7XG5cdH0sXG5cblx0Ly8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IHdpdGhpbiB0aGUgc2V0XG5cdGluZGV4OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIE5vIGFyZ3VtZW50LCByZXR1cm4gaW5kZXggaW4gcGFyZW50XG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybiAoIHRoaXNbIDAgXSAmJiB0aGlzWyAwIF0ucGFyZW50Tm9kZSApID8gdGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGggOiAtMTtcblx0XHR9XG5cblx0XHQvLyBJbmRleCBpbiBzZWxlY3RvclxuXHRcdGlmICggdHlwZW9mIGVsZW0gPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50XG5cdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggdGhpcyxcblxuXHRcdFx0Ly8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkXG5cdFx0XHRlbGVtLmpxdWVyeSA/IGVsZW1bIDAgXSA6IGVsZW1cblx0XHQpO1xuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayhcblx0XHRcdGpRdWVyeS51bmlxdWVTb3J0KFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHRhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID9cblx0XHRcdHRoaXMucHJldk9iamVjdCA6IHRoaXMucHJldk9iamVjdC5maWx0ZXIoIHNlbGVjdG9yIClcblx0XHQpO1xuXHR9XG59ICk7XG5cbmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkge1xuXHR3aGlsZSAoICggY3VyID0gY3VyWyBkaXIgXSApICYmIGN1ci5ub2RlVHlwZSAhPT0gMSApIHt9XG5cdHJldHVybiBjdXI7XG59XG5cbmpRdWVyeS5lYWNoKCB7XG5cdHBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsO1xuXHR9LFxuXHRwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInBhcmVudE5vZGVcIiApO1xuXHR9LFxuXHRwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInBhcmVudE5vZGVcIiwgdW50aWwgKTtcblx0fSxcblx0bmV4dDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiApO1xuXHR9LFxuXHRuZXh0QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldkFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiApO1xuXHR9LFxuXHRuZXh0VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHByZXZVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHNpYmxpbmdzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZ3MoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApO1xuXHR9LFxuXHRjaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCBlbGVtLmZpcnN0Q2hpbGQgKTtcblx0fSxcblx0Y29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudCB8fCBqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmNoaWxkTm9kZXMgKTtcblx0fVxufSwgZnVuY3Rpb24oIG5hbWUsIGZuICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7XG5cdFx0dmFyIG1hdGNoZWQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTtcblxuXHRcdGlmICggbmFtZS5zbGljZSggLTUgKSAhPT0gXCJVbnRpbFwiICkge1xuXHRcdFx0c2VsZWN0b3IgPSB1bnRpbDtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgZHVwbGljYXRlc1xuXHRcdFx0aWYgKCAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdICkge1xuXHRcdFx0XHRqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlc1xuXHRcdFx0aWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRtYXRjaGVkLnJldmVyc2UoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQgKTtcblx0fTtcbn0gKTtcbnZhciBybm90d2hpdGUgPSAoIC9cXFMrL2cgKTtcblxuXG5cbi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzXG5mdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkge1xuXHR2YXIgb2JqZWN0ID0ge307XG5cdGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXSwgZnVuY3Rpb24oIF8sIGZsYWcgKSB7XG5cdFx0b2JqZWN0WyBmbGFnIF0gPSB0cnVlO1xuXHR9ICk7XG5cdHJldHVybiBvYmplY3Q7XG59XG5cbi8qXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcbiAqXG4gKlx0b3B0aW9uczogYW4gb3B0aW9uYWwgbGlzdCBvZiBzcGFjZS1zZXBhcmF0ZWQgb3B0aW9ucyB0aGF0IHdpbGwgY2hhbmdlIGhvd1xuICpcdFx0XHR0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBvcHRpb24gb2JqZWN0XG4gKlxuICogQnkgZGVmYXVsdCBhIGNhbGxiYWNrIGxpc3Qgd2lsbCBhY3QgbGlrZSBhbiBldmVudCBjYWxsYmFjayBsaXN0IGFuZCBjYW4gYmVcbiAqIFwiZmlyZWRcIiBtdWx0aXBsZSB0aW1lcy5cbiAqXG4gKiBQb3NzaWJsZSBvcHRpb25zOlxuICpcbiAqXHRvbmNlOlx0XHRcdHdpbGwgZW5zdXJlIHRoZSBjYWxsYmFjayBsaXN0IGNhbiBvbmx5IGJlIGZpcmVkIG9uY2UgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0bWVtb3J5Olx0XHRcdHdpbGwga2VlcCB0cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdpbGwgY2FsbCBhbnkgY2FsbGJhY2sgYWRkZWRcbiAqXHRcdFx0XHRcdGFmdGVyIHRoZSBsaXN0IGhhcyBiZWVuIGZpcmVkIHJpZ2h0IGF3YXkgd2l0aCB0aGUgbGF0ZXN0IFwibWVtb3JpemVkXCJcbiAqXHRcdFx0XHRcdHZhbHVlcyAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHR1bmlxdWU6XHRcdFx0d2lsbCBlbnN1cmUgYSBjYWxsYmFjayBjYW4gb25seSBiZSBhZGRlZCBvbmNlIChubyBkdXBsaWNhdGUgaW4gdGhlIGxpc3QpXG4gKlxuICpcdHN0b3BPbkZhbHNlOlx0aW50ZXJydXB0IGNhbGxpbmdzIHdoZW4gYSBjYWxsYmFjayByZXR1cm5zIGZhbHNlXG4gKlxuICovXG5qUXVlcnkuQ2FsbGJhY2tzID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0Ly8gQ29udmVydCBvcHRpb25zIGZyb20gU3RyaW5nLWZvcm1hdHRlZCB0byBPYmplY3QtZm9ybWF0dGVkIGlmIG5lZWRlZFxuXHQvLyAod2UgY2hlY2sgaW4gY2FjaGUgZmlyc3QpXG5cdG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIiA/XG5cdFx0Y3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIDpcblx0XHRqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0aW9ucyApO1xuXG5cdHZhciAvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCBpcyBjdXJyZW50bHkgZmlyaW5nXG5cdFx0ZmlyaW5nLFxuXG5cdFx0Ly8gTGFzdCBmaXJlIHZhbHVlIGZvciBub24tZm9yZ2V0dGFibGUgbGlzdHNcblx0XHRtZW1vcnksXG5cblx0XHQvLyBGbGFnIHRvIGtub3cgaWYgbGlzdCB3YXMgYWxyZWFkeSBmaXJlZFxuXHRcdGZpcmVkLFxuXG5cdFx0Ly8gRmxhZyB0byBwcmV2ZW50IGZpcmluZ1xuXHRcdGxvY2tlZCxcblxuXHRcdC8vIEFjdHVhbCBjYWxsYmFjayBsaXN0XG5cdFx0bGlzdCA9IFtdLFxuXG5cdFx0Ly8gUXVldWUgb2YgZXhlY3V0aW9uIGRhdGEgZm9yIHJlcGVhdGFibGUgbGlzdHNcblx0XHRxdWV1ZSA9IFtdLFxuXG5cdFx0Ly8gSW5kZXggb2YgY3VycmVudGx5IGZpcmluZyBjYWxsYmFjayAobW9kaWZpZWQgYnkgYWRkL3JlbW92ZSBhcyBuZWVkZWQpXG5cdFx0ZmlyaW5nSW5kZXggPSAtMSxcblxuXHRcdC8vIEZpcmUgY2FsbGJhY2tzXG5cdFx0ZmlyZSA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBFbmZvcmNlIHNpbmdsZS1maXJpbmdcblx0XHRcdGxvY2tlZCA9IG9wdGlvbnMub25jZTtcblxuXHRcdFx0Ly8gRXhlY3V0ZSBjYWxsYmFja3MgZm9yIGFsbCBwZW5kaW5nIGV4ZWN1dGlvbnMsXG5cdFx0XHQvLyByZXNwZWN0aW5nIGZpcmluZ0luZGV4IG92ZXJyaWRlcyBhbmQgcnVudGltZSBjaGFuZ2VzXG5cdFx0XHRmaXJlZCA9IGZpcmluZyA9IHRydWU7XG5cdFx0XHRmb3IgKCA7IHF1ZXVlLmxlbmd0aDsgZmlyaW5nSW5kZXggPSAtMSApIHtcblx0XHRcdFx0bWVtb3J5ID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdFx0d2hpbGUgKCArK2ZpcmluZ0luZGV4IDwgbGlzdC5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHQvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvblxuXHRcdFx0XHRcdGlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmXG5cdFx0XHRcdFx0XHRvcHRpb25zLnN0b3BPbkZhbHNlICkge1xuXG5cdFx0XHRcdFx0XHQvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlXG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvcmdldCB0aGUgZGF0YSBpZiB3ZSdyZSBkb25lIHdpdGggaXRcblx0XHRcdGlmICggIW9wdGlvbnMubWVtb3J5ICkge1xuXHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0ZmlyaW5nID0gZmFsc2U7XG5cblx0XHRcdC8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kXG5cdFx0XHRpZiAoIGxvY2tlZCApIHtcblxuXHRcdFx0XHQvLyBLZWVwIGFuIGVtcHR5IGxpc3QgaWYgd2UgaGF2ZSBkYXRhIGZvciBmdXR1cmUgYWRkIGNhbGxzXG5cdFx0XHRcdGlmICggbWVtb3J5ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGlzdCA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3Rcblx0XHRzZWxmID0ge1xuXG5cdFx0XHQvLyBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0XG5cdFx0XHRhZGQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBoYXZlIG1lbW9yeSBmcm9tIGEgcGFzdCBydW4sIHdlIHNob3VsZCBmaXJlIGFmdGVyIGFkZGluZ1xuXHRcdFx0XHRcdGlmICggbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRcdHF1ZXVlLnB1c2goIG1lbW9yeSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCggZnVuY3Rpb24gYWRkKCBhcmdzICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsaXN0LnB1c2goIGFyZyApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgalF1ZXJ5LnR5cGUoIGFyZyApICE9PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gSW5zcGVjdCByZWN1cnNpdmVseVxuXHRcdFx0XHRcdFx0XHRcdGFkZCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHR9ICkoIGFyZ3VtZW50cyApO1xuXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0XG5cdFx0XHRyZW1vdmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZWFjaCggYXJndW1lbnRzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdHZhciBpbmRleDtcblx0XHRcdFx0XHR3aGlsZSAoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdGxpc3Quc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgZmlyaW5nIGluZGV4ZXNcblx0XHRcdFx0XHRcdGlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7XG5cdFx0XHRcdFx0XHRcdGZpcmluZ0luZGV4LS07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYSBnaXZlbiBjYWxsYmFjayBpcyBpbiB0aGUgbGlzdC5cblx0XHRcdC8vIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCByZXR1cm4gd2hldGhlciBvciBub3QgbGlzdCBoYXMgY2FsbGJhY2tzIGF0dGFjaGVkLlxuXHRcdFx0aGFzOiBmdW5jdGlvbiggZm4gKSB7XG5cdFx0XHRcdHJldHVybiBmbiA/XG5cdFx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIGZuLCBsaXN0ICkgPiAtMSA6XG5cdFx0XHRcdFx0bGlzdC5sZW5ndGggPiAwO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gUmVtb3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgbGlzdFxuXHRcdFx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZFxuXHRcdFx0Ly8gQWJvcnQgYW55IGN1cnJlbnQvcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHQvLyBDbGVhciBhbGwgY2FsbGJhY2tzIGFuZCB2YWx1ZXNcblx0XHRcdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsb2NrZWQgPSBxdWV1ZSA9IFtdO1xuXHRcdFx0XHRsaXN0ID0gbWVtb3J5ID0gXCJcIjtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0ZGlzYWJsZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gIWxpc3Q7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlXG5cdFx0XHQvLyBBbHNvIGRpc2FibGUgLmFkZCB1bmxlc3Mgd2UgaGF2ZSBtZW1vcnkgKHNpbmNlIGl0IHdvdWxkIGhhdmUgbm8gZWZmZWN0KVxuXHRcdFx0Ly8gQWJvcnQgYW55IHBlbmRpbmcgZXhlY3V0aW9uc1xuXHRcdFx0bG9jazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGlmICggIW1lbW9yeSApIHtcblx0XHRcdFx0XHRsaXN0ID0gbWVtb3J5ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRsb2NrZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFsb2NrZWQ7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDYWxsIGFsbCBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCBhbmQgYXJndW1lbnRzXG5cdFx0XHRmaXJlV2l0aDogZnVuY3Rpb24oIGNvbnRleHQsIGFyZ3MgKSB7XG5cdFx0XHRcdGlmICggIWxvY2tlZCApIHtcblx0XHRcdFx0XHRhcmdzID0gYXJncyB8fCBbXTtcblx0XHRcdFx0XHRhcmdzID0gWyBjb250ZXh0LCBhcmdzLnNsaWNlID8gYXJncy5zbGljZSgpIDogYXJncyBdO1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGFyZ3MgKTtcblx0XHRcdFx0XHRpZiAoICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2FsbCBhbGwgdGhlIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHNcblx0XHRcdGZpcmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRzZWxmLmZpcmVXaXRoKCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIHRoZSBjYWxsYmFja3MgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2Vcblx0XHRcdGZpcmVkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhZmlyZWQ7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRyZXR1cm4gc2VsZjtcbn07XG5cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdERlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHtcblx0XHR2YXIgdHVwbGVzID0gW1xuXG5cdFx0XHRcdC8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBsaXN0ZW5lciBsaXN0LCBmaW5hbCBzdGF0ZVxuXHRcdFx0XHRbIFwicmVzb2x2ZVwiLCBcImRvbmVcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksIFwicmVzb2x2ZWRcIiBdLFxuXHRcdFx0XHRbIFwicmVqZWN0XCIsIFwiZmFpbFwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgXCJyZWplY3RlZFwiIF0sXG5cdFx0XHRcdFsgXCJub3RpZnlcIiwgXCJwcm9ncmVzc1wiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm1lbW9yeVwiICkgXVxuXHRcdFx0XSxcblx0XHRcdHN0YXRlID0gXCJwZW5kaW5nXCIsXG5cdFx0XHRwcm9taXNlID0ge1xuXHRcdFx0XHRzdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0YXRlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRhbHdheXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGVuOiBmdW5jdGlvbiggLyogZm5Eb25lLCBmbkZhaWwsIGZuUHJvZ3Jlc3MgKi8gKSB7XG5cdFx0XHRcdFx0dmFyIGZucyA9IGFyZ3VtZW50cztcblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBmbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBmbnNbIGkgXSApICYmIGZuc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkWyBkb25lIHwgZmFpbCB8IHByb2dyZXNzIF0gZm9yIGZvcndhcmRpbmcgYWN0aW9ucyB0byBuZXdEZWZlclxuXHRcdFx0XHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDEgXSBdKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQgPSBmbiAmJiBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQucHJvbWlzZSgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5IClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZmFpbCggbmV3RGVmZXIucmVqZWN0ICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXShcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcyA9PT0gcHJvbWlzZSA/IG5ld0RlZmVyLnByb21pc2UoKSA6IHRoaXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0Zm5zID0gbnVsbDtcblx0XHRcdFx0XHR9ICkucHJvbWlzZSgpO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIEdldCBhIHByb21pc2UgZm9yIHRoaXMgZGVmZXJyZWRcblx0XHRcdFx0Ly8gSWYgb2JqIGlzIHByb3ZpZGVkLCB0aGUgcHJvbWlzZSBhc3BlY3QgaXMgYWRkZWQgdG8gdGhlIG9iamVjdFxuXHRcdFx0XHRwcm9taXNlOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdFx0XHRcdHJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGRlZmVycmVkID0ge307XG5cblx0XHQvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0XG5cdFx0cHJvbWlzZS5waXBlID0gcHJvbWlzZS50aGVuO1xuXG5cdFx0Ly8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kc1xuXHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHtcblx0XHRcdHZhciBsaXN0ID0gdHVwbGVbIDIgXSxcblx0XHRcdFx0c3RhdGVTdHJpbmcgPSB0dXBsZVsgMyBdO1xuXG5cdFx0XHQvLyBwcm9taXNlWyBkb25lIHwgZmFpbCB8IHByb2dyZXNzIF0gPSBsaXN0LmFkZFxuXHRcdFx0cHJvbWlzZVsgdHVwbGVbIDEgXSBdID0gbGlzdC5hZGQ7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZVxuXHRcdFx0aWYgKCBzdGF0ZVN0cmluZyApIHtcblx0XHRcdFx0bGlzdC5hZGQoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdFx0Ly8gc3RhdGUgPSBbIHJlc29sdmVkIHwgcmVqZWN0ZWQgXVxuXHRcdFx0XHRcdHN0YXRlID0gc3RhdGVTdHJpbmc7XG5cblx0XHRcdFx0Ly8gWyByZWplY3RfbGlzdCB8IHJlc29sdmVfbGlzdCBdLmRpc2FibGU7IHByb2dyZXNzX2xpc3QubG9ja1xuXHRcdFx0XHR9LCB0dXBsZXNbIGkgXiAxIF1bIDIgXS5kaXNhYmxlLCB0dXBsZXNbIDIgXVsgMiBdLmxvY2sgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gZGVmZXJyZWRbIHJlc29sdmUgfCByZWplY3QgfCBub3RpZnkgXVxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0oIHRoaXMgPT09IGRlZmVycmVkID8gcHJvbWlzZSA6IHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH07XG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0gPSBsaXN0LmZpcmVXaXRoO1xuXHRcdH0gKTtcblxuXHRcdC8vIE1ha2UgdGhlIGRlZmVycmVkIGEgcHJvbWlzZVxuXHRcdHByb21pc2UucHJvbWlzZSggZGVmZXJyZWQgKTtcblxuXHRcdC8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnlcblx0XHRpZiAoIGZ1bmMgKSB7XG5cdFx0XHRmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJlZCApO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBkb25lIVxuXHRcdHJldHVybiBkZWZlcnJlZDtcblx0fSxcblxuXHQvLyBEZWZlcnJlZCBoZWxwZXJcblx0d2hlbjogZnVuY3Rpb24oIHN1Ym9yZGluYXRlIC8qICwgLi4uLCBzdWJvcmRpbmF0ZU4gKi8gKSB7XG5cdFx0dmFyIGkgPSAwLFxuXHRcdFx0cmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLFxuXHRcdFx0bGVuZ3RoID0gcmVzb2x2ZVZhbHVlcy5sZW5ndGgsXG5cblx0XHRcdC8vIHRoZSBjb3VudCBvZiB1bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXNcblx0XHRcdHJlbWFpbmluZyA9IGxlbmd0aCAhPT0gMSB8fFxuXHRcdFx0XHQoIHN1Ym9yZGluYXRlICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBzdWJvcmRpbmF0ZS5wcm9taXNlICkgKSA/IGxlbmd0aCA6IDAsXG5cblx0XHRcdC8vIHRoZSBtYXN0ZXIgRGVmZXJyZWQuXG5cdFx0XHQvLyBJZiByZXNvbHZlVmFsdWVzIGNvbnNpc3Qgb2Ygb25seSBhIHNpbmdsZSBEZWZlcnJlZCwganVzdCB1c2UgdGhhdC5cblx0XHRcdGRlZmVycmVkID0gcmVtYWluaW5nID09PSAxID8gc3Vib3JkaW5hdGUgOiBqUXVlcnkuRGVmZXJyZWQoKSxcblxuXHRcdFx0Ly8gVXBkYXRlIGZ1bmN0aW9uIGZvciBib3RoIHJlc29sdmUgYW5kIHByb2dyZXNzIHZhbHVlc1xuXHRcdFx0dXBkYXRlRnVuYyA9IGZ1bmN0aW9uKCBpLCBjb250ZXh0cywgdmFsdWVzICkge1xuXHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdGNvbnRleHRzWyBpIF0gPSB0aGlzO1xuXHRcdFx0XHRcdHZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggdmFsdWVzID09PSBwcm9ncmVzc1ZhbHVlcyApIHtcblx0XHRcdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAhKCAtLXJlbWFpbmluZyApICkge1xuXHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNvbnRleHRzLCB2YWx1ZXMgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9LFxuXG5cdFx0XHRwcm9ncmVzc1ZhbHVlcywgcHJvZ3Jlc3NDb250ZXh0cywgcmVzb2x2ZUNvbnRleHRzO1xuXG5cdFx0Ly8gQWRkIGxpc3RlbmVycyB0byBEZWZlcnJlZCBzdWJvcmRpbmF0ZXM7IHRyZWF0IG90aGVycyBhcyByZXNvbHZlZFxuXHRcdGlmICggbGVuZ3RoID4gMSApIHtcblx0XHRcdHByb2dyZXNzVmFsdWVzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcblx0XHRcdHByb2dyZXNzQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApO1xuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdLnByb21pc2UgKSApIHtcblx0XHRcdFx0XHRyZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSgpXG5cdFx0XHRcdFx0XHQucHJvZ3Jlc3MoIHVwZGF0ZUZ1bmMoIGksIHByb2dyZXNzQ29udGV4dHMsIHByb2dyZXNzVmFsdWVzICkgKVxuXHRcdFx0XHRcdFx0LmRvbmUoIHVwZGF0ZUZ1bmMoIGksIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApIClcblx0XHRcdFx0XHRcdC5mYWlsKCBkZWZlcnJlZC5yZWplY3QgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQtLXJlbWFpbmluZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIElmIHdlJ3JlIG5vdCB3YWl0aW5nIG9uIGFueXRoaW5nLCByZXNvbHZlIHRoZSBtYXN0ZXJcblx0XHRpZiAoICFyZW1haW5pbmcgKSB7XG5cdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlZmVycmVkLnByb21pc2UoKTtcblx0fVxufSApO1xuXG5cbi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeVxudmFyIHJlYWR5TGlzdDtcblxualF1ZXJ5LmZuLnJlYWR5ID0gZnVuY3Rpb24oIGZuICkge1xuXG5cdC8vIEFkZCB0aGUgY2FsbGJhY2tcblx0alF1ZXJ5LnJlYWR5LnByb21pc2UoKS5kb25lKCBmbiApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODFcblx0cmVhZHlXYWl0OiAxLFxuXG5cdC8vIEhvbGQgKG9yIHJlbGVhc2UpIHRoZSByZWFkeSBldmVudFxuXHRob2xkUmVhZHk6IGZ1bmN0aW9uKCBob2xkICkge1xuXHRcdGlmICggaG9sZCApIHtcblx0XHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0XHR9IGVsc2Uge1xuXHRcdFx0alF1ZXJ5LnJlYWR5KCB0cnVlICk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHlcblx0cmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkge1xuXG5cdFx0Ly8gQWJvcnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaG9sZHMgb3Igd2UncmUgYWxyZWFkeSByZWFkeVxuXHRcdGlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeVxuXHRcdGpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTtcblxuXHRcdC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBmaXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlXG5cdFx0aWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZVxuXHRcdHJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTtcblxuXHRcdC8vIFRyaWdnZXIgYW55IGJvdW5kIHJlYWR5IGV2ZW50c1xuXHRcdGlmICggalF1ZXJ5LmZuLnRyaWdnZXJIYW5kbGVyICkge1xuXHRcdFx0alF1ZXJ5KCBkb2N1bWVudCApLnRyaWdnZXJIYW5kbGVyKCBcInJlYWR5XCIgKTtcblx0XHRcdGpRdWVyeSggZG9jdW1lbnQgKS5vZmYoIFwicmVhZHlcIiApO1xuXHRcdH1cblx0fVxufSApO1xuXG4vKipcbiAqIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kXG4gKi9cbmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcblx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCApO1xuXHRqUXVlcnkucmVhZHkoKTtcbn1cblxualF1ZXJ5LnJlYWR5LnByb21pc2UgPSBmdW5jdGlvbiggb2JqICkge1xuXHRpZiAoICFyZWFkeUxpc3QgKSB7XG5cblx0XHRyZWFkeUxpc3QgPSBqUXVlcnkuRGVmZXJyZWQoKTtcblxuXHRcdC8vIENhdGNoIGNhc2VzIHdoZXJlICQoZG9jdW1lbnQpLnJlYWR5KCkgaXMgY2FsbGVkXG5cdFx0Ly8gYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQuXG5cdFx0Ly8gU3VwcG9ydDogSUU5LTEwIG9ubHlcblx0XHQvLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyBcImludGVyYWN0aXZlXCIgdG9vIHNvb25cblx0XHRpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiB8fFxuXHRcdFx0KCBkb2N1bWVudC5yZWFkeVN0YXRlICE9PSBcImxvYWRpbmdcIiAmJiAhZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsICkgKSB7XG5cblx0XHRcdC8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeVxuXHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFja1xuXHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXG5cdFx0XHQvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29ya1xuXHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwibG9hZFwiLCBjb21wbGV0ZWQgKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlYWR5TGlzdC5wcm9taXNlKCBvYmogKTtcbn07XG5cbi8vIEtpY2sgb2ZmIHRoZSBET00gcmVhZHkgY2hlY2sgZXZlbiBpZiB0aGUgdXNlciBkb2VzIG5vdFxualF1ZXJ5LnJlYWR5LnByb21pc2UoKTtcblxuXG5cblxuLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uXG4vLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb25cbnZhciBhY2Nlc3MgPSBmdW5jdGlvbiggZWxlbXMsIGZuLCBrZXksIHZhbHVlLCBjaGFpbmFibGUsIGVtcHR5R2V0LCByYXcgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSBlbGVtcy5sZW5ndGgsXG5cdFx0YnVsayA9IGtleSA9PSBudWxsO1xuXG5cdC8vIFNldHMgbWFueSB2YWx1ZXNcblx0aWYgKCBqUXVlcnkudHlwZSgga2V5ICkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblx0XHRmb3IgKCBpIGluIGtleSApIHtcblx0XHRcdGFjY2VzcyggZWxlbXMsIGZuLCBpLCBrZXlbIGkgXSwgdHJ1ZSwgZW1wdHlHZXQsIHJhdyApO1xuXHRcdH1cblxuXHQvLyBTZXRzIG9uZSB2YWx1ZVxuXHR9IGVsc2UgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cblx0XHRpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJhdyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBidWxrICkge1xuXG5cdFx0XHQvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWluc3QgdGhlIGVudGlyZSBzZXRcblx0XHRcdGlmICggcmF3ICkge1xuXHRcdFx0XHRmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTtcblx0XHRcdFx0Zm4gPSBudWxsO1xuXG5cdFx0XHQvLyAuLi5leGNlcHQgd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gdmFsdWVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWxrID0gZm47XG5cdFx0XHRcdGZuID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRmbihcblx0XHRcdFx0XHRlbGVtc1sgaSBdLCBrZXksIHJhdyA/XG5cdFx0XHRcdFx0dmFsdWUgOlxuXHRcdFx0XHRcdHZhbHVlLmNhbGwoIGVsZW1zWyBpIF0sIGksIGZuKCBlbGVtc1sgaSBdLCBrZXkgKSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNoYWluYWJsZSA/XG5cdFx0ZWxlbXMgOlxuXG5cdFx0Ly8gR2V0c1xuXHRcdGJ1bGsgP1xuXHRcdFx0Zm4uY2FsbCggZWxlbXMgKSA6XG5cdFx0XHRsZW4gPyBmbiggZWxlbXNbIDAgXSwga2V5ICkgOiBlbXB0eUdldDtcbn07XG52YXIgYWNjZXB0RGF0YSA9IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHQvLyBBY2NlcHRzIG9ubHk6XG5cdC8vICAtIE5vZGVcblx0Ly8gICAgLSBOb2RlLkVMRU1FTlRfTk9ERVxuXHQvLyAgICAtIE5vZGUuRE9DVU1FTlRfTk9ERVxuXHQvLyAgLSBPYmplY3Rcblx0Ly8gICAgLSBBbnlcblx0LyoganNoaW50IC1XMDE4ICovXG5cdHJldHVybiBvd25lci5ub2RlVHlwZSA9PT0gMSB8fCBvd25lci5ub2RlVHlwZSA9PT0gOSB8fCAhKCArb3duZXIubm9kZVR5cGUgKTtcbn07XG5cblxuXG5cbmZ1bmN0aW9uIERhdGEoKSB7XG5cdHRoaXMuZXhwYW5kbyA9IGpRdWVyeS5leHBhbmRvICsgRGF0YS51aWQrKztcbn1cblxuRGF0YS51aWQgPSAxO1xuXG5EYXRhLnByb3RvdHlwZSA9IHtcblxuXHRyZWdpc3RlcjogZnVuY3Rpb24oIG93bmVyLCBpbml0aWFsICkge1xuXHRcdHZhciB2YWx1ZSA9IGluaXRpYWwgfHwge307XG5cblx0XHQvLyBJZiBpdCBpcyBhIG5vZGUgdW5saWtlbHkgdG8gYmUgc3RyaW5naWZ5LWVkIG9yIGxvb3BlZCBvdmVyXG5cdFx0Ly8gdXNlIHBsYWluIGFzc2lnbm1lbnRcblx0XHRpZiAoIG93bmVyLm5vZGVUeXBlICkge1xuXHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7XG5cblx0XHQvLyBPdGhlcndpc2Ugc2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUsIG5vbi13cml0YWJsZSBwcm9wZXJ0eVxuXHRcdC8vIGNvbmZpZ3VyYWJpbGl0eSBtdXN0IGJlIHRydWUgdG8gYWxsb3cgdGhlIHByb3BlcnR5IHRvIGJlXG5cdFx0Ly8gZGVsZXRlZCB3aXRoIHRoZSBkZWxldGUgb3BlcmF0b3Jcblx0XHR9IGVsc2Uge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBvd25lciwgdGhpcy5leHBhbmRvLCB7XG5cdFx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdFx0d3JpdGFibGU6IHRydWUsXG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHRcdFx0fSApO1xuXHRcdH1cblx0XHRyZXR1cm4gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHR9LFxuXHRjYWNoZTogZnVuY3Rpb24oIG93bmVyICkge1xuXG5cdFx0Ly8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsXG5cdFx0Ly8gYnV0IHdlIHNob3VsZCBub3QsIHNlZSAjODMzNS5cblx0XHQvLyBBbHdheXMgcmV0dXJuIGFuIGVtcHR5IG9iamVjdC5cblx0XHRpZiAoICFhY2NlcHREYXRhKCBvd25lciApICkge1xuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH1cblxuXHRcdC8vIENoZWNrIGlmIHRoZSBvd25lciBvYmplY3QgYWxyZWFkeSBoYXMgYSBjYWNoZVxuXHRcdHZhciB2YWx1ZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblxuXHRcdC8vIElmIG5vdCwgY3JlYXRlIG9uZVxuXHRcdGlmICggIXZhbHVlICkge1xuXHRcdFx0dmFsdWUgPSB7fTtcblxuXHRcdFx0Ly8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsXG5cdFx0XHQvLyBidXQgd2Ugc2hvdWxkIG5vdCwgc2VlICM4MzM1LlxuXHRcdFx0Ly8gQWx3YXlzIHJldHVybiBhbiBlbXB0eSBvYmplY3QuXG5cdFx0XHRpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYgaXQgaXMgYSBub2RlIHVubGlrZWx5IHRvIGJlIHN0cmluZ2lmeS1lZCBvciBsb29wZWQgb3ZlclxuXHRcdFx0XHQvLyB1c2UgcGxhaW4gYXNzaWdubWVudFxuXHRcdFx0XHRpZiAoIG93bmVyLm5vZGVUeXBlICkge1xuXHRcdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHZhbHVlO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBzZWN1cmUgaXQgaW4gYSBub24tZW51bWVyYWJsZSBwcm9wZXJ0eVxuXHRcdFx0XHQvLyBjb25maWd1cmFibGUgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZVxuXHRcdFx0XHQvLyBkZWxldGVkIHdoZW4gZGF0YSBpcyByZW1vdmVkXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBvd25lciwgdGhpcy5leHBhbmRvLCB7XG5cdFx0XHRcdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWVcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH0sXG5cdHNldDogZnVuY3Rpb24oIG93bmVyLCBkYXRhLCB2YWx1ZSApIHtcblx0XHR2YXIgcHJvcCxcblx0XHRcdGNhY2hlID0gdGhpcy5jYWNoZSggb3duZXIgKTtcblxuXHRcdC8vIEhhbmRsZTogWyBvd25lciwga2V5LCB2YWx1ZSBdIGFyZ3Ncblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Y2FjaGVbIGRhdGEgXSA9IHZhbHVlO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3Ncblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRjYWNoZVsgcHJvcCBdID0gZGF0YVsgcHJvcCBdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gY2FjaGU7XG5cdH0sXG5cdGdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7XG5cdFx0cmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdHRoaXMuY2FjaGUoIG93bmVyICkgOlxuXHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdICYmIG93bmVyWyB0aGlzLmV4cGFuZG8gXVsga2V5IF07XG5cdH0sXG5cdGFjY2VzczogZnVuY3Rpb24oIG93bmVyLCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBzdG9yZWQ7XG5cblx0XHQvLyBJbiBjYXNlcyB3aGVyZSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIE5vIGtleSB3YXMgc3BlY2lmaWVkXG5cdFx0Ly8gICAyLiBBIHN0cmluZyBrZXkgd2FzIHNwZWNpZmllZCwgYnV0IG5vIHZhbHVlIHByb3ZpZGVkXG5cdFx0Ly9cblx0XHQvLyBUYWtlIHRoZSBcInJlYWRcIiBwYXRoIGFuZCBhbGxvdyB0aGUgZ2V0IG1ldGhvZCB0byBkZXRlcm1pbmVcblx0XHQvLyB3aGljaCB2YWx1ZSB0byByZXR1cm4sIHJlc3BlY3RpdmVseSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIFRoZSBlbnRpcmUgY2FjaGUgb2JqZWN0XG5cdFx0Ly8gICAyLiBUaGUgZGF0YSBzdG9yZWQgYXQgdGhlIGtleVxuXHRcdC8vXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHQoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgKSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgKSB7XG5cblx0XHRcdHN0b3JlZCA9IHRoaXMuZ2V0KCBvd25lciwga2V5ICk7XG5cblx0XHRcdHJldHVybiBzdG9yZWQgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHN0b3JlZCA6IHRoaXMuZ2V0KCBvd25lciwgalF1ZXJ5LmNhbWVsQ2FzZSgga2V5ICkgKTtcblx0XHR9XG5cblx0XHQvLyBXaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllc1xuXHRcdC8vICAgMi4gQSBrZXkgYW5kIHZhbHVlXG5cdFx0Ly9cblx0XHR0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTtcblxuXHRcdC8vIFNpbmNlIHRoZSBcInNldFwiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50c1xuXHRcdC8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXVxuXHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7XG5cdH0sXG5cdHJlbW92ZTogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGNhbWVsLFxuXHRcdFx0Y2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHRpZiAoIGNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHRoaXMucmVnaXN0ZXIoIG93bmVyICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBTdXBwb3J0IGFycmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgb2Yga2V5c1xuXHRcdFx0aWYgKCBqUXVlcnkuaXNBcnJheSgga2V5ICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYgXCJuYW1lXCIgaXMgYW4gYXJyYXkgb2Yga2V5cy4uLlxuXHRcdFx0XHQvLyBXaGVuIGRhdGEgaXMgaW5pdGlhbGx5IGNyZWF0ZWQsIHZpYSAoXCJrZXlcIiwgXCJ2YWxcIikgc2lnbmF0dXJlLFxuXHRcdFx0XHQvLyBrZXlzIHdpbGwgYmUgY29udmVydGVkIHRvIGNhbWVsQ2FzZS5cblx0XHRcdFx0Ly8gU2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgX2hvd18gYSBrZXkgd2FzIGFkZGVkLCByZW1vdmVcblx0XHRcdFx0Ly8gYm90aCBwbGFpbiBrZXkgYW5kIGNhbWVsQ2FzZSBrZXkuICMxMjc4NlxuXHRcdFx0XHQvLyBUaGlzIHdpbGwgb25seSBwZW5hbGl6ZSB0aGUgYXJyYXkgYXJndW1lbnQgcGF0aC5cblx0XHRcdFx0bmFtZSA9IGtleS5jb25jYXQoIGtleS5tYXAoIGpRdWVyeS5jYW1lbENhc2UgKSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2FtZWwgPSBqUXVlcnkuY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0XHQvLyBUcnkgdGhlIHN0cmluZyBhcyBhIGtleSBiZWZvcmUgYW55IG1hbmlwdWxhdGlvblxuXHRcdFx0XHRpZiAoIGtleSBpbiBjYWNoZSApIHtcblx0XHRcdFx0XHRuYW1lID0gWyBrZXksIGNhbWVsIF07XG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBJZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuXG5cdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBjcmVhdGUgYW4gYXJyYXkgYnkgbWF0Y2hpbmcgbm9uLXdoaXRlc3BhY2Vcblx0XHRcdFx0XHRuYW1lID0gY2FtZWw7XG5cdFx0XHRcdFx0bmFtZSA9IG5hbWUgaW4gY2FjaGUgP1xuXHRcdFx0XHRcdFx0WyBuYW1lIF0gOiAoIG5hbWUubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aSA9IG5hbWUubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0ZGVsZXRlIGNhY2hlWyBuYW1lWyBpIF0gXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgdGhlcmUncyBubyBtb3JlIGRhdGFcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0gMzUtNDUrXG5cdFx0XHQvLyBXZWJraXQgJiBCbGluayBwZXJmb3JtYW5jZSBzdWZmZXJzIHdoZW4gZGVsZXRpbmcgcHJvcGVydGllc1xuXHRcdFx0Ly8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZFxuXHRcdFx0Ly8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM3ODYwN1xuXHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBvd25lciApIHtcblx0XHR2YXIgY2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0cmV0dXJuIGNhY2hlICE9PSB1bmRlZmluZWQgJiYgIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApO1xuXHR9XG59O1xudmFyIGRhdGFQcml2ID0gbmV3IERhdGEoKTtcblxudmFyIGRhdGFVc2VyID0gbmV3IERhdGEoKTtcblxuXG5cbi8vXHRJbXBsZW1lbnRhdGlvbiBTdW1tYXJ5XG4vL1xuLy9cdDEuIEVuZm9yY2UgQVBJIHN1cmZhY2UgYW5kIHNlbWFudGljIGNvbXBhdGliaWxpdHkgd2l0aCAxLjkueCBicmFuY2hcbi8vXHQyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcgdGhlIHN0b3JhZ2Vcbi8vXHRcdHBhdGhzIHRvIGEgc2luZ2xlIG1lY2hhbmlzbS5cbi8vXHQzLiBVc2UgdGhlIHNhbWUgc2luZ2xlIG1lY2hhbmlzbSB0byBzdXBwb3J0IFwicHJpdmF0ZVwiIGFuZCBcInVzZXJcIiBkYXRhLlxuLy9cdDQuIF9OZXZlcl8gZXhwb3NlIFwicHJpdmF0ZVwiIGRhdGEgdG8gdXNlciBjb2RlIChUT0RPOiBEcm9wIF9kYXRhLCBfcmVtb3ZlRGF0YSlcbi8vXHQ1LiBBdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9uIHVzZXIgb2JqZWN0cyAoZWcuIGV4cGFuZG8gcHJvcGVydGllcylcbi8vXHQ2LiBQcm92aWRlIGEgY2xlYXIgcGF0aCBmb3IgaW1wbGVtZW50YXRpb24gdXBncmFkZSB0byBXZWFrTWFwIGluIDIwMTRcblxudmFyIHJicmFjZSA9IC9eKD86XFx7W1xcd1xcV10qXFx9fFxcW1tcXHdcXFddKlxcXSkkLyxcblx0cm11bHRpRGFzaCA9IC9bQS1aXS9nO1xuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXHR2YXIgbmFtZTtcblxuXHQvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55XG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxuXHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJCZcIiApLnRvTG93ZXJDYXNlKCk7XG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGRhdGEgPT09IFwidHJ1ZVwiID8gdHJ1ZSA6XG5cdFx0XHRcdFx0ZGF0YSA9PT0gXCJmYWxzZVwiID8gZmFsc2UgOlxuXHRcdFx0XHRcdGRhdGEgPT09IFwibnVsbFwiID8gbnVsbCA6XG5cblx0XHRcdFx0XHQvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xuXHRcdFx0XHRcdCtkYXRhICsgXCJcIiA9PT0gZGF0YSA/ICtkYXRhIDpcblx0XHRcdFx0XHRyYnJhY2UudGVzdCggZGF0YSApID8galF1ZXJ5LnBhcnNlSlNPTiggZGF0YSApIDpcblx0XHRcdFx0XHRkYXRhO1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXJcblx0XHRcdGRhdGFVc2VyLnNldCggZWxlbSwga2V5LCBkYXRhICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBkYXRhO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkYXRhVXNlci5oYXNEYXRhKCBlbGVtICkgfHwgZGF0YVByaXYuaGFzRGF0YSggZWxlbSApO1xuXHR9LFxuXG5cdGRhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBkYXRhVXNlci5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRkYXRhVXNlci5yZW1vdmUoIGVsZW0sIG5hbWUgKTtcblx0fSxcblxuXHQvLyBUT0RPOiBOb3cgdGhhdCBhbGwgY2FsbHMgdG8gX2RhdGEgYW5kIF9yZW1vdmVEYXRhIGhhdmUgYmVlbiByZXBsYWNlZFxuXHQvLyB3aXRoIGRpcmVjdCBjYWxscyB0byBkYXRhUHJpdiBtZXRob2RzLCB0aGVzZSBjYW4gYmUgZGVwcmVjYXRlZC5cblx0X2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTtcblx0fSxcblxuXHRfcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHR2YXIgaSwgbmFtZSwgZGF0YSxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRhdHRycyA9IGVsZW0gJiYgZWxlbS5hdHRyaWJ1dGVzO1xuXG5cdFx0Ly8gR2V0cyBhbGwgdmFsdWVzXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdGhpcy5sZW5ndGggKSB7XG5cdFx0XHRcdGRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0gKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFQcml2LmdldCggZWxlbSwgXCJoYXNEYXRhQXR0cnNcIiApICkge1xuXHRcdFx0XHRcdGkgPSBhdHRycy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFMTErXG5cdFx0XHRcdFx0XHQvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NClcblx0XHRcdFx0XHRcdGlmICggYXR0cnNbIGkgXSApIHtcblx0XHRcdFx0XHRcdFx0bmFtZSA9IGF0dHJzWyBpIF0ubmFtZTtcblx0XHRcdFx0XHRcdFx0aWYgKCBuYW1lLmluZGV4T2YoIFwiZGF0YS1cIiApID09PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdG5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lLnNsaWNlKCA1ICkgKTtcblx0XHRcdFx0XHRcdFx0XHRkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0cyBtdWx0aXBsZSB2YWx1ZXNcblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZGF0YSwgY2FtZWxLZXk7XG5cblx0XHRcdC8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5XG5cdFx0XHQvLyAoYW5kIHRoZXJlZm9yZSBoYXMgYW4gZWxlbWVudCBhcHBlYXJzIGF0IHRoaXNbIDAgXSkgYW5kIHRoZVxuXHRcdFx0Ly8gYHZhbHVlYCBwYXJhbWV0ZXIgd2FzIG5vdCB1bmRlZmluZWQuIEFuIGVtcHR5IGpRdWVyeSBvYmplY3Rcblx0XHRcdC8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGxcblx0XHRcdC8vIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhbiBhdHRlbXB0IHRvIHJlYWQgYSBkYXRhIGNhY2hlIGlzIG1hZGUuXG5cdFx0XHRpZiAoIGVsZW0gJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlXG5cdFx0XHRcdC8vIHdpdGggdGhlIGtleSBhcy1pc1xuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtLCBrZXkgKSB8fFxuXG5cdFx0XHRcdFx0Ly8gVHJ5IHRvIGZpbmQgZGFzaGVkIGtleSBpZiBpdCBleGlzdHMgKGdoLTI3NzkpXG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBmb3IgMi4yLnggb25seVxuXHRcdFx0XHRcdGRhdGFVc2VyLmdldCggZWxlbSwga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsIFwiLSQmXCIgKS50b0xvd2VyQ2FzZSgpICk7XG5cblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYW1lbEtleSA9IGpRdWVyeS5jYW1lbENhc2UoIGtleSApO1xuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGVcblx0XHRcdFx0Ly8gd2l0aCB0aGUga2V5IGNhbWVsaXplZFxuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtLCBjYW1lbEtleSApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gXCJkaXNjb3ZlclwiIHRoZSBkYXRhIGluXG5cdFx0XHRcdC8vIEhUTUw1IGN1c3RvbSBkYXRhLSogYXR0cnNcblx0XHRcdFx0ZGF0YSA9IGRhdGFBdHRyKCBlbGVtLCBjYW1lbEtleSwgdW5kZWZpbmVkICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LlxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB0aGUgZGF0YS4uLlxuXHRcdFx0Y2FtZWxLZXkgPSBqUXVlcnkuY2FtZWxDYXNlKCBrZXkgKTtcblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gRmlyc3QsIGF0dGVtcHQgdG8gc3RvcmUgYSBjb3B5IG9yIHJlZmVyZW5jZSBvZiBhbnlcblx0XHRcdFx0Ly8gZGF0YSB0aGF0IG1pZ2h0J3ZlIGJlZW4gc3RvcmUgd2l0aCBhIGNhbWVsQ2FzZWQga2V5LlxuXHRcdFx0XHR2YXIgZGF0YSA9IGRhdGFVc2VyLmdldCggdGhpcywgY2FtZWxLZXkgKTtcblxuXHRcdFx0XHQvLyBGb3IgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZSBpbnRlcm9wLCB3ZSBoYXZlIHRvXG5cdFx0XHRcdC8vIHN0b3JlIHByb3BlcnR5IG5hbWVzIHdpdGggZGFzaGVzIGluIGEgY2FtZWxDYXNlIGZvcm0uXG5cdFx0XHRcdC8vIFRoaXMgbWlnaHQgbm90IGFwcGx5IHRvIGFsbCBwcm9wZXJ0aWVzLi4uKlxuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGNhbWVsS2V5LCB2YWx1ZSApO1xuXG5cdFx0XHRcdC8vICouLi4gSW4gdGhlIGNhc2Ugb2YgcHJvcGVydGllcyB0aGF0IG1pZ2h0IF9hY3R1YWxseV9cblx0XHRcdFx0Ly8gaGF2ZSBkYXNoZXMsIHdlIG5lZWQgdG8gYWxzbyBzdG9yZSBhIGNvcHkgb2YgdGhhdFxuXHRcdFx0XHQvLyB1bmNoYW5nZWQgcHJvcGVydHkuXG5cdFx0XHRcdGlmICgga2V5LmluZGV4T2YoIFwiLVwiICkgPiAtMSAmJiBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0ZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXksIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGF0YVVzZXIucmVtb3ZlKCB0aGlzLCBrZXkgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgcXVldWU7XG5cblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHR0eXBlID0gKCB0eXBlIHx8IFwiZnhcIiApICsgXCJxdWV1ZVwiO1xuXHRcdFx0cXVldWUgPSBkYXRhUHJpdi5nZXQoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0Ly8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cFxuXHRcdFx0aWYgKCBkYXRhICkge1xuXHRcdFx0XHRpZiAoICFxdWV1ZSB8fCBqUXVlcnkuaXNBcnJheSggZGF0YSApICkge1xuXHRcdFx0XHRcdHF1ZXVlID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KCBkYXRhICkgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBkYXRhICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBxdWV1ZSB8fCBbXTtcblx0XHR9XG5cdH0sXG5cblx0ZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksXG5cdFx0XHRzdGFydExlbmd0aCA9IHF1ZXVlLmxlbmd0aCxcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKSxcblx0XHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksXG5cdFx0XHRuZXh0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7XG5cdFx0XHR9O1xuXG5cdFx0Ly8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbFxuXHRcdGlmICggZm4gPT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0c3RhcnRMZW5ndGgtLTtcblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXG5cdFx0XHQvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nXG5cdFx0XHQvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiApIHtcblx0XHRcdFx0cXVldWUudW5zaGlmdCggXCJpbnByb2dyZXNzXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2xlYXIgdXAgdGhlIGxhc3QgcXVldWUgc3RvcCBmdW5jdGlvblxuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XG5cdFx0XHRmbi5jYWxsKCBlbGVtLCBuZXh0LCBob29rcyApO1xuXHRcdH1cblxuXHRcdGlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkge1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSgpO1xuXHRcdH1cblx0fSxcblxuXHQvLyBOb3QgcHVibGljIC0gZ2VuZXJhdGUgYSBxdWV1ZUhvb2tzIG9iamVjdCwgb3IgcmV0dXJuIHRoZSBjdXJyZW50IG9uZVxuXHRfcXVldWVIb29rczogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XG5cdFx0dmFyIGtleSA9IHR5cGUgKyBcInF1ZXVlSG9va3NcIjtcblx0XHRyZXR1cm4gZGF0YVByaXYuZ2V0KCBlbGVtLCBrZXkgKSB8fCBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwge1xuXHRcdFx0ZW1wdHk6IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLmFkZCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgWyB0eXBlICsgXCJxdWV1ZVwiLCBrZXkgXSApO1xuXHRcdFx0fSApXG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBzZXR0ZXIgPSAyO1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGRhdGEgPSB0eXBlO1xuXHRcdFx0dHlwZSA9IFwiZnhcIjtcblx0XHRcdHNldHRlci0tO1xuXHRcdH1cblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHtcblx0XHRcdHJldHVybiBqUXVlcnkucXVldWUoIHRoaXNbIDAgXSwgdHlwZSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcyA6XG5cdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTtcblxuXHRcdFx0XHQvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZVxuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiAmJiBxdWV1ZVsgMCBdICE9PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdH0sXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHR9ICk7XG5cdH0sXG5cdGNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0fSxcblxuXHQvLyBHZXQgYSBwcm9taXNlIHJlc29sdmVkIHdoZW4gcXVldWVzIG9mIGEgY2VydGFpbiB0eXBlXG5cdC8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KVxuXHRwcm9taXNlOiBmdW5jdGlvbiggdHlwZSwgb2JqICkge1xuXHRcdHZhciB0bXAsXG5cdFx0XHRjb3VudCA9IDEsXG5cdFx0XHRkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0ZWxlbWVudHMgPSB0aGlzLFxuXHRcdFx0aSA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0cmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICEoIC0tY291bnQgKSApIHtcblx0XHRcdFx0XHRkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG9iaiA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRtcCA9IGRhdGFQcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArIFwicXVldWVIb29rc1wiICk7XG5cdFx0XHRpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7XG5cdFx0XHRcdGNvdW50Kys7XG5cdFx0XHRcdHRtcC5lbXB0eS5hZGQoIHJlc29sdmUgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmVzb2x2ZSgpO1xuXHRcdHJldHVybiBkZWZlci5wcm9taXNlKCBvYmogKTtcblx0fVxufSApO1xudmFyIHBudW0gPSAoIC9bKy1dPyg/OlxcZCpcXC58KVxcZCsoPzpbZUVdWystXT9cXGQrfCkvICkuc291cmNlO1xuXG52YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoIFwiXig/OihbKy1dKT18KShcIiArIHBudW0gKyBcIikoW2EteiVdKikkXCIsIFwiaVwiICk7XG5cblxudmFyIGNzc0V4cGFuZCA9IFsgXCJUb3BcIiwgXCJSaWdodFwiLCBcIkJvdHRvbVwiLCBcIkxlZnRcIiBdO1xuXG52YXIgaXNIaWRkZW4gPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7XG5cblx0XHQvLyBpc0hpZGRlbiBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uO1xuXHRcdC8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudFxuXHRcdGVsZW0gPSBlbCB8fCBlbGVtO1xuXHRcdHJldHVybiBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApID09PSBcIm5vbmVcIiB8fFxuXHRcdFx0IWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cdH07XG5cblxuXG5mdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkge1xuXHR2YXIgYWRqdXN0ZWQsXG5cdFx0c2NhbGUgPSAxLFxuXHRcdG1heEl0ZXJhdGlvbnMgPSAyMCxcblx0XHRjdXJyZW50VmFsdWUgPSB0d2VlbiA/XG5cdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIHR3ZWVuLmN1cigpOyB9IDpcblx0XHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4galF1ZXJ5LmNzcyggZWxlbSwgcHJvcCwgXCJcIiApOyB9LFxuXHRcdGluaXRpYWwgPSBjdXJyZW50VmFsdWUoKSxcblx0XHR1bml0ID0gdmFsdWVQYXJ0cyAmJiB2YWx1ZVBhcnRzWyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICksXG5cblx0XHQvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlc1xuXHRcdGluaXRpYWxJblVuaXQgPSAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSBcInB4XCIgJiYgK2luaXRpYWwgKSAmJlxuXHRcdFx0cmNzc051bS5leGVjKCBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wICkgKTtcblxuXHRpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5pdGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkge1xuXG5cdFx0Ly8gVHJ1c3QgdW5pdHMgcmVwb3J0ZWQgYnkgalF1ZXJ5LmNzc1xuXHRcdHVuaXQgPSB1bml0IHx8IGluaXRpYWxJblVuaXRbIDMgXTtcblxuXHRcdC8vIE1ha2Ugc3VyZSB3ZSB1cGRhdGUgdGhlIHR3ZWVuIHByb3BlcnRpZXMgbGF0ZXIgb25cblx0XHR2YWx1ZVBhcnRzID0gdmFsdWVQYXJ0cyB8fCBbXTtcblxuXHRcdC8vIEl0ZXJhdGl2ZWx5IGFwcHJveGltYXRlIGZyb20gYSBub256ZXJvIHN0YXJ0aW5nIHBvaW50XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsIHx8IDE7XG5cblx0XHRkbyB7XG5cblx0XHRcdC8vIElmIHByZXZpb3VzIGl0ZXJhdGlvbiB6ZXJvZWQgb3V0LCBkb3VibGUgdW50aWwgd2UgZ2V0ICpzb21ldGhpbmcqLlxuXHRcdFx0Ly8gVXNlIHN0cmluZyBmb3IgZG91Ymxpbmcgc28gd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IHNlZSBzY2FsZSBhcyB1bmNoYW5nZWQgYmVsb3dcblx0XHRcdHNjYWxlID0gc2NhbGUgfHwgXCIuNVwiO1xuXG5cdFx0XHQvLyBBZGp1c3QgYW5kIGFwcGx5XG5cdFx0XHRpbml0aWFsSW5Vbml0ID0gaW5pdGlhbEluVW5pdCAvIHNjYWxlO1xuXHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXG5cdFx0Ly8gVXBkYXRlIHNjYWxlLCB0b2xlcmF0aW5nIHplcm8gb3IgTmFOIGZyb20gdHdlZW4uY3VyKClcblx0XHQvLyBCcmVhayB0aGUgbG9vcCBpZiBzY2FsZSBpcyB1bmNoYW5nZWQgb3IgcGVyZmVjdCwgb3IgaWYgd2UndmUganVzdCBoYWQgZW5vdWdoLlxuXHRcdH0gd2hpbGUgKFxuXHRcdFx0c2NhbGUgIT09ICggc2NhbGUgPSBjdXJyZW50VmFsdWUoKSAvIGluaXRpYWwgKSAmJiBzY2FsZSAhPT0gMSAmJiAtLW1heEl0ZXJhdGlvbnNcblx0XHQpO1xuXHR9XG5cblx0aWYgKCB2YWx1ZVBhcnRzICkge1xuXHRcdGluaXRpYWxJblVuaXQgPSAraW5pdGlhbEluVW5pdCB8fCAraW5pdGlhbCB8fCAwO1xuXG5cdFx0Ly8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkXG5cdFx0YWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gP1xuXHRcdFx0aW5pdGlhbEluVW5pdCArICggdmFsdWVQYXJ0c1sgMSBdICsgMSApICogdmFsdWVQYXJ0c1sgMiBdIDpcblx0XHRcdCt2YWx1ZVBhcnRzWyAyIF07XG5cdFx0aWYgKCB0d2VlbiApIHtcblx0XHRcdHR3ZWVuLnVuaXQgPSB1bml0O1xuXHRcdFx0dHdlZW4uc3RhcnQgPSBpbml0aWFsSW5Vbml0O1xuXHRcdFx0dHdlZW4uZW5kID0gYWRqdXN0ZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhZGp1c3RlZDtcbn1cbnZhciByY2hlY2thYmxlVHlwZSA9ICggL14oPzpjaGVja2JveHxyYWRpbykkL2kgKTtcblxudmFyIHJ0YWdOYW1lID0gKCAvPChbXFx3Oi1dKykvICk7XG5cbnZhciByc2NyaXB0VHlwZSA9ICggL14kfFxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApO1xuXG5cblxuLy8gV2UgaGF2ZSB0byBjbG9zZSB0aGVzZSB0YWdzIHRvIHN1cHBvcnQgWEhUTUwgKCMxMzIwMClcbnZhciB3cmFwTWFwID0ge1xuXG5cdC8vIFN1cHBvcnQ6IElFOVxuXHRvcHRpb246IFsgMSwgXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsIFwiPC9zZWxlY3Q+XCIgXSxcblxuXHQvLyBYSFRNTCBwYXJzZXJzIGRvIG5vdCBtYWdpY2FsbHkgaW5zZXJ0IGVsZW1lbnRzIGluIHRoZVxuXHQvLyBzYW1lIHdheSB0aGF0IHRhZyBzb3VwIHBhcnNlcnMgZG8uIFNvIHdlIGNhbm5vdCBzaG9ydGVuXG5cdC8vIHRoaXMgYnkgb21pdHRpbmcgPHRib2R5PiBvciBvdGhlciByZXF1aXJlZCBlbGVtZW50cy5cblx0dGhlYWQ6IFsgMSwgXCI8dGFibGU+XCIsIFwiPC90YWJsZT5cIiBdLFxuXHRjb2w6IFsgMiwgXCI8dGFibGU+PGNvbGdyb3VwPlwiLCBcIjwvY29sZ3JvdXA+PC90YWJsZT5cIiBdLFxuXHR0cjogWyAyLCBcIjx0YWJsZT48dGJvZHk+XCIsIFwiPC90Ym9keT48L3RhYmxlPlwiIF0sXG5cdHRkOiBbIDMsIFwiPHRhYmxlPjx0Ym9keT48dHI+XCIsIFwiPC90cj48L3Rib2R5PjwvdGFibGU+XCIgXSxcblxuXHRfZGVmYXVsdDogWyAwLCBcIlwiLCBcIlwiIF1cbn07XG5cbi8vIFN1cHBvcnQ6IElFOVxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cblxuZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUU5LTExK1xuXHQvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpXG5cdHZhciByZXQgPSB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiA/XG5cdFx0XHRjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKSA6XG5cdFx0XHR0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiID9cblx0XHRcdFx0Y29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgfHwgXCIqXCIgKSA6XG5cdFx0XHRbXTtcblxuXHRyZXR1cm4gdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIGpRdWVyeS5ub2RlTmFtZSggY29udGV4dCwgdGFnICkgP1xuXHRcdGpRdWVyeS5tZXJnZSggWyBjb250ZXh0IF0sIHJldCApIDpcblx0XHRyZXQ7XG59XG5cblxuLy8gTWFyayBzY3JpcHRzIGFzIGhhdmluZyBhbHJlYWR5IGJlZW4gZXZhbHVhdGVkXG5mdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRkYXRhUHJpdi5zZXQoXG5cdFx0XHRlbGVtc1sgaSBdLFxuXHRcdFx0XCJnbG9iYWxFdmFsXCIsXG5cdFx0XHQhcmVmRWxlbWVudHMgfHwgZGF0YVByaXYuZ2V0KCByZWZFbGVtZW50c1sgaSBdLCBcImdsb2JhbEV2YWxcIiApXG5cdFx0KTtcblx0fVxufVxuXG5cbnZhciByaHRtbCA9IC88fCYjP1xcdys7LztcblxuZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHtcblx0dmFyIGVsZW0sIHRtcCwgdGFnLCB3cmFwLCBjb250YWlucywgaixcblx0XHRmcmFnbWVudCA9IGNvbnRleHQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdG5vZGVzID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1zWyBpIF07XG5cblx0XHRpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHtcblxuXHRcdFx0Ly8gQWRkIG5vZGVzIGRpcmVjdGx5XG5cdFx0XHRpZiAoIGpRdWVyeS50eXBlKCBlbGVtICkgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjEsIFBoYW50b21KUzwyXG5cdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgZWxlbS5ub2RlVHlwZSA/IFsgZWxlbSBdIDogZWxlbSApO1xuXG5cdFx0XHQvLyBDb252ZXJ0IG5vbi1odG1sIGludG8gYSB0ZXh0IG5vZGVcblx0XHRcdH0gZWxzZSBpZiAoICFyaHRtbC50ZXN0KCBlbGVtICkgKSB7XG5cdFx0XHRcdG5vZGVzLnB1c2goIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0gKSApO1xuXG5cdFx0XHQvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXNcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBlbmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKTtcblxuXHRcdFx0XHQvLyBEZXNlcmlhbGl6ZSBhIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uXG5cdFx0XHRcdHRhZyA9ICggcnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHR3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdDtcblx0XHRcdFx0dG1wLmlubmVySFRNTCA9IHdyYXBbIDEgXSArIGpRdWVyeS5odG1sUHJlZmlsdGVyKCBlbGVtICkgKyB3cmFwWyAyIF07XG5cblx0XHRcdFx0Ly8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50XG5cdFx0XHRcdGogPSB3cmFwWyAwIF07XG5cdFx0XHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0XHRcdHRtcCA9IHRtcC5sYXN0Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMSwgUGhhbnRvbUpTPDJcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCB0bXAuY2hpbGROb2RlcyApO1xuXG5cdFx0XHRcdC8vIFJlbWVtYmVyIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyXG5cdFx0XHRcdHRtcCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7XG5cblx0XHRcdFx0Ly8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKVxuXHRcdFx0XHR0bXAudGV4dENvbnRlbnQgPSBcIlwiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJlbW92ZSB3cmFwcGVyIGZyb20gZnJhZ21lbnRcblx0ZnJhZ21lbnQudGV4dENvbnRlbnQgPSBcIlwiO1xuXG5cdGkgPSAwO1xuXHR3aGlsZSAoICggZWxlbSA9IG5vZGVzWyBpKysgXSApICkge1xuXG5cdFx0Ly8gU2tpcCBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBjb250ZXh0IGNvbGxlY3Rpb24gKHRyYWMtNDA4Nylcblx0XHRpZiAoIHNlbGVjdGlvbiAmJiBqUXVlcnkuaW5BcnJheSggZWxlbSwgc2VsZWN0aW9uICkgPiAtMSApIHtcblx0XHRcdGlmICggaWdub3JlZCApIHtcblx0XHRcdFx0aWdub3JlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb250YWlucyA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cblx0XHQvLyBBcHBlbmQgdG8gZnJhZ21lbnRcblx0XHR0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksIFwic2NyaXB0XCIgKTtcblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRpZiAoIGNvbnRhaW5zICkge1xuXHRcdFx0c2V0R2xvYmFsRXZhbCggdG1wICk7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FwdHVyZSBleGVjdXRhYmxlc1xuXHRcdGlmICggc2NyaXB0cyApIHtcblx0XHRcdGogPSAwO1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0bXBbIGorKyBdICkgKSB7XG5cdFx0XHRcdGlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8IFwiXCIgKSApIHtcblx0XHRcdFx0XHRzY3JpcHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmcmFnbWVudDtcbn1cblxuXG4oIGZ1bmN0aW9uKCkge1xuXHR2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0ZGl2ID0gZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApLFxuXHRcdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAtNC4zLCBTYWZhcmk8PTUuMVxuXHQvLyBDaGVjayBzdGF0ZSBsb3N0IGlmIHRoZSBuYW1lIGlzIHNldCAoIzExMjE3KVxuXHQvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpXG5cdC8vIGBuYW1lYCBhbmQgYHR5cGVgIG11c3QgdXNlIC5zZXRBdHRyaWJ1dGUgZm9yIFdXQSAoIzE0OTAxKVxuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcInJhZGlvXCIgKTtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcImNoZWNrZWRcIiwgXCJjaGVja2VkXCIgKTtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJ0XCIgKTtcblxuXHRkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XG5cblx0Ly8gU3VwcG9ydDogU2FmYXJpPD01LjEsIEFuZHJvaWQ8NC4yXG5cdC8vIE9sZGVyIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50c1xuXHRzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUU8PTExK1xuXHQvLyBNYWtlIHN1cmUgdGV4dGFyZWEgKGFuZCBjaGVja2JveCkgZGVmYXVsdFZhbHVlIGlzIHByb3Blcmx5IGNsb25lZFxuXHRkaXYuaW5uZXJIVE1MID0gXCI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+XCI7XG5cdHN1cHBvcnQubm9DbG9uZUNoZWNrZWQgPSAhIWRpdi5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlO1xufSApKCk7XG5cblxudmFyXG5cdHJrZXlFdmVudCA9IC9ea2V5Lyxcblx0cm1vdXNlRXZlbnQgPSAvXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnV8ZHJhZ3xkcm9wKXxjbGljay8sXG5cdHJ0eXBlbmFtZXNwYWNlID0gL14oW14uXSopKD86XFwuKC4rKXwpLztcblxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcblx0cmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHJldHVybkZhbHNlKCkge1xuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8vIFN1cHBvcnQ6IElFOVxuLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvXG5mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblx0fSBjYXRjaCAoIGVyciApIHsgfVxufVxuXG5mdW5jdGlvbiBvbiggZWxlbSwgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgb25lICkge1xuXHR2YXIgb3JpZ0ZuLCB0eXBlO1xuXG5cdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xuXHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBkYXRhIClcblx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRvbiggZWxlbSwgdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XG5cblx0XHQvLyAoIHR5cGVzLCBmbiApXG5cdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vICggdHlwZXMsIGRhdGEsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHR9IGVsc2UgaWYgKCAhZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIG9uZSA9PT0gMSApIHtcblx0XHRvcmlnRm4gPSBmbjtcblx0XHRmbiA9IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXG5cdFx0XHRqUXVlcnkoKS5vZmYoIGV2ZW50ICk7XG5cdFx0XHRyZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9O1xuXG5cdFx0Ly8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm5cblx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcblx0fVxuXHRyZXR1cm4gZWxlbS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XG5cdH0gKTtcbn1cblxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS5cbiAqIFByb3BzIHRvIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFyeSBmb3IgbWFueSBvZiB0aGUgaWRlYXMuXG4gKi9cbmpRdWVyeS5ldmVudCA9IHtcblxuXHRnbG9iYWw6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhLCBzZWxlY3RvciApIHtcblxuXHRcdHZhciBoYW5kbGVPYmpJbiwgZXZlbnRIYW5kbGUsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdC8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpXG5cdFx0aWYgKCAhZWxlbURhdGEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XG5cdFx0XHRoYW5kbGVPYmpJbiA9IGhhbmRsZXI7XG5cdFx0XHRoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjtcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyXG5cdFx0aWYgKCAhaGFuZGxlci5ndWlkICkge1xuXHRcdFx0aGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKztcblx0XHR9XG5cblx0XHQvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRoaXMgaXMgdGhlIGZpcnN0XG5cdFx0aWYgKCAhKCBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgKSApIHtcblx0XHRcdGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9O1xuXHRcdH1cblx0XHRpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7XG5cdFx0XHRldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSA9IGZ1bmN0aW9uKCBlICkge1xuXG5cdFx0XHRcdC8vIERpc2NhcmQgdGhlIHNlY29uZCBldmVudCBvZiBhIGpRdWVyeS5ldmVudC50cmlnZ2VyKCkgYW5kXG5cdFx0XHRcdC8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWRcblx0XHRcdFx0cmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09IFwidW5kZWZpbmVkXCIgJiYgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCAhPT0gZS50eXBlID9cblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuZGlzcGF0Y2guYXBwbHkoIGVsZW0sIGFyZ3VtZW50cyApIDogdW5kZWZpbmVkO1xuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlXG5cdFx0dHlwZXMgPSAoIHR5cGVzIHx8IFwiXCIgKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx5IGhhbmRsZXJzXG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cblx0XHRcdC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVyc1xuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKVxuXHRcdFx0fSwgaGFuZGxlT2JqSW4gKTtcblxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3Rcblx0XHRcdGlmICggISggaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSApICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZFR5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdGlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbIFwiXCIgXTtcblx0XHR0ID0gdHlwZXMubGVuZ3RoO1xuXHRcdHdoaWxlICggdC0tICkge1xuXHRcdFx0dG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdO1xuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG1wWyAxIF07XG5cdFx0XHRuYW1lc3BhY2VzID0gKCB0bXBbIDIgXSB8fCBcIlwiICkuc3BsaXQoIFwiLlwiICkuc29ydCgpO1xuXG5cdFx0XHQvLyBVbmJpbmQgYWxsIGV2ZW50cyAob24gdGhpcyBuYW1lc3BhY2UsIGlmIHByb3ZpZGVkKSBmb3IgdGhlIGVsZW1lbnRcblx0XHRcdGlmICggIXR5cGUgKSB7XG5cdFx0XHRcdGZvciAoIHR5cGUgaW4gZXZlbnRzICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKyB0eXBlc1sgdCBdLCBoYW5kbGVyLCBzZWxlY3RvciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRcdHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcblx0XHRcdGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gfHwgW107XG5cdFx0XHR0bXAgPSB0bXBbIDIgXSAmJlxuXHRcdFx0XHRuZXcgUmVnRXhwKCBcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5qb2luKCBcIlxcXFwuKD86LipcXFxcLnwpXCIgKSArIFwiKFxcXFwufCQpXCIgKTtcblxuXHRcdFx0Ly8gUmVtb3ZlIG1hdGNoaW5nIGV2ZW50c1xuXHRcdFx0b3JpZ0NvdW50ID0gaiA9IGhhbmRsZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0XHRoYW5kbGVPYmogPSBoYW5kbGVyc1sgaiBdO1xuXG5cdFx0XHRcdGlmICggKCBtYXBwZWRUeXBlcyB8fCBvcmlnVHlwZSA9PT0gaGFuZGxlT2JqLm9yaWdUeXBlICkgJiZcblx0XHRcdFx0XHQoICFoYW5kbGVyIHx8IGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAmJlxuXHRcdFx0XHRcdCggIXRtcCB8fCB0bXAudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgJiZcblx0XHRcdFx0XHQoICFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gaGFuZGxlT2JqLnNlbGVjdG9yIHx8XG5cdFx0XHRcdFx0XHRzZWxlY3RvciA9PT0gXCIqKlwiICYmIGhhbmRsZU9iai5zZWxlY3RvciApICkge1xuXHRcdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaiwgMSApO1xuXG5cdFx0XHRcdFx0aWYgKCBoYW5kbGVPYmouc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LS07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggc3BlY2lhbC5yZW1vdmUgKSB7XG5cdFx0XHRcdFx0XHRzcGVjaWFsLnJlbW92ZS5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVtb3ZlIGdlbmVyaWMgZXZlbnQgaGFuZGxlciBpZiB3ZSByZW1vdmVkIHNvbWV0aGluZyBhbmQgbm8gbW9yZSBoYW5kbGVycyBleGlzdFxuXHRcdFx0Ly8gKGF2b2lkcyBwb3RlbnRpYWwgZm9yIGVuZGxlc3MgcmVjdXJzaW9uIGR1cmluZyByZW1vdmFsIG9mIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMpXG5cdFx0XHRpZiAoIG9yaWdDb3VudCAmJiAhaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnRlYXJkb3duIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC50ZWFyZG93bi5jYWxsKCBlbGVtLCBuYW1lc3BhY2VzLCBlbGVtRGF0YS5oYW5kbGUgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGVsZW1EYXRhLmhhbmRsZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVsZXRlIGV2ZW50c1sgdHlwZSBdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSBkYXRhIGFuZCB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkXG5cdFx0aWYgKCBqUXVlcnkuaXNFbXB0eU9iamVjdCggZXZlbnRzICkgKSB7XG5cdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiaGFuZGxlIGV2ZW50c1wiICk7XG5cdFx0fVxuXHR9LFxuXG5cdGRpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHQvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3Rcblx0XHRldmVudCA9IGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICk7XG5cblx0XHR2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcblx0XHRcdGhhbmRsZXJzID0gKCBkYXRhUHJpdi5nZXQoIHRoaXMsIFwiZXZlbnRzXCIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gfHwgW10sXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGV2ZW50LnR5cGUgXSB8fCB7fTtcblxuXHRcdC8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50XG5cdFx0YXJnc1sgMCBdID0gZXZlbnQ7XG5cdFx0ZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzO1xuXG5cdFx0Ly8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZFxuXHRcdGlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJiBzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBoYW5kbGVyc1xuXHRcdGhhbmRsZXJRdWV1ZSA9IGpRdWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTtcblxuXHRcdC8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtO1xuXG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBoYW5kbGVPYmogPSBtYXRjaGVkLmhhbmRsZXJzWyBqKysgXSApICYmXG5cdFx0XHRcdCFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRcdC8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2Uocylcblx0XHRcdFx0Ly8gYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhvc2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuXG5cdFx0XHRcdGlmICggIWV2ZW50LnJuYW1lc3BhY2UgfHwgZXZlbnQucm5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XG5cblx0XHRcdFx0XHRldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7XG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xuXG5cdFx0XHRcdFx0cmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fFxuXHRcdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIgKS5hcHBseSggbWF0Y2hlZC5lbGVtLCBhcmdzICk7XG5cblx0XHRcdFx0XHRpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZVxuXHRcdGlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7XG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0aGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7XG5cdFx0dmFyIGksIG1hdGNoZXMsIHNlbCwgaGFuZGxlT2JqLFxuXHRcdFx0aGFuZGxlclF1ZXVlID0gW10sXG5cdFx0XHRkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCxcblx0XHRcdGN1ciA9IGV2ZW50LnRhcmdldDtcblxuXHRcdC8vIFN1cHBvcnQgKGF0IGxlYXN0KTogQ2hyb21lLCBJRTlcblx0XHQvLyBGaW5kIGRlbGVnYXRlIGhhbmRsZXJzXG5cdFx0Ly8gQmxhY2staG9sZSBTVkcgPHVzZT4gaW5zdGFuY2UgdHJlZXMgKCMxMzE4MClcblx0XHQvL1xuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3g8PTQyK1xuXHRcdC8vIEF2b2lkIG5vbi1sZWZ0LWNsaWNrIGluIEZGIGJ1dCBkb24ndCBibG9jayBJRSByYWRpbyBldmVudHMgKCMzODYxLCBnaC0yMzQzKVxuXHRcdGlmICggZGVsZWdhdGVDb3VudCAmJiBjdXIubm9kZVR5cGUgJiZcblx0XHRcdCggZXZlbnQudHlwZSAhPT0gXCJjbGlja1wiIHx8IGlzTmFOKCBldmVudC5idXR0b24gKSB8fCBldmVudC5idXR0b24gPCAxICkgKSB7XG5cblx0XHRcdGZvciAoIDsgY3VyICE9PSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KVxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NClcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPT09IDEgJiYgKCBjdXIuZGlzYWJsZWQgIT09IHRydWUgfHwgZXZlbnQudHlwZSAhPT0gXCJjbGlja1wiICkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlcyA9IFtdO1xuXHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGkgXTtcblxuXHRcdFx0XHRcdFx0Ly8gRG9uJ3QgY29uZmxpY3Qgd2l0aCBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKCMxMzIwMylcblx0XHRcdFx0XHRcdHNlbCA9IGhhbmRsZU9iai5zZWxlY3RvciArIFwiIFwiO1xuXG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXNbIHNlbCBdID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZXNbIHNlbCBdID0gaGFuZGxlT2JqLm5lZWRzQ29udGV4dCA/XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5KCBzZWwsIHRoaXMgKS5pbmRleCggY3VyICkgPiAtMSA6XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQoIHNlbCwgdGhpcywgbnVsbCwgWyBjdXIgXSApLmxlbmd0aDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlc1sgc2VsIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG1hdGNoZXMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggbWF0Y2hlcy5sZW5ndGggKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVzIH0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBZGQgdGhlIHJlbWFpbmluZyAoZGlyZWN0bHktYm91bmQpIGhhbmRsZXJzXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogdGhpcywgaGFuZGxlcnM6IGhhbmRsZXJzLnNsaWNlKCBkZWxlZ2F0ZUNvdW50ICkgfSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBoYW5kbGVyUXVldWU7XG5cdH0sXG5cblx0Ly8gSW5jbHVkZXMgc29tZSBldmVudCBwcm9wcyBzaGFyZWQgYnkgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnRcblx0cHJvcHM6ICggXCJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBkZXRhaWwgZXZlbnRQaGFzZSBcIiArXG5cdFx0XCJtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoXCIgKS5zcGxpdCggXCIgXCIgKSxcblxuXHRmaXhIb29rczoge30sXG5cblx0a2V5SG9va3M6IHtcblx0XHRwcm9wczogXCJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlXCIuc3BsaXQoIFwiIFwiICksXG5cdFx0ZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkge1xuXG5cdFx0XHQvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHNcblx0XHRcdGlmICggZXZlbnQud2hpY2ggPT0gbnVsbCApIHtcblx0XHRcdFx0ZXZlbnQud2hpY2ggPSBvcmlnaW5hbC5jaGFyQ29kZSAhPSBudWxsID8gb3JpZ2luYWwuY2hhckNvZGUgOiBvcmlnaW5hbC5rZXlDb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXZlbnQ7XG5cdFx0fVxuXHR9LFxuXG5cdG1vdXNlSG9va3M6IHtcblx0XHRwcm9wczogKCBcImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgXCIgK1xuXHRcdFx0XCJzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50XCIgKS5zcGxpdCggXCIgXCIgKSxcblx0XHRmaWx0ZXI6IGZ1bmN0aW9uKCBldmVudCwgb3JpZ2luYWwgKSB7XG5cdFx0XHR2YXIgZXZlbnREb2MsIGRvYywgYm9keSxcblx0XHRcdFx0YnV0dG9uID0gb3JpZ2luYWwuYnV0dG9uO1xuXG5cdFx0XHQvLyBDYWxjdWxhdGUgcGFnZVgvWSBpZiBtaXNzaW5nIGFuZCBjbGllbnRYL1kgYXZhaWxhYmxlXG5cdFx0XHRpZiAoIGV2ZW50LnBhZ2VYID09IG51bGwgJiYgb3JpZ2luYWwuY2xpZW50WCAhPSBudWxsICkge1xuXHRcdFx0XHRldmVudERvYyA9IGV2ZW50LnRhcmdldC5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xuXHRcdFx0XHRkb2MgPSBldmVudERvYy5kb2N1bWVudEVsZW1lbnQ7XG5cdFx0XHRcdGJvZHkgPSBldmVudERvYy5ib2R5O1xuXG5cdFx0XHRcdGV2ZW50LnBhZ2VYID0gb3JpZ2luYWwuY2xpZW50WCArXG5cdFx0XHRcdFx0KCBkb2MgJiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCApIC1cblx0XHRcdFx0XHQoIGRvYyAmJiBkb2MuY2xpZW50TGVmdCB8fCBib2R5ICYmIGJvZHkuY2xpZW50TGVmdCB8fCAwICk7XG5cdFx0XHRcdGV2ZW50LnBhZ2VZID0gb3JpZ2luYWwuY2xpZW50WSArXG5cdFx0XHRcdFx0KCBkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCAgfHwgMCApIC1cblx0XHRcdFx0XHQoIGRvYyAmJiBkb2MuY2xpZW50VG9wICB8fCBib2R5ICYmIGJvZHkuY2xpZW50VG9wICB8fCAwICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHRcblx0XHRcdC8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0XG5cdFx0XHRpZiAoICFldmVudC53aGljaCAmJiBidXR0b24gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0ZXZlbnQud2hpY2ggPSAoIGJ1dHRvbiAmIDEgPyAxIDogKCBidXR0b24gJiAyID8gMyA6ICggYnV0dG9uICYgNCA/IDIgOiAwICkgKSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXZlbnQ7XG5cdFx0fVxuXHR9LFxuXG5cdGZpeDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdGlmICggZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gKSB7XG5cdFx0XHRyZXR1cm4gZXZlbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gQ3JlYXRlIGEgd3JpdGFibGUgY29weSBvZiB0aGUgZXZlbnQgb2JqZWN0IGFuZCBub3JtYWxpemUgc29tZSBwcm9wZXJ0aWVzXG5cdFx0dmFyIGksIHByb3AsIGNvcHksXG5cdFx0XHR0eXBlID0gZXZlbnQudHlwZSxcblx0XHRcdG9yaWdpbmFsRXZlbnQgPSBldmVudCxcblx0XHRcdGZpeEhvb2sgPSB0aGlzLmZpeEhvb2tzWyB0eXBlIF07XG5cblx0XHRpZiAoICFmaXhIb29rICkge1xuXHRcdFx0dGhpcy5maXhIb29rc1sgdHlwZSBdID0gZml4SG9vayA9XG5cdFx0XHRcdHJtb3VzZUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMubW91c2VIb29rcyA6XG5cdFx0XHRcdHJrZXlFdmVudC50ZXN0KCB0eXBlICkgPyB0aGlzLmtleUhvb2tzIDpcblx0XHRcdFx0e307XG5cdFx0fVxuXHRcdGNvcHkgPSBmaXhIb29rLnByb3BzID8gdGhpcy5wcm9wcy5jb25jYXQoIGZpeEhvb2sucHJvcHMgKSA6IHRoaXMucHJvcHM7XG5cblx0XHRldmVudCA9IG5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTtcblxuXHRcdGkgPSBjb3B5Lmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHByb3AgPSBjb3B5WyBpIF07XG5cdFx0XHRldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsgcHJvcCBdO1xuXHRcdH1cblxuXHRcdC8vIFN1cHBvcnQ6IENvcmRvdmEgMi41IChXZWJLaXQpICgjMTMyNTUpXG5cdFx0Ly8gQWxsIGV2ZW50cyBzaG91bGQgaGF2ZSBhIHRhcmdldDsgQ29yZG92YSBkZXZpY2VyZWFkeSBkb2Vzbid0XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZG9jdW1lbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDYuMCssIENocm9tZTwyOFxuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpXG5cdFx0aWYgKCBldmVudC50YXJnZXQubm9kZVR5cGUgPT09IDMgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZml4SG9vay5maWx0ZXIgPyBmaXhIb29rLmZpbHRlciggZXZlbnQsIG9yaWdpbmFsRXZlbnQgKSA6IGV2ZW50O1xuXHR9LFxuXG5cdHNwZWNpYWw6IHtcblx0XHRsb2FkOiB7XG5cblx0XHRcdC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWRcblx0XHRcdG5vQnViYmxlOiB0cnVlXG5cdFx0fSxcblx0XHRmb2N1czoge1xuXG5cdFx0XHQvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3Rcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1cyApIHtcblx0XHRcdFx0XHR0aGlzLmZvY3VzKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVsZWdhdGVUeXBlOiBcImZvY3VzaW5cIlxuXHRcdH0sXG5cdFx0Ymx1cjoge1xuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7XG5cdFx0XHRcdFx0dGhpcy5ibHVyKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVsZWdhdGVUeXBlOiBcImZvY3Vzb3V0XCJcblx0XHR9LFxuXHRcdGNsaWNrOiB7XG5cblx0XHRcdC8vIEZvciBjaGVja2JveCwgZmlyZSBuYXRpdmUgZXZlbnQgc28gY2hlY2tlZCBzdGF0ZSB3aWxsIGJlIHJpZ2h0XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzLnR5cGUgPT09IFwiY2hlY2tib3hcIiAmJiB0aGlzLmNsaWNrICYmIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dGhpcy5jbGljaygpO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRm9yIGNyb3NzLWJyb3dzZXIgY29uc2lzdGVuY3ksIGRvbid0IGZpcmUgbmF0aXZlIC5jbGljaygpIG9uIGxpbmtzXG5cdFx0XHRfZGVmYXVsdDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKCBldmVudC50YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblxuXHQvLyBUaGlzIFwiaWZcIiBpcyBuZWVkZWQgZm9yIHBsYWluIG9iamVjdHNcblx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUgKTtcblx0fVxufTtcblxualF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7XG5cblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISggdGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCApICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMFxuXHRcdFx0XHRzcmMucmV0dXJuVmFsdWUgPT09IGZhbHNlID9cblx0XHRcdHJldHVyblRydWUgOlxuXHRcdFx0cmV0dXJuRmFsc2U7XG5cblx0Ly8gRXZlbnQgdHlwZVxuXHR9IGVsc2Uge1xuXHRcdHRoaXMudHlwZSA9IHNyYztcblx0fVxuXG5cdC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0XG5cdGlmICggcHJvcHMgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIENyZWF0ZSBhIHRpbWVzdGFtcCBpZiBpbmNvbWluZyBldmVudCBkb2Vzbid0IGhhdmUgb25lXG5cdHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygpO1xuXG5cdC8vIE1hcmsgaXQgYXMgZml4ZWRcblx0dGhpc1sgalF1ZXJ5LmV4cGFuZG8gXSA9IHRydWU7XG59O1xuXG4vLyBqUXVlcnkuRXZlbnQgaXMgYmFzZWQgb24gRE9NMyBFdmVudHMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBFQ01BU2NyaXB0IExhbmd1YWdlIEJpbmRpbmdcbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxualF1ZXJ5LkV2ZW50LnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IGpRdWVyeS5FdmVudCxcblx0aXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcblx0aXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXHRpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzU2ltdWxhdGVkOiBmYWxzZSxcblxuXHRwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblx0fSxcblx0c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cblx0XHR0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9XG59O1xuXG4vLyBDcmVhdGUgbW91c2VlbnRlci9sZWF2ZSBldmVudHMgdXNpbmcgbW91c2VvdmVyL291dCBhbmQgZXZlbnQtdGltZSBjaGVja3Ncbi8vIHNvIHRoYXQgZXZlbnQgZGVsZWdhdGlvbiB3b3JrcyBpbiBqUXVlcnkuXG4vLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dFxuLy9cbi8vIFN1cHBvcnQ6IFNhZmFyaSA3IG9ubHlcbi8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOlxuLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ3MDI1OFxuLy8gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnVnIChpdCBleGlzdGVkIGluIG9sZGVyIENocm9tZSB2ZXJzaW9ucyBhcyB3ZWxsKS5cbmpRdWVyeS5lYWNoKCB7XG5cdG1vdXNlZW50ZXI6IFwibW91c2VvdmVyXCIsXG5cdG1vdXNlbGVhdmU6IFwibW91c2VvdXRcIixcblx0cG9pbnRlcmVudGVyOiBcInBvaW50ZXJvdmVyXCIsXG5cdHBvaW50ZXJsZWF2ZTogXCJwb2ludGVyb3V0XCJcbn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cdGpRdWVyeS5ldmVudC5zcGVjaWFsWyBvcmlnIF0gPSB7XG5cdFx0ZGVsZWdhdGVUeXBlOiBmaXgsXG5cdFx0YmluZFR5cGU6IGZpeCxcblxuXHRcdGhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0dmFyIHJldCxcblx0XHRcdFx0dGFyZ2V0ID0gdGhpcyxcblx0XHRcdFx0cmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsXG5cdFx0XHRcdGhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iajtcblxuXHRcdFx0Ly8gRm9yIG1vdXNlZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC5cblx0XHRcdC8vIE5COiBObyByZWxhdGVkVGFyZ2V0IGlmIHRoZSBtb3VzZSBsZWZ0L2VudGVyZWQgdGhlIGJyb3dzZXIgd2luZG93XG5cdFx0XHRpZiAoICFyZWxhdGVkIHx8ICggcmVsYXRlZCAhPT0gdGFyZ2V0ICYmICFqUXVlcnkuY29udGFpbnMoIHRhcmdldCwgcmVsYXRlZCApICkgKSB7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBoYW5kbGVPYmoub3JpZ1R5cGU7XG5cdFx0XHRcdHJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGZpeDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0b25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTtcblx0fSxcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcblx0XHR2YXIgaGFuZGxlT2JqLCB0eXBlO1xuXHRcdGlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkge1xuXG5cdFx0XHQvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50XG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XG5cdFx0XHRqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKFxuXHRcdFx0XHRoYW5kbGVPYmoubmFtZXNwYWNlID9cblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUgKyBcIi5cIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOlxuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSxcblx0XHRcdFx0aGFuZGxlT2JqLnNlbGVjdG9yLFxuXHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzIFssIGZuXSApXG5cdFx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cblxudmFyXG5cdHJ4aHRtbFRhZyA9IC88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcXHc6LV0rKVtePl0qKVxcLz4vZ2ksXG5cblx0Ly8gU3VwcG9ydDogSUUgMTAtMTEsIEVkZ2UgMTAyNDArXG5cdC8vIEluIElFL0VkZ2UgdXNpbmcgcmVnZXggZ3JvdXBzIGhlcmUgY2F1c2VzIHNldmVyZSBzbG93ZG93bnMuXG5cdC8vIFNlZSBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9JRS9mZWVkYmFjay9kZXRhaWxzLzE3MzY1MTIvXG5cdHJub0lubmVyaHRtbCA9IC88c2NyaXB0fDxzdHlsZXw8bGluay9pLFxuXG5cdC8vIGNoZWNrZWQ9XCJjaGVja2VkXCIgb3IgY2hlY2tlZFxuXHRyY2hlY2tlZCA9IC9jaGVja2VkXFxzKig/OltePV18PVxccyouY2hlY2tlZC4pL2ksXG5cdHJzY3JpcHRUeXBlTWFza2VkID0gL150cnVlXFwvKC4qKS8sXG5cdHJjbGVhblNjcmlwdCA9IC9eXFxzKjwhKD86XFxbQ0RBVEFcXFt8LS0pfCg/OlxcXVxcXXwtLSk+XFxzKiQvZztcblxuLy8gTWFuaXB1bGF0aW5nIHRhYmxlcyByZXF1aXJlcyBhIHRib2R5XG5mdW5jdGlvbiBtYW5pcHVsYXRpb25UYXJnZXQoIGVsZW0sIGNvbnRlbnQgKSB7XG5cdHJldHVybiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sIFwidGFibGVcIiApICYmXG5cdFx0alF1ZXJ5Lm5vZGVOYW1lKCBjb250ZW50Lm5vZGVUeXBlICE9PSAxMSA/IGNvbnRlbnQgOiBjb250ZW50LmZpcnN0Q2hpbGQsIFwidHJcIiApID9cblxuXHRcdGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwidGJvZHlcIiApWyAwIF0gfHxcblx0XHRcdGVsZW0uYXBwZW5kQ2hpbGQoIGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcInRib2R5XCIgKSApIDpcblx0XHRlbGVtO1xufVxuXG4vLyBSZXBsYWNlL3Jlc3RvcmUgdGhlIHR5cGUgYXR0cmlidXRlIG9mIHNjcmlwdCBlbGVtZW50cyBmb3Igc2FmZSBET00gbWFuaXB1bGF0aW9uXG5mdW5jdGlvbiBkaXNhYmxlU2NyaXB0KCBlbGVtICkge1xuXHRlbGVtLnR5cGUgPSAoIGVsZW0uZ2V0QXR0cmlidXRlKCBcInR5cGVcIiApICE9PSBudWxsICkgKyBcIi9cIiArIGVsZW0udHlwZTtcblx0cmV0dXJuIGVsZW07XG59XG5mdW5jdGlvbiByZXN0b3JlU2NyaXB0KCBlbGVtICkge1xuXHR2YXIgbWF0Y2ggPSByc2NyaXB0VHlwZU1hc2tlZC5leGVjKCBlbGVtLnR5cGUgKTtcblxuXHRpZiAoIG1hdGNoICkge1xuXHRcdGVsZW0udHlwZSA9IG1hdGNoWyAxIF07XG5cdH0gZWxzZSB7XG5cdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIFwidHlwZVwiICk7XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuZnVuY3Rpb24gY2xvbmVDb3B5RXZlbnQoIHNyYywgZGVzdCApIHtcblx0dmFyIGksIGwsIHR5cGUsIHBkYXRhT2xkLCBwZGF0YUN1ciwgdWRhdGFPbGQsIHVkYXRhQ3VyLCBldmVudHM7XG5cblx0aWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIDEuIENvcHkgcHJpdmF0ZSBkYXRhOiBldmVudHMsIGhhbmRsZXJzLCBldGMuXG5cdGlmICggZGF0YVByaXYuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0cGRhdGFPbGQgPSBkYXRhUHJpdi5hY2Nlc3MoIHNyYyApO1xuXHRcdHBkYXRhQ3VyID0gZGF0YVByaXYuc2V0KCBkZXN0LCBwZGF0YU9sZCApO1xuXHRcdGV2ZW50cyA9IHBkYXRhT2xkLmV2ZW50cztcblxuXHRcdGlmICggZXZlbnRzICkge1xuXHRcdFx0ZGVsZXRlIHBkYXRhQ3VyLmhhbmRsZTtcblx0XHRcdHBkYXRhQ3VyLmV2ZW50cyA9IHt9O1xuXG5cdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBldmVudHNbIHR5cGUgXS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggZGVzdCwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gMi4gQ29weSB1c2VyIGRhdGFcblx0aWYgKCBkYXRhVXNlci5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHR1ZGF0YU9sZCA9IGRhdGFVc2VyLmFjY2Vzcyggc3JjICk7XG5cdFx0dWRhdGFDdXIgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgdWRhdGFPbGQgKTtcblxuXHRcdGRhdGFVc2VyLnNldCggZGVzdCwgdWRhdGFDdXIgKTtcblx0fVxufVxuXG4vLyBGaXggSUUgYnVncywgc2VlIHN1cHBvcnQgdGVzdHNcbmZ1bmN0aW9uIGZpeElucHV0KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuXHQvLyBGYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbi5cblx0aWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIHJjaGVja2FibGVUeXBlLnRlc3QoIHNyYy50eXBlICkgKSB7XG5cdFx0ZGVzdC5jaGVja2VkID0gc3JjLmNoZWNrZWQ7XG5cblx0Ly8gRmFpbHMgdG8gcmV0dXJuIHRoZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQgc3RhdGUgd2hlbiBjbG9uaW5nIG9wdGlvbnNcblx0fSBlbHNlIGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCBub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiICkge1xuXHRcdGRlc3QuZGVmYXVsdFZhbHVlID0gc3JjLmRlZmF1bHRWYWx1ZTtcblx0fVxufVxuXG5mdW5jdGlvbiBkb21NYW5pcCggY29sbGVjdGlvbiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKSB7XG5cblx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRhcmdzID0gY29uY2F0LmFwcGx5KCBbXSwgYXJncyApO1xuXG5cdHZhciBmcmFnbWVudCwgZmlyc3QsIHNjcmlwdHMsIGhhc1NjcmlwdHMsIG5vZGUsIGRvYyxcblx0XHRpID0gMCxcblx0XHRsID0gY29sbGVjdGlvbi5sZW5ndGgsXG5cdFx0aU5vQ2xvbmUgPSBsIC0gMSxcblx0XHR2YWx1ZSA9IGFyZ3NbIDAgXSxcblx0XHRpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0Ly8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0XG5cdGlmICggaXNGdW5jdGlvbiB8fFxuXHRcdFx0KCBsID4gMSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXN1cHBvcnQuY2hlY2tDbG9uZSAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkgKSB7XG5cdFx0cmV0dXJuIGNvbGxlY3Rpb24uZWFjaCggZnVuY3Rpb24oIGluZGV4ICkge1xuXHRcdFx0dmFyIHNlbGYgPSBjb2xsZWN0aW9uLmVxKCBpbmRleCApO1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTtcblx0XHRcdH1cblx0XHRcdGRvbU1hbmlwKCBzZWxmLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggbCApIHtcblx0XHRmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApO1xuXHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdH1cblxuXHRcdC8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFja1xuXHRcdGlmICggZmlyc3QgfHwgaWdub3JlZCApIHtcblx0XHRcdHNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCBcInNjcmlwdFwiICksIGRpc2FibGVTY3JpcHQgKTtcblx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdFx0Ly8gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwXG5cdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLlxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRub2RlID0gZnJhZ21lbnQ7XG5cblx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHQvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMSwgUGhhbnRvbUpTPDJcblx0XHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYWxsYmFjay5jYWxsKCBjb2xsZWN0aW9uWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0alF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApO1xuXG5cdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IHNjcmlwdHNbIGkgXTtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdCFkYXRhUHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggbm9kZS5zcmMgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gT3B0aW9uYWwgQUpBWCBkZXBlbmRlbmN5LCBidXQgd29uJ3QgcnVuIHNjcmlwdHMgaWYgbm90IHByZXNlbnRcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuX2V2YWxVcmwgKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5Ll9ldmFsVXJsKCBub2RlLnNyYyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsIFwiXCIgKSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5mdW5jdGlvbiByZW1vdmUoIGVsZW0sIHNlbGVjdG9yLCBrZWVwRGF0YSApIHtcblx0dmFyIG5vZGUsXG5cdFx0bm9kZXMgPSBzZWxlY3RvciA/IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBlbGVtICkgOiBlbGVtLFxuXHRcdGkgPSAwO1xuXG5cdGZvciAoIDsgKCBub2RlID0gbm9kZXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRpZiAoICFrZWVwRGF0YSAmJiBub2RlLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBub2RlICkgKTtcblx0XHR9XG5cblx0XHRpZiAoIG5vZGUucGFyZW50Tm9kZSApIHtcblx0XHRcdGlmICgga2VlcERhdGEgJiYgalF1ZXJ5LmNvbnRhaW5zKCBub2RlLm93bmVyRG9jdW1lbnQsIG5vZGUgKSApIHtcblx0XHRcdFx0c2V0R2xvYmFsRXZhbCggZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdH1cblx0XHRcdG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggbm9kZSApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHJldHVybiBodG1sLnJlcGxhY2UoIHJ4aHRtbFRhZywgXCI8JDE+PC8kMj5cIiApO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0dmFyIGksIGwsIHNyY0VsZW1lbnRzLCBkZXN0RWxlbWVudHMsXG5cdFx0XHRjbG9uZSA9IGVsZW0uY2xvbmVOb2RlKCB0cnVlICksXG5cdFx0XHRpblBhZ2UgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApO1xuXG5cdFx0Ly8gRml4IElFIGNsb25pbmcgaXNzdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCAmJiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMTEgKSAmJlxuXHRcdFx0XHQhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIFdlIGVzY2hldyBTaXp6bGUgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczogaHR0cDovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yXG5cdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XG5cdFx0XHRzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxuXHRcdGlmICggZGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRcdHNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7XG5cdFx0XHRcdGRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCBcInNjcmlwdFwiICk7XG5cdFx0aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiB0aGUgY2xvbmVkIHNldFxuXHRcdHJldHVybiBjbG9uZTtcblx0fSxcblxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblx0XHR2YXIgZGF0YSwgZWxlbSwgdHlwZSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT09IHVuZGVmaW5lZDsgaSsrICkge1xuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRcdGlmICggKCBkYXRhID0gZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbFsgdHlwZSBdICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9IDM1LTQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoIGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSApIHtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PSAzNS00NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdC8vIEtlZXAgZG9tTWFuaXAgZXhwb3NlZCB1bnRpbCAzLjAgKGdoLTIyMjUpXG5cdGRvbU1hbmlwOiBkb21NYW5pcCxcblxuXHRkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yICk7XG5cdH0sXG5cblx0dGV4dDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnRleHQoIHRoaXMgKSA6XG5cdFx0XHRcdHRoaXMuZW1wdHkoKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRcdHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdGFwcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0LmFwcGVuZENoaWxkKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdHByZXBlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGJlZm9yZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YWZ0ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGVtcHR5OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSB0aGlzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gUHJldmVudCBtZW1vcnkgbGVha3Ncblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7XG5cblx0XHRcdFx0Ly8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXNcblx0XHRcdFx0ZWxlbS50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHRkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzO1xuXHRcdGRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50cztcblxuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApO1xuXHRcdH0gKTtcblx0fSxcblxuXHRodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHRsID0gdGhpcy5sZW5ndGg7XG5cblx0XHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5pbm5lckhUTUw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNlZSBpZiB3ZSBjYW4gdGFrZSBhIHNob3J0Y3V0IGFuZCBqdXN0IHVzZSBpbm5lckhUTUxcblx0XHRcdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAmJlxuXHRcdFx0XHQhd3JhcE1hcFsgKCBydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpIF0gKSB7XG5cblx0XHRcdFx0dmFsdWUgPSBqUXVlcnkuaHRtbFByZWZpbHRlciggdmFsdWUgKTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRcdGVsZW0gPSB0aGlzWyBpIF0gfHwge307XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblx0XHRcdFx0XHRcdFx0ZWxlbS5pbm5lckhUTUwgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtID0gMDtcblxuXHRcdFx0XHQvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2Rcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRcdHRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7XG5cdFx0XHR9XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fSxcblxuXHRyZXBsYWNlV2l0aDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlnbm9yZWQgPSBbXTtcblxuXHRcdC8vIE1ha2UgdGhlIGNoYW5nZXMsIHJlcGxhY2luZyBlYWNoIG5vbi1pZ25vcmVkIGNvbnRleHQgZWxlbWVudCB3aXRoIHRoZSBuZXcgY29udGVudFxuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG5cblx0XHRcdGlmICggalF1ZXJ5LmluQXJyYXkoIHRoaXMsIGlnbm9yZWQgKSA8IDAgKSB7XG5cdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggdGhpcyApICk7XG5cdFx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRcdHBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gRm9yY2UgY2FsbGJhY2sgaW52b2NhdGlvblxuXHRcdH0sIGlnbm9yZWQgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCgge1xuXHRhcHBlbmRUbzogXCJhcHBlbmRcIixcblx0cHJlcGVuZFRvOiBcInByZXBlbmRcIixcblx0aW5zZXJ0QmVmb3JlOiBcImJlZm9yZVwiLFxuXHRpbnNlcnRBZnRlcjogXCJhZnRlclwiLFxuXHRyZXBsYWNlQWxsOiBcInJlcGxhY2VXaXRoXCJcbn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGVsZW1zLFxuXHRcdFx0cmV0ID0gW10sXG5cdFx0XHRpbnNlcnQgPSBqUXVlcnkoIHNlbGVjdG9yICksXG5cdFx0XHRsYXN0ID0gaW5zZXJ0Lmxlbmd0aCAtIDEsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgaSA8PSBsYXN0OyBpKysgKSB7XG5cdFx0XHRlbGVtcyA9IGkgPT09IGxhc3QgPyB0aGlzIDogdGhpcy5jbG9uZSggdHJ1ZSApO1xuXHRcdFx0alF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBRdFdlYktpdFxuXHRcdFx0Ly8gLmdldCgpIGJlY2F1c2UgcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93c1xuXHRcdFx0cHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7XG5cdH07XG59ICk7XG5cblxudmFyIGlmcmFtZSxcblx0ZWxlbWRpc3BsYXkgPSB7XG5cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94XG5cdFx0Ly8gV2UgaGF2ZSB0byBwcmUtZGVmaW5lIHRoZXNlIHZhbHVlcyBmb3IgRkYgKCMxMDIyNylcblx0XHRIVE1MOiBcImJsb2NrXCIsXG5cdFx0Qk9EWTogXCJibG9ja1wiXG5cdH07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGFjdHVhbCBkaXNwbGF5IG9mIGEgZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgbm9kZU5hbWUgb2YgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBkb2MgRG9jdW1lbnQgb2JqZWN0XG4gKi9cblxuLy8gQ2FsbGVkIG9ubHkgZnJvbSB3aXRoaW4gZGVmYXVsdERpc3BsYXlcbmZ1bmN0aW9uIGFjdHVhbERpc3BsYXkoIG5hbWUsIGRvYyApIHtcblx0dmFyIGVsZW0gPSBqUXVlcnkoIGRvYy5jcmVhdGVFbGVtZW50KCBuYW1lICkgKS5hcHBlbmRUbyggZG9jLmJvZHkgKSxcblxuXHRcdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtWyAwIF0sIFwiZGlzcGxheVwiICk7XG5cblx0Ly8gV2UgZG9uJ3QgaGF2ZSBhbnkgZGF0YSBzdG9yZWQgb24gdGhlIGVsZW1lbnQsXG5cdC8vIHNvIHVzZSBcImRldGFjaFwiIG1ldGhvZCBhcyBmYXN0IHdheSB0byBnZXQgcmlkIG9mIHRoZSBlbGVtZW50XG5cdGVsZW0uZGV0YWNoKCk7XG5cblx0cmV0dXJuIGRpc3BsYXk7XG59XG5cbi8qKlxuICogVHJ5IHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBkaXNwbGF5IHZhbHVlIG9mIGFuIGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBub2RlTmFtZVxuICovXG5mdW5jdGlvbiBkZWZhdWx0RGlzcGxheSggbm9kZU5hbWUgKSB7XG5cdHZhciBkb2MgPSBkb2N1bWVudCxcblx0XHRkaXNwbGF5ID0gZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF07XG5cblx0aWYgKCAhZGlzcGxheSApIHtcblx0XHRkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApO1xuXG5cdFx0Ly8gSWYgdGhlIHNpbXBsZSB3YXkgZmFpbHMsIHJlYWQgZnJvbSBpbnNpZGUgYW4gaWZyYW1lXG5cdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiB8fCAhZGlzcGxheSApIHtcblxuXHRcdFx0Ly8gVXNlIHRoZSBhbHJlYWR5LWNyZWF0ZWQgaWZyYW1lIGlmIHBvc3NpYmxlXG5cdFx0XHRpZnJhbWUgPSAoIGlmcmFtZSB8fCBqUXVlcnkoIFwiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPlwiICkgKVxuXHRcdFx0XHQuYXBwZW5kVG8oIGRvYy5kb2N1bWVudEVsZW1lbnQgKTtcblxuXHRcdFx0Ly8gQWx3YXlzIHdyaXRlIGEgbmV3IEhUTUwgc2tlbGV0b24gc28gV2Via2l0IGFuZCBGaXJlZm94IGRvbid0IGNob2tlIG9uIHJldXNlXG5cdFx0XHRkb2MgPSBpZnJhbWVbIDAgXS5jb250ZW50RG9jdW1lbnQ7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFXG5cdFx0XHRkb2Mud3JpdGUoKTtcblx0XHRcdGRvYy5jbG9zZSgpO1xuXG5cdFx0XHRkaXNwbGF5ID0gYWN0dWFsRGlzcGxheSggbm9kZU5hbWUsIGRvYyApO1xuXHRcdFx0aWZyYW1lLmRldGFjaCgpO1xuXHRcdH1cblxuXHRcdC8vIFN0b3JlIHRoZSBjb3JyZWN0IGRlZmF1bHQgZGlzcGxheVxuXHRcdGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdID0gZGlzcGxheTtcblx0fVxuXG5cdHJldHVybiBkaXNwbGF5O1xufVxudmFyIHJtYXJnaW4gPSAoIC9ebWFyZ2luLyApO1xuXG52YXIgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgcG51bSArIFwiKSg/IXB4KVthLXolXSskXCIsIFwiaVwiICk7XG5cbnZhciBnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFPD0xMSssIEZpcmVmb3g8PTMwKyAoIzE1MDk4LCAjMTQxNTApXG5cdFx0Ly8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzXG5cdFx0Ly8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoIFwiZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZVwiXG5cdFx0dmFyIHZpZXcgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG5cblx0XHRpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHtcblx0XHRcdHZpZXcgPSB3aW5kb3c7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSApO1xuXHR9O1xuXG52YXIgc3dhcCA9IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjaywgYXJncyApIHtcblx0dmFyIHJldCwgbmFtZSxcblx0XHRvbGQgPSB7fTtcblxuXHQvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdG9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTtcblx0fVxuXG5cdHJldCA9IGNhbGxiYWNrLmFwcGx5KCBlbGVtLCBhcmdzIHx8IFtdICk7XG5cblx0Ly8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59O1xuXG5cbnZhciBkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblxuXG4oIGZ1bmN0aW9uKCkge1xuXHR2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsIHBpeGVsTWFyZ2luUmlnaHRWYWwsIHJlbGlhYmxlTWFyZ2luTGVmdFZhbCxcblx0XHRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICksXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdC8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzXG5cdGlmICggIWRpdi5zdHlsZSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdC8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOClcblx0ZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJjb250ZW50LWJveFwiO1xuXHRkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcIlwiO1xuXHRzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSA9IGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9PT0gXCJjb250ZW50LWJveFwiO1xuXG5cdGNvbnRhaW5lci5zdHlsZS5jc3NUZXh0ID0gXCJib3JkZXI6MDt3aWR0aDo4cHg7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4O1wiICtcblx0XHRcInBhZGRpbmc6MDttYXJnaW4tdG9wOjFweDtwb3NpdGlvbjphYnNvbHV0ZVwiO1xuXHRjb250YWluZXIuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdC8vIEV4ZWN1dGluZyBib3RoIHBpeGVsUG9zaXRpb24gJiBib3hTaXppbmdSZWxpYWJsZSB0ZXN0cyByZXF1aXJlIG9ubHkgb25lIGxheW91dFxuXHQvLyBzbyB0aGV5J3JlIGV4ZWN1dGVkIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSB0aGUgc2Vjb25kIGNvbXB1dGF0aW9uLlxuXHRmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHtcblx0XHRkaXYuc3R5bGUuY3NzVGV4dCA9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3g8MjksIEFuZHJvaWQgMi4zXG5cdFx0XHQvLyBWZW5kb3ItcHJlZml4IGJveC1zaXppbmdcblx0XHRcdFwiLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O1wiICtcblx0XHRcdFwicG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztcIiArXG5cdFx0XHRcIm1hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7XCIgK1xuXHRcdFx0XCJ0b3A6MSU7d2lkdGg6NTAlXCI7XG5cdFx0ZGl2LmlubmVySFRNTCA9IFwiXCI7XG5cdFx0ZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdHZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTtcblx0XHRwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSBcIjElXCI7XG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gZGl2U3R5bGUubWFyZ2luTGVmdCA9PT0gXCIycHhcIjtcblx0XHRib3hTaXppbmdSZWxpYWJsZVZhbCA9IGRpdlN0eWxlLndpZHRoID09PSBcIjRweFwiO1xuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgLSA0LjMgb25seVxuXHRcdC8vIFNvbWUgc3R5bGVzIGNvbWUgYmFjayB3aXRoIHBlcmNlbnRhZ2UgdmFsdWVzLCBldmVuIHRob3VnaCB0aGV5IHNob3VsZG4ndFxuXHRcdGRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IFwiNTAlXCI7XG5cdFx0cGl4ZWxNYXJnaW5SaWdodFZhbCA9IGRpdlN0eWxlLm1hcmdpblJpZ2h0ID09PSBcIjRweFwiO1xuXG5cdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblx0fVxuXG5cdGpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHtcblx0XHRwaXhlbFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gVGhpcyB0ZXN0IGlzIGV4ZWN1dGVkIG9ubHkgb25jZSBidXQgd2Ugc3RpbGwgZG8gbWVtb2l6aW5nXG5cdFx0XHQvLyBzaW5jZSB3ZSBjYW4gdXNlIHRoZSBib3hTaXppbmdSZWxpYWJsZSBwcmUtY29tcHV0aW5nLlxuXHRcdFx0Ly8gTm8gbmVlZCB0byBjaGVjayBpZiB0aGUgdGVzdCB3YXMgYWxyZWFkeSBwZXJmb3JtZWQsIHRob3VnaC5cblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcGl4ZWxQb3NpdGlvblZhbDtcblx0XHR9LFxuXHRcdGJveFNpemluZ1JlbGlhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggYm94U2l6aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHtcblx0XHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDtcblx0XHR9LFxuXHRcdHBpeGVsTWFyZ2luUmlnaHQ6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMC00LjNcblx0XHRcdC8vIFdlJ3JlIGNoZWNraW5nIGZvciBib3hTaXppbmdSZWxpYWJsZVZhbCBoZXJlIGluc3RlYWQgb2YgcGl4ZWxNYXJnaW5SaWdodFZhbFxuXHRcdFx0Ly8gc2luY2UgdGhhdCBjb21wcmVzc2VzIGJldHRlciBhbmQgdGhleSdyZSBjb21wdXRlZCB0b2dldGhlciBhbnl3YXkuXG5cdFx0XHRpZiAoIGJveFNpemluZ1JlbGlhYmxlVmFsID09IG51bGwgKSB7XG5cdFx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcGl4ZWxNYXJnaW5SaWdodFZhbDtcblx0XHR9LFxuXHRcdHJlbGlhYmxlTWFyZ2luTGVmdDogZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OCBvbmx5LCBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDM3XG5cdFx0XHRpZiAoIGJveFNpemluZ1JlbGlhYmxlVmFsID09IG51bGwgKSB7XG5cdFx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVNYXJnaW5MZWZ0VmFsO1xuXHRcdH0sXG5cdFx0cmVsaWFibGVNYXJnaW5SaWdodDogZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG5cdFx0XHQvLyBDaGVjayBpZiBkaXYgd2l0aCBleHBsaWNpdCB3aWR0aCBhbmQgbm8gbWFyZ2luLXJpZ2h0IGluY29ycmVjdGx5XG5cdFx0XHQvLyBnZXRzIGNvbXB1dGVkIG1hcmdpbi1yaWdodCBiYXNlZCBvbiB3aWR0aCBvZiBjb250YWluZXIuICgjMzMzMylcblx0XHRcdC8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodFxuXHRcdFx0Ly8gVGhpcyBzdXBwb3J0IGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgb25jZSBzbyBubyBtZW1vaXppbmcgaXMgbmVlZGVkLlxuXHRcdFx0dmFyIHJldCxcblx0XHRcdFx0bWFyZ2luRGl2ID0gZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKTtcblxuXHRcdFx0Ly8gUmVzZXQgQ1NTOiBib3gtc2l6aW5nOyBkaXNwbGF5OyBtYXJnaW47IGJvcmRlcjsgcGFkZGluZ1xuXHRcdFx0bWFyZ2luRGl2LnN0eWxlLmNzc1RleHQgPSBkaXYuc3R5bGUuY3NzVGV4dCA9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjNcblx0XHRcdFx0Ly8gVmVuZG9yLXByZWZpeCBib3gtc2l6aW5nXG5cdFx0XHRcdFwiLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Y29udGVudC1ib3g7XCIgK1xuXHRcdFx0XHRcImRpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowXCI7XG5cdFx0XHRtYXJnaW5EaXYuc3R5bGUubWFyZ2luUmlnaHQgPSBtYXJnaW5EaXYuc3R5bGUud2lkdGggPSBcIjBcIjtcblx0XHRcdGRpdi5zdHlsZS53aWR0aCA9IFwiMXB4XCI7XG5cdFx0XHRkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApO1xuXG5cdFx0XHRyZXQgPSAhcGFyc2VGbG9hdCggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIG1hcmdpbkRpdiApLm1hcmdpblJpZ2h0ICk7XG5cblx0XHRcdGRvY3VtZW50RWxlbWVudC5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7XG5cdFx0XHRkaXYucmVtb3ZlQ2hpbGQoIG1hcmdpbkRpdiApO1xuXG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0fSApO1xufSApKCk7XG5cblxuZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHtcblx0dmFyIHdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgsIHJldCxcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0Y29tcHV0ZWQgPSBjb21wdXRlZCB8fCBnZXRTdHlsZXMoIGVsZW0gKTtcblx0cmV0ID0gY29tcHV0ZWQgPyBjb21wdXRlZC5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgfHwgY29tcHV0ZWRbIG5hbWUgXSA6IHVuZGVmaW5lZDtcblxuXHQvLyBTdXBwb3J0OiBPcGVyYSAxMi4xeCBvbmx5XG5cdC8vIEZhbGwgYmFjayB0byBzdHlsZSBldmVuIHdpdGhvdXQgY29tcHV0ZWRcblx0Ly8gY29tcHV0ZWQgaXMgdW5kZWZpbmVkIGZvciBlbGVtcyBvbiBkb2N1bWVudCBmcmFnbWVudHNcblx0aWYgKCAoIHJldCA9PT0gXCJcIiB8fCByZXQgPT09IHVuZGVmaW5lZCApICYmICFqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICkge1xuXHRcdHJldCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUU5XG5cdC8vIGdldFByb3BlcnR5VmFsdWUgaXMgb25seSBuZWVkZWQgZm9yIC5jc3MoJ2ZpbHRlcicpICgjMTI1MzcpXG5cdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHQvLyBBIHRyaWJ1dGUgdG8gdGhlIFwiYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkc1wiXG5cdFx0Ly8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsXG5cdFx0Ly8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy5cblx0XHQvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6XG5cdFx0Ly8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3Nzb20vI3Jlc29sdmVkLXZhbHVlc1xuXHRcdGlmICggIXN1cHBvcnQucGl4ZWxNYXJnaW5SaWdodCgpICYmIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiBybWFyZ2luLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuXHRcdFx0d2lkdGggPSBzdHlsZS53aWR0aDtcblx0XHRcdG1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7XG5cdFx0XHRtYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoO1xuXG5cdFx0XHQvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7XG5cdFx0XHRyZXQgPSBjb21wdXRlZC53aWR0aDtcblxuXHRcdFx0Ly8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlc1xuXHRcdFx0c3R5bGUud2lkdGggPSB3aWR0aDtcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7XG5cdFx0XHRzdHlsZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/XG5cblx0XHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdFx0Ly8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci5cblx0XHRyZXQgKyBcIlwiIDpcblx0XHRyZXQ7XG59XG5cblxuZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25GbiwgaG9va0ZuICkge1xuXG5cdC8vIERlZmluZSB0aGUgaG9vaywgd2UnbGwgY2hlY2sgb24gdGhlIGZpcnN0IHJ1biBpZiBpdCdzIHJlYWxseSBuZWVkZWQuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggY29uZGl0aW9uRm4oKSApIHtcblxuXHRcdFx0XHQvLyBIb29rIG5vdCBuZWVkZWQgKG9yIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBpdCBkdWVcblx0XHRcdFx0Ly8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LlxuXHRcdFx0XHRkZWxldGUgdGhpcy5nZXQ7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSG9vayBuZWVkZWQ7IHJlZGVmaW5lIGl0IHNvIHRoYXQgdGhlIHN1cHBvcnQgdGVzdCBpcyBub3QgZXhlY3V0ZWQgYWdhaW4uXG5cdFx0XHRyZXR1cm4gKCB0aGlzLmdldCA9IGhvb2tGbiApLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cdH07XG59XG5cblxudmFyXG5cblx0Ly8gU3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZVxuXHQvLyBleGNlcHQgXCJ0YWJsZVwiLCBcInRhYmxlLWNlbGxcIiwgb3IgXCJ0YWJsZS1jYXB0aW9uXCJcblx0Ly8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5XG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcblxuXHRjc3NTaG93ID0geyBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLCB2aXNpYmlsaXR5OiBcImhpZGRlblwiLCBkaXNwbGF5OiBcImJsb2NrXCIgfSxcblx0Y3NzTm9ybWFsVHJhbnNmb3JtID0ge1xuXHRcdGxldHRlclNwYWNpbmc6IFwiMFwiLFxuXHRcdGZvbnRXZWlnaHQ6IFwiNDAwXCJcblx0fSxcblxuXHRjc3NQcmVmaXhlcyA9IFsgXCJXZWJraXRcIiwgXCJPXCIsIFwiTW96XCIsIFwibXNcIiBdLFxuXHRlbXB0eVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLnN0eWxlO1xuXG4vLyBSZXR1cm4gYSBjc3MgcHJvcGVydHkgbWFwcGVkIHRvIGEgcG90ZW50aWFsbHkgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5XG5mdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHtcblxuXHQvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZFxuXHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRyZXR1cm4gbmFtZTtcblx0fVxuXG5cdC8vIENoZWNrIGZvciB2ZW5kb3IgcHJlZml4ZWQgbmFtZXNcblx0dmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSxcblx0XHRpID0gY3NzUHJlZml4ZXMubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTtcblx0XHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRcdHJldHVybiBuYW1lO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkge1xuXG5cdC8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW5cblx0Ly8gbm9ybWFsaXplZCBhdCB0aGlzIHBvaW50XG5cdHZhciBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApO1xuXHRyZXR1cm4gbWF0Y2hlcyA/XG5cblx0XHQvLyBHdWFyZCBhZ2FpbnN0IHVuZGVmaW5lZCBcInN1YnRyYWN0XCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rc1xuXHRcdE1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgOlxuXHRcdHZhbHVlO1xufVxuXG5mdW5jdGlvbiBhdWdtZW50V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEsIGlzQm9yZGVyQm94LCBzdHlsZXMgKSB7XG5cdHZhciBpID0gZXh0cmEgPT09ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSA/XG5cblx0XHQvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIHJpZ2h0IG1lYXN1cmVtZW50LCBhdm9pZCBhdWdtZW50YXRpb25cblx0XHQ0IDpcblxuXHRcdC8vIE90aGVyd2lzZSBpbml0aWFsaXplIGZvciBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHByb3BlcnRpZXNcblx0XHRuYW1lID09PSBcIndpZHRoXCIgPyAxIDogMCxcblxuXHRcdHZhbCA9IDA7XG5cblx0Zm9yICggOyBpIDwgNDsgaSArPSAyICkge1xuXG5cdFx0Ly8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luLCBzbyBhZGQgaXQgaWYgd2Ugd2FudCBpdFxuXHRcdGlmICggZXh0cmEgPT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHR2YWwgKz0galF1ZXJ5LmNzcyggZWxlbSwgZXh0cmEgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBpc0JvcmRlckJveCApIHtcblxuXHRcdFx0Ly8gYm9yZGVyLWJveCBpbmNsdWRlcyBwYWRkaW5nLCBzbyByZW1vdmUgaXQgaWYgd2Ugd2FudCBjb250ZW50XG5cdFx0XHRpZiAoIGV4dHJhID09PSBcImNvbnRlbnRcIiApIHtcblx0XHRcdFx0dmFsIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBib3JkZXIgbm9yIG1hcmdpbiwgc28gcmVtb3ZlIGJvcmRlclxuXHRcdFx0aWYgKCBleHRyYSAhPT0gXCJtYXJnaW5cIiApIHtcblx0XHRcdFx0dmFsIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCwgc28gYWRkIHBhZGRpbmdcblx0XHRcdHZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblxuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCBub3IgcGFkZGluZywgc28gYWRkIGJvcmRlclxuXHRcdFx0aWYgKCBleHRyYSAhPT0gXCJwYWRkaW5nXCIgKSB7XG5cdFx0XHRcdHZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB2YWw7XG59XG5cbmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICkge1xuXG5cdC8vIFN0YXJ0IHdpdGggb2Zmc2V0IHByb3BlcnR5LCB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSBib3JkZXItYm94IHZhbHVlXG5cdHZhciB2YWx1ZUlzQm9yZGVyQm94ID0gdHJ1ZSxcblx0XHR2YWwgPSBuYW1lID09PSBcIndpZHRoXCIgPyBlbGVtLm9mZnNldFdpZHRoIDogZWxlbS5vZmZzZXRIZWlnaHQsXG5cdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0aXNCb3JkZXJCb3ggPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiO1xuXG5cdC8vIFNvbWUgbm9uLWh0bWwgZWxlbWVudHMgcmV0dXJuIHVuZGVmaW5lZCBmb3Igb2Zmc2V0V2lkdGgsIHNvIGNoZWNrIGZvciBudWxsL3VuZGVmaW5lZFxuXHQvLyBzdmcgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02NDkyODVcblx0Ly8gTWF0aE1MIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDkxNjY4XG5cdGlmICggdmFsIDw9IDAgfHwgdmFsID09IG51bGwgKSB7XG5cblx0XHQvLyBGYWxsIGJhY2sgdG8gY29tcHV0ZWQgdGhlbiB1bmNvbXB1dGVkIGNzcyBpZiBuZWNlc3Nhcnlcblx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApO1xuXHRcdGlmICggdmFsIDwgMCB8fCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdHZhbCA9IGVsZW0uc3R5bGVbIG5hbWUgXTtcblx0XHR9XG5cblx0XHQvLyBDb21wdXRlZCB1bml0IGlzIG5vdCBwaXhlbHMuIFN0b3AgaGVyZSBhbmQgcmV0dXJuLlxuXHRcdGlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkge1xuXHRcdFx0cmV0dXJuIHZhbDtcblx0XHR9XG5cblx0XHQvLyBDaGVjayBmb3Igc3R5bGUgaW4gY2FzZSBhIGJyb3dzZXIgd2hpY2ggcmV0dXJucyB1bnJlbGlhYmxlIHZhbHVlc1xuXHRcdC8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGVcblx0XHR2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3ggJiZcblx0XHRcdCggc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpIHx8IHZhbCA9PT0gZWxlbS5zdHlsZVsgbmFtZSBdICk7XG5cblx0XHQvLyBOb3JtYWxpemUgXCJcIiwgYXV0bywgYW5kIHByZXBhcmUgZm9yIGV4dHJhXG5cdFx0dmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDtcblx0fVxuXG5cdC8vIFVzZSB0aGUgYWN0aXZlIGJveC1zaXppbmcgbW9kZWwgdG8gYWRkL3N1YnRyYWN0IGlycmVsZXZhbnQgc3R5bGVzXG5cdHJldHVybiAoIHZhbCArXG5cdFx0YXVnbWVudFdpZHRoT3JIZWlnaHQoXG5cdFx0XHRlbGVtLFxuXHRcdFx0bmFtZSxcblx0XHRcdGV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSxcblx0XHRcdHZhbHVlSXNCb3JkZXJCb3gsXG5cdFx0XHRzdHlsZXNcblx0XHQpXG5cdCkgKyBcInB4XCI7XG59XG5cbmZ1bmN0aW9uIHNob3dIaWRlKCBlbGVtZW50cywgc2hvdyApIHtcblx0dmFyIGRpc3BsYXksIGVsZW0sIGhpZGRlbixcblx0XHR2YWx1ZXMgPSBbXSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoO1xuXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHR2YWx1ZXNbIGluZGV4IF0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwib2xkZGlzcGxheVwiICk7XG5cdFx0ZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTtcblx0XHRpZiAoIHNob3cgKSB7XG5cblx0XHRcdC8vIFJlc2V0IHRoZSBpbmxpbmUgZGlzcGxheSBvZiB0aGlzIGVsZW1lbnQgdG8gbGVhcm4gaWYgaXQgaXNcblx0XHRcdC8vIGJlaW5nIGhpZGRlbiBieSBjYXNjYWRlZCBydWxlcyBvciBub3Rcblx0XHRcdGlmICggIXZhbHVlc1sgaW5kZXggXSAmJiBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGVsZW1lbnRzIHdoaWNoIGhhdmUgYmVlbiBvdmVycmlkZGVuIHdpdGggZGlzcGxheTogbm9uZVxuXHRcdFx0Ly8gaW4gYSBzdHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJyb3dzZXIgc3R5bGUgaXNcblx0XHRcdC8vIGZvciBzdWNoIGFuIGVsZW1lbnRcblx0XHRcdGlmICggZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmIGlzSGlkZGVuKCBlbGVtICkgKSB7XG5cdFx0XHRcdHZhbHVlc1sgaW5kZXggXSA9IGRhdGFQcml2LmFjY2Vzcyhcblx0XHRcdFx0XHRlbGVtLFxuXHRcdFx0XHRcdFwib2xkZGlzcGxheVwiLFxuXHRcdFx0XHRcdGRlZmF1bHREaXNwbGF5KCBlbGVtLm5vZGVOYW1lIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aGlkZGVuID0gaXNIaWRkZW4oIGVsZW0gKTtcblxuXHRcdFx0aWYgKCBkaXNwbGF5ICE9PSBcIm5vbmVcIiB8fCAhaGlkZGVuICkge1xuXHRcdFx0XHRkYXRhUHJpdi5zZXQoXG5cdFx0XHRcdFx0ZWxlbSxcblx0XHRcdFx0XHRcIm9sZGRpc3BsYXlcIixcblx0XHRcdFx0XHRoaWRkZW4gPyBkaXNwbGF5IDogalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFNldCB0aGUgZGlzcGxheSBvZiBtb3N0IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wXG5cdC8vIHRvIGF2b2lkIHRoZSBjb25zdGFudCByZWZsb3dcblx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRlbGVtID0gZWxlbWVudHNbIGluZGV4IF07XG5cdFx0aWYgKCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRpZiAoICFzaG93IHx8IGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgfHwgZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICkge1xuXHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/IHZhbHVlc1sgaW5kZXggXSB8fCBcIlwiIDogXCJub25lXCI7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRzO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0XG5cdC8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eVxuXHRjc3NIb29rczoge1xuXHRcdG9wYWNpdHk6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdFx0Ly8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHlcblx0XHRcdFx0XHR2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCBcIm9wYWNpdHlcIiApO1xuXHRcdFx0XHRcdHJldHVybiByZXQgPT09IFwiXCIgPyBcIjFcIiA6IHJldDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvLyBEb24ndCBhdXRvbWF0aWNhbGx5IGFkZCBcInB4XCIgdG8gdGhlc2UgcG9zc2libHktdW5pdGxlc3MgcHJvcGVydGllc1xuXHRjc3NOdW1iZXI6IHtcblx0XHRcImFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50XCI6IHRydWUsXG5cdFx0XCJjb2x1bW5Db3VudFwiOiB0cnVlLFxuXHRcdFwiZmlsbE9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcImZsZXhHcm93XCI6IHRydWUsXG5cdFx0XCJmbGV4U2hyaW5rXCI6IHRydWUsXG5cdFx0XCJmb250V2VpZ2h0XCI6IHRydWUsXG5cdFx0XCJsaW5lSGVpZ2h0XCI6IHRydWUsXG5cdFx0XCJvcGFjaXR5XCI6IHRydWUsXG5cdFx0XCJvcmRlclwiOiB0cnVlLFxuXHRcdFwib3JwaGFuc1wiOiB0cnVlLFxuXHRcdFwid2lkb3dzXCI6IHRydWUsXG5cdFx0XCJ6SW5kZXhcIjogdHJ1ZSxcblx0XHRcInpvb21cIjogdHJ1ZVxuXHR9LFxuXG5cdC8vIEFkZCBpbiBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBiZWZvcmVcblx0Ly8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZVxuXHRjc3NQcm9wczoge1xuXHRcdFwiZmxvYXRcIjogXCJjc3NGbG9hdFwiXG5cdH0sXG5cblx0Ly8gR2V0IGFuZCBzZXQgdGhlIHN0eWxlIHByb3BlcnR5IG9uIGEgRE9NIE5vZGVcblx0c3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7XG5cblx0XHQvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHR2YXIgcmV0LCB0eXBlLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdFx0bmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fFxuXHRcdFx0KCBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggb3JpZ05hbWUgKSB8fCBvcmlnTmFtZSApO1xuXG5cdFx0Ly8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb25cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZVxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRcdC8vIENvbnZlcnQgXCIrPVwiIG9yIFwiLT1cIiB0byByZWxhdGl2ZSBudW1iZXJzICgjNzM0NSlcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAoIHJldCA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmIHJldFsgMSBdICkge1xuXHRcdFx0XHR2YWx1ZSA9IGFkanVzdENTUyggZWxlbSwgbmFtZSwgcmV0ICk7XG5cblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM5MjM3XG5cdFx0XHRcdHR5cGUgPSBcIm51bWJlclwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQgKCM3MTE2KVxuXHRcdFx0aWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIG51bWJlciB3YXMgcGFzc2VkIGluLCBhZGQgdGhlIHVuaXQgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcylcblx0XHRcdGlmICggdHlwZSA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsdWUgKz0gcmV0ICYmIHJldFsgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU5LTExK1xuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8XG5cdFx0XHRcdCggdmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgbm9uLWNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0XG5cdFx0XHRyZXR1cm4gc3R5bGVbIG5hbWUgXTtcblx0XHR9XG5cdH0sXG5cblx0Y3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHtcblx0XHR2YXIgdmFsLCBudW0sIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHRuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8XG5cdFx0XHQoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBvcmlnTmFtZSApIHx8IG9yaWdOYW1lICk7XG5cblx0XHQvLyBUcnkgcHJlZml4ZWQgbmFtZSBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCBuYW1lXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbCA9IGhvb2tzLmdldCggZWxlbSwgdHJ1ZSwgZXh0cmEgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2UsIGlmIGEgd2F5IHRvIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZXhpc3RzLCB1c2UgdGhhdFxuXHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgXCJub3JtYWxcIiB0byBjb21wdXRlZCB2YWx1ZVxuXHRcdGlmICggdmFsID09PSBcIm5vcm1hbFwiICYmIG5hbWUgaW4gY3NzTm9ybWFsVHJhbnNmb3JtICkge1xuXHRcdFx0dmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBudW1lcmljIGlmIGZvcmNlZCBvciBhIHF1YWxpZmllciB3YXMgcHJvdmlkZWQgYW5kIHZhbCBsb29rcyBudW1lcmljXG5cdFx0aWYgKCBleHRyYSA9PT0gXCJcIiB8fCBleHRyYSApIHtcblx0XHRcdG51bSA9IHBhcnNlRmxvYXQoIHZhbCApO1xuXHRcdFx0cmV0dXJuIGV4dHJhID09PSB0cnVlIHx8IGlzRmluaXRlKCBudW0gKSA/IG51bSB8fCAwIDogdmFsO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQsIGV4dHJhICkge1xuXHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdFx0XHQvLyBDZXJ0YWluIGVsZW1lbnRzIGNhbiBoYXZlIGRpbWVuc2lvbiBpbmZvIGlmIHdlIGludmlzaWJseSBzaG93IHRoZW1cblx0XHRcdFx0Ly8gYnV0IGl0IG11c3QgaGF2ZSBhIGN1cnJlbnQgZGlzcGxheSBzdHlsZSB0aGF0IHdvdWxkIGJlbmVmaXRcblx0XHRcdFx0cmV0dXJuIHJkaXNwbGF5c3dhcC50ZXN0KCBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApICkgJiZcblx0XHRcdFx0XHRlbGVtLm9mZnNldFdpZHRoID09PSAwID9cblx0XHRcdFx0XHRcdHN3YXAoIGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKTtcblx0XHRcdFx0XHRcdH0gKSA6XG5cdFx0XHRcdFx0XHRnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7XG5cdFx0XHR2YXIgbWF0Y2hlcyxcblx0XHRcdFx0c3R5bGVzID0gZXh0cmEgJiYgZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0XHRcdHN1YnRyYWN0ID0gZXh0cmEgJiYgYXVnbWVudFdpZHRoT3JIZWlnaHQoXG5cdFx0XHRcdFx0ZWxlbSxcblx0XHRcdFx0XHRuYW1lLFxuXHRcdFx0XHRcdGV4dHJhLFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0XHRcdFx0c3R5bGVzXG5cdFx0XHRcdCk7XG5cblx0XHRcdC8vIENvbnZlcnQgdG8gcGl4ZWxzIGlmIHZhbHVlIGFkanVzdG1lbnQgaXMgbmVlZGVkXG5cdFx0XHRpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmXG5cdFx0XHRcdCggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApICE9PSBcInB4XCIgKSB7XG5cblx0XHRcdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdHZhbHVlID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApO1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LFxuXHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdHJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgXCJtYXJnaW5MZWZ0XCIgKSApIHx8XG5cdFx0XHRcdGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtXG5cdFx0XHRcdFx0c3dhcCggZWxlbSwgeyBtYXJnaW5MZWZ0OiAwIH0sIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KSArIFwicHhcIjtcblx0XHR9XG5cdH1cbik7XG5cbi8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG5qUXVlcnkuY3NzSG9va3MubWFyZ2luUmlnaHQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCxcblx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4gc3dhcCggZWxlbSwgeyBcImRpc3BsYXlcIjogXCJpbmxpbmUtYmxvY2tcIiB9LFxuXHRcdFx0XHRjdXJDU1MsIFsgZWxlbSwgXCJtYXJnaW5SaWdodFwiIF0gKTtcblx0XHR9XG5cdH1cbik7XG5cbi8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXNcbmpRdWVyeS5lYWNoKCB7XG5cdG1hcmdpbjogXCJcIixcblx0cGFkZGluZzogXCJcIixcblx0Ym9yZGVyOiBcIldpZHRoXCJcbn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHtcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBpID0gMCxcblx0XHRcdFx0ZXhwYW5kZWQgPSB7fSxcblxuXHRcdFx0XHQvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmdcblx0XHRcdFx0cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS5zcGxpdCggXCIgXCIgKSA6IFsgdmFsdWUgXTtcblxuXHRcdFx0Zm9yICggOyBpIDwgNDsgaSsrICkge1xuXHRcdFx0XHRleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9XG5cdFx0XHRcdFx0cGFydHNbIGkgXSB8fCBwYXJ0c1sgaSAtIDIgXSB8fCBwYXJ0c1sgMCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXhwYW5kZWQ7XG5cdFx0fVxuXHR9O1xuXG5cdGlmICggIXJtYXJnaW4udGVzdCggcHJlZml4ICkgKSB7XG5cdFx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXS5zZXQgPSBzZXRQb3NpdGl2ZU51bWJlcjtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGNzczogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHRcdHZhciBzdHlsZXMsIGxlbixcblx0XHRcdFx0bWFwID0ge30sXG5cdFx0XHRcdGkgPSAwO1xuXG5cdFx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCBuYW1lICkgKSB7XG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0XHRsZW4gPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWFwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XG5cdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHR9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblx0c2hvdzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzLCB0cnVlICk7XG5cdH0sXG5cdGhpZGU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcyApO1xuXHR9LFxuXHR0b2dnbGU6IGZ1bmN0aW9uKCBzdGF0ZSApIHtcblx0XHRpZiAoIHR5cGVvZiBzdGF0ZSA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGUgPyB0aGlzLnNob3coKSA6IHRoaXMuaGlkZSgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBpc0hpZGRlbiggdGhpcyApICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5zaG93KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cblxuZnVuY3Rpb24gVHdlZW4oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICkge1xuXHRyZXR1cm4gbmV3IFR3ZWVuLnByb3RvdHlwZS5pbml0KCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApO1xufVxualF1ZXJ5LlR3ZWVuID0gVHdlZW47XG5cblR3ZWVuLnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IFR3ZWVuLFxuXHRpbml0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcsIHVuaXQgKSB7XG5cdFx0dGhpcy5lbGVtID0gZWxlbTtcblx0XHR0aGlzLnByb3AgPSBwcm9wO1xuXHRcdHRoaXMuZWFzaW5nID0gZWFzaW5nIHx8IGpRdWVyeS5lYXNpbmcuX2RlZmF1bHQ7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0XHR0aGlzLnN0YXJ0ID0gdGhpcy5ub3cgPSB0aGlzLmN1cigpO1xuXHRcdHRoaXMuZW5kID0gZW5kO1xuXHRcdHRoaXMudW5pdCA9IHVuaXQgfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICk7XG5cdH0sXG5cdGN1cjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTtcblxuXHRcdHJldHVybiBob29rcyAmJiBob29rcy5nZXQgP1xuXHRcdFx0aG9va3MuZ2V0KCB0aGlzICkgOlxuXHRcdFx0VHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LmdldCggdGhpcyApO1xuXHR9LFxuXHRydW46IGZ1bmN0aW9uKCBwZXJjZW50ICkge1xuXHRcdHZhciBlYXNlZCxcblx0XHRcdGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLmR1cmF0aW9uICkge1xuXHRcdFx0dGhpcy5wb3MgPSBlYXNlZCA9IGpRdWVyeS5lYXNpbmdbIHRoaXMuZWFzaW5nIF0oXG5cdFx0XHRcdHBlcmNlbnQsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIHBlcmNlbnQsIDAsIDEsIHRoaXMub3B0aW9ucy5kdXJhdGlvblxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7XG5cdFx0fVxuXHRcdHRoaXMubm93ID0gKCB0aGlzLmVuZCAtIHRoaXMuc3RhcnQgKSAqIGVhc2VkICsgdGhpcy5zdGFydDtcblxuXHRcdGlmICggdGhpcy5vcHRpb25zLnN0ZXAgKSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKCB0aGlzLmVsZW0sIHRoaXMubm93LCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBob29rcy5zZXQgKSB7XG5cdFx0XHRob29rcy5zZXQoIHRoaXMgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0VHdlZW4ucHJvcEhvb2tzLl9kZWZhdWx0LnNldCggdGhpcyApO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufTtcblxuVHdlZW4ucHJvdG90eXBlLmluaXQucHJvdG90eXBlID0gVHdlZW4ucHJvdG90eXBlO1xuXG5Ud2Vlbi5wcm9wSG9va3MgPSB7XG5cdF9kZWZhdWx0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cdFx0XHR2YXIgcmVzdWx0O1xuXG5cdFx0XHQvLyBVc2UgYSBwcm9wZXJ0eSBvbiB0aGUgZWxlbWVudCBkaXJlY3RseSB3aGVuIGl0IGlzIG5vdCBhIERPTSBlbGVtZW50LFxuXHRcdFx0Ly8gb3Igd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBzdHlsZSBwcm9wZXJ0eSB0aGF0IGV4aXN0cy5cblx0XHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAhPT0gMSB8fFxuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gIT0gbnVsbCAmJiB0d2Vlbi5lbGVtLnN0eWxlWyB0d2Vlbi5wcm9wIF0gPT0gbnVsbCApIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUGFzc2luZyBhbiBlbXB0eSBzdHJpbmcgYXMgYSAzcmQgcGFyYW1ldGVyIHRvIC5jc3Mgd2lsbCBhdXRvbWF0aWNhbGx5XG5cdFx0XHQvLyBhdHRlbXB0IGEgcGFyc2VGbG9hdCBhbmQgZmFsbGJhY2sgdG8gYSBzdHJpbmcgaWYgdGhlIHBhcnNlIGZhaWxzLlxuXHRcdFx0Ly8gU2ltcGxlIHZhbHVlcyBzdWNoIGFzIFwiMTBweFwiIGFyZSBwYXJzZWQgdG8gRmxvYXQ7XG5cdFx0XHQvLyBjb21wbGV4IHZhbHVlcyBzdWNoIGFzIFwicm90YXRlKDFyYWQpXCIgYXJlIHJldHVybmVkIGFzLWlzLlxuXHRcdFx0cmVzdWx0ID0galF1ZXJ5LmNzcyggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgXCJcIiApO1xuXG5cdFx0XHQvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kIFwiYXV0b1wiIGFyZSBjb252ZXJ0ZWQgdG8gMC5cblx0XHRcdHJldHVybiAhcmVzdWx0IHx8IHJlc3VsdCA9PT0gXCJhdXRvXCIgPyAwIDogcmVzdWx0O1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cblx0XHRcdC8vIFVzZSBzdGVwIGhvb2sgZm9yIGJhY2sgY29tcGF0LlxuXHRcdFx0Ly8gVXNlIGNzc0hvb2sgaWYgaXRzIHRoZXJlLlxuXHRcdFx0Ly8gVXNlIC5zdHlsZSBpZiBhdmFpbGFibGUgYW5kIHVzZSBwbGFpbiBwcm9wZXJ0aWVzIHdoZXJlIGF2YWlsYWJsZS5cblx0XHRcdGlmICggalF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSApIHtcblx0XHRcdFx0alF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSggdHdlZW4gKTtcblx0XHRcdH0gZWxzZSBpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0KCB0d2Vlbi5lbGVtLnN0eWxlWyBqUXVlcnkuY3NzUHJvcHNbIHR3ZWVuLnByb3AgXSBdICE9IG51bGwgfHxcblx0XHRcdFx0XHRqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSApICkge1xuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIHR3ZWVuLm5vdyArIHR3ZWVuLnVuaXQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbi8vIFN1cHBvcnQ6IElFOVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJvcEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fSxcblx0X2RlZmF1bHQ6IFwic3dpbmdcIlxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgQ29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIHRpbWVySWQsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLztcblxuLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseVxuZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRmeE5vdyA9IHVuZGVmaW5lZDtcblx0fSApO1xuXHRyZXR1cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3coKSApO1xufVxuXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxuZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHtcblx0dmFyIHdoaWNoLFxuXHRcdGkgPSAwLFxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTtcblxuXHQvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXG5cdC8vIG90aGVyd2lzZSBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0XG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwO1xuXHRmb3IgKCA7IGkgPCA0IDsgaSArPSAyIC0gaW5jbHVkZVdpZHRoICkge1xuXHRcdHdoaWNoID0gY3NzRXhwYW5kWyBpIF07XG5cdFx0YXR0cnNbIFwibWFyZ2luXCIgKyB3aGljaCBdID0gYXR0cnNbIFwicGFkZGluZ1wiICsgd2hpY2ggXSA9IHR5cGU7XG5cdH1cblxuXHRpZiAoIGluY2x1ZGVXaWR0aCApIHtcblx0XHRhdHRycy5vcGFjaXR5ID0gYXR0cnMud2lkdGggPSB0eXBlO1xuXHR9XG5cblx0cmV0dXJuIGF0dHJzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHtcblx0dmFyIHR3ZWVuLFxuXHRcdGNvbGxlY3Rpb24gPSAoIEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCBBbmltYXRpb24udHdlZW5lcnNbIFwiKlwiIF0gKSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHtcblxuXHRcdFx0Ly8gV2UncmUgZG9uZSB3aXRoIHRoaXMgcHJvcGVydHlcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7XG5cdC8qIGpzaGludCB2YWxpZHRoaXM6IHRydWUgKi9cblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIHR3ZWVuLCBob29rcywgb2xkZmlyZSwgZGlzcGxheSwgY2hlY2tEaXNwbGF5LFxuXHRcdGFuaW0gPSB0aGlzLFxuXHRcdG9yaWcgPSB7fSxcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGUsXG5cdFx0aGlkZGVuID0gZWxlbS5ub2RlVHlwZSAmJiBpc0hpZGRlbiggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cblx0Ly8gSGFuZGxlIHF1ZXVlOiBmYWxzZSBwcm9taXNlc1xuXHRpZiAoICFvcHRzLnF1ZXVlICkge1xuXHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCBcImZ4XCIgKTtcblx0XHRpZiAoIGhvb2tzLnVucXVldWVkID09IG51bGwgKSB7XG5cdFx0XHRob29rcy51bnF1ZXVlZCA9IDA7XG5cdFx0XHRvbGRmaXJlID0gaG9va3MuZW1wdHkuZmlyZTtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhaG9va3MudW5xdWV1ZWQgKSB7XG5cdFx0XHRcdFx0b2xkZmlyZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRob29rcy51bnF1ZXVlZCsrO1xuXG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBFbnN1cmUgdGhlIGNvbXBsZXRlIGhhbmRsZXIgaXMgY2FsbGVkIGJlZm9yZSB0aGlzIGNvbXBsZXRlc1xuXHRcdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRob29rcy51bnF1ZXVlZC0tO1xuXHRcdFx0XHRpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sIFwiZnhcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBIZWlnaHQvd2lkdGggb3ZlcmZsb3cgcGFzc1xuXHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBcImhlaWdodFwiIGluIHByb3BzIHx8IFwid2lkdGhcIiBpbiBwcm9wcyApICkge1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0XG5cdFx0Ly8gUmVjb3JkIGFsbCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRTktMTAgZG8gbm90XG5cdFx0Ly8gY2hhbmdlIHRoZSBvdmVyZmxvdyBhdHRyaWJ1dGUgd2hlbiBvdmVyZmxvd1ggYW5kXG5cdFx0Ly8gb3ZlcmZsb3dZIGFyZSBzZXQgdG8gdGhlIHNhbWUgdmFsdWVcblx0XHRvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTtcblxuXHRcdC8vIFNldCBkaXNwbGF5IHByb3BlcnR5IHRvIGlubGluZS1ibG9jayBmb3IgaGVpZ2h0L3dpZHRoXG5cdFx0Ly8gYW5pbWF0aW9ucyBvbiBpbmxpbmUgZWxlbWVudHMgdGhhdCBhcmUgaGF2aW5nIHdpZHRoL2hlaWdodCBhbmltYXRlZFxuXHRcdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXG5cdFx0Ly8gVGVzdCBkZWZhdWx0IGRpc3BsYXkgaWYgZGlzcGxheSBpcyBjdXJyZW50bHkgXCJub25lXCJcblx0XHRjaGVja0Rpc3BsYXkgPSBkaXNwbGF5ID09PSBcIm5vbmVcIiA/XG5cdFx0XHRkYXRhUHJpdi5nZXQoIGVsZW0sIFwib2xkZGlzcGxheVwiICkgfHwgZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKSA6IGRpc3BsYXk7XG5cblx0XHRpZiAoIGNoZWNrRGlzcGxheSA9PT0gXCJpbmxpbmVcIiAmJiBqUXVlcnkuY3NzKCBlbGVtLCBcImZsb2F0XCIgKSA9PT0gXCJub25lXCIgKSB7XG5cdFx0XHRzdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcblx0XHR9XG5cdH1cblxuXHRpZiAoIG9wdHMub3ZlcmZsb3cgKSB7XG5cdFx0c3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuXHRcdGFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHtcblx0XHRcdHN0eWxlLm92ZXJmbG93ID0gb3B0cy5vdmVyZmxvd1sgMCBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dZID0gb3B0cy5vdmVyZmxvd1sgMiBdO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIHNob3cvaGlkZSBwYXNzXG5cdGZvciAoIHByb3AgaW4gcHJvcHMgKSB7XG5cdFx0dmFsdWUgPSBwcm9wc1sgcHJvcCBdO1xuXHRcdGlmICggcmZ4dHlwZXMuZXhlYyggdmFsdWUgKSApIHtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgcHJvcCBdO1xuXHRcdFx0dG9nZ2xlID0gdG9nZ2xlIHx8IHZhbHVlID09PSBcInRvZ2dsZVwiO1xuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyBcImhpZGVcIiA6IFwic2hvd1wiICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgZGF0YVNob3cgbGVmdCBvdmVyIGZyb20gYSBzdG9wcGVkIGhpZGUgb3Igc2hvd1xuXHRcdFx0XHQvLyBhbmQgd2UgYXJlIGdvaW5nIHRvIHByb2NlZWQgd2l0aCBzaG93LCB3ZSBzaG91bGQgcHJldGVuZCB0byBiZSBoaWRkZW5cblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJzaG93XCIgJiYgZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IHRydWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdG9yaWdbIHByb3AgXSA9IGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gfHwgalF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wICk7XG5cblx0XHQvLyBBbnkgbm9uLWZ4IHZhbHVlIHN0b3BzIHVzIGZyb20gcmVzdG9yaW5nIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlXG5cdFx0fSBlbHNlIHtcblx0XHRcdGRpc3BsYXkgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9yaWcgKSApIHtcblx0XHRpZiAoIGRhdGFTaG93ICkge1xuXHRcdFx0aWYgKCBcImhpZGRlblwiIGluIGRhdGFTaG93ICkge1xuXHRcdFx0XHRoaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRhdGFTaG93ID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7fSApO1xuXHRcdH1cblxuXHRcdC8vIFN0b3JlIHN0YXRlIGlmIGl0cyB0b2dnbGUgLSBlbmFibGVzIC5zdG9wKCkudG9nZ2xlKCkgdG8gXCJyZXZlcnNlXCJcblx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdGRhdGFTaG93LmhpZGRlbiA9ICFoaWRkZW47XG5cdFx0fVxuXHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0alF1ZXJ5KCBlbGVtICkuc2hvdygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRhbmltLmRvbmUoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkoIGVsZW0gKS5oaWRlKCk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgcHJvcDtcblxuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cdFx0XHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdGZvciAoIHByb3AgaW4gb3JpZyApIHtcblx0XHRcdHR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7XG5cblx0XHRcdGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkge1xuXHRcdFx0XHRkYXRhU2hvd1sgcHJvcCBdID0gdHdlZW4uc3RhcnQ7XG5cdFx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRcdHR3ZWVuLmVuZCA9IHR3ZWVuLnN0YXJ0O1xuXHRcdFx0XHRcdHR3ZWVuLnN0YXJ0ID0gcHJvcCA9PT0gXCJ3aWR0aFwiIHx8IHByb3AgPT09IFwiaGVpZ2h0XCIgPyAxIDogMDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHQvLyBJZiB0aGlzIGlzIGEgbm9vcCBsaWtlIC5oaWRlKCkuaGlkZSgpLCByZXN0b3JlIGFuIG92ZXJ3cml0dGVuIGRpc3BsYXkgdmFsdWVcblx0fSBlbHNlIGlmICggKCBkaXNwbGF5ID09PSBcIm5vbmVcIiA/IGRlZmF1bHREaXNwbGF5KCBlbGVtLm5vZGVOYW1lICkgOiBkaXNwbGF5ICkgPT09IFwiaW5saW5lXCIgKSB7XG5cdFx0c3R5bGUuZGlzcGxheSA9IGRpc3BsYXk7XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBpbmRleCApO1xuXHRcdGVhc2luZyA9IHNwZWNpYWxFYXNpbmdbIG5hbWUgXTtcblx0XHR2YWx1ZSA9IHByb3BzWyBpbmRleCBdO1xuXHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRlYXNpbmcgPSB2YWx1ZVsgMSBdO1xuXHRcdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyAwIF07XG5cdFx0fVxuXG5cdFx0aWYgKCBpbmRleCAhPT0gbmFtZSApIHtcblx0XHRcdHByb3BzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgaW5kZXggXTtcblx0XHR9XG5cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdO1xuXHRcdGlmICggaG9va3MgJiYgXCJleHBhbmRcIiBpbiBob29rcyApIHtcblx0XHRcdHZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBuYW1lIF07XG5cblx0XHRcdC8vIE5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b24ndCBvdmVyd3JpdGUgZXhpc3Rpbmcga2V5cy5cblx0XHRcdC8vIFJldXNpbmcgJ2luZGV4JyBiZWNhdXNlIHdlIGhhdmUgdGhlIGNvcnJlY3QgXCJuYW1lXCJcblx0XHRcdGZvciAoIGluZGV4IGluIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7XG5cdFx0XHRcdFx0cHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgaW5kZXggXTtcblx0XHRcdFx0XHRzcGVjaWFsRWFzaW5nWyBpbmRleCBdID0gZWFzaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZztcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gQW5pbWF0aW9uKCBlbGVtLCBwcm9wZXJ0aWVzLCBvcHRpb25zICkge1xuXHR2YXIgcmVzdWx0LFxuXHRcdHN0b3BwZWQsXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IEFuaW1hdGlvbi5wcmVmaWx0ZXJzLmxlbmd0aCxcblx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIERvbid0IG1hdGNoIGVsZW0gaW4gdGhlIDphbmltYXRlZCBzZWxlY3RvclxuXHRcdFx0ZGVsZXRlIHRpY2suZWxlbTtcblx0XHR9ICksXG5cdFx0dGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHR2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0XHRyZW1haW5pbmcgPSBNYXRoLm1heCggMCwgYW5pbWF0aW9uLnN0YXJ0VGltZSArIGFuaW1hdGlvbi5kdXJhdGlvbiAtIGN1cnJlbnRUaW1lICksXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjNcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAoIzEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSApO1xuXG5cdFx0XHRpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHtcblx0XHRcdFx0cmV0dXJuIHJlbWFpbmluZztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcblx0XHRcdG9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHtcblx0XHRcdFx0c3BlY2lhbEVhc2luZzoge30sXG5cdFx0XHRcdGVhc2luZzogalF1ZXJ5LmVhc2luZy5fZGVmYXVsdFxuXHRcdFx0fSwgb3B0aW9ucyApLFxuXHRcdFx0b3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxuXHRcdFx0c3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0ZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sXG5cdFx0XHR0d2VlbnM6IFtdLFxuXHRcdFx0Y3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7XG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcblx0XHRcdFx0XHRcdGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmdbIHByb3AgXSB8fCBhbmltYXRpb24ub3B0cy5lYXNpbmcgKTtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApO1xuXHRcdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0XHR9LFxuXHRcdFx0c3RvcDogZnVuY3Rpb24oIGdvdG9FbmQgKSB7XG5cdFx0XHRcdHZhciBpbmRleCA9IDAsXG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnRcblx0XHRcdFx0XHRsZW5ndGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwO1xuXHRcdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RvcHBlZCA9IHRydWU7XG5cdFx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xuXHRcdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCAxICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXNvbHZlIHdoZW4gd2UgcGxheWVkIHRoZSBsYXN0IGZyYW1lOyBvdGhlcndpc2UsIHJlamVjdFxuXHRcdFx0XHRpZiAoIGdvdG9FbmQgKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdH0gKSxcblx0XHRwcm9wcyA9IGFuaW1hdGlvbi5wcm9wcztcblxuXHRwcm9wRmlsdGVyKCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApO1xuXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xuXHRcdHJlc3VsdCA9IEFuaW1hdGlvbi5wcmVmaWx0ZXJzWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7XG5cdFx0aWYgKCByZXN1bHQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXN1bHQuc3RvcCApICkge1xuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPVxuXHRcdFx0XHRcdGpRdWVyeS5wcm94eSggcmVzdWx0LnN0b3AsIHJlc3VsdCApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cdH1cblxuXHRqUXVlcnkubWFwKCBwcm9wcywgY3JlYXRlVHdlZW4sIGFuaW1hdGlvbiApO1xuXG5cdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGFuaW1hdGlvbi5vcHRzLnN0YXJ0ICkgKSB7XG5cdFx0YW5pbWF0aW9uLm9wdHMuc3RhcnQuY2FsbCggZWxlbSwgYW5pbWF0aW9uICk7XG5cdH1cblxuXHRqUXVlcnkuZngudGltZXIoXG5cdFx0alF1ZXJ5LmV4dGVuZCggdGljaywge1xuXHRcdFx0ZWxlbTogZWxlbSxcblx0XHRcdGFuaW06IGFuaW1hdGlvbixcblx0XHRcdHF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZVxuXHRcdH0gKVxuXHQpO1xuXG5cdC8vIGF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zXG5cdHJldHVybiBhbmltYXRpb24ucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzIClcblx0XHQuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKVxuXHRcdC5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsIClcblx0XHQuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTtcbn1cblxualF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFuaW1hdGlvbiwge1xuXHR0d2VlbmVyczoge1xuXHRcdFwiKlwiOiBbIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHtcblx0XHRcdHZhciB0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICk7XG5cdFx0XHRhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTtcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9IF1cblx0fSxcblxuXHR0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkge1xuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHByb3BzICkgKSB7XG5cdFx0XHRjYWxsYmFjayA9IHByb3BzO1xuXHRcdFx0cHJvcHMgPSBbIFwiKlwiIF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb3BzID0gcHJvcHMubWF0Y2goIHJub3R3aGl0ZSApO1xuXHRcdH1cblxuXHRcdHZhciBwcm9wLFxuXHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0bGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0XHRwcm9wID0gcHJvcHNbIGluZGV4IF07XG5cdFx0XHRBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSA9IEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0udW5zaGlmdCggY2FsbGJhY2sgKTtcblx0XHR9XG5cdH0sXG5cblx0cHJlZmlsdGVyczogWyBkZWZhdWx0UHJlZmlsdGVyIF0sXG5cblx0cHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7XG5cdFx0aWYgKCBwcmVwZW5kICkge1xuXHRcdFx0QW5pbWF0aW9uLnByZWZpbHRlcnMudW5zaGlmdCggY2FsbGJhY2sgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0QW5pbWF0aW9uLnByZWZpbHRlcnMucHVzaCggY2FsbGJhY2sgKTtcblx0XHR9XG5cdH1cbn0gKTtcblxualF1ZXJ5LnNwZWVkID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGZuICkge1xuXHR2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSBcIm9iamVjdFwiID8galF1ZXJ5LmV4dGVuZCgge30sIHNwZWVkICkgOiB7XG5cdFx0Y29tcGxldGU6IGZuIHx8ICFmbiAmJiBlYXNpbmcgfHxcblx0XHRcdGpRdWVyeS5pc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLFxuXHRcdGR1cmF0aW9uOiBzcGVlZCxcblx0XHRlYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmdcblx0fTtcblxuXHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZngub2ZmID8gMCA6IHR5cGVvZiBvcHQuZHVyYXRpb24gPT09IFwibnVtYmVyXCIgP1xuXHRcdG9wdC5kdXJhdGlvbiA6IG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzID9cblx0XHRcdGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdIDogalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDtcblxuXHQvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiBcImZ4XCJcblx0aWYgKCBvcHQucXVldWUgPT0gbnVsbCB8fCBvcHQucXVldWUgPT09IHRydWUgKSB7XG5cdFx0b3B0LnF1ZXVlID0gXCJmeFwiO1xuXHR9XG5cblx0Ly8gUXVldWVpbmdcblx0b3B0Lm9sZCA9IG9wdC5jb21wbGV0ZTtcblxuXHRvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHQub2xkICkgKSB7XG5cdFx0XHRvcHQub2xkLmNhbGwoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdC5xdWV1ZSApIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCBvcHQucXVldWUgKTtcblx0XHR9XG5cdH07XG5cblx0cmV0dXJuIG9wdDtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXG5cdFx0Ly8gU2hvdyBhbnkgaGlkZGVuIGVsZW1lbnRzIGFmdGVyIHNldHRpbmcgb3BhY2l0eSB0byAwXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBpc0hpZGRlbiApLmNzcyggXCJvcGFjaXR5XCIsIDAgKS5zaG93KClcblxuXHRcdFx0Ly8gQW5pbWF0ZSB0byB0aGUgdmFsdWUgc3BlY2lmaWVkXG5cdFx0XHQuZW5kKCkuYW5pbWF0ZSggeyBvcGFjaXR5OiB0byB9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9LFxuXHRhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSxcblx0XHRcdG9wdGFsbCA9IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSxcblx0XHRcdGRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gT3BlcmF0ZSBvbiBhIGNvcHkgb2YgcHJvcCBzbyBwZXItcHJvcGVydHkgZWFzaW5nIHdvbid0IGJlIGxvc3Rcblx0XHRcdFx0dmFyIGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApO1xuXG5cdFx0XHRcdC8vIEVtcHR5IGFuaW1hdGlvbnMsIG9yIGZpbmlzaGluZyByZXNvbHZlcyBpbW1lZGlhdGVseVxuXHRcdFx0XHRpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgXCJmaW5pc2hcIiApICkge1xuXHRcdFx0XHRcdGFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0ZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247XG5cblx0XHRyZXR1cm4gZW1wdHkgfHwgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/XG5cdFx0XHR0aGlzLmVhY2goIGRvQW5pbWF0aW9uICkgOlxuXHRcdFx0dGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApO1xuXHR9LFxuXHRzdG9wOiBmdW5jdGlvbiggdHlwZSwgY2xlYXJRdWV1ZSwgZ290b0VuZCApIHtcblx0XHR2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkge1xuXHRcdFx0dmFyIHN0b3AgPSBob29rcy5zdG9wO1xuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XG5cdFx0XHRzdG9wKCBnb3RvRW5kICk7XG5cdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRnb3RvRW5kID0gY2xlYXJRdWV1ZTtcblx0XHRcdGNsZWFyUXVldWUgPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBjbGVhclF1ZXVlICYmIHR5cGUgIT09IGZhbHNlICkge1xuXHRcdFx0dGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZGVxdWV1ZSA9IHRydWUsXG5cdFx0XHRcdGluZGV4ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyBcInF1ZXVlSG9va3NcIixcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0ZGF0YSA9IGRhdGFQcml2LmdldCggdGhpcyApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICkge1xuXHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkge1xuXHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBpbmRleCBpbiBkYXRhICkge1xuXHRcdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgJiYgcnJ1bi50ZXN0KCBpbmRleCApICkge1xuXHRcdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiZcblx0XHRcdFx0XHQoIHR5cGUgPT0gbnVsbCB8fCB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSApIHtcblxuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIGdvdG9FbmQgKTtcblx0XHRcdFx0XHRkZXF1ZXVlID0gZmFsc2U7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2VkLlxuXHRcdFx0Ly8gVGltZXJzIGN1cnJlbnRseSB3aWxsIGNhbGwgdGhlaXIgY29tcGxldGUgY2FsbGJhY2tzLCB3aGljaFxuXHRcdFx0Ly8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLlxuXHRcdFx0aWYgKCBkZXF1ZXVlIHx8ICFnb3RvRW5kICkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblx0ZmluaXNoOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRpZiAoIHR5cGUgIT09IGZhbHNlICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpbmRleCxcblx0XHRcdFx0ZGF0YSA9IGRhdGFQcml2LmdldCggdGhpcyApLFxuXHRcdFx0XHRxdWV1ZSA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlXCIgXSxcblx0XHRcdFx0aG9va3MgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgXSxcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0bGVuZ3RoID0gcXVldWUgPyBxdWV1ZS5sZW5ndGggOiAwO1xuXG5cdFx0XHQvLyBFbmFibGUgZmluaXNoaW5nIGZsYWcgb24gcHJpdmF0ZSBkYXRhXG5cdFx0XHRkYXRhLmZpbmlzaCA9IHRydWU7XG5cblx0XHRcdC8vIEVtcHR5IHRoZSBxdWV1ZSBmaXJzdFxuXHRcdFx0alF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBbXSApO1xuXG5cdFx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnN0b3AgKSB7XG5cdFx0XHRcdGhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7XG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFuaW1hdGlvbnMgaW4gdGhlIG9sZCBxdWV1ZSBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdGlmICggcXVldWVbIGluZGV4IF0gJiYgcXVldWVbIGluZGV4IF0uZmluaXNoICkge1xuXHRcdFx0XHRcdHF1ZXVlWyBpbmRleCBdLmZpbmlzaC5jYWxsKCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVHVybiBvZmYgZmluaXNoaW5nIGZsYWdcblx0XHRcdGRlbGV0ZSBkYXRhLmZpbmlzaDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJ0b2dnbGVcIiwgXCJzaG93XCIsIFwiaGlkZVwiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHR2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHNwZWVkID09IG51bGwgfHwgdHlwZW9mIHNwZWVkID09PSBcImJvb2xlYW5cIiA/XG5cdFx0XHRjc3NGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICkgOlxuXHRcdFx0dGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9O1xufSApO1xuXG4vLyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25zXG5qUXVlcnkuZWFjaCgge1xuXHRzbGlkZURvd246IGdlbkZ4KCBcInNob3dcIiApLFxuXHRzbGlkZVVwOiBnZW5GeCggXCJoaWRlXCIgKSxcblx0c2xpZGVUb2dnbGU6IGdlbkZ4KCBcInRvZ2dsZVwiICksXG5cdGZhZGVJbjogeyBvcGFjaXR5OiBcInNob3dcIiB9LFxuXHRmYWRlT3V0OiB7IG9wYWNpdHk6IFwiaGlkZVwiIH0sXG5cdGZhZGVUb2dnbGU6IHsgb3BhY2l0eTogXCJ0b2dnbGVcIiB9XG59LCBmdW5jdGlvbiggbmFtZSwgcHJvcHMgKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkudGltZXJzID0gW107XG5qUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgdGltZXIsXG5cdFx0aSA9IDAsXG5cdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycztcblxuXHRmeE5vdyA9IGpRdWVyeS5ub3coKTtcblxuXHRmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0dGltZXIgPSB0aW1lcnNbIGkgXTtcblxuXHRcdC8vIENoZWNrcyB0aGUgdGltZXIgaGFzIG5vdCBhbHJlYWR5IGJlZW4gcmVtb3ZlZFxuXHRcdGlmICggIXRpbWVyKCkgJiYgdGltZXJzWyBpIF0gPT09IHRpbWVyICkge1xuXHRcdFx0dGltZXJzLnNwbGljZSggaS0tLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCAhdGltZXJzLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZnguc3RvcCgpO1xuXHR9XG5cdGZ4Tm93ID0gdW5kZWZpbmVkO1xufTtcblxualF1ZXJ5LmZ4LnRpbWVyID0gZnVuY3Rpb24oIHRpbWVyICkge1xuXHRqUXVlcnkudGltZXJzLnB1c2goIHRpbWVyICk7XG5cdGlmICggdGltZXIoKSApIHtcblx0XHRqUXVlcnkuZnguc3RhcnQoKTtcblx0fSBlbHNlIHtcblx0XHRqUXVlcnkudGltZXJzLnBvcCgpO1xuXHR9XG59O1xuXG5qUXVlcnkuZnguaW50ZXJ2YWwgPSAxMztcbmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkge1xuXHRpZiAoICF0aW1lcklkICkge1xuXHRcdHRpbWVySWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoIGpRdWVyeS5meC50aWNrLCBqUXVlcnkuZnguaW50ZXJ2YWwgKTtcblx0fVxufTtcblxualF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHtcblx0d2luZG93LmNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTtcblxuXHR0aW1lcklkID0gbnVsbDtcbn07XG5cbmpRdWVyeS5meC5zcGVlZHMgPSB7XG5cdHNsb3c6IDYwMCxcblx0ZmFzdDogMjAwLFxuXG5cdC8vIERlZmF1bHQgc3BlZWRcblx0X2RlZmF1bHQ6IDQwMFxufTtcblxuXG4vLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uXG4vLyBodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvXG5qUXVlcnkuZm4uZGVsYXkgPSBmdW5jdGlvbiggdGltZSwgdHlwZSApIHtcblx0dGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTtcblx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7XG5cdFx0dmFyIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggbmV4dCwgdGltZSApO1xuXHRcdGhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXQgKTtcblx0XHR9O1xuXHR9ICk7XG59O1xuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApLFxuXHRcdHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2VsZWN0XCIgKSxcblx0XHRvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib3B0aW9uXCIgKSApO1xuXG5cdGlucHV0LnR5cGUgPSBcImNoZWNrYm94XCI7XG5cblx0Ly8gU3VwcG9ydDogaU9TPD01LjEsIEFuZHJvaWQ8PTQuMitcblx0Ly8gRGVmYXVsdCB2YWx1ZSBmb3IgYSBjaGVja2JveCBzaG91bGQgYmUgXCJvblwiXG5cdHN1cHBvcnQuY2hlY2tPbiA9IGlucHV0LnZhbHVlICE9PSBcIlwiO1xuXG5cdC8vIFN1cHBvcnQ6IElFPD0xMStcblx0Ly8gTXVzdCBhY2Nlc3Mgc2VsZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3Rcblx0c3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPD0yLjNcblx0Ly8gT3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBhcmUgaW5jb3JyZWN0bHkgbWFya2VkIGFzIGRpc2FibGVkXG5cdHNlbGVjdC5kaXNhYmxlZCA9IHRydWU7XG5cdHN1cHBvcnQub3B0RGlzYWJsZWQgPSAhb3B0LmRpc2FibGVkO1xuXG5cdC8vIFN1cHBvcnQ6IElFPD0xMStcblx0Ly8gQW4gaW5wdXQgbG9zZXMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW9cblx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0aW5wdXQudmFsdWUgPSBcInRcIjtcblx0aW5wdXQudHlwZSA9IFwicmFkaW9cIjtcblx0c3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09IFwidFwiO1xufSApKCk7XG5cblxudmFyIGJvb2xIb29rLFxuXHRhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBhdHRyaWJ1dGVzIGFyZSBsb3dlcmNhc2Vcblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cdFx0XHRuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0aG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gfHxcblx0XHRcdFx0KCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZpbmVkICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gbnVsbCApIHtcblx0XHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyBcIlwiICk7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXG5cdFx0cmV0ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0Ly8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWRcblx0XHRyZXR1cm4gcmV0ID09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7XG5cdH0sXG5cblx0YXR0ckhvb2tzOiB7XG5cdFx0dHlwZToge1xuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRcdGlmICggIXN1cHBvcnQucmFkaW9WYWx1ZSAmJiB2YWx1ZSA9PT0gXCJyYWRpb1wiICYmXG5cdFx0XHRcdFx0alF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZWxlbS52YWx1ZTtcblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIHZhbHVlICk7XG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnZhbHVlID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdHZhciBuYW1lLCBwcm9wTmFtZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0YXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJub3R3aGl0ZSApO1xuXG5cdFx0aWYgKCBhdHRyTmFtZXMgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdHdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkge1xuXHRcdFx0XHRwcm9wTmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcblxuXHRcdFx0XHQvLyBCb29sZWFuIGF0dHJpYnV0ZXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50ICgjMTA4NzApXG5cdFx0XHRcdGlmICggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkgKSB7XG5cblx0XHRcdFx0XHQvLyBTZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB0byBmYWxzZVxuXHRcdFx0XHRcdGVsZW1bIHByb3BOYW1lIF0gPSBmYWxzZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhvb2tzIGZvciBib29sZWFuIGF0dHJpYnV0ZXNcbmJvb2xIb29rID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHtcblx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZVxuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cbn07XG5qUXVlcnkuZWFjaCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goIC9cXHcrL2cgKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBnZXR0ZXIgPSBhdHRySGFuZGxlWyBuYW1lIF0gfHwgalF1ZXJ5LmZpbmQuYXR0cjtcblxuXHRhdHRySGFuZGxlWyBuYW1lIF0gPSBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0dmFyIHJldCwgaGFuZGxlO1xuXHRcdGlmICggIWlzWE1MICkge1xuXG5cdFx0XHQvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wIGJ5IHRlbXBvcmFyaWx5IHJlbW92aW5nIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZ2V0dGVyXG5cdFx0XHRoYW5kbGUgPSBhdHRySGFuZGxlWyBuYW1lIF07XG5cdFx0XHRhdHRySGFuZGxlWyBuYW1lIF0gPSByZXQ7XG5cdFx0XHRyZXQgPSBnZXR0ZXIoIGVsZW0sIG5hbWUsIGlzWE1MICkgIT0gbnVsbCA/XG5cdFx0XHRcdG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdG51bGw7XG5cdFx0XHRhdHRySGFuZGxlWyBuYW1lIF0gPSBoYW5kbGU7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG59ICk7XG5cblxuXG5cbnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxcblx0cmNsaWNrYWJsZSA9IC9eKD86YXxhcmVhKSQvaTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZVByb3A6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHR2YXIgcmV0LCBob29rcyxcblx0XHRcdG5UeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdC8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcblx0XHRpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXG5cdFx0XHQvLyBGaXggbmFtZSBhbmQgYXR0YWNoIGhvb2tzXG5cdFx0XHRuYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lO1xuXHRcdFx0aG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuICggZWxlbVsgbmFtZSBdID0gdmFsdWUgKTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKCByZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSApICE9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZWxlbVsgbmFtZSBdO1xuXHR9LFxuXG5cdHByb3BIb29rczoge1xuXHRcdHRhYkluZGV4OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHRcdC8vIGVsZW0udGFiSW5kZXggZG9lc24ndCBhbHdheXMgcmV0dXJuIHRoZVxuXHRcdFx0XHQvLyBjb3JyZWN0IHZhbHVlIHdoZW4gaXQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBzZXRcblx0XHRcdFx0Ly8gaHR0cDovL2ZsdWlkcHJvamVjdC5vcmcvYmxvZy8yMDA4LzAxLzA5L2dldHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5kZXgtdmFsdWVzLXdpdGgtamF2YXNjcmlwdC9cblx0XHRcdFx0Ly8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCMxMjA3Milcblx0XHRcdFx0dmFyIHRhYmluZGV4ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ0YWJpbmRleFwiICk7XG5cblx0XHRcdFx0cmV0dXJuIHRhYmluZGV4ID9cblx0XHRcdFx0XHRwYXJzZUludCggdGFiaW5kZXgsIDEwICkgOlxuXHRcdFx0XHRcdHJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8XG5cdFx0XHRcdFx0XHRyY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiBlbGVtLmhyZWYgP1xuXHRcdFx0XHRcdFx0XHQwIDpcblx0XHRcdFx0XHRcdFx0LTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHByb3BGaXg6IHtcblx0XHRcImZvclwiOiBcImh0bWxGb3JcIixcblx0XHRcImNsYXNzXCI6IFwiY2xhc3NOYW1lXCJcblx0fVxufSApO1xuXG4vLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcbi8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eVxuLy8gZm9yY2VzIHRoZSBicm93c2VyIHRvIHJlc3BlY3Qgc2V0dGluZyBzZWxlY3RlZFxuLy8gb24gdGhlIG9wdGlvblxuLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWRcbi8vIHdoZW4gaW4gYW4gb3B0Z3JvdXBcbmlmICggIXN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7XG5cdGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRpZiAoIHBhcmVudCAmJiBwYXJlbnQucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0cGFyZW50LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRpZiAoIHBhcmVudCApIHtcblx0XHRcdFx0cGFyZW50LnNlbGVjdGVkSW5kZXg7XG5cblx0XHRcdFx0aWYgKCBwYXJlbnQucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5qUXVlcnkuZWFjaCggW1xuXHRcInRhYkluZGV4XCIsXG5cdFwicmVhZE9ubHlcIixcblx0XCJtYXhMZW5ndGhcIixcblx0XCJjZWxsU3BhY2luZ1wiLFxuXHRcImNlbGxQYWRkaW5nXCIsXG5cdFwicm93U3BhblwiLFxuXHRcImNvbFNwYW5cIixcblx0XCJ1c2VNYXBcIixcblx0XCJmcmFtZUJvcmRlclwiLFxuXHRcImNvbnRlbnRFZGl0YWJsZVwiXG5dLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnByb3BGaXhbIHRoaXMudG9Mb3dlckNhc2UoKSBdID0gdGhpcztcbn0gKTtcblxuXG5cblxudmFyIHJjbGFzcyA9IC9bXFx0XFxyXFxuXFxmXS9nO1xuXG5mdW5jdGlvbiBnZXRDbGFzcyggZWxlbSApIHtcblx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCBcImNsYXNzXCIgKSB8fCBcIlwiO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmFkZENsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSApIHtcblx0XHRcdGNsYXNzZXMgPSB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107XG5cblx0XHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApO1xuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdFx0KCBcIiBcIiArIGN1clZhbHVlICsgXCIgXCIgKS5yZXBsYWNlKCByY2xhc3MsIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHtcblx0XHRcdFx0XHRcdGlmICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhenogKyBcIiBcIiApIDwgMCApIHtcblx0XHRcdFx0XHRcdFx0Y3VyICs9IGNsYXp6ICsgXCIgXCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gT25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0galF1ZXJ5LnRyaW0oIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hdHRyKCBcImNsYXNzXCIsIFwiXCIgKTtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZSApIHtcblx0XHRcdGNsYXNzZXMgPSB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107XG5cblx0XHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApO1xuXG5cdFx0XHRcdC8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpXG5cdFx0XHRcdGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHQoIFwiIFwiICsgY3VyVmFsdWUgKyBcIiBcIiApLnJlcGxhY2UoIHJjbGFzcywgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgKmFsbCogaW5zdGFuY2VzXG5cdFx0XHRcdFx0XHR3aGlsZSAoIGN1ci5pbmRleE9mKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgPSBjdXIucmVwbGFjZSggXCIgXCIgKyBjbGF6eiArIFwiIFwiLCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE9ubHkgYXNzaWduIGlmIGRpZmZlcmVudCB0byBhdm9pZCB1bm5lZWRlZCByZW5kZXJpbmcuXG5cdFx0XHRcdFx0ZmluYWxWYWx1ZSA9IGpRdWVyeS50cmltKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkge1xuXHRcdHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09IFwiYm9vbGVhblwiICYmIHR5cGUgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTtcblx0XHR9XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnRvZ2dsZUNsYXNzKFxuXHRcdFx0XHRcdHZhbHVlLmNhbGwoIHRoaXMsIGksIGdldENsYXNzKCB0aGlzICksIHN0YXRlVmFsICksXG5cdFx0XHRcdFx0c3RhdGVWYWxcblx0XHRcdFx0KTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBjbGFzc05hbWUsIGksIHNlbGYsIGNsYXNzTmFtZXM7XG5cblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0XHQvLyBUb2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lc1xuXHRcdFx0XHRpID0gMDtcblx0XHRcdFx0c2VsZiA9IGpRdWVyeSggdGhpcyApO1xuXHRcdFx0XHRjbGFzc05hbWVzID0gdmFsdWUubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdO1xuXG5cdFx0XHRcdHdoaWxlICggKCBjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0XG5cdFx0XHRcdFx0aWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHtcblx0XHRcdFx0XHRcdHNlbGYucmVtb3ZlQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZWxmLmFkZENsYXNzKCBjbGFzc05hbWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWVcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZSA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0XHRcdGNsYXNzTmFtZSA9IGdldENsYXNzKCB0aGlzICk7XG5cdFx0XHRcdGlmICggY2xhc3NOYW1lICkge1xuXG5cdFx0XHRcdFx0Ly8gU3RvcmUgY2xhc3NOYW1lIGlmIHNldFxuXHRcdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIsIGNsYXNzTmFtZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCxcblx0XHRcdFx0Ly8gdGhlbiByZW1vdmUgdGhlIHdob2xlIGNsYXNzbmFtZSAoaWYgdGhlcmUgd2FzIG9uZSwgdGhlIGFib3ZlIHNhdmVkIGl0KS5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGJyaW5nIGJhY2sgd2hhdGV2ZXIgd2FzIHByZXZpb3VzbHkgc2F2ZWQgKGlmIGFueXRoaW5nKSxcblx0XHRcdFx0Ly8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLlxuXHRcdFx0XHRpZiAoIHRoaXMuc2V0QXR0cmlidXRlICkge1xuXHRcdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsXG5cdFx0XHRcdFx0XHRjbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID9cblx0XHRcdFx0XHRcdFwiXCIgOlxuXHRcdFx0XHRcdFx0ZGF0YVByaXYuZ2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiApIHx8IFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZSwgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Y2xhc3NOYW1lID0gXCIgXCIgKyBzZWxlY3RvciArIFwiIFwiO1xuXHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHQoIFwiIFwiICsgZ2V0Q2xhc3MoIGVsZW0gKSArIFwiIFwiICkucmVwbGFjZSggcmNsYXNzLCBcIiBcIiApXG5cdFx0XHRcdFx0LmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTFcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn0gKTtcblxuXG5cblxudmFyIHJyZXR1cm4gPSAvXFxyL2csXG5cdHJzcGFjZXMgPSAvW1xceDIwXFx0XFxyXFxuXFxmXSsvZztcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHR2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgaG9va3MsIHJldCwgaXNGdW5jdGlvbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF07XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF0gfHxcblx0XHRcdFx0XHRqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHRcdGlmICggaG9va3MgJiZcblx0XHRcdFx0XHRcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIFwidmFsdWVcIiApICkgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0ID0gZWxlbS52YWx1ZTtcblxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIHJldCA9PT0gXCJzdHJpbmdcIiA/XG5cblx0XHRcdFx0XHQvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzXG5cdFx0XHRcdFx0cmV0LnJlcGxhY2UoIHJyZXR1cm4sIFwiXCIgKSA6XG5cblx0XHRcdFx0XHQvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcblx0XHRcdFx0XHRyZXQgPT0gbnVsbCA/IFwiXCIgOiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdHZhciB2YWw7XG5cblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlLmNhbGwoIHRoaXMsIGksIGpRdWVyeSggdGhpcyApLnZhbCgpICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YWwgPSB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVHJlYXQgbnVsbC91bmRlZmluZWQgYXMgXCJcIjsgY29udmVydCBudW1iZXJzIHRvIHN0cmluZ1xuXHRcdFx0aWYgKCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdFx0dmFsID0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsICs9IFwiXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWwgKSApIHtcblx0XHRcdFx0dmFsID0galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiO1xuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cblx0XHRcdGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyB0aGlzLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHQvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZ1xuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCBcInZhbHVlXCIgKSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHR0aGlzLnZhbHVlID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHZhbEhvb2tzOiB7XG5cdFx0b3B0aW9uOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHRcdHZhciB2YWwgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInZhbHVlXCIgKTtcblx0XHRcdFx0cmV0dXJuIHZhbCAhPSBudWxsID9cblx0XHRcdFx0XHR2YWwgOlxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUxMC0xMStcblx0XHRcdFx0XHQvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAoIzE0Njg2LCAjMTQ4NTgpXG5cdFx0XHRcdFx0Ly8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2Vcblx0XHRcdFx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2Utd2hpdGVzcGFjZVxuXHRcdFx0XHRcdGpRdWVyeS50cmltKCBqUXVlcnkudGV4dCggZWxlbSApICkucmVwbGFjZSggcnNwYWNlcywgXCIgXCIgKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHNlbGVjdDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIHZhbHVlLCBvcHRpb24sXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcblx0XHRcdFx0XHRpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCxcblx0XHRcdFx0XHRvbmUgPSBlbGVtLnR5cGUgPT09IFwic2VsZWN0LW9uZVwiIHx8IGluZGV4IDwgMCxcblx0XHRcdFx0XHR2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sXG5cdFx0XHRcdFx0bWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGgsXG5cdFx0XHRcdFx0aSA9IGluZGV4IDwgMCA/XG5cdFx0XHRcdFx0XHRtYXggOlxuXHRcdFx0XHRcdFx0b25lID8gaW5kZXggOiAwO1xuXG5cdFx0XHRcdC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnNcblx0XHRcdFx0Zm9yICggOyBpIDwgbWF4OyBpKysgKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0Ly8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpXG5cdFx0XHRcdFx0aWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmXG5cblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQoIHN1cHBvcnQub3B0RGlzYWJsZWQgP1xuXHRcdFx0XHRcdFx0XHRcdCFvcHRpb24uZGlzYWJsZWQgOiBvcHRpb24uZ2V0QXR0cmlidXRlKCBcImRpc2FibGVkXCIgKSA9PT0gbnVsbCApICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8XG5cdFx0XHRcdFx0XHRcdFx0IWpRdWVyeS5ub2RlTmFtZSggb3B0aW9uLnBhcmVudE5vZGUsIFwib3B0Z3JvdXBcIiApICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb25cblx0XHRcdFx0XHRcdHZhbHVlID0galF1ZXJ5KCBvcHRpb24gKS52YWwoKTtcblxuXHRcdFx0XHRcdFx0Ly8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHNcblx0XHRcdFx0XHRcdGlmICggb25lICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5XG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRcdHZhciBvcHRpb25TZXQsIG9wdGlvbixcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdHZhbHVlcyA9IGpRdWVyeS5tYWtlQXJyYXkoIHZhbHVlICksXG5cdFx0XHRcdFx0aSA9IG9wdGlvbnMubGVuZ3RoO1xuXG5cdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblx0XHRcdFx0XHRpZiAoIG9wdGlvbi5zZWxlY3RlZCA9XG5cdFx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggalF1ZXJ5LnZhbEhvb2tzLm9wdGlvbi5nZXQoIG9wdGlvbiApLCB2YWx1ZXMgKSA+IC0xXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvcHRpb25TZXQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0XG5cdFx0XHRcdGlmICggIW9wdGlvblNldCApIHtcblx0XHRcdFx0XHRlbGVtLnNlbGVjdGVkSW5kZXggPSAtMTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG4vLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlclxualF1ZXJ5LmVhY2goIFsgXCJyYWRpb1wiLCBcImNoZWNrYm94XCIgXSwgZnVuY3Rpb24oKSB7XG5cdGpRdWVyeS52YWxIb29rc1sgdGhpcyBdID0ge1xuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0aWYgKCBqUXVlcnkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeSggZWxlbSApLnZhbCgpLCB2YWx1ZSApID4gLTEgKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmICggIXN1cHBvcnQuY2hlY2tPbiApIHtcblx0XHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXS5nZXQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IG51bGwgPyBcIm9uXCIgOiBlbGVtLnZhbHVlO1xuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gUmV0dXJuIGpRdWVyeSBmb3IgYXR0cmlidXRlcy1vbmx5IGluY2x1c2lvblxuXG5cbnZhciByZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLztcblxualF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmV2ZW50LCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7XG5cblx0XHR2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLFxuXHRcdFx0ZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sXG5cdFx0XHR0eXBlID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcInR5cGVcIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LFxuXHRcdFx0bmFtZXNwYWNlcyA9IGhhc093bi5jYWxsKCBldmVudCwgXCJuYW1lc3BhY2VcIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCBcIi5cIiApIDogW107XG5cblx0XHRjdXIgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKCBcIi5cIiApID4gLTEgKSB7XG5cblx0XHRcdC8vIE5hbWVzcGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFuZGxlKClcblx0XHRcdG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCBcIi5cIiApO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoIFwiOlwiICkgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKTtcblx0XHRldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApIDpcblx0XHRcdG51bGw7XG5cblx0XHQvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWRcblx0XHRldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZWxlbTtcblx0XHR9XG5cblx0XHQvLyBDbG9uZSBhbnkgaW5jb21pbmcgZGF0YSBhbmQgcHJlcGVuZCB0aGUgZXZlbnQsIGNyZWF0aW5nIHRoZSBoYW5kbGVyIGFyZyBsaXN0XG5cdFx0ZGF0YSA9IGRhdGEgPT0gbnVsbCA/XG5cdFx0XHRbIGV2ZW50IF0gOlxuXHRcdFx0alF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7XG5cblx0XHQvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzXG5cdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpXG5cdFx0Ly8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNClcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTtcblx0XHRcdGlmICggIXJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7XG5cdFx0XHRcdGN1ciA9IGN1ci5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yICggOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggY3VyICk7XG5cdFx0XHRcdHRtcCA9IGN1cjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pXG5cdFx0XHRpZiAoIHRtcCA9PT0gKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQgKSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGhcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggY3VyID0gZXZlbnRQYXRoWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRldmVudC50eXBlID0gaSA+IDEgP1xuXHRcdFx0XHRidWJibGVUeXBlIDpcblx0XHRcdFx0c3BlY2lhbC5iaW5kVHlwZSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBqUXVlcnkgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gKCBkYXRhUHJpdi5nZXQoIGN1ciwgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSAmJlxuXHRcdFx0XHRkYXRhUHJpdi5nZXQoIGN1ciwgXCJoYW5kbGVcIiApO1xuXHRcdFx0aWYgKCBoYW5kbGUgKSB7XG5cdFx0XHRcdGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE5hdGl2ZSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTtcblx0XHRcdGlmICggaGFuZGxlICYmIGhhbmRsZS5hcHBseSAmJiBhY2NlcHREYXRhKCBjdXIgKSApIHtcblx0XHRcdFx0ZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdFx0aWYgKCBldmVudC5yZXN1bHQgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZXZlbnQudHlwZSA9IHR5cGU7XG5cblx0XHQvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHtcblxuXHRcdFx0aWYgKCAoICFzcGVjaWFsLl9kZWZhdWx0IHx8XG5cdFx0XHRcdHNwZWNpYWwuX2RlZmF1bHQuYXBwbHkoIGV2ZW50UGF0aC5wb3AoKSwgZGF0YSApID09PSBmYWxzZSApICYmXG5cdFx0XHRcdGFjY2VwdERhdGEoIGVsZW0gKSApIHtcblxuXHRcdFx0XHQvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgbmFtZSBhcyB0aGUgZXZlbnQuXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MClcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIGVsZW1bIHR5cGUgXSApICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0XHRcdC8vIERvbid0IHJlLXRyaWdnZXIgYW4gb25GT08gZXZlbnQgd2hlbiB3ZSBjYWxsIGl0cyBGT08oKSBtZXRob2Rcblx0XHRcdFx0XHR0bXAgPSBlbGVtWyBvbnR5cGUgXTtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSBudWxsO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHR5cGU7XG5cdFx0XHRcdFx0ZWxlbVsgdHlwZSBdKCk7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmVcblx0Ly8gVXNlZCBvbmx5IGZvciBgZm9jdXMoaW4gfCBvdXQpYCBldmVudHNcblx0c2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVtLCBldmVudCApIHtcblx0XHR2YXIgZSA9IGpRdWVyeS5leHRlbmQoXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCksXG5cdFx0XHRldmVudCxcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0aXNTaW11bGF0ZWQ6IHRydWVcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblx0fVxuXG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSApO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxualF1ZXJ5LmVhY2goICggXCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayBcIiArXG5cdFwibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgXCIgK1xuXHRcImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnVcIiApLnNwbGl0KCBcIiBcIiApLFxuXHRmdW5jdGlvbiggaSwgbmFtZSApIHtcblxuXHQvLyBIYW5kbGUgZXZlbnQgYmluZGluZ1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDAgP1xuXHRcdFx0dGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6XG5cdFx0XHR0aGlzLnRyaWdnZXIoIG5hbWUgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7XG5cdFx0cmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7XG5cdH1cbn0gKTtcblxuXG5cblxuc3VwcG9ydC5mb2N1c2luID0gXCJvbmZvY3VzaW5cIiBpbiB3aW5kb3c7XG5cblxuLy8gU3VwcG9ydDogRmlyZWZveFxuLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50c1xuLy8gUmVsYXRlZCB0aWNrZXQgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc3ODdcbi8vXG4vLyBTdXBwb3J0OiBDaHJvbWUsIFNhZmFyaVxuLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsXG4vLyB3aGljaCBpcyBzcGVjIHZpb2xhdGlvbiAtIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWZvY3VzZXZlbnQtZXZlbnQtb3JkZXJcbi8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1N1xuaWYgKCAhc3VwcG9ydC5mb2N1c2luICkge1xuXHRqUXVlcnkuZWFjaCggeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXG5cdFx0Ly8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIG9uIHRoZSBkb2N1bWVudCB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXRcblx0XHR2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTtcblx0XHR9O1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0ge1xuXHRcdFx0c2V0dXA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLmFkZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCAoIGF0dGFjaGVzIHx8IDAgKSArIDEgKTtcblx0XHRcdH0sXG5cdFx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fSApO1xufVxudmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuXG52YXIgbm9uY2UgPSBqUXVlcnkubm93KCk7XG5cbnZhciBycXVlcnkgPSAoIC9cXD8vICk7XG5cblxuXG4vLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuLy8gV29ya2Fyb3VuZCBmYWlsdXJlIHRvIHN0cmluZy1jYXN0IG51bGwgaW5wdXRcbmpRdWVyeS5wYXJzZUpTT04gPSBmdW5jdGlvbiggZGF0YSApIHtcblx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKyBcIlwiICk7XG59O1xuXG5cbi8vIENyb3NzLWJyb3dzZXIgeG1sIHBhcnNpbmdcbmpRdWVyeS5wYXJzZVhNTCA9IGZ1bmN0aW9uKCBkYXRhICkge1xuXHR2YXIgeG1sO1xuXHRpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUU5XG5cdHRyeSB7XG5cdFx0eG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCBcInRleHQveG1sXCIgKTtcblx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0eG1sID0gdW5kZWZpbmVkO1xuXHR9XG5cblx0aWYgKCAheG1sIHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJwYXJzZXJlcnJvclwiICkubGVuZ3RoICkge1xuXHRcdGpRdWVyeS5lcnJvciggXCJJbnZhbGlkIFhNTDogXCIgKyBkYXRhICk7XG5cdH1cblx0cmV0dXJuIHhtbDtcbn07XG5cblxudmFyXG5cdHJoYXNoID0gLyMuKiQvLFxuXHRydHMgPSAvKFs/Jl0pXz1bXiZdKi8sXG5cdHJoZWFkZXJzID0gL14oLio/KTpbIFxcdF0qKFteXFxyXFxuXSopJC9tZyxcblxuXHQvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb25cblx0cmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxcblx0cm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sXG5cdHJwcm90b2NvbCA9IC9eXFwvXFwvLyxcblxuXHQvKiBQcmVmaWx0ZXJzXG5cdCAqIDEpIFRoZXkgYXJlIHVzZWZ1bCB0byBpbnRyb2R1Y2UgY3VzdG9tIGRhdGFUeXBlcyAoc2VlIGFqYXgvanNvbnAuanMgZm9yIGFuIGV4YW1wbGUpXG5cdCAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6XG5cdCAqICAgIC0gQkVGT1JFIGFza2luZyBmb3IgYSB0cmFuc3BvcnRcblx0ICogICAgLSBBRlRFUiBwYXJhbSBzZXJpYWxpemF0aW9uIChzLmRhdGEgaXMgYSBzdHJpbmcgaWYgcy5wcm9jZXNzRGF0YSBpcyB0cnVlKVxuXHQgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlXG5cdCAqIDQpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcblx0ICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byBcIipcIiBpZiBuZWVkZWRcblx0ICovXG5cdHByZWZpbHRlcnMgPSB7fSxcblxuXHQvKiBUcmFuc3BvcnRzIGJpbmRpbmdzXG5cdCAqIDEpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogMikgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiAzKSBzZWxlY3Rpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBnbyB0byBcIipcIiBpZiBuZWVkZWRcblx0ICovXG5cdHRyYW5zcG9ydHMgPSB7fSxcblxuXHQvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb25cblx0YWxsVHlwZXMgPSBcIiovXCIuY29uY2F0KCBcIipcIiApLFxuXG5cdC8vIEFuY2hvciB0YWcgZm9yIHBhcnNpbmcgdGhlIGRvY3VtZW50IG9yaWdpblxuXHRvcmlnaW5BbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXHRvcmlnaW5BbmNob3IuaHJlZiA9IGxvY2F0aW9uLmhyZWY7XG5cbi8vIEJhc2UgXCJjb25zdHJ1Y3RvclwiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnRcbmZ1bmN0aW9uIGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlICkge1xuXG5cdC8vIGRhdGFUeXBlRXhwcmVzc2lvbiBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gXCIqXCJcblx0cmV0dXJuIGZ1bmN0aW9uKCBkYXRhVHlwZUV4cHJlc3Npb24sIGZ1bmMgKSB7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uO1xuXHRcdFx0ZGF0YVR5cGVFeHByZXNzaW9uID0gXCIqXCI7XG5cdFx0fVxuXG5cdFx0dmFyIGRhdGFUeXBlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7XG5cblx0XHRcdC8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb25cblx0XHRcdHdoaWxlICggKCBkYXRhVHlwZSA9IGRhdGFUeXBlc1sgaSsrIF0gKSApIHtcblxuXHRcdFx0XHQvLyBQcmVwZW5kIGlmIHJlcXVlc3RlZFxuXHRcdFx0XHRpZiAoIGRhdGFUeXBlWyAwIF0gPT09IFwiK1wiICkge1xuXHRcdFx0XHRcdGRhdGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8fCBcIipcIjtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnVuc2hpZnQoIGZ1bmMgKTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYXBwZW5kXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbi8vIEJhc2UgaW5zcGVjdGlvbiBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNwb3J0c1xuZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHtcblxuXHR2YXIgaW5zcGVjdGVkID0ge30sXG5cdFx0c2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7XG5cblx0ZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7XG5cdFx0dmFyIHNlbGVjdGVkO1xuXHRcdGluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7XG5cdFx0alF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHtcblx0XHRcdHZhciBkYXRhVHlwZU9yVHJhbnNwb3J0ID0gcHJlZmlsdGVyT3JGYWN0b3J5KCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7XG5cdFx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZU9yVHJhbnNwb3J0ID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHtcblxuXHRcdFx0XHRvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdGluc3BlY3QoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIGlmICggc2Vla2luZ1RyYW5zcG9ydCApIHtcblx0XHRcdFx0cmV0dXJuICEoIHNlbGVjdGVkID0gZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0XHRyZXR1cm4gc2VsZWN0ZWQ7XG5cdH1cblxuXHRyZXR1cm4gaW5zcGVjdCggb3B0aW9ucy5kYXRhVHlwZXNbIDAgXSApIHx8ICFpbnNwZWN0ZWRbIFwiKlwiIF0gJiYgaW5zcGVjdCggXCIqXCIgKTtcbn1cblxuLy8gQSBzcGVjaWFsIGV4dGVuZCBmb3IgYWpheCBvcHRpb25zXG4vLyB0aGF0IHRha2VzIFwiZmxhdFwiIG9wdGlvbnMgKG5vdCB0byBiZSBkZWVwIGV4dGVuZGVkKVxuLy8gRml4ZXMgIzk4ODdcbmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkge1xuXHR2YXIga2V5LCBkZWVwLFxuXHRcdGZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTtcblxuXHRmb3IgKCBrZXkgaW4gc3JjICkge1xuXHRcdGlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0KCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKCBkZWVwID0ge30gKSApIClbIGtleSBdID0gc3JjWyBrZXkgXTtcblx0XHR9XG5cdH1cblx0aWYgKCBkZWVwICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApO1xuXHR9XG5cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OlxuICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSlcbiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuICovXG5mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkge1xuXG5cdHZhciBjdCwgdHlwZSwgZmluYWxEYXRhVHlwZSwgZmlyc3REYXRhVHlwZSxcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7XG5cblx0Ly8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3Ncblx0d2hpbGUgKCBkYXRhVHlwZXNbIDAgXSA9PT0gXCIqXCIgKSB7XG5cdFx0ZGF0YVR5cGVzLnNoaWZ0KCk7XG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0Y3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBlXG5cdGlmICggY3QgKSB7XG5cdFx0Zm9yICggdHlwZSBpbiBjb250ZW50cyApIHtcblx0XHRcdGlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7XG5cdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0eXBlICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZVxuXHRpZiAoIGRhdGFUeXBlc1sgMCBdIGluIHJlc3BvbnNlcyApIHtcblx0XHRmaW5hbERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXG5cdFx0Zm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7XG5cdFx0XHRpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyBcIiBcIiArIGRhdGFUeXBlc1sgMCBdIF0gKSB7XG5cdFx0XHRcdGZpbmFsRGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggIWZpcnN0RGF0YVR5cGUgKSB7XG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZVxuXHRcdGZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7XG5cdH1cblxuXHQvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlXG5cdC8vIFdlIGFkZCB0aGUgZGF0YVR5cGUgdG8gdGhlIGxpc3QgaWYgbmVlZGVkXG5cdC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2Vcblx0aWYgKCBmaW5hbERhdGFUeXBlICkge1xuXHRcdGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7XG5cdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07XG5cdH1cbn1cblxuLyogQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZVxuICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApIHtcblx0dmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0bXAsIHByZXYsXG5cdFx0Y29udmVydGVycyA9IHt9LFxuXG5cdFx0Ly8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvblxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7XG5cblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXG5cdGlmICggZGF0YVR5cGVzWyAxIF0gKSB7XG5cdFx0Zm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7XG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xuXHRcdH1cblx0fVxuXG5cdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHQvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZVxuXHR3aGlsZSAoIGN1cnJlbnQgKSB7XG5cblx0XHRpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHtcblx0XHRcdGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gXSA9IHJlc3BvbnNlO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkXG5cdFx0aWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkge1xuXHRcdFx0cmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7XG5cdFx0fVxuXG5cdFx0cHJldiA9IGN1cnJlbnQ7XG5cdFx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdFx0aWYgKCBjdXJyZW50ICkge1xuXG5cdFx0Ly8gVGhlcmUncyBvbmx5IHdvcmsgdG8gZG8gaWYgY3VycmVudCBkYXRhVHlwZSBpcyBub24tYXV0b1xuXHRcdFx0aWYgKCBjdXJyZW50ID09PSBcIipcIiApIHtcblxuXHRcdFx0XHRjdXJyZW50ID0gcHJldjtcblxuXHRcdFx0Ly8gQ29udmVydCByZXNwb25zZSBpZiBwcmV2IGRhdGFUeXBlIGlzIG5vbi1hdXRvIGFuZCBkaWZmZXJzIGZyb20gY3VycmVudFxuXHRcdFx0fSBlbHNlIGlmICggcHJldiAhPT0gXCIqXCIgJiYgcHJldiAhPT0gY3VycmVudCApIHtcblxuXHRcdFx0XHQvLyBTZWVrIGEgZGlyZWN0IGNvbnZlcnRlclxuXHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgY3VycmVudCBdIHx8IGNvbnZlcnRlcnNbIFwiKiBcIiArIGN1cnJlbnQgXTtcblxuXHRcdFx0XHQvLyBJZiBub25lIGZvdW5kLCBzZWVrIGEgcGFpclxuXHRcdFx0XHRpZiAoICFjb252ICkge1xuXHRcdFx0XHRcdGZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIElmIGNvbnYyIG91dHB1dHMgY3VycmVudFxuXHRcdFx0XHRcdFx0dG1wID0gY29udjIuc3BsaXQoIFwiIFwiICk7XG5cdFx0XHRcdFx0XHRpZiAoIHRtcFsgMSBdID09PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIElmIHByZXYgY2FuIGJlIGNvbnZlcnRlZCB0byBhY2NlcHRlZCBpbnB1dFxuXHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgdG1wWyAwIF0gXSB8fFxuXHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlcnNbIFwiKiBcIiArIHRtcFsgMCBdIF07XG5cdFx0XHRcdFx0XHRcdGlmICggY29udiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIENvbmRlbnNlIGVxdWl2YWxlbmNlIGNvbnZlcnRlcnNcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgY29udjIgXTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGVcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBjb252ZXJ0ZXJzWyBjb252MiBdICE9PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y3VycmVudCA9IHRtcFsgMCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHRtcFsgMSBdICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXBwbHkgY29udmVydGVyIChpZiBub3QgYW4gZXF1aXZhbGVuY2UpXG5cdFx0XHRcdGlmICggY29udiAhPT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdC8vIFVubGVzcyBlcnJvcnMgYXJlIGFsbG93ZWQgdG8gYnViYmxlLCBjYXRjaCBhbmQgcmV0dXJuIHRoZW1cblx0XHRcdFx0XHRpZiAoIGNvbnYgJiYgcy50aHJvd3MgKSB7XG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXRlOiBcInBhcnNlcmVycm9yXCIsXG5cdFx0XHRcdFx0XHRcdFx0ZXJyb3I6IGNvbnYgPyBlIDogXCJObyBjb252ZXJzaW9uIGZyb20gXCIgKyBwcmV2ICsgXCIgdG8gXCIgKyBjdXJyZW50XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHsgc3RhdGU6IFwic3VjY2Vzc1wiLCBkYXRhOiByZXNwb25zZSB9O1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzXG5cdGFjdGl2ZTogMCxcblxuXHQvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0XG5cdGxhc3RNb2RpZmllZDoge30sXG5cdGV0YWc6IHt9LFxuXG5cdGFqYXhTZXR0aW5nczoge1xuXHRcdHVybDogbG9jYXRpb24uaHJlZixcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGlzTG9jYWw6IHJsb2NhbFByb3RvY29sLnRlc3QoIGxvY2F0aW9uLnByb3RvY29sICksXG5cdFx0Z2xvYmFsOiB0cnVlLFxuXHRcdHByb2Nlc3NEYXRhOiB0cnVlLFxuXHRcdGFzeW5jOiB0cnVlLFxuXHRcdGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOFwiLFxuXHRcdC8qXG5cdFx0dGltZW91dDogMCxcblx0XHRkYXRhOiBudWxsLFxuXHRcdGRhdGFUeXBlOiBudWxsLFxuXHRcdHVzZXJuYW1lOiBudWxsLFxuXHRcdHBhc3N3b3JkOiBudWxsLFxuXHRcdGNhY2hlOiBudWxsLFxuXHRcdHRocm93czogZmFsc2UsXG5cdFx0dHJhZGl0aW9uYWw6IGZhbHNlLFxuXHRcdGhlYWRlcnM6IHt9LFxuXHRcdCovXG5cblx0XHRhY2NlcHRzOiB7XG5cdFx0XHRcIipcIjogYWxsVHlwZXMsXG5cdFx0XHR0ZXh0OiBcInRleHQvcGxhaW5cIixcblx0XHRcdGh0bWw6IFwidGV4dC9odG1sXCIsXG5cdFx0XHR4bWw6IFwiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbFwiLFxuXHRcdFx0anNvbjogXCJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHRcIlxuXHRcdH0sXG5cblx0XHRjb250ZW50czoge1xuXHRcdFx0eG1sOiAvXFxieG1sXFxiLyxcblx0XHRcdGh0bWw6IC9cXGJodG1sLyxcblx0XHRcdGpzb246IC9cXGJqc29uXFxiL1xuXHRcdH0sXG5cblx0XHRyZXNwb25zZUZpZWxkczoge1xuXHRcdFx0eG1sOiBcInJlc3BvbnNlWE1MXCIsXG5cdFx0XHR0ZXh0OiBcInJlc3BvbnNlVGV4dFwiLFxuXHRcdFx0anNvbjogXCJyZXNwb25zZUpTT05cIlxuXHRcdH0sXG5cblx0XHQvLyBEYXRhIGNvbnZlcnRlcnNcblx0XHQvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgXCIqXCIpIGFuZCBkZXN0aW5hdGlvbiB0eXBlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG5cdFx0Y29udmVydGVyczoge1xuXG5cdFx0XHQvLyBDb252ZXJ0IGFueXRoaW5nIHRvIHRleHRcblx0XHRcdFwiKiB0ZXh0XCI6IFN0cmluZyxcblxuXHRcdFx0Ly8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pXG5cdFx0XHRcInRleHQgaHRtbFwiOiB0cnVlLFxuXG5cdFx0XHQvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uXG5cdFx0XHRcInRleHQganNvblwiOiBqUXVlcnkucGFyc2VKU09OLFxuXG5cdFx0XHQvLyBQYXJzZSB0ZXh0IGFzIHhtbFxuXHRcdFx0XCJ0ZXh0IHhtbFwiOiBqUXVlcnkucGFyc2VYTUxcblx0XHR9LFxuXG5cdFx0Ly8gRm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDpcblx0XHQvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmXG5cdFx0Ly8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmVcblx0XHQvLyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZClcblx0XHRmbGF0T3B0aW9uczoge1xuXHRcdFx0dXJsOiB0cnVlLFxuXHRcdFx0Y29udGV4dDogdHJ1ZVxuXHRcdH1cblx0fSxcblxuXHQvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldFxuXHQvLyB3aXRoIGJvdGggYWpheFNldHRpbmdzIGFuZCBzZXR0aW5ncyBmaWVsZHMuXG5cdC8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuXG5cdGFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzID9cblxuXHRcdFx0Ly8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3Rcblx0XHRcdGFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDpcblxuXHRcdFx0Ly8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5nc1xuXHRcdFx0YWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7XG5cdH0sXG5cblx0YWpheFByZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzICksXG5cdGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLFxuXG5cdC8vIE1haW4gbWV0aG9kXG5cdGFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBJZiB1cmwgaXMgYW4gb2JqZWN0LCBzaW11bGF0ZSBwcmUtMS41IHNpZ25hdHVyZVxuXHRcdGlmICggdHlwZW9mIHVybCA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB1cmw7XG5cdFx0XHR1cmwgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3Rcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdHZhciB0cmFuc3BvcnQsXG5cblx0XHRcdC8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW1cblx0XHRcdGNhY2hlVVJMLFxuXG5cdFx0XHQvLyBSZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcsXG5cdFx0XHRyZXNwb25zZUhlYWRlcnMsXG5cblx0XHRcdC8vIHRpbWVvdXQgaGFuZGxlXG5cdFx0XHR0aW1lb3V0VGltZXIsXG5cblx0XHRcdC8vIFVybCBjbGVhbnVwIHZhclxuXHRcdFx0dXJsQW5jaG9yLFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcblx0XHRcdGZpcmVHbG9iYWxzLFxuXG5cdFx0XHQvLyBMb29wIHZhcmlhYmxlXG5cdFx0XHRpLFxuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGZpbmFsIG9wdGlvbnMgb2JqZWN0XG5cdFx0XHRzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSxcblxuXHRcdFx0Ly8gQ2FsbGJhY2tzIGNvbnRleHRcblx0XHRcdGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLFxuXG5cdFx0XHQvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uXG5cdFx0XHRnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiZcblx0XHRcdFx0KCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID9cblx0XHRcdFx0XHRqUXVlcnkoIGNhbGxiYWNrQ29udGV4dCApIDpcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQsXG5cblx0XHRcdC8vIERlZmVycmVkc1xuXHRcdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdHN0YXR1c0NvZGUgPSBzLnN0YXR1c0NvZGUgfHwge30sXG5cblx0XHRcdC8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpXG5cdFx0XHRyZXF1ZXN0SGVhZGVycyA9IHt9LFxuXHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LFxuXG5cdFx0XHQvLyBUaGUganFYSFIgc3RhdGVcblx0XHRcdHN0YXRlID0gMCxcblxuXHRcdFx0Ly8gRGVmYXVsdCBhYm9ydCBtZXNzYWdlXG5cdFx0XHRzdHJBYm9ydCA9IFwiY2FuY2VsZWRcIixcblxuXHRcdFx0Ly8gRmFrZSB4aHJcblx0XHRcdGpxWEhSID0ge1xuXHRcdFx0XHRyZWFkeVN0YXRlOiAwLFxuXG5cdFx0XHRcdC8vIEJ1aWxkcyBoZWFkZXJzIGhhc2h0YWJsZSBpZiBuZWVkZWRcblx0XHRcdFx0Z2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0XHRcdFx0dmFyIG1hdGNoO1xuXHRcdFx0XHRcdGlmICggc3RhdGUgPT09IDIgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICFyZXNwb25zZUhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVycyA9IHt9O1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoICggbWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbIDEgXS50b0xvd2VyQ2FzZSgpIF0gPSBtYXRjaFsgMiBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gUmF3IHN0cmluZ1xuXHRcdFx0XHRnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZSA9PT0gMiA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdHZhciBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHRpZiAoICFzdGF0ZSApIHtcblx0XHRcdFx0XHRcdG5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoICFzdGF0ZSApIHtcblx0XHRcdFx0XHRcdHMubWltZVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0XHRzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkge1xuXHRcdFx0XHRcdHZhciBjb2RlO1xuXHRcdFx0XHRcdGlmICggbWFwICkge1xuXHRcdFx0XHRcdFx0aWYgKCBzdGF0ZSA8IDIgKSB7XG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gTGF6eS1hZGQgdGhlIG5ldyBjYWxsYmFjayBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyBvbGQgb25lc1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEV4ZWN1dGUgdGhlIGFwcHJvcHJpYXRlIGNhbGxiYWNrc1xuXHRcdFx0XHRcdFx0XHRqcVhIUi5hbHdheXMoIG1hcFsganFYSFIuc3RhdHVzIF0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSByZXF1ZXN0XG5cdFx0XHRcdGFib3J0OiBmdW5jdGlvbiggc3RhdHVzVGV4dCApIHtcblx0XHRcdFx0XHR2YXIgZmluYWxUZXh0ID0gc3RhdHVzVGV4dCB8fCBzdHJBYm9ydDtcblx0XHRcdFx0XHRpZiAoIHRyYW5zcG9ydCApIHtcblx0XHRcdFx0XHRcdHRyYW5zcG9ydC5hYm9ydCggZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRvbmUoIDAsIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0Ly8gQXR0YWNoIGRlZmVycmVkc1xuXHRcdGRlZmVycmVkLnByb21pc2UoIGpxWEhSICkuY29tcGxldGUgPSBjb21wbGV0ZURlZmVycmVkLmFkZDtcblx0XHRqcVhIUi5zdWNjZXNzID0ganFYSFIuZG9uZTtcblx0XHRqcVhIUi5lcnJvciA9IGpxWEhSLmZhaWw7XG5cblx0XHQvLyBSZW1vdmUgaGFzaCBjaGFyYWN0ZXIgKCM3NTMxOiBhbmQgc3RyaW5nIHByb21vdGlvbilcblx0XHQvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHByb3ZpZGVkIChwcmVmaWx0ZXJzIG1pZ2h0IGV4cGVjdCBpdClcblx0XHQvLyBIYW5kbGUgZmFsc3kgdXJsIGluIHRoZSBzZXR0aW5ncyBvYmplY3QgKCMxMDA5MzogY29uc2lzdGVuY3kgd2l0aCBvbGQgc2lnbmF0dXJlKVxuXHRcdC8vIFdlIGFsc28gdXNlIHRoZSB1cmwgcGFyYW1ldGVyIGlmIGF2YWlsYWJsZVxuXHRcdHMudXJsID0gKCAoIHVybCB8fCBzLnVybCB8fCBsb2NhdGlvbi5ocmVmICkgKyBcIlwiICkucmVwbGFjZSggcmhhc2gsIFwiXCIgKVxuXHRcdFx0LnJlcGxhY2UoIHJwcm90b2NvbCwgbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKTtcblxuXHRcdC8vIEFsaWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBhcyBwZXIgdGlja2V0ICMxMjAwNFxuXHRcdHMudHlwZSA9IG9wdGlvbnMubWV0aG9kIHx8IG9wdGlvbnMudHlwZSB8fCBzLm1ldGhvZCB8fCBzLnR5cGU7XG5cblx0XHQvLyBFeHRyYWN0IGRhdGFUeXBlcyBsaXN0XG5cdFx0cy5kYXRhVHlwZXMgPSBqUXVlcnkudHJpbSggcy5kYXRhVHlwZSB8fCBcIipcIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXG5cdFx0Ly8gQSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlciB3aGVuIHRoZSBvcmlnaW4gZG9lc24ndCBtYXRjaCB0aGUgY3VycmVudCBvcmlnaW4uXG5cdFx0aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7XG5cdFx0XHR1cmxBbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTgtMTErXG5cdFx0XHQvLyBJRSB0aHJvd3MgZXhjZXB0aW9uIGlmIHVybCBpcyBtYWxmb3JtZWQsIGUuZy4gaHR0cDovL2V4YW1wbGUuY29tOjgweC9cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gcy51cmw7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUU4LTExK1xuXHRcdFx0XHQvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZVxuXHRcdFx0XHR1cmxBbmNob3IuaHJlZiA9IHVybEFuY2hvci5ocmVmO1xuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gb3JpZ2luQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09XG5cdFx0XHRcdFx0dXJsQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgdXJsQW5jaG9yLmhvc3Q7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbixcblx0XHRcdFx0Ly8gaXQgY2FuIGJlIHJlamVjdGVkIGJ5IHRoZSB0cmFuc3BvcnQgaWYgaXQgaXMgaW52YWxpZFxuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmdcblx0XHRpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHByZWZpbHRlcnNcblx0XHRpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlXG5cdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcblx0XHRcdHJldHVybiBqcVhIUjtcblx0XHR9XG5cblx0XHQvLyBXZSBjYW4gZmlyZSBnbG9iYWwgZXZlbnRzIGFzIG9mIG5vdyBpZiBhc2tlZCB0b1xuXHRcdC8vIERvbid0IGZpcmUgZXZlbnRzIGlmIGpRdWVyeS5ldmVudCBpcyB1bmRlZmluZWQgaW4gYW4gQU1ELXVzYWdlIHNjZW5hcmlvICgjMTUxMTgpXG5cdFx0ZmlyZUdsb2JhbHMgPSBqUXVlcnkuZXZlbnQgJiYgcy5nbG9iYWw7XG5cblx0XHQvLyBXYXRjaCBmb3IgYSBuZXcgc2V0IG9mIHJlcXVlc3RzXG5cdFx0aWYgKCBmaXJlR2xvYmFscyAmJiBqUXVlcnkuYWN0aXZlKysgPT09IDAgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggXCJhamF4U3RhcnRcIiApO1xuXHRcdH1cblxuXHRcdC8vIFVwcGVyY2FzZSB0aGUgdHlwZVxuXHRcdHMudHlwZSA9IHMudHlwZS50b1VwcGVyQ2FzZSgpO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnRcblx0XHRzLmhhc0NvbnRlbnQgPSAhcm5vQ29udGVudC50ZXN0KCBzLnR5cGUgKTtcblxuXHRcdC8vIFNhdmUgdGhlIFVSTCBpbiBjYXNlIHdlJ3JlIHRveWluZyB3aXRoIHRoZSBJZi1Nb2RpZmllZC1TaW5jZVxuXHRcdC8vIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciBsYXRlciBvblxuXHRcdGNhY2hlVVJMID0gcy51cmw7XG5cblx0XHQvLyBNb3JlIG9wdGlvbnMgaGFuZGxpbmcgZm9yIHJlcXVlc3RzIHdpdGggbm8gY29udGVudFxuXHRcdGlmICggIXMuaGFzQ29udGVudCApIHtcblxuXHRcdFx0Ly8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRhIHRvIHVybFxuXHRcdFx0aWYgKCBzLmRhdGEgKSB7XG5cdFx0XHRcdGNhY2hlVVJMID0gKCBzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gXCImXCIgOiBcIj9cIiApICsgcy5kYXRhICk7XG5cblx0XHRcdFx0Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeVxuXHRcdFx0XHRkZWxldGUgcy5kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgYW50aS1jYWNoZSBpbiB1cmwgaWYgbmVlZGVkXG5cdFx0XHRpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRzLnVybCA9IHJ0cy50ZXN0KCBjYWNoZVVSTCApID9cblxuXHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYSAnXycgcGFyYW1ldGVyLCBzZXQgaXRzIHZhbHVlXG5cdFx0XHRcdFx0Y2FjaGVVUkwucmVwbGFjZSggcnRzLCBcIiQxXz1cIiArIG5vbmNlKysgKSA6XG5cblx0XHRcdFx0XHQvLyBPdGhlcndpc2UgYWRkIG9uZSB0byB0aGUgZW5kXG5cdFx0XHRcdFx0Y2FjaGVVUkwgKyAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gXCImXCIgOiBcIj9cIiApICsgXCJfPVwiICsgbm9uY2UrKztcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0aWYgKCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU1vZGlmaWVkLVNpbmNlXCIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHRcdGlmICggalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTm9uZS1NYXRjaFwiLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgY29ycmVjdCBoZWFkZXIsIGlmIGRhdGEgaXMgYmVpbmcgc2VudFxuXHRcdGlmICggcy5kYXRhICYmIHMuaGFzQ29udGVudCAmJiBzLmNvbnRlbnRUeXBlICE9PSBmYWxzZSB8fCBvcHRpb25zLmNvbnRlbnRUeXBlICkge1xuXHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJDb250ZW50LVR5cGVcIiwgcy5jb250ZW50VHlwZSApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGVcblx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKFxuXHRcdFx0XCJBY2NlcHRcIixcblx0XHRcdHMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1sgMCBdIF0gP1xuXHRcdFx0XHRzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSArXG5cdFx0XHRcdFx0KCBzLmRhdGFUeXBlc1sgMCBdICE9PSBcIipcIiA/IFwiLCBcIiArIGFsbFR5cGVzICsgXCI7IHE9MC4wMVwiIDogXCJcIiApIDpcblx0XHRcdFx0cy5hY2NlcHRzWyBcIipcIiBdXG5cdFx0KTtcblxuXHRcdC8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlvblxuXHRcdGZvciAoIGkgaW4gcy5oZWFkZXJzICkge1xuXHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggaSwgcy5oZWFkZXJzWyBpIF0gKTtcblx0XHR9XG5cblx0XHQvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0XG5cdFx0aWYgKCBzLmJlZm9yZVNlbmQgJiZcblx0XHRcdCggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29udGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgc3RhdGUgPT09IDIgKSApIHtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuXG5cdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcblx0XHR9XG5cblx0XHQvLyBBYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb25cblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkc1xuXHRcdGZvciAoIGkgaW4geyBzdWNjZXNzOiAxLCBlcnJvcjogMSwgY29tcGxldGU6IDEgfSApIHtcblx0XHRcdGpxWEhSWyBpIF0oIHNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEdldCB0cmFuc3BvcnRcblx0XHR0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIG5vIHRyYW5zcG9ydCwgd2UgYXV0by1hYm9ydFxuXHRcdGlmICggIXRyYW5zcG9ydCApIHtcblx0XHRcdGRvbmUoIC0xLCBcIk5vIFRyYW5zcG9ydFwiICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSAxO1xuXG5cdFx0XHQvLyBTZW5kIGdsb2JhbCBldmVudFxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheFNlbmRcIiwgWyBqcVhIUiwgcyBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGFqYXhTZW5kLCBzdG9wIHRoZXJlXG5cdFx0XHRpZiAoIHN0YXRlID09PSAyICkge1xuXHRcdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpbWVvdXRcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xuXHRcdFx0XHR0aW1lb3V0VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0anFYSFIuYWJvcnQoIFwidGltZW91dFwiICk7XG5cdFx0XHRcdH0sIHMudGltZW91dCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRzdGF0ZSA9IDE7XG5cdFx0XHRcdHRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApO1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0Ly8gUHJvcGFnYXRlIGV4Y2VwdGlvbiBhcyBlcnJvciBpZiBub3QgZG9uZVxuXHRcdFx0XHRpZiAoIHN0YXRlIDwgMiApIHtcblx0XHRcdFx0XHRkb25lKCAtMSwgZSApO1xuXG5cdFx0XHRcdC8vIFNpbXBseSByZXRocm93IG90aGVyd2lzZVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmVcblx0XHRmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHtcblx0XHRcdHZhciBpc1N1Y2Nlc3MsIHN1Y2Nlc3MsIGVycm9yLCByZXNwb25zZSwgbW9kaWZpZWQsXG5cdFx0XHRcdHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0O1xuXG5cdFx0XHQvLyBDYWxsZWQgb25jZVxuXHRcdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGF0ZSBpcyBcImRvbmVcIiBub3dcblx0XHRcdHN0YXRlID0gMjtcblxuXHRcdFx0Ly8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHNcblx0XHRcdGlmICggdGltZW91dFRpbWVyICkge1xuXHRcdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb25cblx0XHRcdC8vIChubyBtYXR0ZXIgaG93IGxvbmcgdGhlIGpxWEhSIG9iamVjdCB3aWxsIGJlIHVzZWQpXG5cdFx0XHR0cmFuc3BvcnQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdC8vIENhY2hlIHJlc3BvbnNlIGhlYWRlcnNcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyA9IGhlYWRlcnMgfHwgXCJcIjtcblxuXHRcdFx0Ly8gU2V0IHJlYWR5U3RhdGVcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSBzdGF0dXMgPiAwID8gNCA6IDA7XG5cblx0XHRcdC8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsXG5cdFx0XHRpc1N1Y2Nlc3MgPSBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCB8fCBzdGF0dXMgPT09IDMwNDtcblxuXHRcdFx0Ly8gR2V0IHJlc3BvbnNlIGRhdGFcblx0XHRcdGlmICggcmVzcG9uc2VzICkge1xuXHRcdFx0XHRyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KVxuXHRcdFx0cmVzcG9uc2UgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKTtcblxuXHRcdFx0Ly8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmdcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXG5cdFx0XHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0XHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiTGFzdC1Nb2RpZmllZFwiICk7XG5cdFx0XHRcdFx0aWYgKCBtb2RpZmllZCApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJldGFnXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBpZiBubyBjb250ZW50XG5cdFx0XHRcdGlmICggc3RhdHVzID09PSAyMDQgfHwgcy50eXBlID09PSBcIkhFQURcIiApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub2NvbnRlbnRcIjtcblxuXHRcdFx0XHQvLyBpZiBub3QgbW9kaWZpZWRcblx0XHRcdFx0fSBlbHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm90bW9kaWZpZWRcIjtcblxuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gcmVzcG9uc2Uuc3RhdGU7XG5cdFx0XHRcdFx0c3VjY2VzcyA9IHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdFx0ZXJyb3IgPSByZXNwb25zZS5lcnJvcjtcblx0XHRcdFx0XHRpc1N1Y2Nlc3MgPSAhZXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gRXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQgYW5kIG5vcm1hbGl6ZSBmb3Igbm9uLWFib3J0c1xuXHRcdFx0XHRlcnJvciA9IHN0YXR1c1RleHQ7XG5cdFx0XHRcdGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcImVycm9yXCI7XG5cdFx0XHRcdFx0aWYgKCBzdGF0dXMgPCAwICkge1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmplY3Rcblx0XHRcdGpxWEhSLnN0YXR1cyA9IHN0YXR1cztcblx0XHRcdGpxWEhSLnN0YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgXCJcIjtcblxuXHRcdFx0Ly8gU3VjY2Vzcy9FcnJvclxuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7XG5cdFx0XHRzdGF0dXNDb2RlID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggaXNTdWNjZXNzID8gXCJhamF4U3VjY2Vzc1wiIDogXCJhamF4RXJyb3JcIixcblx0XHRcdFx0XHRbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb21wbGV0ZVxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheENvbXBsZXRlXCIsIFsganFYSFIsIHMgXSApO1xuXG5cdFx0XHRcdC8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlclxuXHRcdFx0XHRpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdG9wXCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBqcVhIUjtcblx0fSxcblxuXHRnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFjaywgXCJqc29uXCIgKTtcblx0fSxcblxuXHRnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssIFwic2NyaXB0XCIgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcImdldFwiLCBcInBvc3RcIiBdLCBmdW5jdGlvbiggaSwgbWV0aG9kICkge1xuXHRqUXVlcnlbIG1ldGhvZCBdID0gZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2ssIHR5cGUgKSB7XG5cblx0XHQvLyBTaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRlZFxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHtcblx0XHRcdHR5cGUgPSB0eXBlIHx8IGNhbGxiYWNrO1xuXHRcdFx0Y2FsbGJhY2sgPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBUaGUgdXJsIGNhbiBiZSBhbiBvcHRpb25zIG9iamVjdCAod2hpY2ggdGhlbiBtdXN0IGhhdmUgLnVybClcblx0XHRyZXR1cm4galF1ZXJ5LmFqYXgoIGpRdWVyeS5leHRlbmQoIHtcblx0XHRcdHVybDogdXJsLFxuXHRcdFx0dHlwZTogbWV0aG9kLFxuXHRcdFx0ZGF0YVR5cGU6IHR5cGUsXG5cdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0c3VjY2VzczogY2FsbGJhY2tcblx0XHR9LCBqUXVlcnkuaXNQbGFpbk9iamVjdCggdXJsICkgJiYgdXJsICkgKTtcblx0fTtcbn0gKTtcblxuXG5qUXVlcnkuX2V2YWxVcmwgPSBmdW5jdGlvbiggdXJsICkge1xuXHRyZXR1cm4galF1ZXJ5LmFqYXgoIHtcblx0XHR1cmw6IHVybCxcblxuXHRcdC8vIE1ha2UgdGhpcyBleHBsaWNpdCwgc2luY2UgdXNlciBjYW4gb3ZlcnJpZGUgdGhpcyB0aHJvdWdoIGFqYXhTZXR1cCAoIzExMjY0KVxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0ZGF0YVR5cGU6IFwic2NyaXB0XCIsXG5cdFx0YXN5bmM6IGZhbHNlLFxuXHRcdGdsb2JhbDogZmFsc2UsXG5cdFx0XCJ0aHJvd3NcIjogdHJ1ZVxuXHR9ICk7XG59O1xuXG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0d3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0dmFyIHdyYXA7XG5cblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXNbIDAgXSApIHtcblxuXHRcdFx0Ly8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmRcblx0XHRcdHdyYXAgPSBqUXVlcnkoIGh0bWwsIHRoaXNbIDAgXS5vd25lckRvY3VtZW50ICkuZXEoIDAgKS5jbG9uZSggdHJ1ZSApO1xuXG5cdFx0XHRpZiAoIHRoaXNbIDAgXS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR3cmFwLmluc2VydEJlZm9yZSggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHdyYXAubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGVsZW0gPSB0aGlzO1xuXG5cdFx0XHRcdHdoaWxlICggZWxlbS5maXJzdEVsZW1lbnRDaGlsZCApIHtcblx0XHRcdFx0XHRlbGVtID0gZWxlbS5maXJzdEVsZW1lbnRDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBlbGVtO1xuXHRcdFx0fSApLmFwcGVuZCggdGhpcyApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHdyYXBJbm5lcjogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGlzRnVuY3Rpb24gPyBodG1sLmNhbGwoIHRoaXMsIGkgKSA6IGh0bWwgKTtcblx0XHR9ICk7XG5cdH0sXG5cblx0dW53cmFwOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggIWpRdWVyeS5ub2RlTmFtZSggdGhpcywgXCJib2R5XCIgKSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApO1xuXHRcdFx0fVxuXHRcdH0gKS5lbmQoKTtcblx0fVxufSApO1xuXG5cbmpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiAhalF1ZXJ5LmV4cHIuZmlsdGVycy52aXNpYmxlKCBlbGVtICk7XG59O1xualF1ZXJ5LmV4cHIuZmlsdGVycy52aXNpYmxlID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0Ly8gU3VwcG9ydDogT3BlcmEgPD0gMTIuMTJcblx0Ly8gT3BlcmEgcmVwb3J0cyBvZmZzZXRXaWR0aHMgYW5kIG9mZnNldEhlaWdodHMgbGVzcyB0aGFuIHplcm8gb24gc29tZSBlbGVtZW50c1xuXHQvLyBVc2UgT1IgaW5zdGVhZCBvZiBBTkQgYXMgdGhlIGVsZW1lbnQgaXMgbm90IHZpc2libGUgaWYgZWl0aGVyIGlzIHRydWVcblx0Ly8gU2VlIHRpY2tldHMgIzEwNDA2IGFuZCAjMTMxMzJcblx0cmV0dXJuIGVsZW0ub2Zmc2V0V2lkdGggPiAwIHx8IGVsZW0ub2Zmc2V0SGVpZ2h0ID4gMCB8fCBlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoID4gMDtcbn07XG5cblxuXG5cbnZhciByMjAgPSAvJTIwL2csXG5cdHJicmFja2V0ID0gL1xcW1xcXSQvLFxuXHRyQ1JMRiA9IC9cXHI/XFxuL2csXG5cdHJzdWJtaXR0ZXJUeXBlcyA9IC9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxcblx0cnN1Ym1pdHRhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO1xuXG5mdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7XG5cdHZhciBuYW1lO1xuXG5cdGlmICggalF1ZXJ5LmlzQXJyYXkoIG9iaiApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXG5cdFx0alF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7XG5cdFx0XHRpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkge1xuXG5cdFx0XHRcdC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC5cblx0XHRcdFx0YnVpbGRQYXJhbXMoXG5cdFx0XHRcdFx0cHJlZml4ICsgXCJbXCIgKyAoIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT0gbnVsbCA/IGkgOiBcIlwiICkgKyBcIl1cIixcblx0XHRcdFx0XHR2LFxuXHRcdFx0XHRcdHRyYWRpdGlvbmFsLFxuXHRcdFx0XHRcdGFkZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHR9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgalF1ZXJ5LnR5cGUoIG9iaiApID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIG9iamVjdCBpdGVtLlxuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCArIFwiW1wiICsgbmFtZSArIFwiXVwiLCBvYmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHNjYWxhciBpdGVtLlxuXHRcdGFkZCggcHJlZml4LCBvYmogKTtcblx0fVxufVxuXG4vLyBTZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZlxuLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkgc3RyaW5nXG5qUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7XG5cdHZhciBwcmVmaXgsXG5cdFx0cyA9IFtdLFxuXHRcdGFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWVcblx0XHRcdHZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2YWx1ZSgpIDogKCB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICk7XG5cdFx0XHRzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KCB2YWx1ZSApO1xuXHRcdH07XG5cblx0Ly8gU2V0IHRyYWRpdGlvbmFsIHRvIHRydWUgZm9yIGpRdWVyeSA8PSAxLjMuMiBiZWhhdmlvci5cblx0aWYgKCB0cmFkaXRpb25hbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdHRyYWRpdGlvbmFsID0galF1ZXJ5LmFqYXhTZXR0aW5ncyAmJiBqUXVlcnkuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsO1xuXHR9XG5cblx0Ly8gSWYgYW4gYXJyYXkgd2FzIHBhc3NlZCBpbiwgYXNzdW1lIHRoYXQgaXQgaXMgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cy5cblx0aWYgKCBqUXVlcnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50c1xuXHRcdGpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHtcblx0XHRcdGFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7XG5cdFx0fSApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSBcIm9sZFwiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlclxuXHRcdC8vIGRpZCBpdCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LlxuXHRcdGZvciAoIHByZWZpeCBpbiBhICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4IF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uXG5cdHJldHVybiBzLmpvaW4oIFwiJlwiICkucmVwbGFjZSggcjIwLCBcIitcIiApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzZXJpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApO1xuXHR9LFxuXHRzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gQ2FuIGFkZCBwcm9wSG9vayBmb3IgXCJlbGVtZW50c1wiIHRvIGZpbHRlciBvciBhZGQgZm9ybSBlbGVtZW50c1xuXHRcdFx0dmFyIGVsZW1lbnRzID0galF1ZXJ5LnByb3AoIHRoaXMsIFwiZWxlbWVudHNcIiApO1xuXHRcdFx0cmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMgKSA6IHRoaXM7XG5cdFx0fSApXG5cdFx0LmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdFx0Ly8gVXNlIC5pcyggXCI6ZGlzYWJsZWRcIiApIHNvIHRoYXQgZmllbGRzZXRbZGlzYWJsZWRdIHdvcmtzXG5cdFx0XHRyZXR1cm4gdGhpcy5uYW1lICYmICFqUXVlcnkoIHRoaXMgKS5pcyggXCI6ZGlzYWJsZWRcIiApICYmXG5cdFx0XHRcdHJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiZcblx0XHRcdFx0KCB0aGlzLmNoZWNrZWQgfHwgIXJjaGVja2FibGVUeXBlLnRlc3QoIHR5cGUgKSApO1xuXHRcdH0gKVxuXHRcdC5tYXAoIGZ1bmN0aW9uKCBpLCBlbGVtICkge1xuXHRcdFx0dmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpO1xuXG5cdFx0XHRyZXR1cm4gdmFsID09IG51bGwgP1xuXHRcdFx0XHRudWxsIDpcblx0XHRcdFx0alF1ZXJ5LmlzQXJyYXkoIHZhbCApID9cblx0XHRcdFx0XHRqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdFx0XHRcdH0gKSA6XG5cdFx0XHRcdFx0eyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdH0gKS5nZXQoKTtcblx0fVxufSApO1xuXG5cbmpRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gZnVuY3Rpb24oKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblx0fSBjYXRjaCAoIGUgKSB7fVxufTtcblxudmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7XG5cblx0XHQvLyBGaWxlIHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIGNvZGUgMCwgYXNzdW1lIDIwMFxuXHRcdDA6IDIwMCxcblxuXHRcdC8vIFN1cHBvcnQ6IElFOVxuXHRcdC8vICMxNDUwOiBzb21ldGltZXMgSUUgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNFxuXHRcdDEyMjM6IDIwNFxuXHR9LFxuXHR4aHJTdXBwb3J0ZWQgPSBqUXVlcnkuYWpheFNldHRpbmdzLnhocigpO1xuXG5zdXBwb3J0LmNvcnMgPSAhIXhoclN1cHBvcnRlZCAmJiAoIFwid2l0aENyZWRlbnRpYWxzXCIgaW4geGhyU3VwcG9ydGVkICk7XG5zdXBwb3J0LmFqYXggPSB4aHJTdXBwb3J0ZWQgPSAhIXhoclN1cHBvcnRlZDtcblxualF1ZXJ5LmFqYXhUcmFuc3BvcnQoIGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHR2YXIgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2s7XG5cblx0Ly8gQ3Jvc3MgZG9tYWluIG9ubHkgYWxsb3dlZCBpZiBzdXBwb3J0ZWQgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdFxuXHRpZiAoIHN1cHBvcnQuY29ycyB8fCB4aHJTdXBwb3J0ZWQgJiYgIW9wdGlvbnMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0dmFyIGksXG5cdFx0XHRcdFx0eGhyID0gb3B0aW9ucy54aHIoKTtcblxuXHRcdFx0XHR4aHIub3Blbihcblx0XHRcdFx0XHRvcHRpb25zLnR5cGUsXG5cdFx0XHRcdFx0b3B0aW9ucy51cmwsXG5cdFx0XHRcdFx0b3B0aW9ucy5hc3luYyxcblx0XHRcdFx0XHRvcHRpb25zLnVzZXJuYW1lLFxuXHRcdFx0XHRcdG9wdGlvbnMucGFzc3dvcmRcblx0XHRcdFx0KTtcblxuXHRcdFx0XHQvLyBBcHBseSBjdXN0b20gZmllbGRzIGlmIHByb3ZpZGVkXG5cdFx0XHRcdGlmICggb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0Zm9yICggaSBpbiBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRcdHhoclsgaSBdID0gb3B0aW9ucy54aHJGaWVsZHNbIGkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBPdmVycmlkZSBtaW1lIHR5cGUgaWYgbmVlZGVkXG5cdFx0XHRcdGlmICggb3B0aW9ucy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHtcblx0XHRcdFx0XHR4aHIub3ZlcnJpZGVNaW1lVHlwZSggb3B0aW9ucy5taW1lVHlwZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gWC1SZXF1ZXN0ZWQtV2l0aCBoZWFkZXJcblx0XHRcdFx0Ly8gRm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc2VlaW5nIGFzIGNvbmRpdGlvbnMgZm9yIGEgcHJlZmxpZ2h0IGFyZVxuXHRcdFx0XHQvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLlxuXHRcdFx0XHQvLyAoaXQgY2FuIGFsd2F5cyBiZSBzZXQgb24gYSBwZXItcmVxdWVzdCBiYXNpcyBvciBldmVuIHVzaW5nIGFqYXhTZXR1cClcblx0XHRcdFx0Ly8gRm9yIHNhbWUtZG9tYWluIHJlcXVlc3RzLCB3b24ndCBjaGFuZ2UgaGVhZGVyIGlmIGFscmVhZHkgcHJvdmlkZWQuXG5cdFx0XHRcdGlmICggIW9wdGlvbnMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbIFwiWC1SZXF1ZXN0ZWQtV2l0aFwiIF0gKSB7XG5cdFx0XHRcdFx0aGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSA9IFwiWE1MSHR0cFJlcXVlc3RcIjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNldCBoZWFkZXJzXG5cdFx0XHRcdGZvciAoIGkgaW4gaGVhZGVycyApIHtcblx0XHRcdFx0XHR4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDYWxsYmFja1xuXHRcdFx0XHRjYWxsYmFjayA9IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHRcdGNhbGxiYWNrID0gZXJyb3JDYWxsYmFjayA9IHhoci5vbmxvYWQgPVxuXHRcdFx0XHRcdFx0XHRcdHhoci5vbmVycm9yID0geGhyLm9uYWJvcnQgPSB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiYWJvcnRcIiApIHtcblx0XHRcdFx0XHRcdFx0XHR4aHIuYWJvcnQoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gXCJlcnJvclwiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUU5XG5cdFx0XHRcdFx0XHRcdFx0Ly8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZVxuXHRcdFx0XHRcdFx0XHRcdGlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggMCwgXCJlcnJvclwiICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXNUZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZShcblx0XHRcdFx0XHRcdFx0XHRcdHhoclN1Y2Nlc3NTdGF0dXNbIHhoci5zdGF0dXMgXSB8fCB4aHIuc3RhdHVzLFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHQsXG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFOSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBGb3IgWEhSMiBub24tdGV4dCwgbGV0IHRoZSBjYWxsZXIgaGFuZGxlIGl0IChnaC0yNDk4KVxuXHRcdFx0XHRcdFx0XHRcdFx0KCB4aHIucmVzcG9uc2VUeXBlIHx8IFwidGV4dFwiICkgIT09IFwidGV4dFwiICB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHhoci5yZXNwb25zZVRleHQgIT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGJpbmFyeTogeGhyLnJlc3BvbnNlIH0gOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IHRleHQ6IHhoci5yZXNwb25zZVRleHQgfSxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIExpc3RlbiB0byBldmVudHNcblx0XHRcdFx0eGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7XG5cdFx0XHRcdGVycm9yQ2FsbGJhY2sgPSB4aHIub25lcnJvciA9IGNhbGxiYWNrKCBcImVycm9yXCIgKTtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRTlcblx0XHRcdFx0Ly8gVXNlIG9ucmVhZHlzdGF0ZWNoYW5nZSB0byByZXBsYWNlIG9uYWJvcnRcblx0XHRcdFx0Ly8gdG8gaGFuZGxlIHVuY2F1Z2h0IGFib3J0c1xuXHRcdFx0XHRpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0eGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgcmVhZHlTdGF0ZSBiZWZvcmUgdGltZW91dCBhcyBpdCBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFsbG93IG9uZXJyb3IgdG8gYmUgY2FsbGVkIGZpcnN0LFxuXHRcdFx0XHRcdFx0XHQvLyBidXQgdGhhdCB3aWxsIG5vdCBoYW5kbGUgYSBuYXRpdmUgYWJvcnRcblx0XHRcdFx0XHRcdFx0Ly8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0Ly8gYXMgeGhyLm9uZXJyb3IgY2Fubm90IGJlIGFjY2Vzc2VkXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDYWxsYmFjaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2soIFwiYWJvcnRcIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cblx0XHRcdFx0XHQvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pXG5cdFx0XHRcdFx0eGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApO1xuXHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdC8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGVcbmpRdWVyeS5hamF4U2V0dXAoIHtcblx0YWNjZXB0czoge1xuXHRcdHNjcmlwdDogXCJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIFwiICtcblx0XHRcdFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0XCJcblx0fSxcblx0Y29udGVudHM6IHtcblx0XHRzY3JpcHQ6IC9cXGIoPzpqYXZhfGVjbWEpc2NyaXB0XFxiL1xuXHR9LFxuXHRjb252ZXJ0ZXJzOiB7XG5cdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7XG5cdFx0XHRyZXR1cm4gdGV4dDtcblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRzLmNhY2hlID0gZmFsc2U7XG5cdH1cblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMudHlwZSA9IFwiR0VUXCI7XG5cdH1cbn0gKTtcblxuLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0XG5qUXVlcnkuYWpheFRyYW5zcG9ydCggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cblx0Ly8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1ZXN0c1xuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0dmFyIHNjcmlwdCwgY2FsbGJhY2s7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBfLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0c2NyaXB0ID0galF1ZXJ5KCBcIjxzY3JpcHQ+XCIgKS5wcm9wKCB7XG5cdFx0XHRcdFx0Y2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LFxuXHRcdFx0XHRcdHNyYzogcy51cmxcblx0XHRcdFx0fSApLm9uKFxuXHRcdFx0XHRcdFwibG9hZCBlcnJvclwiLFxuXHRcdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcblx0cmpzb25wID0gLyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztcblxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZSsrICkgKTtcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcblx0XHRyZXR1cm4gY2FsbGJhY2s7XG5cdH1cbn0gKTtcblxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJqc29uIGpzb25wXCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHtcblxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXG5cdFx0anNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID9cblx0XHRcdFwidXJsXCIgOlxuXHRcdFx0dHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApXG5cdFx0XHRcdFx0LmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCAmJlxuXHRcdFx0XHRyanNvbnAudGVzdCggcy5kYXRhICkgJiYgXCJkYXRhXCJcblx0XHQpO1xuXG5cdC8vIEhhbmRsZSBpZmYgdGhlIGV4cGVjdGVkIGRhdGEgdHlwZSBpcyBcImpzb25wXCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXRcblx0aWYgKCBqc29uUHJvcCB8fCBzLmRhdGFUeXBlc1sgMCBdID09PSBcImpzb25wXCIgKSB7XG5cblx0XHQvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1iZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0XG5cdFx0Y2FsbGJhY2tOYW1lID0gcy5qc29ucENhbGxiYWNrID0galF1ZXJ5LmlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID9cblx0XHRcdHMuanNvbnBDYWxsYmFjaygpIDpcblx0XHRcdHMuanNvbnBDYWxsYmFjaztcblxuXHRcdC8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGFcblx0XHRpZiAoIGpzb25Qcm9wICkge1xuXHRcdFx0c1sganNvblByb3AgXSA9IHNbIGpzb25Qcm9wIF0ucmVwbGFjZSggcmpzb25wLCBcIiQxXCIgKyBjYWxsYmFja05hbWUgKTtcblx0XHR9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHtcblx0XHRcdHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIHMudXJsICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmpzb25wICsgXCI9XCIgKyBjYWxsYmFja05hbWU7XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIGRhdGEgY29udmVydGVyIHRvIHJldHJpZXZlIGpzb24gYWZ0ZXIgc2NyaXB0IGV4ZWN1dGlvblxuXHRcdHMuY29udmVydGVyc1sgXCJzY3JpcHQganNvblwiIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggIXJlc3BvbnNlQ29udGFpbmVyICkge1xuXHRcdFx0XHRqUXVlcnkuZXJyb3IoIGNhbGxiYWNrTmFtZSArIFwiIHdhcyBub3QgY2FsbGVkXCIgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXNwb25zZUNvbnRhaW5lclsgMCBdO1xuXHRcdH07XG5cblx0XHQvLyBGb3JjZSBqc29uIGRhdGFUeXBlXG5cdFx0cy5kYXRhVHlwZXNbIDAgXSA9IFwianNvblwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja1xuXHRcdG92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTtcblx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IGFyZ3VtZW50cztcblx0XHR9O1xuXG5cdFx0Ly8gQ2xlYW4tdXAgZnVuY3Rpb24gKGZpcmVzIGFmdGVyIGNvbnZlcnRlcnMpXG5cdFx0anFYSFIuYWx3YXlzKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gSWYgcHJldmlvdXMgdmFsdWUgZGlkbid0IGV4aXN0IC0gcmVtb3ZlIGl0XG5cdFx0XHRpZiAoIG92ZXJ3cml0dGVuID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdGpRdWVyeSggd2luZG93ICkucmVtb3ZlUHJvcCggY2FsbGJhY2tOYW1lICk7XG5cblx0XHRcdC8vIE90aGVyd2lzZSByZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNhdmUgYmFjayBhcyBmcmVlXG5cdFx0XHRpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkge1xuXG5cdFx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZFxuXHRcdFx0XHRzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHRcdFx0Ly8gU2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZVxuXHRcdFx0XHRvbGRDYWxsYmFja3MucHVzaCggY2FsbGJhY2tOYW1lICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZVxuXHRcdFx0aWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBqUXVlcnkuaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHtcblx0XHRcdFx0b3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDtcblx0XHR9ICk7XG5cblx0XHQvLyBEZWxlZ2F0ZSB0byBzY3JpcHRcblx0XHRyZXR1cm4gXCJzY3JpcHRcIjtcblx0fVxufSApO1xuXG5cblxuXG4vLyBBcmd1bWVudCBcImRhdGFcIiBzaG91bGQgYmUgc3RyaW5nIG9mIGh0bWxcbi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCxcbi8vIGRlZmF1bHRzIHRvIGRvY3VtZW50XG4vLyBrZWVwU2NyaXB0cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIGh0bWwgc3RyaW5nXG5qUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkge1xuXHRpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGtlZXBTY3JpcHRzID0gY29udGV4dDtcblx0XHRjb250ZXh0ID0gZmFsc2U7XG5cdH1cblx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XG5cblx0dmFyIHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApLFxuXHRcdHNjcmlwdHMgPSAha2VlcFNjcmlwdHMgJiYgW107XG5cblx0Ly8gU2luZ2xlIHRhZ1xuXHRpZiAoIHBhcnNlZCApIHtcblx0XHRyZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNlZFsgMSBdICkgXTtcblx0fVxuXG5cdHBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7XG5cblx0aWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkge1xuXHRcdGpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5tZXJnZSggW10sIHBhcnNlZC5jaGlsZE5vZGVzICk7XG59O1xuXG5cbi8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZCBtZXRob2RcbnZhciBfbG9hZCA9IGpRdWVyeS5mbi5sb2FkO1xuXG4vKipcbiAqIExvYWQgYSB1cmwgaW50byBhIHBhZ2VcbiAqL1xualF1ZXJ5LmZuLmxvYWQgPSBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkge1xuXHRpZiAoIHR5cGVvZiB1cmwgIT09IFwic3RyaW5nXCIgJiYgX2xvYWQgKSB7XG5cdFx0cmV0dXJuIF9sb2FkLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0fVxuXG5cdHZhciBzZWxlY3RvciwgdHlwZSwgcmVzcG9uc2UsXG5cdFx0c2VsZiA9IHRoaXMsXG5cdFx0b2ZmID0gdXJsLmluZGV4T2YoIFwiIFwiICk7XG5cblx0aWYgKCBvZmYgPiAtMSApIHtcblx0XHRzZWxlY3RvciA9IGpRdWVyeS50cmltKCB1cmwuc2xpY2UoIG9mZiApICk7XG5cdFx0dXJsID0gdXJsLnNsaWNlKCAwLCBvZmYgKTtcblx0fVxuXG5cdC8vIElmIGl0J3MgYSBmdW5jdGlvblxuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHtcblxuXHRcdC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrXG5cdFx0Y2FsbGJhY2sgPSBwYXJhbXM7XG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xuXG5cdC8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmdcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0dHlwZSA9IFwiUE9TVFwiO1xuXHR9XG5cblx0Ly8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3Rcblx0aWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7XG5cdFx0alF1ZXJ5LmFqYXgoIHtcblx0XHRcdHVybDogdXJsLFxuXG5cdFx0XHQvLyBJZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkLlxuXHRcdFx0Ly8gTWFrZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGV4cGxpY2l0IHNpbmNlXG5cdFx0XHQvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2Rcblx0XHRcdHR5cGU6IHR5cGUgfHwgXCJHRVRcIixcblx0XHRcdGRhdGFUeXBlOiBcImh0bWxcIixcblx0XHRcdGRhdGE6IHBhcmFtc1xuXHRcdH0gKS5kb25lKCBmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkge1xuXG5cdFx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcblx0XHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xuXG5cdFx0XHRzZWxmLmh0bWwoIHNlbGVjdG9yID9cblxuXHRcdFx0XHQvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXZcblx0XHRcdFx0Ly8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzXG5cdFx0XHRcdGpRdWVyeSggXCI8ZGl2PlwiICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0XG5cdFx0XHRcdHJlc3BvbnNlVGV4dCApO1xuXG5cdFx0Ly8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImRhdGFcIiwgXCJzdGF0dXNcIiwgXCJqcVhIUlwiXG5cdFx0Ly8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLlxuXHRcdC8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJqcVhIUlwiLCBcInN0YXR1c1wiLCBcImVycm9yXCJcblx0XHR9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSFIsIHN0YXR1cyApIHtcblx0XHRcdHNlbGYuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cblxuXG4vLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50c1xualF1ZXJ5LmVhY2goIFtcblx0XCJhamF4U3RhcnRcIixcblx0XCJhamF4U3RvcFwiLFxuXHRcImFqYXhDb21wbGV0ZVwiLFxuXHRcImFqYXhFcnJvclwiLFxuXHRcImFqYXhTdWNjZXNzXCIsXG5cdFwiYWpheFNlbmRcIlxuXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7XG5cdGpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApO1xuXHR9O1xufSApO1xuXG5cblxuXG5qUXVlcnkuZXhwci5maWx0ZXJzLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiBqUXVlcnkuZ3JlcCggalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiBlbGVtID09PSBmbi5lbGVtO1xuXHR9ICkubGVuZ3RoO1xufTtcblxuXG5cblxuLyoqXG4gKiBHZXRzIGEgd2luZG93IGZyb20gYW4gZWxlbWVudFxuICovXG5mdW5jdGlvbiBnZXRXaW5kb3coIGVsZW0gKSB7XG5cdHJldHVybiBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSA/IGVsZW0gOiBlbGVtLm5vZGVUeXBlID09PSA5ICYmIGVsZW0uZGVmYXVsdFZpZXc7XG59XG5cbmpRdWVyeS5vZmZzZXQgPSB7XG5cdHNldE9mZnNldDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGkgKSB7XG5cdFx0dmFyIGN1clBvc2l0aW9uLCBjdXJMZWZ0LCBjdXJDU1NUb3AsIGN1clRvcCwgY3VyT2Zmc2V0LCBjdXJDU1NMZWZ0LCBjYWxjdWxhdGVQb3NpdGlvbixcblx0XHRcdHBvc2l0aW9uID0galF1ZXJ5LmNzcyggZWxlbSwgXCJwb3NpdGlvblwiICksXG5cdFx0XHRjdXJFbGVtID0galF1ZXJ5KCBlbGVtICksXG5cdFx0XHRwcm9wcyA9IHt9O1xuXG5cdFx0Ly8gU2V0IHBvc2l0aW9uIGZpcnN0LCBpbi1jYXNlIHRvcC9sZWZ0IGFyZSBzZXQgZXZlbiBvbiBzdGF0aWMgZWxlbVxuXHRcdGlmICggcG9zaXRpb24gPT09IFwic3RhdGljXCIgKSB7XG5cdFx0XHRlbGVtLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuXHRcdH1cblxuXHRcdGN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCk7XG5cdFx0Y3VyQ1NTVG9wID0galF1ZXJ5LmNzcyggZWxlbSwgXCJ0b3BcIiApO1xuXHRcdGN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImxlZnRcIiApO1xuXHRcdGNhbGN1bGF0ZVBvc2l0aW9uID0gKCBwb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiIHx8IHBvc2l0aW9uID09PSBcImZpeGVkXCIgKSAmJlxuXHRcdFx0KCBjdXJDU1NUb3AgKyBjdXJDU1NMZWZ0ICkuaW5kZXhPZiggXCJhdXRvXCIgKSA+IC0xO1xuXG5cdFx0Ly8gTmVlZCB0byBiZSBhYmxlIHRvIGNhbGN1bGF0ZSBwb3NpdGlvbiBpZiBlaXRoZXJcblx0XHQvLyB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWRcblx0XHRpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkge1xuXHRcdFx0Y3VyUG9zaXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7XG5cdFx0XHRjdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7XG5cdFx0XHRjdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwO1xuXHRcdFx0Y3VyTGVmdCA9IHBhcnNlRmxvYXQoIGN1ckNTU0xlZnQgKSB8fCAwO1xuXHRcdH1cblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHtcblxuXHRcdFx0Ly8gVXNlIGpRdWVyeS5leHRlbmQgaGVyZSB0byBhbGxvdyBtb2RpZmljYXRpb24gb2YgY29vcmRpbmF0ZXMgYXJndW1lbnQgKGdoLTE4NDgpXG5cdFx0XHRvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbnMudG9wICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy50b3AgPSAoIG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCApICsgY3VyVG9wO1xuXHRcdH1cblx0XHRpZiAoIG9wdGlvbnMubGVmdCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7XG5cdFx0fVxuXG5cdFx0aWYgKCBcInVzaW5nXCIgaW4gb3B0aW9ucyApIHtcblx0XHRcdG9wdGlvbnMudXNpbmcuY2FsbCggZWxlbSwgcHJvcHMgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJFbGVtLmNzcyggcHJvcHMgKTtcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0b2Zmc2V0OiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0dGhpcyA6XG5cdFx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTtcblx0XHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHZhciBkb2NFbGVtLCB3aW4sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0Ym94ID0geyB0b3A6IDAsIGxlZnQ6IDAgfSxcblx0XHRcdGRvYyA9IGVsZW0gJiYgZWxlbS5vd25lckRvY3VtZW50O1xuXG5cdFx0aWYgKCAhZG9jICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0Ly8gTWFrZSBzdXJlIGl0J3Mgbm90IGEgZGlzY29ubmVjdGVkIERPTSBub2RlXG5cdFx0aWYgKCAhalF1ZXJ5LmNvbnRhaW5zKCBkb2NFbGVtLCBlbGVtICkgKSB7XG5cdFx0XHRyZXR1cm4gYm94O1xuXHRcdH1cblxuXHRcdGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0d2luID0gZ2V0V2luZG93KCBkb2MgKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBib3gudG9wICsgd2luLnBhZ2VZT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRUb3AsXG5cdFx0XHRsZWZ0OiBib3gubGVmdCArIHdpbi5wYWdlWE9mZnNldCAtIGRvY0VsZW0uY2xpZW50TGVmdFxuXHRcdH07XG5cdH0sXG5cblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0cGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblxuXHRcdC8vIEZpeGVkIGVsZW1lbnRzIGFyZSBvZmZzZXQgZnJvbSB3aW5kb3cgKHBhcmVudE9mZnNldCA9IHt0b3A6MCwgbGVmdDogMH0sXG5cdFx0Ly8gYmVjYXVzZSBpdCBpcyBpdHMgb25seSBvZmZzZXQgcGFyZW50XG5cdFx0aWYgKCBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSA9PT0gXCJmaXhlZFwiICkge1xuXG5cdFx0XHQvLyBBc3N1bWUgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGlzIHRoZXJlIHdoZW4gY29tcHV0ZWQgcG9zaXRpb24gaXMgZml4ZWRcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBHZXQgKnJlYWwqIG9mZnNldFBhcmVudFxuXHRcdFx0b2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQoKTtcblxuXHRcdFx0Ly8gR2V0IGNvcnJlY3Qgb2Zmc2V0c1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblx0XHRcdGlmICggIWpRdWVyeS5ub2RlTmFtZSggb2Zmc2V0UGFyZW50WyAwIF0sIFwiaHRtbFwiICkgKSB7XG5cdFx0XHRcdHBhcmVudE9mZnNldCA9IG9mZnNldFBhcmVudC5vZmZzZXQoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG9mZnNldFBhcmVudCBib3JkZXJzXG5cdFx0XHRwYXJlbnRPZmZzZXQudG9wICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBdLCBcImJvcmRlclRvcFdpZHRoXCIsIHRydWUgKTtcblx0XHRcdHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudFsgMCBdLCBcImJvcmRlckxlZnRXaWR0aFwiLCB0cnVlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2luc1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IG9mZnNldC50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5Ub3BcIiwgdHJ1ZSApLFxuXHRcdFx0bGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luTGVmdFwiLCB0cnVlIClcblx0XHR9O1xuXHR9LFxuXG5cdC8vIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGRvY3VtZW50RWxlbWVudCBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuXHQvLyAxKSBGb3IgdGhlIGVsZW1lbnQgaW5zaWRlIHRoZSBpZnJhbWUgd2l0aG91dCBvZmZzZXRQYXJlbnQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuXG5cdC8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvd1xuXHQvLyAyKSBGb3IgdGhlIGhpZGRlbiBvciBkZXRhY2hlZCBlbGVtZW50XG5cdC8vIDMpIEZvciBib2R5IG9yIGh0bWwgZWxlbWVudCwgaS5lLiBpbiBjYXNlIG9mIHRoZSBodG1sIG5vZGUgLSBpdCB3aWxsIHJldHVybiBpdHNlbGZcblx0Ly9cblx0Ly8gYnV0IHRob3NlIGV4Y2VwdGlvbnMgd2VyZSBuZXZlciBwcmVzZW50ZWQgYXMgYSByZWFsIGxpZmUgdXNlLWNhc2VzXG5cdC8vIGFuZCBtaWdodCBiZSBjb25zaWRlcmVkIGFzIG1vcmUgcHJlZmVyYWJsZSByZXN1bHRzLlxuXHQvL1xuXHQvLyBUaGlzIGxvZ2ljLCBob3dldmVyLCBpcyBub3QgZ3VhcmFudGVlZCBhbmQgY2FuIGNoYW5nZSBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZVxuXHRvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQ7XG5cblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnRFbGVtZW50O1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG4vLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHNcbmpRdWVyeS5lYWNoKCB7IHNjcm9sbExlZnQ6IFwicGFnZVhPZmZzZXRcIiwgc2Nyb2xsVG9wOiBcInBhZ2VZT2Zmc2V0XCIgfSwgZnVuY3Rpb24oIG1ldGhvZCwgcHJvcCApIHtcblx0dmFyIHRvcCA9IFwicGFnZVlPZmZzZXRcIiA9PT0gcHJvcDtcblxuXHRqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7XG5cdFx0XHR2YXIgd2luID0gZ2V0V2luZG93KCBlbGVtICk7XG5cblx0XHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiB3aW4gPyB3aW5bIHByb3AgXSA6IGVsZW1bIG1ldGhvZCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHdpbiApIHtcblx0XHRcdFx0d2luLnNjcm9sbFRvKFxuXHRcdFx0XHRcdCF0b3AgPyB2YWwgOiB3aW4ucGFnZVhPZmZzZXQsXG5cdFx0XHRcdFx0dG9wID8gdmFsIDogd2luLnBhZ2VZT2Zmc2V0XG5cdFx0XHRcdCk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1bIG1ldGhvZCBdID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0sIG1ldGhvZCwgdmFsLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH07XG59ICk7XG5cbi8vIFN1cHBvcnQ6IFNhZmFyaTw3LTgrLCBDaHJvbWU8MzctNDQrXG4vLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvblxuLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0XG4vLyBCbGluayBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0yMjkyODBcbi8vIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyBwZXJjZW50IHdoZW4gc3BlY2lmaWVkIGZvciB0b3AvbGVmdC9ib3R0b20vcmlnaHQ7XG4vLyByYXRoZXIgdGhhbiBtYWtlIHRoZSBjc3MgbW9kdWxlIGRlcGVuZCBvbiB0aGUgb2Zmc2V0IG1vZHVsZSwganVzdCBjaGVjayBmb3IgaXQgaGVyZVxualF1ZXJ5LmVhY2goIFsgXCJ0b3BcIiwgXCJsZWZ0XCIgXSwgZnVuY3Rpb24oIGksIHByb3AgKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdFx0Y29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTtcblxuXHRcdFx0XHQvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXRcblx0XHRcdFx0cmV0dXJuIHJudW1ub25weC50ZXN0KCBjb21wdXRlZCApID9cblx0XHRcdFx0XHRqUXVlcnkoIGVsZW0gKS5wb3NpdGlvbigpWyBwcm9wIF0gKyBcInB4XCIgOlxuXHRcdFx0XHRcdGNvbXB1dGVkO1xuXHRcdFx0fVxuXHRcdH1cblx0KTtcbn0gKTtcblxuXG4vLyBDcmVhdGUgaW5uZXJIZWlnaHQsIGlubmVyV2lkdGgsIGhlaWdodCwgd2lkdGgsIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoIG1ldGhvZHNcbmpRdWVyeS5lYWNoKCB7IEhlaWdodDogXCJoZWlnaHRcIiwgV2lkdGg6IFwid2lkdGhcIiB9LCBmdW5jdGlvbiggbmFtZSwgdHlwZSApIHtcblx0alF1ZXJ5LmVhY2goIHsgcGFkZGluZzogXCJpbm5lclwiICsgbmFtZSwgY29udGVudDogdHlwZSwgXCJcIjogXCJvdXRlclwiICsgbmFtZSB9LFxuXHRcdGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkge1xuXG5cdFx0Ly8gTWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoXG5cdFx0alF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSBcImJvb2xlYW5cIiApLFxuXHRcdFx0XHRleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/IFwibWFyZ2luXCIgOiBcImJvcmRlclwiICk7XG5cblx0XHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGRvYztcblxuXHRcdFx0XHRpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRcdFx0Ly8gQXMgb2YgNS84LzIwMTIgdGhpcyB3aWxsIHlpZWxkIGluY29ycmVjdCByZXN1bHRzIGZvciBNb2JpbGUgU2FmYXJpLCBidXQgdGhlcmVcblx0XHRcdFx0XHQvLyBpc24ndCBhIHdob2xlIGxvdCB3ZSBjYW4gZG8uIFNlZSBwdWxsIHJlcXVlc3QgYXQgdGhpcyBVUkwgZm9yIGRpc2N1c3Npb246XG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC83NjRcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIFwiY2xpZW50XCIgKyBuYW1lIF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBHZXQgZG9jdW1lbnQgd2lkdGggb3IgaGVpZ2h0XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdFx0XHRcdC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSxcblx0XHRcdFx0XHQvLyB3aGljaGV2ZXIgaXMgZ3JlYXRlc3Rcblx0XHRcdFx0XHRyZXR1cm4gTWF0aC5tYXgoXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwic2Nyb2xsXCIgKyBuYW1lIF0sIGRvY1sgXCJzY3JvbGxcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJvZmZzZXRcIiArIG5hbWUgXSwgZG9jWyBcIm9mZnNldFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZG9jWyBcImNsaWVudFwiICsgbmFtZSBdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblxuXHRcdFx0XHRcdC8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXRcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDpcblxuXHRcdFx0XHRcdC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApO1xuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUsIG51bGwgKTtcblx0XHR9O1xuXHR9ICk7XG59ICk7XG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcblx0fSxcblxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XG5cblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgP1xuXHRcdFx0dGhpcy5vZmYoIHNlbGVjdG9yLCBcIioqXCIgKSA6XG5cdFx0XHR0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8IFwiKipcIiwgZm4gKTtcblx0fSxcblx0c2l6ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubGVuZ3RoO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5hbmRTZWxmID0galF1ZXJ5LmZuLmFkZEJhY2s7XG5cblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSApO1xufVxuXG5cblxudmFyXG5cblx0Ly8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG5cdF9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LFxuXG5cdC8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG5cdF8kID0gd2luZG93LiQ7XG5cbmpRdWVyeS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oIGRlZXAgKSB7XG5cdGlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHtcblx0XHR3aW5kb3cuJCA9IF8kO1xuXHR9XG5cblx0aWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHtcblx0XHR3aW5kb3cualF1ZXJ5ID0gX2pRdWVyeTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnk7XG59O1xuXG4vLyBFeHBvc2UgalF1ZXJ5IGFuZCAkIGlkZW50aWZpZXJzLCBldmVuIGluIEFNRFxuLy8gKCM3MTAyI2NvbW1lbnQ6MTAsIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNTU3KVxuLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KVxuaWYgKCAhbm9HbG9iYWwgKSB7XG5cdHdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTtcbn1cblxucmV0dXJuIGpRdWVyeTtcbn0pKTtcbiIsIi8qKlxuICogT3dsIENhcm91c2VsIHYyLjEuNFxuICogQ29weXJpZ2h0IDIwMTMtMjAxNiBEYXZpZCBEZXV0c2NoXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS9Pd2xDYXJvdXNlbDIvT3dsQ2Fyb3VzZWwyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKi9cbi8qKlxuICogT3dsIGNhcm91c2VsXG4gKiBAdmVyc2lvbiAyLjEuMFxuICogQGF1dGhvciBCYXJ0b3N6IFdvamNpZWNob3dza2lcbiAqIEBhdXRob3IgRGF2aWQgRGV1dHNjaFxuICogQGxpY2Vuc2UgVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKiBAdG9kbyBMYXp5IExvYWQgSWNvblxuICogQHRvZG8gcHJldmVudCBhbmltYXRpb25lbmQgYnVibGluZ1xuICogQHRvZG8gaXRlbXNTY2FsZVVwXG4gKiBAdG9kbyBUZXN0IFplcHRvXG4gKiBAdG9kbyBzdGFnZVBhZGRpbmcgY2FsY3VsYXRlIHdyb25nIGFjdGl2ZSBjbGFzc2VzXG4gKi9cbjsoZnVuY3Rpb24oJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBjYXJvdXNlbC5cblx0ICogQGNsYXNzIFRoZSBPd2wgQ2Fyb3VzZWwuXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudHxqUXVlcnl9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBjcmVhdGUgdGhlIGNhcm91c2VsIGZvci5cblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zXG5cdCAqL1xuXHRmdW5jdGlvbiBPd2woZWxlbWVudCwgb3B0aW9ucykge1xuXG5cdFx0LyoqXG5cdFx0ICogQ3VycmVudCBzZXR0aW5ncyBmb3IgdGhlIGNhcm91c2VsLlxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKi9cblx0XHR0aGlzLnNldHRpbmdzID0gbnVsbDtcblxuXHRcdC8qKlxuXHRcdCAqIEN1cnJlbnQgb3B0aW9ucyBzZXQgYnkgdGhlIGNhbGxlciBpbmNsdWRpbmcgZGVmYXVsdHMuXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqL1xuXHRcdHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBPd2wuRGVmYXVsdHMsIG9wdGlvbnMpO1xuXG5cdFx0LyoqXG5cdFx0ICogUGx1Z2luIGVsZW1lbnQuXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqL1xuXHRcdHRoaXMuJGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuXG5cdFx0LyoqXG5cdFx0ICogUHJveGllZCBldmVudCBoYW5kbGVycy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0dGhpcy5faGFuZGxlcnMgPSB7fTtcblxuXHRcdC8qKlxuXHRcdCAqIFJlZmVyZW5jZXMgdG8gdGhlIHJ1bm5pbmcgcGx1Z2lucyBvZiB0aGlzIGNhcm91c2VsLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHR0aGlzLl9wbHVnaW5zID0ge307XG5cblx0XHQvKipcblx0XHQgKiBDdXJyZW50bHkgc3VwcHJlc3NlZCBldmVudHMgdG8gcHJldmVudCB0aGVtIGZyb20gYmVlaW5nIHJldHJpZ2dlcmVkLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHR0aGlzLl9zdXByZXNzID0ge307XG5cblx0XHQvKipcblx0XHQgKiBBYnNvbHV0ZSBjdXJyZW50IHBvc2l0aW9uLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHR0aGlzLl9jdXJyZW50ID0gbnVsbDtcblxuXHRcdC8qKlxuXHRcdCAqIEFuaW1hdGlvbiBzcGVlZCBpbiBtaWxsaXNlY29uZHMuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqL1xuXHRcdHRoaXMuX3NwZWVkID0gbnVsbDtcblxuXHRcdC8qKlxuXHRcdCAqIENvb3JkaW5hdGVzIG9mIGFsbCBpdGVtcyBpbiBwaXhlbC5cblx0XHQgKiBAdG9kbyBUaGUgbmFtZSBvZiB0aGlzIG1lbWJlciBpcyBtaXNzbGVhZGluZy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0dGhpcy5fY29vcmRpbmF0ZXMgPSBbXTtcblxuXHRcdC8qKlxuXHRcdCAqIEN1cnJlbnQgYnJlYWtwb2ludC5cblx0XHQgKiBAdG9kbyBSZWFsIG1lZGlhIHF1ZXJpZXMgd291bGQgYmUgbmljZS5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0dGhpcy5fYnJlYWtwb2ludCA9IG51bGw7XG5cblx0XHQvKipcblx0XHQgKiBDdXJyZW50IHdpZHRoIG9mIHRoZSBwbHVnaW4gZWxlbWVudC5cblx0XHQgKi9cblx0XHR0aGlzLl93aWR0aCA9IG51bGw7XG5cblx0XHQvKipcblx0XHQgKiBBbGwgcmVhbCBpdGVtcy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0dGhpcy5faXRlbXMgPSBbXTtcblxuXHRcdC8qKlxuXHRcdCAqIEFsbCBjbG9uZWQgaXRlbXMuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqL1xuXHRcdHRoaXMuX2Nsb25lcyA9IFtdO1xuXG5cdFx0LyoqXG5cdFx0ICogTWVyZ2UgdmFsdWVzIG9mIGFsbCBpdGVtcy5cblx0XHQgKiBAdG9kbyBNYXliZSB0aGlzIGNvdWxkIGJlIHBhcnQgb2YgYSBwbHVnaW4uXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqL1xuXHRcdHRoaXMuX21lcmdlcnMgPSBbXTtcblxuXHRcdC8qKlxuXHRcdCAqIFdpZHRocyBvZiBhbGwgaXRlbXMuXG5cdFx0ICovXG5cdFx0dGhpcy5fd2lkdGhzID0gW107XG5cblx0XHQvKipcblx0XHQgKiBJbnZhbGlkYXRlZCBwYXJ0cyB3aXRoaW4gdGhlIHVwZGF0ZSBwcm9jZXNzLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHR0aGlzLl9pbnZhbGlkYXRlZCA9IHt9O1xuXG5cdFx0LyoqXG5cdFx0ICogT3JkZXJlZCBsaXN0IG9mIHdvcmtlcnMgZm9yIHRoZSB1cGRhdGUgcHJvY2Vzcy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0dGhpcy5fcGlwZSA9IFtdO1xuXG5cdFx0LyoqXG5cdFx0ICogQ3VycmVudCBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGRyYWcgb3BlcmF0aW9uLlxuXHRcdCAqIEB0b2RvICMyNjFcblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0dGhpcy5fZHJhZyA9IHtcblx0XHRcdHRpbWU6IG51bGwsXG5cdFx0XHR0YXJnZXQ6IG51bGwsXG5cdFx0XHRwb2ludGVyOiBudWxsLFxuXHRcdFx0c3RhZ2U6IHtcblx0XHRcdFx0c3RhcnQ6IG51bGwsXG5cdFx0XHRcdGN1cnJlbnQ6IG51bGxcblx0XHRcdH0sXG5cdFx0XHRkaXJlY3Rpb246IG51bGxcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQ3VycmVudCBzdGF0ZSBpbmZvcm1hdGlvbiBhbmQgdGhlaXIgdGFncy5cblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHR0aGlzLl9zdGF0ZXMgPSB7XG5cdFx0XHRjdXJyZW50OiB7fSxcblx0XHRcdHRhZ3M6IHtcblx0XHRcdFx0J2luaXRpYWxpemluZyc6IFsgJ2J1c3knIF0sXG5cdFx0XHRcdCdhbmltYXRpbmcnOiBbICdidXN5JyBdLFxuXHRcdFx0XHQnZHJhZ2dpbmcnOiBbICdpbnRlcmFjdGluZycgXVxuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQkLmVhY2goWyAnb25SZXNpemUnLCAnb25UaHJvdHRsZWRSZXNpemUnIF0sICQucHJveHkoZnVuY3Rpb24oaSwgaGFuZGxlcikge1xuXHRcdFx0dGhpcy5faGFuZGxlcnNbaGFuZGxlcl0gPSAkLnByb3h5KHRoaXNbaGFuZGxlcl0sIHRoaXMpO1xuXHRcdH0sIHRoaXMpKTtcblxuXHRcdCQuZWFjaChPd2wuUGx1Z2lucywgJC5wcm94eShmdW5jdGlvbihrZXksIHBsdWdpbikge1xuXHRcdFx0dGhpcy5fcGx1Z2luc1trZXkuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSldXG5cdFx0XHRcdD0gbmV3IHBsdWdpbih0aGlzKTtcblx0XHR9LCB0aGlzKSk7XG5cblx0XHQkLmVhY2goT3dsLldvcmtlcnMsICQucHJveHkoZnVuY3Rpb24ocHJpb3JpdHksIHdvcmtlcikge1xuXHRcdFx0dGhpcy5fcGlwZS5wdXNoKHtcblx0XHRcdFx0J2ZpbHRlcic6IHdvcmtlci5maWx0ZXIsXG5cdFx0XHRcdCdydW4nOiAkLnByb3h5KHdvcmtlci5ydW4sIHRoaXMpXG5cdFx0XHR9KTtcblx0XHR9LCB0aGlzKSk7XG5cblx0XHR0aGlzLnNldHVwKCk7XG5cdFx0dGhpcy5pbml0aWFsaXplKCk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmYXVsdCBvcHRpb25zIGZvciB0aGUgY2Fyb3VzZWwuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdE93bC5EZWZhdWx0cyA9IHtcblx0XHRpdGVtczogMyxcblx0XHRsb29wOiBmYWxzZSxcblx0XHRjZW50ZXI6IGZhbHNlLFxuXHRcdHJld2luZDogZmFsc2UsXG5cblx0XHRtb3VzZURyYWc6IHRydWUsXG5cdFx0dG91Y2hEcmFnOiB0cnVlLFxuXHRcdHB1bGxEcmFnOiB0cnVlLFxuXHRcdGZyZWVEcmFnOiBmYWxzZSxcblxuXHRcdG1hcmdpbjogMCxcblx0XHRzdGFnZVBhZGRpbmc6IDAsXG5cblx0XHRtZXJnZTogZmFsc2UsXG5cdFx0bWVyZ2VGaXQ6IHRydWUsXG5cdFx0YXV0b1dpZHRoOiBmYWxzZSxcblxuXHRcdHN0YXJ0UG9zaXRpb246IDAsXG5cdFx0cnRsOiBmYWxzZSxcblxuXHRcdHNtYXJ0U3BlZWQ6IDI1MCxcblx0XHRmbHVpZFNwZWVkOiBmYWxzZSxcblx0XHRkcmFnRW5kU3BlZWQ6IGZhbHNlLFxuXG5cdFx0cmVzcG9uc2l2ZToge30sXG5cdFx0cmVzcG9uc2l2ZVJlZnJlc2hSYXRlOiAyMDAsXG5cdFx0cmVzcG9uc2l2ZUJhc2VFbGVtZW50OiB3aW5kb3csXG5cblx0XHRmYWxsYmFja0Vhc2luZzogJ3N3aW5nJyxcblxuXHRcdGluZm86IGZhbHNlLFxuXG5cdFx0bmVzdGVkSXRlbVNlbGVjdG9yOiBmYWxzZSxcblx0XHRpdGVtRWxlbWVudDogJ2RpdicsXG5cdFx0c3RhZ2VFbGVtZW50OiAnZGl2JyxcblxuXHRcdHJlZnJlc2hDbGFzczogJ293bC1yZWZyZXNoJyxcblx0XHRsb2FkZWRDbGFzczogJ293bC1sb2FkZWQnLFxuXHRcdGxvYWRpbmdDbGFzczogJ293bC1sb2FkaW5nJyxcblx0XHRydGxDbGFzczogJ293bC1ydGwnLFxuXHRcdHJlc3BvbnNpdmVDbGFzczogJ293bC1yZXNwb25zaXZlJyxcblx0XHRkcmFnQ2xhc3M6ICdvd2wtZHJhZycsXG5cdFx0aXRlbUNsYXNzOiAnb3dsLWl0ZW0nLFxuXHRcdHN0YWdlQ2xhc3M6ICdvd2wtc3RhZ2UnLFxuXHRcdHN0YWdlT3V0ZXJDbGFzczogJ293bC1zdGFnZS1vdXRlcicsXG5cdFx0Z3JhYkNsYXNzOiAnb3dsLWdyYWInXG5cdH07XG5cblx0LyoqXG5cdCAqIEVudW1lcmF0aW9uIGZvciB3aWR0aC5cblx0ICogQHB1YmxpY1xuXHQgKiBAcmVhZG9ubHlcblx0ICogQGVudW0ge1N0cmluZ31cblx0ICovXG5cdE93bC5XaWR0aCA9IHtcblx0XHREZWZhdWx0OiAnZGVmYXVsdCcsXG5cdFx0SW5uZXI6ICdpbm5lcicsXG5cdFx0T3V0ZXI6ICdvdXRlcidcblx0fTtcblxuXHQvKipcblx0ICogRW51bWVyYXRpb24gZm9yIHR5cGVzLlxuXHQgKiBAcHVibGljXG5cdCAqIEByZWFkb25seVxuXHQgKiBAZW51bSB7U3RyaW5nfVxuXHQgKi9cblx0T3dsLlR5cGUgPSB7XG5cdFx0RXZlbnQ6ICdldmVudCcsXG5cdFx0U3RhdGU6ICdzdGF0ZSdcblx0fTtcblxuXHQvKipcblx0ICogQ29udGFpbnMgYWxsIHJlZ2lzdGVyZWQgcGx1Z2lucy5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0T3dsLlBsdWdpbnMgPSB7fTtcblxuXHQvKipcblx0ICogTGlzdCBvZiB3b3JrZXJzIGludm9sdmVkIGluIHRoZSB1cGRhdGUgcHJvY2Vzcy5cblx0ICovXG5cdE93bC5Xb3JrZXJzID0gWyB7XG5cdFx0ZmlsdGVyOiBbICd3aWR0aCcsICdzZXR0aW5ncycgXSxcblx0XHRydW46IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy5fd2lkdGggPSB0aGlzLiRlbGVtZW50LndpZHRoKCk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0ZmlsdGVyOiBbICd3aWR0aCcsICdpdGVtcycsICdzZXR0aW5ncycgXSxcblx0XHRydW46IGZ1bmN0aW9uKGNhY2hlKSB7XG5cdFx0XHRjYWNoZS5jdXJyZW50ID0gdGhpcy5faXRlbXMgJiYgdGhpcy5faXRlbXNbdGhpcy5yZWxhdGl2ZSh0aGlzLl9jdXJyZW50KV07XG5cdFx0fVxuXHR9LCB7XG5cdFx0ZmlsdGVyOiBbICdpdGVtcycsICdzZXR0aW5ncycgXSxcblx0XHRydW46IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy4kc3RhZ2UuY2hpbGRyZW4oJy5jbG9uZWQnKS5yZW1vdmUoKTtcblx0XHR9XG5cdH0sIHtcblx0XHRmaWx0ZXI6IFsgJ3dpZHRoJywgJ2l0ZW1zJywgJ3NldHRpbmdzJyBdLFxuXHRcdHJ1bjogZnVuY3Rpb24oY2FjaGUpIHtcblx0XHRcdHZhciBtYXJnaW4gPSB0aGlzLnNldHRpbmdzLm1hcmdpbiB8fCAnJyxcblx0XHRcdFx0Z3JpZCA9ICF0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCxcblx0XHRcdFx0cnRsID0gdGhpcy5zZXR0aW5ncy5ydGwsXG5cdFx0XHRcdGNzcyA9IHtcblx0XHRcdFx0XHQnd2lkdGgnOiAnYXV0bycsXG5cdFx0XHRcdFx0J21hcmdpbi1sZWZ0JzogcnRsID8gbWFyZ2luIDogJycsXG5cdFx0XHRcdFx0J21hcmdpbi1yaWdodCc6IHJ0bCA/ICcnIDogbWFyZ2luXG5cdFx0XHRcdH07XG5cblx0XHRcdCFncmlkICYmIHRoaXMuJHN0YWdlLmNoaWxkcmVuKCkuY3NzKGNzcyk7XG5cblx0XHRcdGNhY2hlLmNzcyA9IGNzcztcblx0XHR9XG5cdH0sIHtcblx0XHRmaWx0ZXI6IFsgJ3dpZHRoJywgJ2l0ZW1zJywgJ3NldHRpbmdzJyBdLFxuXHRcdHJ1bjogZnVuY3Rpb24oY2FjaGUpIHtcblx0XHRcdHZhciB3aWR0aCA9ICh0aGlzLndpZHRoKCkgLyB0aGlzLnNldHRpbmdzLml0ZW1zKS50b0ZpeGVkKDMpIC0gdGhpcy5zZXR0aW5ncy5tYXJnaW4sXG5cdFx0XHRcdG1lcmdlID0gbnVsbCxcblx0XHRcdFx0aXRlcmF0b3IgPSB0aGlzLl9pdGVtcy5sZW5ndGgsXG5cdFx0XHRcdGdyaWQgPSAhdGhpcy5zZXR0aW5ncy5hdXRvV2lkdGgsXG5cdFx0XHRcdHdpZHRocyA9IFtdO1xuXG5cdFx0XHRjYWNoZS5pdGVtcyA9IHtcblx0XHRcdFx0bWVyZ2U6IGZhbHNlLFxuXHRcdFx0XHR3aWR0aDogd2lkdGhcblx0XHRcdH07XG5cblx0XHRcdHdoaWxlIChpdGVyYXRvci0tKSB7XG5cdFx0XHRcdG1lcmdlID0gdGhpcy5fbWVyZ2Vyc1tpdGVyYXRvcl07XG5cdFx0XHRcdG1lcmdlID0gdGhpcy5zZXR0aW5ncy5tZXJnZUZpdCAmJiBNYXRoLm1pbihtZXJnZSwgdGhpcy5zZXR0aW5ncy5pdGVtcykgfHwgbWVyZ2U7XG5cblx0XHRcdFx0Y2FjaGUuaXRlbXMubWVyZ2UgPSBtZXJnZSA+IDEgfHwgY2FjaGUuaXRlbXMubWVyZ2U7XG5cblx0XHRcdFx0d2lkdGhzW2l0ZXJhdG9yXSA9ICFncmlkID8gdGhpcy5faXRlbXNbaXRlcmF0b3JdLndpZHRoKCkgOiB3aWR0aCAqIG1lcmdlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl93aWR0aHMgPSB3aWR0aHM7XG5cdFx0fVxuXHR9LCB7XG5cdFx0ZmlsdGVyOiBbICdpdGVtcycsICdzZXR0aW5ncycgXSxcblx0XHRydW46IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGNsb25lcyA9IFtdLFxuXHRcdFx0XHRpdGVtcyA9IHRoaXMuX2l0ZW1zLFxuXHRcdFx0XHRzZXR0aW5ncyA9IHRoaXMuc2V0dGluZ3MsXG5cdFx0XHRcdHZpZXcgPSBNYXRoLm1heChzZXR0aW5ncy5pdGVtcyAqIDIsIDQpLFxuXHRcdFx0XHRzaXplID0gTWF0aC5jZWlsKGl0ZW1zLmxlbmd0aCAvIDIpICogMixcblx0XHRcdFx0cmVwZWF0ID0gc2V0dGluZ3MubG9vcCAmJiBpdGVtcy5sZW5ndGggPyBzZXR0aW5ncy5yZXdpbmQgPyB2aWV3IDogTWF0aC5tYXgodmlldywgc2l6ZSkgOiAwLFxuXHRcdFx0XHRhcHBlbmQgPSAnJyxcblx0XHRcdFx0cHJlcGVuZCA9ICcnO1xuXG5cdFx0XHRyZXBlYXQgLz0gMjtcblxuXHRcdFx0d2hpbGUgKHJlcGVhdC0tKSB7XG5cdFx0XHRcdGNsb25lcy5wdXNoKHRoaXMubm9ybWFsaXplKGNsb25lcy5sZW5ndGggLyAyLCB0cnVlKSk7XG5cdFx0XHRcdGFwcGVuZCA9IGFwcGVuZCArIGl0ZW1zW2Nsb25lc1tjbG9uZXMubGVuZ3RoIC0gMV1dWzBdLm91dGVySFRNTDtcblx0XHRcdFx0Y2xvbmVzLnB1c2godGhpcy5ub3JtYWxpemUoaXRlbXMubGVuZ3RoIC0gMSAtIChjbG9uZXMubGVuZ3RoIC0gMSkgLyAyLCB0cnVlKSk7XG5cdFx0XHRcdHByZXBlbmQgPSBpdGVtc1tjbG9uZXNbY2xvbmVzLmxlbmd0aCAtIDFdXVswXS5vdXRlckhUTUwgKyBwcmVwZW5kO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9jbG9uZXMgPSBjbG9uZXM7XG5cblx0XHRcdCQoYXBwZW5kKS5hZGRDbGFzcygnY2xvbmVkJykuYXBwZW5kVG8odGhpcy4kc3RhZ2UpO1xuXHRcdFx0JChwcmVwZW5kKS5hZGRDbGFzcygnY2xvbmVkJykucHJlcGVuZFRvKHRoaXMuJHN0YWdlKTtcblx0XHR9XG5cdH0sIHtcblx0XHRmaWx0ZXI6IFsgJ3dpZHRoJywgJ2l0ZW1zJywgJ3NldHRpbmdzJyBdLFxuXHRcdHJ1bjogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgcnRsID0gdGhpcy5zZXR0aW5ncy5ydGwgPyAxIDogLTEsXG5cdFx0XHRcdHNpemUgPSB0aGlzLl9jbG9uZXMubGVuZ3RoICsgdGhpcy5faXRlbXMubGVuZ3RoLFxuXHRcdFx0XHRpdGVyYXRvciA9IC0xLFxuXHRcdFx0XHRwcmV2aW91cyA9IDAsXG5cdFx0XHRcdGN1cnJlbnQgPSAwLFxuXHRcdFx0XHRjb29yZGluYXRlcyA9IFtdO1xuXG5cdFx0XHR3aGlsZSAoKytpdGVyYXRvciA8IHNpemUpIHtcblx0XHRcdFx0cHJldmlvdXMgPSBjb29yZGluYXRlc1tpdGVyYXRvciAtIDFdIHx8IDA7XG5cdFx0XHRcdGN1cnJlbnQgPSB0aGlzLl93aWR0aHNbdGhpcy5yZWxhdGl2ZShpdGVyYXRvcildICsgdGhpcy5zZXR0aW5ncy5tYXJnaW47XG5cdFx0XHRcdGNvb3JkaW5hdGVzLnB1c2gocHJldmlvdXMgKyBjdXJyZW50ICogcnRsKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fY29vcmRpbmF0ZXMgPSBjb29yZGluYXRlcztcblx0XHR9XG5cdH0sIHtcblx0XHRmaWx0ZXI6IFsgJ3dpZHRoJywgJ2l0ZW1zJywgJ3NldHRpbmdzJyBdLFxuXHRcdHJ1bjogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgcGFkZGluZyA9IHRoaXMuc2V0dGluZ3Muc3RhZ2VQYWRkaW5nLFxuXHRcdFx0XHRjb29yZGluYXRlcyA9IHRoaXMuX2Nvb3JkaW5hdGVzLFxuXHRcdFx0XHRjc3MgPSB7XG5cdFx0XHRcdFx0J3dpZHRoJzogTWF0aC5jZWlsKE1hdGguYWJzKGNvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzLmxlbmd0aCAtIDFdKSkgKyBwYWRkaW5nICogMixcblx0XHRcdFx0XHQncGFkZGluZy1sZWZ0JzogcGFkZGluZyB8fCAnJyxcblx0XHRcdFx0XHQncGFkZGluZy1yaWdodCc6IHBhZGRpbmcgfHwgJydcblx0XHRcdFx0fTtcblxuXHRcdFx0dGhpcy4kc3RhZ2UuY3NzKGNzcyk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0ZmlsdGVyOiBbICd3aWR0aCcsICdpdGVtcycsICdzZXR0aW5ncycgXSxcblx0XHRydW46IGZ1bmN0aW9uKGNhY2hlKSB7XG5cdFx0XHR2YXIgaXRlcmF0b3IgPSB0aGlzLl9jb29yZGluYXRlcy5sZW5ndGgsXG5cdFx0XHRcdGdyaWQgPSAhdGhpcy5zZXR0aW5ncy5hdXRvV2lkdGgsXG5cdFx0XHRcdGl0ZW1zID0gdGhpcy4kc3RhZ2UuY2hpbGRyZW4oKTtcblxuXHRcdFx0aWYgKGdyaWQgJiYgY2FjaGUuaXRlbXMubWVyZ2UpIHtcblx0XHRcdFx0d2hpbGUgKGl0ZXJhdG9yLS0pIHtcblx0XHRcdFx0XHRjYWNoZS5jc3Mud2lkdGggPSB0aGlzLl93aWR0aHNbdGhpcy5yZWxhdGl2ZShpdGVyYXRvcildO1xuXHRcdFx0XHRcdGl0ZW1zLmVxKGl0ZXJhdG9yKS5jc3MoY2FjaGUuY3NzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChncmlkKSB7XG5cdFx0XHRcdGNhY2hlLmNzcy53aWR0aCA9IGNhY2hlLml0ZW1zLndpZHRoO1xuXHRcdFx0XHRpdGVtcy5jc3MoY2FjaGUuY3NzKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sIHtcblx0XHRmaWx0ZXI6IFsgJ2l0ZW1zJyBdLFxuXHRcdHJ1bjogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLl9jb29yZGluYXRlcy5sZW5ndGggPCAxICYmIHRoaXMuJHN0YWdlLnJlbW92ZUF0dHIoJ3N0eWxlJyk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0ZmlsdGVyOiBbICd3aWR0aCcsICdpdGVtcycsICdzZXR0aW5ncycgXSxcblx0XHRydW46IGZ1bmN0aW9uKGNhY2hlKSB7XG5cdFx0XHRjYWNoZS5jdXJyZW50ID0gY2FjaGUuY3VycmVudCA/IHRoaXMuJHN0YWdlLmNoaWxkcmVuKCkuaW5kZXgoY2FjaGUuY3VycmVudCkgOiAwO1xuXHRcdFx0Y2FjaGUuY3VycmVudCA9IE1hdGgubWF4KHRoaXMubWluaW11bSgpLCBNYXRoLm1pbih0aGlzLm1heGltdW0oKSwgY2FjaGUuY3VycmVudCkpO1xuXHRcdFx0dGhpcy5yZXNldChjYWNoZS5jdXJyZW50KTtcblx0XHR9XG5cdH0sIHtcblx0XHRmaWx0ZXI6IFsgJ3Bvc2l0aW9uJyBdLFxuXHRcdHJ1bjogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLmFuaW1hdGUodGhpcy5jb29yZGluYXRlcyh0aGlzLl9jdXJyZW50KSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0ZmlsdGVyOiBbICd3aWR0aCcsICdwb3NpdGlvbicsICdpdGVtcycsICdzZXR0aW5ncycgXSxcblx0XHRydW46IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHJ0bCA9IHRoaXMuc2V0dGluZ3MucnRsID8gMSA6IC0xLFxuXHRcdFx0XHRwYWRkaW5nID0gdGhpcy5zZXR0aW5ncy5zdGFnZVBhZGRpbmcgKiAyLFxuXHRcdFx0XHRiZWdpbiA9IHRoaXMuY29vcmRpbmF0ZXModGhpcy5jdXJyZW50KCkpICsgcGFkZGluZyxcblx0XHRcdFx0ZW5kID0gYmVnaW4gKyB0aGlzLndpZHRoKCkgKiBydGwsXG5cdFx0XHRcdGlubmVyLCBvdXRlciwgbWF0Y2hlcyA9IFtdLCBpLCBuO1xuXG5cdFx0XHRmb3IgKGkgPSAwLCBuID0gdGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG5cdFx0XHRcdGlubmVyID0gdGhpcy5fY29vcmRpbmF0ZXNbaSAtIDFdIHx8IDA7XG5cdFx0XHRcdG91dGVyID0gTWF0aC5hYnModGhpcy5fY29vcmRpbmF0ZXNbaV0pICsgcGFkZGluZyAqIHJ0bDtcblxuXHRcdFx0XHRpZiAoKHRoaXMub3AoaW5uZXIsICc8PScsIGJlZ2luKSAmJiAodGhpcy5vcChpbm5lciwgJz4nLCBlbmQpKSlcblx0XHRcdFx0XHR8fCAodGhpcy5vcChvdXRlciwgJzwnLCBiZWdpbikgJiYgdGhpcy5vcChvdXRlciwgJz4nLCBlbmQpKSkge1xuXHRcdFx0XHRcdG1hdGNoZXMucHVzaChpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLiRzdGFnZS5jaGlsZHJlbignLmFjdGl2ZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcblx0XHRcdHRoaXMuJHN0YWdlLmNoaWxkcmVuKCc6ZXEoJyArIG1hdGNoZXMuam9pbignKSwgOmVxKCcpICsgJyknKS5hZGRDbGFzcygnYWN0aXZlJyk7XG5cblx0XHRcdGlmICh0aGlzLnNldHRpbmdzLmNlbnRlcikge1xuXHRcdFx0XHR0aGlzLiRzdGFnZS5jaGlsZHJlbignLmNlbnRlcicpLnJlbW92ZUNsYXNzKCdjZW50ZXInKTtcblx0XHRcdFx0dGhpcy4kc3RhZ2UuY2hpbGRyZW4oKS5lcSh0aGlzLmN1cnJlbnQoKSkuYWRkQ2xhc3MoJ2NlbnRlcicpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBdO1xuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyB0aGUgY2Fyb3VzZWwuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdE93bC5wcm90b3R5cGUuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZW50ZXIoJ2luaXRpYWxpemluZycpO1xuXHRcdHRoaXMudHJpZ2dlcignaW5pdGlhbGl6ZScpO1xuXG5cdFx0dGhpcy4kZWxlbWVudC50b2dnbGVDbGFzcyh0aGlzLnNldHRpbmdzLnJ0bENsYXNzLCB0aGlzLnNldHRpbmdzLnJ0bCk7XG5cblx0XHRpZiAodGhpcy5zZXR0aW5ncy5hdXRvV2lkdGggJiYgIXRoaXMuaXMoJ3ByZS1sb2FkaW5nJykpIHtcblx0XHRcdHZhciBpbWdzLCBuZXN0ZWRTZWxlY3Rvciwgd2lkdGg7XG5cdFx0XHRpbWdzID0gdGhpcy4kZWxlbWVudC5maW5kKCdpbWcnKTtcblx0XHRcdG5lc3RlZFNlbGVjdG9yID0gdGhpcy5zZXR0aW5ncy5uZXN0ZWRJdGVtU2VsZWN0b3IgPyAnLicgKyB0aGlzLnNldHRpbmdzLm5lc3RlZEl0ZW1TZWxlY3RvciA6IHVuZGVmaW5lZDtcblx0XHRcdHdpZHRoID0gdGhpcy4kZWxlbWVudC5jaGlsZHJlbihuZXN0ZWRTZWxlY3Rvcikud2lkdGgoKTtcblxuXHRcdFx0aWYgKGltZ3MubGVuZ3RoICYmIHdpZHRoIDw9IDApIHtcblx0XHRcdFx0dGhpcy5wcmVsb2FkQXV0b1dpZHRoSW1hZ2VzKGltZ3MpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmxvYWRpbmdDbGFzcyk7XG5cblx0XHQvLyBjcmVhdGUgc3RhZ2Vcblx0XHR0aGlzLiRzdGFnZSA9ICQoJzwnICsgdGhpcy5zZXR0aW5ncy5zdGFnZUVsZW1lbnQgKyAnIGNsYXNzPVwiJyArIHRoaXMuc2V0dGluZ3Muc3RhZ2VDbGFzcyArICdcIi8+Jylcblx0XHRcdC53cmFwKCc8ZGl2IGNsYXNzPVwiJyArIHRoaXMuc2V0dGluZ3Muc3RhZ2VPdXRlckNsYXNzICsgJ1wiLz4nKTtcblxuXHRcdC8vIGFwcGVuZCBzdGFnZVxuXHRcdHRoaXMuJGVsZW1lbnQuYXBwZW5kKHRoaXMuJHN0YWdlLnBhcmVudCgpKTtcblxuXHRcdC8vIGFwcGVuZCBjb250ZW50XG5cdFx0dGhpcy5yZXBsYWNlKHRoaXMuJGVsZW1lbnQuY2hpbGRyZW4oKS5ub3QodGhpcy4kc3RhZ2UucGFyZW50KCkpKTtcblxuXHRcdC8vIGNoZWNrIHZpc2liaWxpdHlcblx0XHRpZiAodGhpcy4kZWxlbWVudC5pcygnOnZpc2libGUnKSkge1xuXHRcdFx0Ly8gdXBkYXRlIHZpZXdcblx0XHRcdHRoaXMucmVmcmVzaCgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBpbnZhbGlkYXRlIHdpZHRoXG5cdFx0XHR0aGlzLmludmFsaWRhdGUoJ3dpZHRoJyk7XG5cdFx0fVxuXG5cdFx0dGhpcy4kZWxlbWVudFxuXHRcdFx0LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sb2FkaW5nQ2xhc3MpXG5cdFx0XHQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmxvYWRlZENsYXNzKTtcblxuXHRcdC8vIHJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzXG5cdFx0dGhpcy5yZWdpc3RlckV2ZW50SGFuZGxlcnMoKTtcblxuXHRcdHRoaXMubGVhdmUoJ2luaXRpYWxpemluZycpO1xuXHRcdHRoaXMudHJpZ2dlcignaW5pdGlhbGl6ZWQnKTtcblx0fTtcblxuXHQvKipcblx0ICogU2V0dXBzIHRoZSBjdXJyZW50IHNldHRpbmdzLlxuXHQgKiBAdG9kbyBSZW1vdmUgcmVzcG9uc2l2ZSBjbGFzc2VzLiBXaHkgc2hvdWxkIGFkYXB0aXZlIGRlc2lnbnMgYmUgYnJvdWdodCBpbnRvIElFOD9cblx0ICogQHRvZG8gU3VwcG9ydCBmb3IgbWVkaWEgcXVlcmllcyBieSB1c2luZyBgbWF0Y2hNZWRpYWAgd291bGQgYmUgbmljZS5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5zZXR1cCA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB2aWV3cG9ydCA9IHRoaXMudmlld3BvcnQoKSxcblx0XHRcdG92ZXJ3cml0ZXMgPSB0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZSxcblx0XHRcdG1hdGNoID0gLTEsXG5cdFx0XHRzZXR0aW5ncyA9IG51bGw7XG5cblx0XHRpZiAoIW92ZXJ3cml0ZXMpIHtcblx0XHRcdHNldHRpbmdzID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCQuZWFjaChvdmVyd3JpdGVzLCBmdW5jdGlvbihicmVha3BvaW50KSB7XG5cdFx0XHRcdGlmIChicmVha3BvaW50IDw9IHZpZXdwb3J0ICYmIGJyZWFrcG9pbnQgPiBtYXRjaCkge1xuXHRcdFx0XHRcdG1hdGNoID0gTnVtYmVyKGJyZWFrcG9pbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0c2V0dGluZ3MgPSAkLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLCBvdmVyd3JpdGVzW21hdGNoXSk7XG5cdFx0XHRkZWxldGUgc2V0dGluZ3MucmVzcG9uc2l2ZTtcblxuXHRcdFx0Ly8gcmVzcG9uc2l2ZSBjbGFzc1xuXHRcdFx0aWYgKHNldHRpbmdzLnJlc3BvbnNpdmVDbGFzcykge1xuXHRcdFx0XHR0aGlzLiRlbGVtZW50LmF0dHIoJ2NsYXNzJyxcblx0XHRcdFx0XHR0aGlzLiRlbGVtZW50LmF0dHIoJ2NsYXNzJykucmVwbGFjZShuZXcgUmVnRXhwKCcoJyArIHRoaXMub3B0aW9ucy5yZXNwb25zaXZlQ2xhc3MgKyAnLSlcXFxcUytcXFxccycsICdnJyksICckMScgKyBtYXRjaClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5zZXR0aW5ncyA9PT0gbnVsbCB8fCB0aGlzLl9icmVha3BvaW50ICE9PSBtYXRjaCkge1xuXHRcdFx0dGhpcy50cmlnZ2VyKCdjaGFuZ2UnLCB7IHByb3BlcnR5OiB7IG5hbWU6ICdzZXR0aW5ncycsIHZhbHVlOiBzZXR0aW5ncyB9IH0pO1xuXHRcdFx0dGhpcy5fYnJlYWtwb2ludCA9IG1hdGNoO1xuXHRcdFx0dGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuXHRcdFx0dGhpcy5pbnZhbGlkYXRlKCdzZXR0aW5ncycpO1xuXHRcdFx0dGhpcy50cmlnZ2VyKCdjaGFuZ2VkJywgeyBwcm9wZXJ0eTogeyBuYW1lOiAnc2V0dGluZ3MnLCB2YWx1ZTogdGhpcy5zZXR0aW5ncyB9IH0pO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogVXBkYXRlcyBvcHRpb24gbG9naWMgaWYgbmVjZXNzZXJ5LlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLm9wdGlvbnNMb2dpYyA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnNldHRpbmdzLmF1dG9XaWR0aCkge1xuXHRcdFx0dGhpcy5zZXR0aW5ncy5zdGFnZVBhZGRpbmcgPSBmYWxzZTtcblx0XHRcdHRoaXMuc2V0dGluZ3MubWVyZ2UgPSBmYWxzZTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFByZXBhcmVzIGFuIGl0ZW0gYmVmb3JlIGFkZC5cblx0ICogQHRvZG8gUmVuYW1lIGV2ZW50IHBhcmFtZXRlciBgY29udGVudGAgdG8gYGl0ZW1gLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEByZXR1cm5zIHtqUXVlcnl8SFRNTEVsZW1lbnR9IC0gVGhlIGl0ZW0gY29udGFpbmVyLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5wcmVwYXJlID0gZnVuY3Rpb24oaXRlbSkge1xuXHRcdHZhciBldmVudCA9IHRoaXMudHJpZ2dlcigncHJlcGFyZScsIHsgY29udGVudDogaXRlbSB9KTtcblxuXHRcdGlmICghZXZlbnQuZGF0YSkge1xuXHRcdFx0ZXZlbnQuZGF0YSA9ICQoJzwnICsgdGhpcy5zZXR0aW5ncy5pdGVtRWxlbWVudCArICcvPicpXG5cdFx0XHRcdC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaXRlbUNsYXNzKS5hcHBlbmQoaXRlbSlcblx0XHR9XG5cblx0XHR0aGlzLnRyaWdnZXIoJ3ByZXBhcmVkJywgeyBjb250ZW50OiBldmVudC5kYXRhIH0pO1xuXG5cdFx0cmV0dXJuIGV2ZW50LmRhdGE7XG5cdH07XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIHZpZXcuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdE93bC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGkgPSAwLFxuXHRcdFx0biA9IHRoaXMuX3BpcGUubGVuZ3RoLFxuXHRcdFx0ZmlsdGVyID0gJC5wcm94eShmdW5jdGlvbihwKSB7IHJldHVybiB0aGlzW3BdIH0sIHRoaXMuX2ludmFsaWRhdGVkKSxcblx0XHRcdGNhY2hlID0ge307XG5cblx0XHR3aGlsZSAoaSA8IG4pIHtcblx0XHRcdGlmICh0aGlzLl9pbnZhbGlkYXRlZC5hbGwgfHwgJC5ncmVwKHRoaXMuX3BpcGVbaV0uZmlsdGVyLCBmaWx0ZXIpLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0dGhpcy5fcGlwZVtpXS5ydW4oY2FjaGUpO1xuXHRcdFx0fVxuXHRcdFx0aSsrO1xuXHRcdH1cblxuXHRcdHRoaXMuX2ludmFsaWRhdGVkID0ge307XG5cblx0XHQhdGhpcy5pcygndmFsaWQnKSAmJiB0aGlzLmVudGVyKCd2YWxpZCcpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSB3aWR0aCBvZiB0aGUgdmlldy5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge093bC5XaWR0aH0gW2RpbWVuc2lvbj1Pd2wuV2lkdGguRGVmYXVsdF0gLSBUaGUgZGltZW5zaW9uIHRvIHJldHVybi5cblx0ICogQHJldHVybnMge051bWJlcn0gLSBUaGUgd2lkdGggb2YgdGhlIHZpZXcgaW4gcGl4ZWwuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLndpZHRoID0gZnVuY3Rpb24oZGltZW5zaW9uKSB7XG5cdFx0ZGltZW5zaW9uID0gZGltZW5zaW9uIHx8IE93bC5XaWR0aC5EZWZhdWx0O1xuXHRcdHN3aXRjaCAoZGltZW5zaW9uKSB7XG5cdFx0XHRjYXNlIE93bC5XaWR0aC5Jbm5lcjpcblx0XHRcdGNhc2UgT3dsLldpZHRoLk91dGVyOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5fd2lkdGg7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5fd2lkdGggLSB0aGlzLnNldHRpbmdzLnN0YWdlUGFkZGluZyAqIDIgKyB0aGlzLnNldHRpbmdzLm1hcmdpbjtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlZnJlc2hlcyB0aGUgY2Fyb3VzZWwgcHJpbWFyaWx5IGZvciBhZGFwdGl2ZSBwdXJwb3Nlcy5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5lbnRlcigncmVmcmVzaGluZycpO1xuXHRcdHRoaXMudHJpZ2dlcigncmVmcmVzaCcpO1xuXG5cdFx0dGhpcy5zZXR1cCgpO1xuXG5cdFx0dGhpcy5vcHRpb25zTG9naWMoKTtcblxuXHRcdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLnJlZnJlc2hDbGFzcyk7XG5cblx0XHR0aGlzLnVwZGF0ZSgpO1xuXG5cdFx0dGhpcy4kZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMucmVmcmVzaENsYXNzKTtcblxuXHRcdHRoaXMubGVhdmUoJ3JlZnJlc2hpbmcnKTtcblx0XHR0aGlzLnRyaWdnZXIoJ3JlZnJlc2hlZCcpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBDaGVja3Mgd2luZG93IGByZXNpemVgIGV2ZW50LlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLm9uVGhyb3R0bGVkUmVzaXplID0gZnVuY3Rpb24oKSB7XG5cdFx0d2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVyKTtcblx0XHR0aGlzLnJlc2l6ZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQodGhpcy5faGFuZGxlcnMub25SZXNpemUsIHRoaXMuc2V0dGluZ3MucmVzcG9uc2l2ZVJlZnJlc2hSYXRlKTtcblx0fTtcblxuXHQvKipcblx0ICogQ2hlY2tzIHdpbmRvdyBgcmVzaXplYCBldmVudC5cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5vblJlc2l6ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy5faXRlbXMubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX3dpZHRoID09PSB0aGlzLiRlbGVtZW50LndpZHRoKCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuJGVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmVudGVyKCdyZXNpemluZycpO1xuXG5cdFx0aWYgKHRoaXMudHJpZ2dlcigncmVzaXplJykuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcblx0XHRcdHRoaXMubGVhdmUoJ3Jlc2l6aW5nJyk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy5pbnZhbGlkYXRlKCd3aWR0aCcpO1xuXG5cdFx0dGhpcy5yZWZyZXNoKCk7XG5cblx0XHR0aGlzLmxlYXZlKCdyZXNpemluZycpO1xuXHRcdHRoaXMudHJpZ2dlcigncmVzaXplZCcpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZWdpc3RlcnMgZXZlbnQgaGFuZGxlcnMuXG5cdCAqIEB0b2RvIENoZWNrIGBtc1BvaW50ZXJFbmFibGVkYFxuXHQgKiBAdG9kbyAjMjYxXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdE93bC5wcm90b3R5cGUucmVnaXN0ZXJFdmVudEhhbmRsZXJzID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCQuc3VwcG9ydC50cmFuc2l0aW9uKSB7XG5cdFx0XHR0aGlzLiRzdGFnZS5vbigkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQgKyAnLm93bC5jb3JlJywgJC5wcm94eSh0aGlzLm9uVHJhbnNpdGlvbkVuZCwgdGhpcykpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnNldHRpbmdzLnJlc3BvbnNpdmUgIT09IGZhbHNlKSB7XG5cdFx0XHR0aGlzLm9uKHdpbmRvdywgJ3Jlc2l6ZScsIHRoaXMuX2hhbmRsZXJzLm9uVGhyb3R0bGVkUmVzaXplKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5zZXR0aW5ncy5tb3VzZURyYWcpIHtcblx0XHRcdHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmRyYWdDbGFzcyk7XG5cdFx0XHR0aGlzLiRzdGFnZS5vbignbW91c2Vkb3duLm93bC5jb3JlJywgJC5wcm94eSh0aGlzLm9uRHJhZ1N0YXJ0LCB0aGlzKSk7XG5cdFx0XHR0aGlzLiRzdGFnZS5vbignZHJhZ3N0YXJ0Lm93bC5jb3JlIHNlbGVjdHN0YXJ0Lm93bC5jb3JlJywgZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZSB9KTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5zZXR0aW5ncy50b3VjaERyYWcpe1xuXHRcdFx0dGhpcy4kc3RhZ2Uub24oJ3RvdWNoc3RhcnQub3dsLmNvcmUnLCAkLnByb3h5KHRoaXMub25EcmFnU3RhcnQsIHRoaXMpKTtcblx0XHRcdHRoaXMuJHN0YWdlLm9uKCd0b3VjaGNhbmNlbC5vd2wuY29yZScsICQucHJveHkodGhpcy5vbkRyYWdFbmQsIHRoaXMpKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgYHRvdWNoc3RhcnRgIGFuZCBgbW91c2Vkb3duYCBldmVudHMuXG5cdCAqIEB0b2RvIEhvcml6b250YWwgc3dpcGUgdGhyZXNob2xkIGFzIG9wdGlvblxuXHQgKiBAdG9kbyAjMjYxXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgYXJndW1lbnRzLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5vbkRyYWdTdGFydCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0dmFyIHN0YWdlID0gbnVsbDtcblxuXHRcdGlmIChldmVudC53aGljaCA9PT0gMykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICgkLnN1cHBvcnQudHJhbnNmb3JtKSB7XG5cdFx0XHRzdGFnZSA9IHRoaXMuJHN0YWdlLmNzcygndHJhbnNmb3JtJykucmVwbGFjZSgvLipcXCh8XFwpfCAvZywgJycpLnNwbGl0KCcsJyk7XG5cdFx0XHRzdGFnZSA9IHtcblx0XHRcdFx0eDogc3RhZ2Vbc3RhZ2UubGVuZ3RoID09PSAxNiA/IDEyIDogNF0sXG5cdFx0XHRcdHk6IHN0YWdlW3N0YWdlLmxlbmd0aCA9PT0gMTYgPyAxMyA6IDVdXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdGFnZSA9IHRoaXMuJHN0YWdlLnBvc2l0aW9uKCk7XG5cdFx0XHRzdGFnZSA9IHtcblx0XHRcdFx0eDogdGhpcy5zZXR0aW5ncy5ydGwgP1xuXHRcdFx0XHRcdHN0YWdlLmxlZnQgKyB0aGlzLiRzdGFnZS53aWR0aCgpIC0gdGhpcy53aWR0aCgpICsgdGhpcy5zZXR0aW5ncy5tYXJnaW4gOlxuXHRcdFx0XHRcdHN0YWdlLmxlZnQsXG5cdFx0XHRcdHk6IHN0YWdlLnRvcFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5pcygnYW5pbWF0aW5nJykpIHtcblx0XHRcdCQuc3VwcG9ydC50cmFuc2Zvcm0gPyB0aGlzLmFuaW1hdGUoc3RhZ2UueCkgOiB0aGlzLiRzdGFnZS5zdG9wKClcblx0XHRcdHRoaXMuaW52YWxpZGF0ZSgncG9zaXRpb24nKTtcblx0XHR9XG5cblx0XHR0aGlzLiRlbGVtZW50LnRvZ2dsZUNsYXNzKHRoaXMub3B0aW9ucy5ncmFiQ2xhc3MsIGV2ZW50LnR5cGUgPT09ICdtb3VzZWRvd24nKTtcblxuXHRcdHRoaXMuc3BlZWQoMCk7XG5cblx0XHR0aGlzLl9kcmFnLnRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblx0XHR0aGlzLl9kcmFnLnRhcmdldCA9ICQoZXZlbnQudGFyZ2V0KTtcblx0XHR0aGlzLl9kcmFnLnN0YWdlLnN0YXJ0ID0gc3RhZ2U7XG5cdFx0dGhpcy5fZHJhZy5zdGFnZS5jdXJyZW50ID0gc3RhZ2U7XG5cdFx0dGhpcy5fZHJhZy5wb2ludGVyID0gdGhpcy5wb2ludGVyKGV2ZW50KTtcblxuXHRcdCQoZG9jdW1lbnQpLm9uKCdtb3VzZXVwLm93bC5jb3JlIHRvdWNoZW5kLm93bC5jb3JlJywgJC5wcm94eSh0aGlzLm9uRHJhZ0VuZCwgdGhpcykpO1xuXG5cdFx0JChkb2N1bWVudCkub25lKCdtb3VzZW1vdmUub3dsLmNvcmUgdG91Y2htb3ZlLm93bC5jb3JlJywgJC5wcm94eShmdW5jdGlvbihldmVudCkge1xuXHRcdFx0dmFyIGRlbHRhID0gdGhpcy5kaWZmZXJlbmNlKHRoaXMuX2RyYWcucG9pbnRlciwgdGhpcy5wb2ludGVyKGV2ZW50KSk7XG5cblx0XHRcdCQoZG9jdW1lbnQpLm9uKCdtb3VzZW1vdmUub3dsLmNvcmUgdG91Y2htb3ZlLm93bC5jb3JlJywgJC5wcm94eSh0aGlzLm9uRHJhZ01vdmUsIHRoaXMpKTtcblxuXHRcdFx0aWYgKE1hdGguYWJzKGRlbHRhLngpIDwgTWF0aC5hYnMoZGVsdGEueSkgJiYgdGhpcy5pcygndmFsaWQnKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRcdHRoaXMuZW50ZXIoJ2RyYWdnaW5nJyk7XG5cdFx0XHR0aGlzLnRyaWdnZXIoJ2RyYWcnKTtcblx0XHR9LCB0aGlzKSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEhhbmRsZXMgdGhlIGB0b3VjaG1vdmVgIGFuZCBgbW91c2Vtb3ZlYCBldmVudHMuXG5cdCAqIEB0b2RvICMyNjFcblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIFRoZSBldmVudCBhcmd1bWVudHMuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLm9uRHJhZ01vdmUgPSBmdW5jdGlvbihldmVudCkge1xuXHRcdHZhciBtaW5pbXVtID0gbnVsbCxcblx0XHRcdG1heGltdW0gPSBudWxsLFxuXHRcdFx0cHVsbCA9IG51bGwsXG5cdFx0XHRkZWx0YSA9IHRoaXMuZGlmZmVyZW5jZSh0aGlzLl9kcmFnLnBvaW50ZXIsIHRoaXMucG9pbnRlcihldmVudCkpLFxuXHRcdFx0c3RhZ2UgPSB0aGlzLmRpZmZlcmVuY2UodGhpcy5fZHJhZy5zdGFnZS5zdGFydCwgZGVsdGEpO1xuXG5cdFx0aWYgKCF0aGlzLmlzKCdkcmFnZ2luZycpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmxvb3ApIHtcblx0XHRcdG1pbmltdW0gPSB0aGlzLmNvb3JkaW5hdGVzKHRoaXMubWluaW11bSgpKTtcblx0XHRcdG1heGltdW0gPSB0aGlzLmNvb3JkaW5hdGVzKHRoaXMubWF4aW11bSgpICsgMSkgLSBtaW5pbXVtO1xuXHRcdFx0c3RhZ2UueCA9ICgoKHN0YWdlLnggLSBtaW5pbXVtKSAlIG1heGltdW0gKyBtYXhpbXVtKSAlIG1heGltdW0pICsgbWluaW11bTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWluaW11bSA9IHRoaXMuc2V0dGluZ3MucnRsID8gdGhpcy5jb29yZGluYXRlcyh0aGlzLm1heGltdW0oKSkgOiB0aGlzLmNvb3JkaW5hdGVzKHRoaXMubWluaW11bSgpKTtcblx0XHRcdG1heGltdW0gPSB0aGlzLnNldHRpbmdzLnJ0bCA/IHRoaXMuY29vcmRpbmF0ZXModGhpcy5taW5pbXVtKCkpIDogdGhpcy5jb29yZGluYXRlcyh0aGlzLm1heGltdW0oKSk7XG5cdFx0XHRwdWxsID0gdGhpcy5zZXR0aW5ncy5wdWxsRHJhZyA/IC0xICogZGVsdGEueCAvIDUgOiAwO1xuXHRcdFx0c3RhZ2UueCA9IE1hdGgubWF4KE1hdGgubWluKHN0YWdlLngsIG1pbmltdW0gKyBwdWxsKSwgbWF4aW11bSArIHB1bGwpO1xuXHRcdH1cblxuXHRcdHRoaXMuX2RyYWcuc3RhZ2UuY3VycmVudCA9IHN0YWdlO1xuXG5cdFx0dGhpcy5hbmltYXRlKHN0YWdlLngpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBgdG91Y2hlbmRgIGFuZCBgbW91c2V1cGAgZXZlbnRzLlxuXHQgKiBAdG9kbyAjMjYxXG5cdCAqIEB0b2RvIFRocmVzaG9sZCBmb3IgY2xpY2sgZXZlbnRcblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIFRoZSBldmVudCBhcmd1bWVudHMuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLm9uRHJhZ0VuZCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0dmFyIGRlbHRhID0gdGhpcy5kaWZmZXJlbmNlKHRoaXMuX2RyYWcucG9pbnRlciwgdGhpcy5wb2ludGVyKGV2ZW50KSksXG5cdFx0XHRzdGFnZSA9IHRoaXMuX2RyYWcuc3RhZ2UuY3VycmVudCxcblx0XHRcdGRpcmVjdGlvbiA9IGRlbHRhLnggPiAwIF4gdGhpcy5zZXR0aW5ncy5ydGwgPyAnbGVmdCcgOiAncmlnaHQnO1xuXG5cdFx0JChkb2N1bWVudCkub2ZmKCcub3dsLmNvcmUnKTtcblxuXHRcdHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmdyYWJDbGFzcyk7XG5cblx0XHRpZiAoZGVsdGEueCAhPT0gMCAmJiB0aGlzLmlzKCdkcmFnZ2luZycpIHx8ICF0aGlzLmlzKCd2YWxpZCcpKSB7XG5cdFx0XHR0aGlzLnNwZWVkKHRoaXMuc2V0dGluZ3MuZHJhZ0VuZFNwZWVkIHx8IHRoaXMuc2V0dGluZ3Muc21hcnRTcGVlZCk7XG5cdFx0XHR0aGlzLmN1cnJlbnQodGhpcy5jbG9zZXN0KHN0YWdlLngsIGRlbHRhLnggIT09IDAgPyBkaXJlY3Rpb24gOiB0aGlzLl9kcmFnLmRpcmVjdGlvbikpO1xuXHRcdFx0dGhpcy5pbnZhbGlkYXRlKCdwb3NpdGlvbicpO1xuXHRcdFx0dGhpcy51cGRhdGUoKTtcblxuXHRcdFx0dGhpcy5fZHJhZy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG5cblx0XHRcdGlmIChNYXRoLmFicyhkZWx0YS54KSA+IDMgfHwgbmV3IERhdGUoKS5nZXRUaW1lKCkgLSB0aGlzLl9kcmFnLnRpbWUgPiAzMDApIHtcblx0XHRcdFx0dGhpcy5fZHJhZy50YXJnZXQub25lKCdjbGljay5vd2wuY29yZScsIGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghdGhpcy5pcygnZHJhZ2dpbmcnKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMubGVhdmUoJ2RyYWdnaW5nJyk7XG5cdFx0dGhpcy50cmlnZ2VyKCdkcmFnZ2VkJyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIGNsb3Nlc3QgaXRlbSBmb3IgYSBjb29yZGluYXRlLlxuXHQgKiBAdG9kbyBTZXR0aW5nIGBmcmVlRHJhZ2AgbWFrZXMgYGNsb3Nlc3RgIG5vdCByZXVzYWJsZS4gU2VlICMxNjUuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGNvb3JkaW5hdGUgLSBUaGUgY29vcmRpbmF0ZSBpbiBwaXhlbC5cblx0ICogQHBhcmFtIHtTdHJpbmd9IGRpcmVjdGlvbiAtIFRoZSBkaXJlY3Rpb24gdG8gY2hlY2sgZm9yIHRoZSBjbG9zZXN0IGl0ZW0uIEV0aGVyIGBsZWZ0YCBvciBgcmlnaHRgLlxuXHQgKiBAcmV0dXJuIHtOdW1iZXJ9IC0gVGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBjbG9zZXN0IGl0ZW0uXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLmNsb3Nlc3QgPSBmdW5jdGlvbihjb29yZGluYXRlLCBkaXJlY3Rpb24pIHtcblx0XHR2YXIgcG9zaXRpb24gPSAtMSxcblx0XHRcdHB1bGwgPSAzMCxcblx0XHRcdHdpZHRoID0gdGhpcy53aWR0aCgpLFxuXHRcdFx0Y29vcmRpbmF0ZXMgPSB0aGlzLmNvb3JkaW5hdGVzKCk7XG5cblx0XHRpZiAoIXRoaXMuc2V0dGluZ3MuZnJlZURyYWcpIHtcblx0XHRcdC8vIGNoZWNrIGNsb3Nlc3QgaXRlbVxuXHRcdFx0JC5lYWNoKGNvb3JkaW5hdGVzLCAkLnByb3h5KGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkge1xuXHRcdFx0XHQvLyBvbiBhIGxlZnQgcHVsbCwgY2hlY2sgb24gY3VycmVudCBpbmRleFxuXHRcdFx0XHRpZiAoZGlyZWN0aW9uID09PSAnbGVmdCcgJiYgY29vcmRpbmF0ZSA+IHZhbHVlIC0gcHVsbCAmJiBjb29yZGluYXRlIDwgdmFsdWUgKyBwdWxsKSB7XG5cdFx0XHRcdFx0cG9zaXRpb24gPSBpbmRleDtcblx0XHRcdFx0Ly8gb24gYSByaWdodCBwdWxsLCBjaGVjayBvbiBwcmV2aW91cyBpbmRleFxuXHRcdFx0XHQvLyB0byBkbyBzbywgc3VidHJhY3Qgd2lkdGggZnJvbSB2YWx1ZSBhbmQgc2V0IHBvc2l0aW9uID0gaW5kZXggKyAxXG5cdFx0XHRcdH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAncmlnaHQnICYmIGNvb3JkaW5hdGUgPiB2YWx1ZSAtIHdpZHRoIC0gcHVsbCAmJiBjb29yZGluYXRlIDwgdmFsdWUgLSB3aWR0aCArIHB1bGwpIHtcblx0XHRcdFx0XHRwb3NpdGlvbiA9IGluZGV4ICsgMTtcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLm9wKGNvb3JkaW5hdGUsICc8JywgdmFsdWUpXG5cdFx0XHRcdFx0JiYgdGhpcy5vcChjb29yZGluYXRlLCAnPicsIGNvb3JkaW5hdGVzW2luZGV4ICsgMV0gfHwgdmFsdWUgLSB3aWR0aCkpIHtcblx0XHRcdFx0XHRwb3NpdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ2xlZnQnID8gaW5kZXggKyAxIDogaW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHBvc2l0aW9uID09PSAtMTtcblx0XHRcdH0sIHRoaXMpKTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuc2V0dGluZ3MubG9vcCkge1xuXHRcdFx0Ly8gbm9uIGxvb3AgYm91bmRyaWVzXG5cdFx0XHRpZiAodGhpcy5vcChjb29yZGluYXRlLCAnPicsIGNvb3JkaW5hdGVzW3RoaXMubWluaW11bSgpXSkpIHtcblx0XHRcdFx0cG9zaXRpb24gPSBjb29yZGluYXRlID0gdGhpcy5taW5pbXVtKCk7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMub3AoY29vcmRpbmF0ZSwgJzwnLCBjb29yZGluYXRlc1t0aGlzLm1heGltdW0oKV0pKSB7XG5cdFx0XHRcdHBvc2l0aW9uID0gY29vcmRpbmF0ZSA9IHRoaXMubWF4aW11bSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBwb3NpdGlvbjtcblx0fTtcblxuXHQvKipcblx0ICogQW5pbWF0ZXMgdGhlIHN0YWdlLlxuXHQgKiBAdG9kbyAjMjcwXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGNvb3JkaW5hdGUgLSBUaGUgY29vcmRpbmF0ZSBpbiBwaXhlbHMuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLmFuaW1hdGUgPSBmdW5jdGlvbihjb29yZGluYXRlKSB7XG5cdFx0dmFyIGFuaW1hdGUgPSB0aGlzLnNwZWVkKCkgPiAwO1xuXG5cdFx0dGhpcy5pcygnYW5pbWF0aW5nJykgJiYgdGhpcy5vblRyYW5zaXRpb25FbmQoKTtcblxuXHRcdGlmIChhbmltYXRlKSB7XG5cdFx0XHR0aGlzLmVudGVyKCdhbmltYXRpbmcnKTtcblx0XHRcdHRoaXMudHJpZ2dlcigndHJhbnNsYXRlJyk7XG5cdFx0fVxuXG5cdFx0aWYgKCQuc3VwcG9ydC50cmFuc2Zvcm0zZCAmJiAkLnN1cHBvcnQudHJhbnNpdGlvbikge1xuXHRcdFx0dGhpcy4kc3RhZ2UuY3NzKHtcblx0XHRcdFx0dHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoJyArIGNvb3JkaW5hdGUgKyAncHgsMHB4LDBweCknLFxuXHRcdFx0XHR0cmFuc2l0aW9uOiAodGhpcy5zcGVlZCgpIC8gMTAwMCkgKyAncydcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSBpZiAoYW5pbWF0ZSkge1xuXHRcdFx0dGhpcy4kc3RhZ2UuYW5pbWF0ZSh7XG5cdFx0XHRcdGxlZnQ6IGNvb3JkaW5hdGUgKyAncHgnXG5cdFx0XHR9LCB0aGlzLnNwZWVkKCksIHRoaXMuc2V0dGluZ3MuZmFsbGJhY2tFYXNpbmcsICQucHJveHkodGhpcy5vblRyYW5zaXRpb25FbmQsIHRoaXMpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy4kc3RhZ2UuY3NzKHtcblx0XHRcdFx0bGVmdDogY29vcmRpbmF0ZSArICdweCdcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNhcm91c2VsIGlzIGluIGEgc3BlY2lmaWMgc3RhdGUgb3Igbm90LlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gc3RhdGUgLSBUaGUgc3RhdGUgdG8gY2hlY2suXG5cdCAqIEByZXR1cm5zIHtCb29sZWFufSAtIFRoZSBmbGFnIHdoaWNoIGluZGljYXRlcyBpZiB0aGUgY2Fyb3VzZWwgaXMgYnVzeS5cblx0ICovXG5cdE93bC5wcm90b3R5cGUuaXMgPSBmdW5jdGlvbihzdGF0ZSkge1xuXHRcdHJldHVybiB0aGlzLl9zdGF0ZXMuY3VycmVudFtzdGF0ZV0gJiYgdGhpcy5fc3RhdGVzLmN1cnJlbnRbc3RhdGVdID4gMDtcblx0fTtcblxuXHQvKipcblx0ICogU2V0cyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgaXRlbS5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gW3Bvc2l0aW9uXSAtIFRoZSBuZXcgYWJzb2x1dGUgcG9zaXRpb24gb3Igbm90aGluZyB0byBsZWF2ZSBpdCB1bmNoYW5nZWQuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IC0gVGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGl0ZW0uXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLmN1cnJlbnQgPSBmdW5jdGlvbihwb3NpdGlvbikge1xuXHRcdGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fY3VycmVudDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5faXRlbXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHBvc2l0aW9uID0gdGhpcy5ub3JtYWxpemUocG9zaXRpb24pO1xuXG5cdFx0aWYgKHRoaXMuX2N1cnJlbnQgIT09IHBvc2l0aW9uKSB7XG5cdFx0XHR2YXIgZXZlbnQgPSB0aGlzLnRyaWdnZXIoJ2NoYW5nZScsIHsgcHJvcGVydHk6IHsgbmFtZTogJ3Bvc2l0aW9uJywgdmFsdWU6IHBvc2l0aW9uIH0gfSk7XG5cblx0XHRcdGlmIChldmVudC5kYXRhICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cG9zaXRpb24gPSB0aGlzLm5vcm1hbGl6ZShldmVudC5kYXRhKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fY3VycmVudCA9IHBvc2l0aW9uO1xuXG5cdFx0XHR0aGlzLmludmFsaWRhdGUoJ3Bvc2l0aW9uJyk7XG5cblx0XHRcdHRoaXMudHJpZ2dlcignY2hhbmdlZCcsIHsgcHJvcGVydHk6IHsgbmFtZTogJ3Bvc2l0aW9uJywgdmFsdWU6IHRoaXMuX2N1cnJlbnQgfSB9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fY3VycmVudDtcblx0fTtcblxuXHQvKipcblx0ICogSW52YWxpZGF0ZXMgdGhlIGdpdmVuIHBhcnQgb2YgdGhlIHVwZGF0ZSByb3V0aW5lLlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gW3BhcnRdIC0gVGhlIHBhcnQgdG8gaW52YWxpZGF0ZS5cblx0ICogQHJldHVybnMge0FycmF5LjxTdHJpbmc+fSAtIFRoZSBpbnZhbGlkYXRlZCBwYXJ0cy5cblx0ICovXG5cdE93bC5wcm90b3R5cGUuaW52YWxpZGF0ZSA9IGZ1bmN0aW9uKHBhcnQpIHtcblx0XHRpZiAoJC50eXBlKHBhcnQpID09PSAnc3RyaW5nJykge1xuXHRcdFx0dGhpcy5faW52YWxpZGF0ZWRbcGFydF0gPSB0cnVlO1xuXHRcdFx0dGhpcy5pcygndmFsaWQnKSAmJiB0aGlzLmxlYXZlKCd2YWxpZCcpO1xuXHRcdH1cblx0XHRyZXR1cm4gJC5tYXAodGhpcy5faW52YWxpZGF0ZWQsIGZ1bmN0aW9uKHYsIGkpIHsgcmV0dXJuIGkgfSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlc2V0cyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgaXRlbS5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gcG9zaXRpb24gLSBUaGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIG5ldyBpdGVtLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG5cdFx0cG9zaXRpb24gPSB0aGlzLm5vcm1hbGl6ZShwb3NpdGlvbik7XG5cblx0XHRpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX3NwZWVkID0gMDtcblx0XHR0aGlzLl9jdXJyZW50ID0gcG9zaXRpb247XG5cblx0XHR0aGlzLnN1cHByZXNzKFsgJ3RyYW5zbGF0ZScsICd0cmFuc2xhdGVkJyBdKTtcblxuXHRcdHRoaXMuYW5pbWF0ZSh0aGlzLmNvb3JkaW5hdGVzKHBvc2l0aW9uKSk7XG5cblx0XHR0aGlzLnJlbGVhc2UoWyAndHJhbnNsYXRlJywgJ3RyYW5zbGF0ZWQnIF0pO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBOb3JtYWxpemVzIGFuIGFic29sdXRlIG9yIGEgcmVsYXRpdmUgcG9zaXRpb24gb2YgYW4gaXRlbS5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gcG9zaXRpb24gLSBUaGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgcG9zaXRpb24gdG8gbm9ybWFsaXplLlxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtyZWxhdGl2ZT1mYWxzZV0gLSBXaGV0aGVyIHRoZSBnaXZlbiBwb3NpdGlvbiBpcyByZWxhdGl2ZSBvciBub3QuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IC0gVGhlIG5vcm1hbGl6ZWQgcG9zaXRpb24uXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBvc2l0aW9uLCByZWxhdGl2ZSkge1xuXHRcdHZhciBuID0gdGhpcy5faXRlbXMubGVuZ3RoLFxuXHRcdFx0bSA9IHJlbGF0aXZlID8gMCA6IHRoaXMuX2Nsb25lcy5sZW5ndGg7XG5cblx0XHRpZiAoIXRoaXMuaXNOdW1lcmljKHBvc2l0aW9uKSB8fCBuIDwgMSkge1xuXHRcdFx0cG9zaXRpb24gPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gbiArIG0pIHtcblx0XHRcdHBvc2l0aW9uID0gKChwb3NpdGlvbiAtIG0gLyAyKSAlIG4gKyBuKSAlIG4gKyBtIC8gMjtcblx0XHR9XG5cblx0XHRyZXR1cm4gcG9zaXRpb247XG5cdH07XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGFuIGFic29sdXRlIHBvc2l0aW9uIG9mIGFuIGl0ZW0gaW50byBhIHJlbGF0aXZlIG9uZS5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gcG9zaXRpb24gLSBUaGUgYWJzb2x1dGUgcG9zaXRpb24gdG8gY29udmVydC5cblx0ICogQHJldHVybnMge051bWJlcn0gLSBUaGUgY29udmVydGVkIHBvc2l0aW9uLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5yZWxhdGl2ZSA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG5cdFx0cG9zaXRpb24gLT0gdGhpcy5fY2xvbmVzLmxlbmd0aCAvIDI7XG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKHBvc2l0aW9uLCB0cnVlKTtcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyB0aGUgbWF4aW11bSBwb3NpdGlvbiBmb3IgdGhlIGN1cnJlbnQgaXRlbS5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtyZWxhdGl2ZT1mYWxzZV0gLSBXaGV0aGVyIHRvIHJldHVybiBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBvciBhIHJlbGF0aXZlIHBvc2l0aW9uLlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfVxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5tYXhpbXVtID0gZnVuY3Rpb24ocmVsYXRpdmUpIHtcblx0XHR2YXIgc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzLFxuXHRcdFx0bWF4aW11bSA9IHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aCxcblx0XHRcdGJvdW5kYXJ5ID0gTWF0aC5hYnModGhpcy5fY29vcmRpbmF0ZXNbbWF4aW11bSAtIDFdKSAtIHRoaXMuX3dpZHRoLFxuXHRcdFx0aSA9IC0xLCBqO1xuXG5cdFx0aWYgKHNldHRpbmdzLmxvb3ApIHtcblx0XHRcdG1heGltdW0gPSB0aGlzLl9jbG9uZXMubGVuZ3RoIC8gMiArIHRoaXMuX2l0ZW1zLmxlbmd0aCAtIDE7XG5cdFx0fSBlbHNlIGlmIChzZXR0aW5ncy5hdXRvV2lkdGggfHwgc2V0dGluZ3MubWVyZ2UpIHtcblx0XHRcdC8vIGJpbmFyeSBzZWFyY2hcblx0XHRcdHdoaWxlIChtYXhpbXVtIC0gaSA+IDEpIHtcblx0XHRcdFx0TWF0aC5hYnModGhpcy5fY29vcmRpbmF0ZXNbaiA9IG1heGltdW0gKyBpID4+IDFdKSA8IGJvdW5kYXJ5XG5cdFx0XHRcdFx0PyBpID0gaiA6IG1heGltdW0gPSBqO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoc2V0dGluZ3MuY2VudGVyKSB7XG5cdFx0XHRtYXhpbXVtID0gdGhpcy5faXRlbXMubGVuZ3RoIC0gMTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF4aW11bSA9IHRoaXMuX2l0ZW1zLmxlbmd0aCAtIHNldHRpbmdzLml0ZW1zO1xuXHRcdH1cblxuXHRcdGlmIChyZWxhdGl2ZSkge1xuXHRcdFx0bWF4aW11bSAtPSB0aGlzLl9jbG9uZXMubGVuZ3RoIC8gMjtcblx0XHR9XG5cblx0XHRyZXR1cm4gTWF0aC5tYXgobWF4aW11bSwgMCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIG1pbmltdW0gcG9zaXRpb24gZm9yIHRoZSBjdXJyZW50IGl0ZW0uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtCb29sZWFufSBbcmVsYXRpdmU9ZmFsc2VdIC0gV2hldGhlciB0byByZXR1cm4gYW4gYWJzb2x1dGUgcG9zaXRpb24gb3IgYSByZWxhdGl2ZSBwb3NpdGlvbi5cblx0ICogQHJldHVybnMge051bWJlcn1cblx0ICovXG5cdE93bC5wcm90b3R5cGUubWluaW11bSA9IGZ1bmN0aW9uKHJlbGF0aXZlKSB7XG5cdFx0cmV0dXJuIHJlbGF0aXZlID8gMCA6IHRoaXMuX2Nsb25lcy5sZW5ndGggLyAyO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIGFuIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCByZWxhdGl2ZSBwb3NpdGlvbi5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gW3Bvc2l0aW9uXSAtIFRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgaXRlbS5cblx0ICogQHJldHVybiB7alF1ZXJ5fEFycmF5LjxqUXVlcnk+fSAtIFRoZSBpdGVtIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBvciBhbGwgaXRlbXMgaWYgbm8gcG9zaXRpb24gd2FzIGdpdmVuLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5pdGVtcyA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG5cdFx0aWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLl9pdGVtcy5zbGljZSgpO1xuXHRcdH1cblxuXHRcdHBvc2l0aW9uID0gdGhpcy5ub3JtYWxpemUocG9zaXRpb24sIHRydWUpO1xuXHRcdHJldHVybiB0aGlzLl9pdGVtc1twb3NpdGlvbl07XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgYW4gaXRlbSBhdCB0aGUgc3BlY2lmaWVkIHJlbGF0aXZlIHBvc2l0aW9uLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbcG9zaXRpb25dIC0gVGhlIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSBpdGVtLlxuXHQgKiBAcmV0dXJuIHtqUXVlcnl8QXJyYXkuPGpRdWVyeT59IC0gVGhlIGl0ZW0gYXQgdGhlIGdpdmVuIHBvc2l0aW9uIG9yIGFsbCBpdGVtcyBpZiBubyBwb3NpdGlvbiB3YXMgZ2l2ZW4uXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLm1lcmdlcnMgPSBmdW5jdGlvbihwb3NpdGlvbikge1xuXHRcdGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5fbWVyZ2Vycy5zbGljZSgpO1xuXHRcdH1cblxuXHRcdHBvc2l0aW9uID0gdGhpcy5ub3JtYWxpemUocG9zaXRpb24sIHRydWUpO1xuXHRcdHJldHVybiB0aGlzLl9tZXJnZXJzW3Bvc2l0aW9uXTtcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyB0aGUgYWJzb2x1dGUgcG9zaXRpb25zIG9mIGNsb25lcyBmb3IgYW4gaXRlbS5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gW3Bvc2l0aW9uXSAtIFRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgaXRlbS5cblx0ICogQHJldHVybnMge0FycmF5LjxOdW1iZXI+fSAtIFRoZSBhYnNvbHV0ZSBwb3NpdGlvbnMgb2YgY2xvbmVzIGZvciB0aGUgaXRlbSBvciBhbGwgaWYgbm8gcG9zaXRpb24gd2FzIGdpdmVuLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5jbG9uZXMgPSBmdW5jdGlvbihwb3NpdGlvbikge1xuXHRcdHZhciBvZGQgPSB0aGlzLl9jbG9uZXMubGVuZ3RoIC8gMixcblx0XHRcdGV2ZW4gPSBvZGQgKyB0aGlzLl9pdGVtcy5sZW5ndGgsXG5cdFx0XHRtYXAgPSBmdW5jdGlvbihpbmRleCkgeyByZXR1cm4gaW5kZXggJSAyID09PSAwID8gZXZlbiArIGluZGV4IC8gMiA6IG9kZCAtIChpbmRleCArIDEpIC8gMiB9O1xuXG5cdFx0aWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiAkLm1hcCh0aGlzLl9jbG9uZXMsIGZ1bmN0aW9uKHYsIGkpIHsgcmV0dXJuIG1hcChpKSB9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gJC5tYXAodGhpcy5fY2xvbmVzLCBmdW5jdGlvbih2LCBpKSB7IHJldHVybiB2ID09PSBwb3NpdGlvbiA/IG1hcChpKSA6IG51bGwgfSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHNwZWVkLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbc3BlZWRdIC0gVGhlIGFuaW1hdGlvbiBzcGVlZCBpbiBtaWxsaXNlY29uZHMgb3Igbm90aGluZyB0byBsZWF2ZSBpdCB1bmNoYW5nZWQuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IC0gVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHNwZWVkIGluIG1pbGxpc2Vjb25kcy5cblx0ICovXG5cdE93bC5wcm90b3R5cGUuc3BlZWQgPSBmdW5jdGlvbihzcGVlZCkge1xuXHRcdGlmIChzcGVlZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLl9zcGVlZCA9IHNwZWVkO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9zcGVlZDtcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyB0aGUgY29vcmRpbmF0ZSBvZiBhbiBpdGVtLlxuXHQgKiBAdG9kbyBUaGUgbmFtZSBvZiB0aGlzIG1ldGhvZCBpcyBtaXNzbGVhbmRpbmcuXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uIC0gVGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBpdGVtIHdpdGhpbiBgbWluaW11bSgpYCBhbmQgYG1heGltdW0oKWAuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ8QXJyYXkuPE51bWJlcj59IC0gVGhlIGNvb3JkaW5hdGUgb2YgdGhlIGl0ZW0gaW4gcGl4ZWwgb3IgYWxsIGNvb3JkaW5hdGVzLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5jb29yZGluYXRlcyA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG5cdFx0dmFyIG11bHRpcGxpZXIgPSAxLFxuXHRcdFx0bmV3UG9zaXRpb24gPSBwb3NpdGlvbiAtIDEsXG5cdFx0XHRjb29yZGluYXRlO1xuXG5cdFx0aWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiAkLm1hcCh0aGlzLl9jb29yZGluYXRlcywgJC5wcm94eShmdW5jdGlvbihjb29yZGluYXRlLCBpbmRleCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb29yZGluYXRlcyhpbmRleCk7XG5cdFx0XHR9LCB0aGlzKSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuY2VudGVyKSB7XG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5ydGwpIHtcblx0XHRcdFx0bXVsdGlwbGllciA9IC0xO1xuXHRcdFx0XHRuZXdQb3NpdGlvbiA9IHBvc2l0aW9uICsgMTtcblx0XHRcdH1cblxuXHRcdFx0Y29vcmRpbmF0ZSA9IHRoaXMuX2Nvb3JkaW5hdGVzW3Bvc2l0aW9uXTtcblx0XHRcdGNvb3JkaW5hdGUgKz0gKHRoaXMud2lkdGgoKSAtIGNvb3JkaW5hdGUgKyAodGhpcy5fY29vcmRpbmF0ZXNbbmV3UG9zaXRpb25dIHx8IDApKSAvIDIgKiBtdWx0aXBsaWVyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb29yZGluYXRlID0gdGhpcy5fY29vcmRpbmF0ZXNbbmV3UG9zaXRpb25dIHx8IDA7XG5cdFx0fVxuXG5cdFx0Y29vcmRpbmF0ZSA9IE1hdGguY2VpbChjb29yZGluYXRlKTtcblxuXHRcdHJldHVybiBjb29yZGluYXRlO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBDYWxjdWxhdGVzIHRoZSBzcGVlZCBmb3IgYSB0cmFuc2xhdGlvbi5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge051bWJlcn0gZnJvbSAtIFRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgc3RhcnQgaXRlbS5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IHRvIC0gVGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSB0YXJnZXQgaXRlbS5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtmYWN0b3I9dW5kZWZpbmVkXSAtIFRoZSB0aW1lIGZhY3RvciBpbiBtaWxsaXNlY29uZHMuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IC0gVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgdHJhbnNsYXRpb24uXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLmR1cmF0aW9uID0gZnVuY3Rpb24oZnJvbSwgdG8sIGZhY3Rvcikge1xuXHRcdGlmIChmYWN0b3IgPT09IDApIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHJldHVybiBNYXRoLm1pbihNYXRoLm1heChNYXRoLmFicyh0byAtIGZyb20pLCAxKSwgNikgKiBNYXRoLmFicygoZmFjdG9yIHx8IHRoaXMuc2V0dGluZ3Muc21hcnRTcGVlZCkpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTbGlkZXMgdG8gdGhlIHNwZWNpZmllZCBpdGVtLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbS5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtzcGVlZF0gLSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSB0cmFuc2l0aW9uLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS50byA9IGZ1bmN0aW9uKHBvc2l0aW9uLCBzcGVlZCkge1xuXHRcdHZhciBjdXJyZW50ID0gdGhpcy5jdXJyZW50KCksXG5cdFx0XHRyZXZlcnQgPSBudWxsLFxuXHRcdFx0ZGlzdGFuY2UgPSBwb3NpdGlvbiAtIHRoaXMucmVsYXRpdmUoY3VycmVudCksXG5cdFx0XHRkaXJlY3Rpb24gPSAoZGlzdGFuY2UgPiAwKSAtIChkaXN0YW5jZSA8IDApLFxuXHRcdFx0aXRlbXMgPSB0aGlzLl9pdGVtcy5sZW5ndGgsXG5cdFx0XHRtaW5pbXVtID0gdGhpcy5taW5pbXVtKCksXG5cdFx0XHRtYXhpbXVtID0gdGhpcy5tYXhpbXVtKCk7XG5cblx0XHRpZiAodGhpcy5zZXR0aW5ncy5sb29wKSB7XG5cdFx0XHRpZiAoIXRoaXMuc2V0dGluZ3MucmV3aW5kICYmIE1hdGguYWJzKGRpc3RhbmNlKSA+IGl0ZW1zIC8gMikge1xuXHRcdFx0XHRkaXN0YW5jZSArPSBkaXJlY3Rpb24gKiAtMSAqIGl0ZW1zO1xuXHRcdFx0fVxuXG5cdFx0XHRwb3NpdGlvbiA9IGN1cnJlbnQgKyBkaXN0YW5jZTtcblx0XHRcdHJldmVydCA9ICgocG9zaXRpb24gLSBtaW5pbXVtKSAlIGl0ZW1zICsgaXRlbXMpICUgaXRlbXMgKyBtaW5pbXVtO1xuXG5cdFx0XHRpZiAocmV2ZXJ0ICE9PSBwb3NpdGlvbiAmJiByZXZlcnQgLSBkaXN0YW5jZSA8PSBtYXhpbXVtICYmIHJldmVydCAtIGRpc3RhbmNlID4gMCkge1xuXHRcdFx0XHRjdXJyZW50ID0gcmV2ZXJ0IC0gZGlzdGFuY2U7XG5cdFx0XHRcdHBvc2l0aW9uID0gcmV2ZXJ0O1xuXHRcdFx0XHR0aGlzLnJlc2V0KGN1cnJlbnQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodGhpcy5zZXR0aW5ncy5yZXdpbmQpIHtcblx0XHRcdG1heGltdW0gKz0gMTtcblx0XHRcdHBvc2l0aW9uID0gKHBvc2l0aW9uICUgbWF4aW11bSArIG1heGltdW0pICUgbWF4aW11bTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cG9zaXRpb24gPSBNYXRoLm1heChtaW5pbXVtLCBNYXRoLm1pbihtYXhpbXVtLCBwb3NpdGlvbikpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3BlZWQodGhpcy5kdXJhdGlvbihjdXJyZW50LCBwb3NpdGlvbiwgc3BlZWQpKTtcblx0XHR0aGlzLmN1cnJlbnQocG9zaXRpb24pO1xuXG5cdFx0aWYgKHRoaXMuJGVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHtcblx0XHRcdHRoaXMudXBkYXRlKCk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBTbGlkZXMgdG8gdGhlIG5leHQgaXRlbS5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gW3NwZWVkXSAtIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHRyYW5zaXRpb24uXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbihzcGVlZCkge1xuXHRcdHNwZWVkID0gc3BlZWQgfHwgZmFsc2U7XG5cdFx0dGhpcy50byh0aGlzLnJlbGF0aXZlKHRoaXMuY3VycmVudCgpKSArIDEsIHNwZWVkKTtcblx0fTtcblxuXHQvKipcblx0ICogU2xpZGVzIHRvIHRoZSBwcmV2aW91cyBpdGVtLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbc3BlZWRdIC0gVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgdHJhbnNpdGlvbi5cblx0ICovXG5cdE93bC5wcm90b3R5cGUucHJldiA9IGZ1bmN0aW9uKHNwZWVkKSB7XG5cdFx0c3BlZWQgPSBzcGVlZCB8fCBmYWxzZTtcblx0XHR0aGlzLnRvKHRoaXMucmVsYXRpdmUodGhpcy5jdXJyZW50KCkpIC0gMSwgc3BlZWQpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBlbmQgb2YgYW4gYW5pbWF0aW9uLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IGFyZ3VtZW50cy5cblx0ICovXG5cdE93bC5wcm90b3R5cGUub25UcmFuc2l0aW9uRW5kID0gZnVuY3Rpb24oZXZlbnQpIHtcblxuXHRcdC8vIGlmIGNzczIgYW5pbWF0aW9uIHRoZW4gZXZlbnQgb2JqZWN0IGlzIHVuZGVmaW5lZFxuXHRcdGlmIChldmVudCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdFx0Ly8gQ2F0Y2ggb25seSBvd2wtc3RhZ2UgdHJhbnNpdGlvbkVuZCBldmVudFxuXHRcdFx0aWYgKChldmVudC50YXJnZXQgfHwgZXZlbnQuc3JjRWxlbWVudCB8fCBldmVudC5vcmlnaW5hbFRhcmdldCkgIT09IHRoaXMuJHN0YWdlLmdldCgwKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5sZWF2ZSgnYW5pbWF0aW5nJyk7XG5cdFx0dGhpcy50cmlnZ2VyKCd0cmFuc2xhdGVkJyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgdmlld3BvcnQgd2lkdGguXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHJldHVybiB7TnVtYmVyfSAtIFRoZSB3aWR0aCBpbiBwaXhlbC5cblx0ICovXG5cdE93bC5wcm90b3R5cGUudmlld3BvcnQgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgd2lkdGg7XG5cdFx0aWYgKHRoaXMub3B0aW9ucy5yZXNwb25zaXZlQmFzZUVsZW1lbnQgIT09IHdpbmRvdykge1xuXHRcdFx0d2lkdGggPSAkKHRoaXMub3B0aW9ucy5yZXNwb25zaXZlQmFzZUVsZW1lbnQpLndpZHRoKCk7XG5cdFx0fSBlbHNlIGlmICh3aW5kb3cuaW5uZXJXaWR0aCkge1xuXHRcdFx0d2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcblx0XHR9IGVsc2UgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpIHtcblx0XHRcdHdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyAnQ2FuIG5vdCBkZXRlY3Qgdmlld3BvcnQgd2lkdGguJztcblx0XHR9XG5cdFx0cmV0dXJuIHdpZHRoO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXBsYWNlcyB0aGUgY3VycmVudCBjb250ZW50LlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8alF1ZXJ5fFN0cmluZ30gY29udGVudCAtIFRoZSBuZXcgY29udGVudC5cblx0ICovXG5cdE93bC5wcm90b3R5cGUucmVwbGFjZSA9IGZ1bmN0aW9uKGNvbnRlbnQpIHtcblx0XHR0aGlzLiRzdGFnZS5lbXB0eSgpO1xuXHRcdHRoaXMuX2l0ZW1zID0gW107XG5cblx0XHRpZiAoY29udGVudCkge1xuXHRcdFx0Y29udGVudCA9IChjb250ZW50IGluc3RhbmNlb2YgalF1ZXJ5KSA/IGNvbnRlbnQgOiAkKGNvbnRlbnQpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnNldHRpbmdzLm5lc3RlZEl0ZW1TZWxlY3Rvcikge1xuXHRcdFx0Y29udGVudCA9IGNvbnRlbnQuZmluZCgnLicgKyB0aGlzLnNldHRpbmdzLm5lc3RlZEl0ZW1TZWxlY3Rvcik7XG5cdFx0fVxuXG5cdFx0Y29udGVudC5maWx0ZXIoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5ub2RlVHlwZSA9PT0gMTtcblx0XHR9KS5lYWNoKCQucHJveHkoZnVuY3Rpb24oaW5kZXgsIGl0ZW0pIHtcblx0XHRcdGl0ZW0gPSB0aGlzLnByZXBhcmUoaXRlbSk7XG5cdFx0XHR0aGlzLiRzdGFnZS5hcHBlbmQoaXRlbSk7XG5cdFx0XHR0aGlzLl9pdGVtcy5wdXNoKGl0ZW0pO1xuXHRcdFx0dGhpcy5fbWVyZ2Vycy5wdXNoKGl0ZW0uZmluZCgnW2RhdGEtbWVyZ2VdJykuYW5kU2VsZignW2RhdGEtbWVyZ2VdJykuYXR0cignZGF0YS1tZXJnZScpICogMSB8fCAxKTtcblx0XHR9LCB0aGlzKSk7XG5cblx0XHR0aGlzLnJlc2V0KHRoaXMuaXNOdW1lcmljKHRoaXMuc2V0dGluZ3Muc3RhcnRQb3NpdGlvbikgPyB0aGlzLnNldHRpbmdzLnN0YXJ0UG9zaXRpb24gOiAwKTtcblxuXHRcdHRoaXMuaW52YWxpZGF0ZSgnaXRlbXMnKTtcblx0fTtcblxuXHQvKipcblx0ICogQWRkcyBhbiBpdGVtLlxuXHQgKiBAdG9kbyBVc2UgYGl0ZW1gIGluc3RlYWQgb2YgYGNvbnRlbnRgIGZvciB0aGUgZXZlbnQgYXJndW1lbnRzLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8alF1ZXJ5fFN0cmluZ30gY29udGVudCAtIFRoZSBpdGVtIGNvbnRlbnQgdG8gYWRkLlxuXHQgKiBAcGFyYW0ge051bWJlcn0gW3Bvc2l0aW9uXSAtIFRoZSByZWxhdGl2ZSBwb3NpdGlvbiBhdCB3aGljaCB0byBpbnNlcnQgdGhlIGl0ZW0gb3RoZXJ3aXNlIHRoZSBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZC5cblx0ICovXG5cdE93bC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oY29udGVudCwgcG9zaXRpb24pIHtcblx0XHR2YXIgY3VycmVudCA9IHRoaXMucmVsYXRpdmUodGhpcy5fY3VycmVudCk7XG5cblx0XHRwb3NpdGlvbiA9IHBvc2l0aW9uID09PSB1bmRlZmluZWQgPyB0aGlzLl9pdGVtcy5sZW5ndGggOiB0aGlzLm5vcm1hbGl6ZShwb3NpdGlvbiwgdHJ1ZSk7XG5cdFx0Y29udGVudCA9IGNvbnRlbnQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZW50IDogJChjb250ZW50KTtcblxuXHRcdHRoaXMudHJpZ2dlcignYWRkJywgeyBjb250ZW50OiBjb250ZW50LCBwb3NpdGlvbjogcG9zaXRpb24gfSk7XG5cblx0XHRjb250ZW50ID0gdGhpcy5wcmVwYXJlKGNvbnRlbnQpO1xuXG5cdFx0aWYgKHRoaXMuX2l0ZW1zLmxlbmd0aCA9PT0gMCB8fCBwb3NpdGlvbiA9PT0gdGhpcy5faXRlbXMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLl9pdGVtcy5sZW5ndGggPT09IDAgJiYgdGhpcy4kc3RhZ2UuYXBwZW5kKGNvbnRlbnQpO1xuXHRcdFx0dGhpcy5faXRlbXMubGVuZ3RoICE9PSAwICYmIHRoaXMuX2l0ZW1zW3Bvc2l0aW9uIC0gMV0uYWZ0ZXIoY29udGVudCk7XG5cdFx0XHR0aGlzLl9pdGVtcy5wdXNoKGNvbnRlbnQpO1xuXHRcdFx0dGhpcy5fbWVyZ2Vycy5wdXNoKGNvbnRlbnQuZmluZCgnW2RhdGEtbWVyZ2VdJykuYW5kU2VsZignW2RhdGEtbWVyZ2VdJykuYXR0cignZGF0YS1tZXJnZScpICogMSB8fCAxKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5faXRlbXNbcG9zaXRpb25dLmJlZm9yZShjb250ZW50KTtcblx0XHRcdHRoaXMuX2l0ZW1zLnNwbGljZShwb3NpdGlvbiwgMCwgY29udGVudCk7XG5cdFx0XHR0aGlzLl9tZXJnZXJzLnNwbGljZShwb3NpdGlvbiwgMCwgY29udGVudC5maW5kKCdbZGF0YS1tZXJnZV0nKS5hbmRTZWxmKCdbZGF0YS1tZXJnZV0nKS5hdHRyKCdkYXRhLW1lcmdlJykgKiAxIHx8IDEpO1xuXHRcdH1cblxuXHRcdHRoaXMuX2l0ZW1zW2N1cnJlbnRdICYmIHRoaXMucmVzZXQodGhpcy5faXRlbXNbY3VycmVudF0uaW5kZXgoKSk7XG5cblx0XHR0aGlzLmludmFsaWRhdGUoJ2l0ZW1zJyk7XG5cblx0XHR0aGlzLnRyaWdnZXIoJ2FkZGVkJywgeyBjb250ZW50OiBjb250ZW50LCBwb3NpdGlvbjogcG9zaXRpb24gfSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYW4gaXRlbSBieSBpdHMgcG9zaXRpb24uXG5cdCAqIEB0b2RvIFVzZSBgaXRlbWAgaW5zdGVhZCBvZiBgY29udGVudGAgZm9yIHRoZSBldmVudCBhcmd1bWVudHMuXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uIC0gVGhlIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSBpdGVtIHRvIHJlbW92ZS5cblx0ICovXG5cdE93bC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24ocG9zaXRpb24pIHtcblx0XHRwb3NpdGlvbiA9IHRoaXMubm9ybWFsaXplKHBvc2l0aW9uLCB0cnVlKTtcblxuXHRcdGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy50cmlnZ2VyKCdyZW1vdmUnLCB7IGNvbnRlbnQ6IHRoaXMuX2l0ZW1zW3Bvc2l0aW9uXSwgcG9zaXRpb246IHBvc2l0aW9uIH0pO1xuXG5cdFx0dGhpcy5faXRlbXNbcG9zaXRpb25dLnJlbW92ZSgpO1xuXHRcdHRoaXMuX2l0ZW1zLnNwbGljZShwb3NpdGlvbiwgMSk7XG5cdFx0dGhpcy5fbWVyZ2Vycy5zcGxpY2UocG9zaXRpb24sIDEpO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlKCdpdGVtcycpO1xuXG5cdFx0dGhpcy50cmlnZ2VyKCdyZW1vdmVkJywgeyBjb250ZW50OiBudWxsLCBwb3NpdGlvbjogcG9zaXRpb24gfSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFByZWxvYWRzIGltYWdlcyB3aXRoIGF1dG8gd2lkdGguXG5cdCAqIEB0b2RvIFJlcGxhY2UgYnkgYSBtb3JlIGdlbmVyaWMgYXBwcm9hY2hcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5wcmVsb2FkQXV0b1dpZHRoSW1hZ2VzID0gZnVuY3Rpb24oaW1hZ2VzKSB7XG5cdFx0aW1hZ2VzLmVhY2goJC5wcm94eShmdW5jdGlvbihpLCBlbGVtZW50KSB7XG5cdFx0XHR0aGlzLmVudGVyKCdwcmUtbG9hZGluZycpO1xuXHRcdFx0ZWxlbWVudCA9ICQoZWxlbWVudCk7XG5cdFx0XHQkKG5ldyBJbWFnZSgpKS5vbmUoJ2xvYWQnLCAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0ZWxlbWVudC5hdHRyKCdzcmMnLCBlLnRhcmdldC5zcmMpO1xuXHRcdFx0XHRlbGVtZW50LmNzcygnb3BhY2l0eScsIDEpO1xuXHRcdFx0XHR0aGlzLmxlYXZlKCdwcmUtbG9hZGluZycpO1xuXHRcdFx0XHQhdGhpcy5pcygncHJlLWxvYWRpbmcnKSAmJiAhdGhpcy5pcygnaW5pdGlhbGl6aW5nJykgJiYgdGhpcy5yZWZyZXNoKCk7XG5cdFx0XHR9LCB0aGlzKSkuYXR0cignc3JjJywgZWxlbWVudC5hdHRyKCdzcmMnKSB8fCBlbGVtZW50LmF0dHIoJ2RhdGEtc3JjJykgfHwgZWxlbWVudC5hdHRyKCdkYXRhLXNyYy1yZXRpbmEnKSk7XG5cdFx0fSwgdGhpcykpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZXN0cm95cyB0aGUgY2Fyb3VzZWwuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdE93bC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0dGhpcy4kZWxlbWVudC5vZmYoJy5vd2wuY29yZScpO1xuXHRcdHRoaXMuJHN0YWdlLm9mZignLm93bC5jb3JlJyk7XG5cdFx0JChkb2N1bWVudCkub2ZmKCcub3dsLmNvcmUnKTtcblxuXHRcdGlmICh0aGlzLnNldHRpbmdzLnJlc3BvbnNpdmUgIT09IGZhbHNlKSB7XG5cdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZXIpO1xuXHRcdFx0dGhpcy5vZmYod2luZG93LCAncmVzaXplJywgdGhpcy5faGFuZGxlcnMub25UaHJvdHRsZWRSZXNpemUpO1xuXHRcdH1cblxuXHRcdGZvciAodmFyIGkgaW4gdGhpcy5fcGx1Z2lucykge1xuXHRcdFx0dGhpcy5fcGx1Z2luc1tpXS5kZXN0cm95KCk7XG5cdFx0fVxuXG5cdFx0dGhpcy4kc3RhZ2UuY2hpbGRyZW4oJy5jbG9uZWQnKS5yZW1vdmUoKTtcblxuXHRcdHRoaXMuJHN0YWdlLnVud3JhcCgpO1xuXHRcdHRoaXMuJHN0YWdlLmNoaWxkcmVuKCkuY29udGVudHMoKS51bndyYXAoKTtcblx0XHR0aGlzLiRzdGFnZS5jaGlsZHJlbigpLnVud3JhcCgpO1xuXG5cdFx0dGhpcy4kZWxlbWVudFxuXHRcdFx0LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5yZWZyZXNoQ2xhc3MpXG5cdFx0XHQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmxvYWRpbmdDbGFzcylcblx0XHRcdC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMubG9hZGVkQ2xhc3MpXG5cdFx0XHQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLnJ0bENsYXNzKVxuXHRcdFx0LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5kcmFnQ2xhc3MpXG5cdFx0XHQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmdyYWJDbGFzcylcblx0XHRcdC5hdHRyKCdjbGFzcycsIHRoaXMuJGVsZW1lbnQuYXR0cignY2xhc3MnKS5yZXBsYWNlKG5ldyBSZWdFeHAodGhpcy5vcHRpb25zLnJlc3BvbnNpdmVDbGFzcyArICctXFxcXFMrXFxcXHMnLCAnZycpLCAnJykpXG5cdFx0XHQucmVtb3ZlRGF0YSgnb3dsLmNhcm91c2VsJyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIE9wZXJhdG9ycyB0byBjYWxjdWxhdGUgcmlnaHQtdG8tbGVmdCBhbmQgbGVmdC10by1yaWdodC5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2FdIC0gVGhlIGxlZnQgc2lkZSBvcGVyYW5kLlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gW29dIC0gVGhlIG9wZXJhdG9yLlxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2JdIC0gVGhlIHJpZ2h0IHNpZGUgb3BlcmFuZC5cblx0ICovXG5cdE93bC5wcm90b3R5cGUub3AgPSBmdW5jdGlvbihhLCBvLCBiKSB7XG5cdFx0dmFyIHJ0bCA9IHRoaXMuc2V0dGluZ3MucnRsO1xuXHRcdHN3aXRjaCAobykge1xuXHRcdFx0Y2FzZSAnPCc6XG5cdFx0XHRcdHJldHVybiBydGwgPyBhID4gYiA6IGEgPCBiO1xuXHRcdFx0Y2FzZSAnPic6XG5cdFx0XHRcdHJldHVybiBydGwgPyBhIDwgYiA6IGEgPiBiO1xuXHRcdFx0Y2FzZSAnPj0nOlxuXHRcdFx0XHRyZXR1cm4gcnRsID8gYSA8PSBiIDogYSA+PSBiO1xuXHRcdFx0Y2FzZSAnPD0nOlxuXHRcdFx0XHRyZXR1cm4gcnRsID8gYSA+PSBiIDogYSA8PSBiO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBBdHRhY2hlcyB0byBhbiBpbnRlcm5hbCBldmVudC5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50IC0gVGhlIGV2ZW50IHNvdXJjZS5cblx0ICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IG5hbWUuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIC0gVGhlIGV2ZW50IGhhbmRsZXIgdG8gYXR0YWNoLlxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGNhcHR1cmUgLSBXZXRoZXIgdGhlIGV2ZW50IHNob3VsZCBiZSBoYW5kbGVkIGF0IHRoZSBjYXB0dXJpbmcgcGhhc2Ugb3Igbm90LlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50LCBsaXN0ZW5lciwgY2FwdHVyZSkge1xuXHRcdGlmIChlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHtcblx0XHRcdGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIGNhcHR1cmUpO1xuXHRcdH0gZWxzZSBpZiAoZWxlbWVudC5hdHRhY2hFdmVudCkge1xuXHRcdFx0ZWxlbWVudC5hdHRhY2hFdmVudCgnb24nICsgZXZlbnQsIGxpc3RlbmVyKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIERldGFjaGVzIGZyb20gYW4gaW50ZXJuYWwgZXZlbnQuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFRoZSBldmVudCBzb3VyY2UuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBldmVudCAtIFRoZSBldmVudCBuYW1lLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFRoZSBhdHRhY2hlZCBldmVudCBoYW5kbGVyIHRvIGRldGFjaC5cblx0ICogQHBhcmFtIHtCb29sZWFufSBjYXB0dXJlIC0gV2V0aGVyIHRoZSBhdHRhY2hlZCBldmVudCBoYW5kbGVyIHdhcyByZWdpc3RlcmVkIGFzIGEgY2FwdHVyaW5nIGxpc3RlbmVyIG9yIG5vdC5cblx0ICovXG5cdE93bC5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24oZWxlbWVudCwgZXZlbnQsIGxpc3RlbmVyLCBjYXB0dXJlKSB7XG5cdFx0aWYgKGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcikge1xuXHRcdFx0ZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwgY2FwdHVyZSk7XG5cdFx0fSBlbHNlIGlmIChlbGVtZW50LmRldGFjaEV2ZW50KSB7XG5cdFx0XHRlbGVtZW50LmRldGFjaEV2ZW50KCdvbicgKyBldmVudCwgbGlzdGVuZXIpO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogVHJpZ2dlcnMgYSBwdWJsaWMgZXZlbnQuXG5cdCAqIEB0b2RvIFJlbW92ZSBgc3RhdHVzYCwgYHJlbGF0ZWRUYXJnZXRgIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBUaGUgZXZlbnQgbmFtZS5cblx0ICogQHBhcmFtIHsqfSBbZGF0YT1udWxsXSAtIFRoZSBldmVudCBkYXRhLlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gW25hbWVzcGFjZT1jYXJvdXNlbF0gLSBUaGUgZXZlbnQgbmFtZXNwYWNlLlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gW3N0YXRlXSAtIFRoZSBzdGF0ZSB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50LlxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtlbnRlcj1mYWxzZV0gLSBJbmRpY2F0ZXMgaWYgdGhlIGNhbGwgZW50ZXJzIHRoZSBzcGVjaWZpZWQgc3RhdGUgb3Igbm90LlxuXHQgKiBAcmV0dXJucyB7RXZlbnR9IC0gVGhlIGV2ZW50IGFyZ3VtZW50cy5cblx0ICovXG5cdE93bC5wcm90b3R5cGUudHJpZ2dlciA9IGZ1bmN0aW9uKG5hbWUsIGRhdGEsIG5hbWVzcGFjZSwgc3RhdGUsIGVudGVyKSB7XG5cdFx0dmFyIHN0YXR1cyA9IHtcblx0XHRcdGl0ZW06IHsgY291bnQ6IHRoaXMuX2l0ZW1zLmxlbmd0aCwgaW5kZXg6IHRoaXMuY3VycmVudCgpIH1cblx0XHR9LCBoYW5kbGVyID0gJC5jYW1lbENhc2UoXG5cdFx0XHQkLmdyZXAoWyAnb24nLCBuYW1lLCBuYW1lc3BhY2UgXSwgZnVuY3Rpb24odikgeyByZXR1cm4gdiB9KVxuXHRcdFx0XHQuam9pbignLScpLnRvTG93ZXJDYXNlKClcblx0XHQpLCBldmVudCA9ICQuRXZlbnQoXG5cdFx0XHRbIG5hbWUsICdvd2wnLCBuYW1lc3BhY2UgfHwgJ2Nhcm91c2VsJyBdLmpvaW4oJy4nKS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0JC5leHRlbmQoeyByZWxhdGVkVGFyZ2V0OiB0aGlzIH0sIHN0YXR1cywgZGF0YSlcblx0XHQpO1xuXG5cdFx0aWYgKCF0aGlzLl9zdXByZXNzW25hbWVdKSB7XG5cdFx0XHQkLmVhY2godGhpcy5fcGx1Z2lucywgZnVuY3Rpb24obmFtZSwgcGx1Z2luKSB7XG5cdFx0XHRcdGlmIChwbHVnaW4ub25UcmlnZ2VyKSB7XG5cdFx0XHRcdFx0cGx1Z2luLm9uVHJpZ2dlcihldmVudCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLnJlZ2lzdGVyKHsgdHlwZTogT3dsLlR5cGUuRXZlbnQsIG5hbWU6IG5hbWUgfSk7XG5cdFx0XHR0aGlzLiRlbGVtZW50LnRyaWdnZXIoZXZlbnQpO1xuXG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncyAmJiB0eXBlb2YgdGhpcy5zZXR0aW5nc1toYW5kbGVyXSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHR0aGlzLnNldHRpbmdzW2hhbmRsZXJdLmNhbGwodGhpcywgZXZlbnQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBldmVudDtcblx0fTtcblxuXHQvKipcblx0ICogRW50ZXJzIGEgc3RhdGUuXG5cdCAqIEBwYXJhbSBuYW1lIC0gVGhlIHN0YXRlIG5hbWUuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLmVudGVyID0gZnVuY3Rpb24obmFtZSkge1xuXHRcdCQuZWFjaChbIG5hbWUgXS5jb25jYXQodGhpcy5fc3RhdGVzLnRhZ3NbbmFtZV0gfHwgW10pLCAkLnByb3h5KGZ1bmN0aW9uKGksIG5hbWUpIHtcblx0XHRcdGlmICh0aGlzLl9zdGF0ZXMuY3VycmVudFtuYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuX3N0YXRlcy5jdXJyZW50W25hbWVdID0gMDtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fc3RhdGVzLmN1cnJlbnRbbmFtZV0rKztcblx0XHR9LCB0aGlzKSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIExlYXZlcyBhIHN0YXRlLlxuXHQgKiBAcGFyYW0gbmFtZSAtIFRoZSBzdGF0ZSBuYW1lLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5sZWF2ZSA9IGZ1bmN0aW9uKG5hbWUpIHtcblx0XHQkLmVhY2goWyBuYW1lIF0uY29uY2F0KHRoaXMuX3N0YXRlcy50YWdzW25hbWVdIHx8IFtdKSwgJC5wcm94eShmdW5jdGlvbihpLCBuYW1lKSB7XG5cdFx0XHR0aGlzLl9zdGF0ZXMuY3VycmVudFtuYW1lXS0tO1xuXHRcdH0sIHRoaXMpKTtcblx0fTtcblxuXHQvKipcblx0ICogUmVnaXN0ZXJzIGFuIGV2ZW50IG9yIHN0YXRlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgLSBUaGUgZXZlbnQgb3Igc3RhdGUgdG8gcmVnaXN0ZXIuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnJlZ2lzdGVyID0gZnVuY3Rpb24ob2JqZWN0KSB7XG5cdFx0aWYgKG9iamVjdC50eXBlID09PSBPd2wuVHlwZS5FdmVudCkge1xuXHRcdFx0aWYgKCEkLmV2ZW50LnNwZWNpYWxbb2JqZWN0Lm5hbWVdKSB7XG5cdFx0XHRcdCQuZXZlbnQuc3BlY2lhbFtvYmplY3QubmFtZV0gPSB7fTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCEkLmV2ZW50LnNwZWNpYWxbb2JqZWN0Lm5hbWVdLm93bCkge1xuXHRcdFx0XHR2YXIgX2RlZmF1bHQgPSAkLmV2ZW50LnNwZWNpYWxbb2JqZWN0Lm5hbWVdLl9kZWZhdWx0O1xuXHRcdFx0XHQkLmV2ZW50LnNwZWNpYWxbb2JqZWN0Lm5hbWVdLl9kZWZhdWx0ID0gZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRcdGlmIChfZGVmYXVsdCAmJiBfZGVmYXVsdC5hcHBseSAmJiAoIWUubmFtZXNwYWNlIHx8IGUubmFtZXNwYWNlLmluZGV4T2YoJ293bCcpID09PSAtMSkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBfZGVmYXVsdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZS5uYW1lc3BhY2UgJiYgZS5uYW1lc3BhY2UuaW5kZXhPZignb3dsJykgPiAtMTtcblx0XHRcdFx0fTtcblx0XHRcdFx0JC5ldmVudC5zcGVjaWFsW29iamVjdC5uYW1lXS5vd2wgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAob2JqZWN0LnR5cGUgPT09IE93bC5UeXBlLlN0YXRlKSB7XG5cdFx0XHRpZiAoIXRoaXMuX3N0YXRlcy50YWdzW29iamVjdC5uYW1lXSkge1xuXHRcdFx0XHR0aGlzLl9zdGF0ZXMudGFnc1tvYmplY3QubmFtZV0gPSBvYmplY3QudGFncztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuX3N0YXRlcy50YWdzW29iamVjdC5uYW1lXSA9IHRoaXMuX3N0YXRlcy50YWdzW29iamVjdC5uYW1lXS5jb25jYXQob2JqZWN0LnRhZ3MpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9zdGF0ZXMudGFnc1tvYmplY3QubmFtZV0gPSAkLmdyZXAodGhpcy5fc3RhdGVzLnRhZ3Nbb2JqZWN0Lm5hbWVdLCAkLnByb3h5KGZ1bmN0aW9uKHRhZywgaSkge1xuXHRcdFx0XHRyZXR1cm4gJC5pbkFycmF5KHRhZywgdGhpcy5fc3RhdGVzLnRhZ3Nbb2JqZWN0Lm5hbWVdKSA9PT0gaTtcblx0XHRcdH0sIHRoaXMpKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFN1cHByZXNzZXMgZXZlbnRzLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7QXJyYXkuPFN0cmluZz59IGV2ZW50cyAtIFRoZSBldmVudHMgdG8gc3VwcHJlc3MuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnN1cHByZXNzID0gZnVuY3Rpb24oZXZlbnRzKSB7XG5cdFx0JC5lYWNoKGV2ZW50cywgJC5wcm94eShmdW5jdGlvbihpbmRleCwgZXZlbnQpIHtcblx0XHRcdHRoaXMuX3N1cHJlc3NbZXZlbnRdID0gdHJ1ZTtcblx0XHR9LCB0aGlzKSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlbGVhc2VzIHN1cHByZXNzZWQgZXZlbnRzLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7QXJyYXkuPFN0cmluZz59IGV2ZW50cyAtIFRoZSBldmVudHMgdG8gcmVsZWFzZS5cblx0ICovXG5cdE93bC5wcm90b3R5cGUucmVsZWFzZSA9IGZ1bmN0aW9uKGV2ZW50cykge1xuXHRcdCQuZWFjaChldmVudHMsICQucHJveHkoZnVuY3Rpb24oaW5kZXgsIGV2ZW50KSB7XG5cdFx0XHRkZWxldGUgdGhpcy5fc3VwcmVzc1tldmVudF07XG5cdFx0fSwgdGhpcykpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHVuaWZpZWQgcG9pbnRlciBjb29yZGluYXRlcyBmcm9tIGV2ZW50LlxuXHQgKiBAdG9kbyAjMjYxXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtFdmVudH0gLSBUaGUgYG1vdXNlZG93bmAgb3IgYHRvdWNoc3RhcnRgIGV2ZW50LlxuXHQgKiBAcmV0dXJucyB7T2JqZWN0fSAtIENvbnRhaW5zIGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzIG9mIGN1cnJlbnQgcG9pbnRlciBwb3NpdGlvbi5cblx0ICovXG5cdE93bC5wcm90b3R5cGUucG9pbnRlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0dmFyIHJlc3VsdCA9IHsgeDogbnVsbCwgeTogbnVsbCB9O1xuXG5cdFx0ZXZlbnQgPSBldmVudC5vcmlnaW5hbEV2ZW50IHx8IGV2ZW50IHx8IHdpbmRvdy5ldmVudDtcblxuXHRcdGV2ZW50ID0gZXZlbnQudG91Y2hlcyAmJiBldmVudC50b3VjaGVzLmxlbmd0aCA/XG5cdFx0XHRldmVudC50b3VjaGVzWzBdIDogZXZlbnQuY2hhbmdlZFRvdWNoZXMgJiYgZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID9cblx0XHRcdFx0ZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gOiBldmVudDtcblxuXHRcdGlmIChldmVudC5wYWdlWCkge1xuXHRcdFx0cmVzdWx0LnggPSBldmVudC5wYWdlWDtcblx0XHRcdHJlc3VsdC55ID0gZXZlbnQucGFnZVk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdC54ID0gZXZlbnQuY2xpZW50WDtcblx0XHRcdHJlc3VsdC55ID0gZXZlbnQuY2xpZW50WTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIGlmIHRoZSBpbnB1dCBpcyBhIE51bWJlciBvciBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29lcmNlZCB0byBhIE51bWJlclxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7TnVtYmVyfFN0cmluZ3xPYmplY3R8QXJyYXl8Qm9vbGVhbnxSZWdFeHB8RnVuY3Rpb258U3ltYm9sfSAtIFRoZSBpbnB1dCB0byBiZSB0ZXN0ZWRcblx0ICogQHJldHVybnMge0Jvb2xlYW59IC0gQW4gaW5kaWNhdGlvbiBpZiB0aGUgaW5wdXQgaXMgYSBOdW1iZXIgb3IgY2FuIGJlIGNvZXJjZWQgdG8gYSBOdW1iZXJcblx0ICovXG5cdE93bC5wcm90b3R5cGUuaXNOdW1lcmljID0gZnVuY3Rpb24obnVtYmVyKSB7XG5cdFx0cmV0dXJuICFpc05hTihwYXJzZUZsb2F0KG51bWJlcikpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBkaWZmZXJlbmNlIG9mIHR3byB2ZWN0b3JzLlxuXHQgKiBAdG9kbyAjMjYxXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtPYmplY3R9IC0gVGhlIGZpcnN0IHZlY3Rvci5cblx0ICogQHBhcmFtIHtPYmplY3R9IC0gVGhlIHNlY29uZCB2ZWN0b3IuXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9IC0gVGhlIGRpZmZlcmVuY2UuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLmRpZmZlcmVuY2UgPSBmdW5jdGlvbihmaXJzdCwgc2Vjb25kKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHg6IGZpcnN0LnggLSBzZWNvbmQueCxcblx0XHRcdHk6IGZpcnN0LnkgLSBzZWNvbmQueVxuXHRcdH07XG5cdH07XG5cblx0LyoqXG5cdCAqIFRoZSBqUXVlcnkgUGx1Z2luIGZvciB0aGUgT3dsIENhcm91c2VsXG5cdCAqIEB0b2RvIE5hdmlnYXRpb24gcGx1Z2luIGBuZXh0YCBhbmQgYHByZXZgXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdCQuZm4ub3dsQ2Fyb3VzZWwgPSBmdW5jdGlvbihvcHRpb24pIHtcblx0XHR2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyICR0aGlzID0gJCh0aGlzKSxcblx0XHRcdFx0ZGF0YSA9ICR0aGlzLmRhdGEoJ293bC5jYXJvdXNlbCcpO1xuXG5cdFx0XHRpZiAoIWRhdGEpIHtcblx0XHRcdFx0ZGF0YSA9IG5ldyBPd2wodGhpcywgdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb24pO1xuXHRcdFx0XHQkdGhpcy5kYXRhKCdvd2wuY2Fyb3VzZWwnLCBkYXRhKTtcblxuXHRcdFx0XHQkLmVhY2goW1xuXHRcdFx0XHRcdCduZXh0JywgJ3ByZXYnLCAndG8nLCAnZGVzdHJveScsICdyZWZyZXNoJywgJ3JlcGxhY2UnLCAnYWRkJywgJ3JlbW92ZSdcblx0XHRcdFx0XSwgZnVuY3Rpb24oaSwgZXZlbnQpIHtcblx0XHRcdFx0XHRkYXRhLnJlZ2lzdGVyKHsgdHlwZTogT3dsLlR5cGUuRXZlbnQsIG5hbWU6IGV2ZW50IH0pO1xuXHRcdFx0XHRcdGRhdGEuJGVsZW1lbnQub24oZXZlbnQgKyAnLm93bC5jYXJvdXNlbC5jb3JlJywgJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgZS5yZWxhdGVkVGFyZ2V0ICE9PSB0aGlzKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuc3VwcHJlc3MoWyBldmVudCBdKTtcblx0XHRcdFx0XHRcdFx0ZGF0YVtldmVudF0uYXBwbHkodGhpcywgW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5yZWxlYXNlKFsgZXZlbnQgXSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSwgZGF0YSkpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycgJiYgb3B0aW9uLmNoYXJBdCgwKSAhPT0gJ18nKSB7XG5cdFx0XHRcdGRhdGFbb3B0aW9uXS5hcHBseShkYXRhLCBhcmdzKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fTtcblxuXHQvKipcblx0ICogVGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgalF1ZXJ5IFBsdWdpblxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHQkLmZuLm93bENhcm91c2VsLkNvbnN0cnVjdG9yID0gT3dsO1xuXG59KSh3aW5kb3cuWmVwdG8gfHwgd2luZG93LmpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7XG5cbi8qKlxuICogQXV0b1JlZnJlc2ggUGx1Z2luXG4gKiBAdmVyc2lvbiAyLjEuMFxuICogQGF1dGhvciBBcnR1cyBLb2xhbm93c2tpXG4gKiBAYXV0aG9yIERhdmlkIERldXRzY2hcbiAqIEBsaWNlbnNlIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICovXG47KGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBhdXRvIHJlZnJlc2ggcGx1Z2luLlxuXHQgKiBAY2xhc3MgVGhlIEF1dG8gUmVmcmVzaCBQbHVnaW5cblx0ICogQHBhcmFtIHtPd2x9IGNhcm91c2VsIC0gVGhlIE93bCBDYXJvdXNlbFxuXHQgKi9cblx0dmFyIEF1dG9SZWZyZXNoID0gZnVuY3Rpb24oY2Fyb3VzZWwpIHtcblx0XHQvKipcblx0XHQgKiBSZWZlcmVuY2UgdG8gdGhlIGNvcmUuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPd2x9XG5cdFx0ICovXG5cdFx0dGhpcy5fY29yZSA9IGNhcm91c2VsO1xuXG5cdFx0LyoqXG5cdFx0ICogUmVmcmVzaCBpbnRlcnZhbC5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge251bWJlcn1cblx0XHQgKi9cblx0XHR0aGlzLl9pbnRlcnZhbCA9IG51bGw7XG5cblx0XHQvKipcblx0XHQgKiBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIGN1cnJlbnRseSB2aXNpYmxlIG9yIG5vdC5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dGhpcy5fdmlzaWJsZSA9IG51bGw7XG5cblx0XHQvKipcblx0XHQgKiBBbGwgZXZlbnQgaGFuZGxlcnMuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dGhpcy5faGFuZGxlcnMgPSB7XG5cdFx0XHQnaW5pdGlhbGl6ZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiB0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9SZWZyZXNoKSB7XG5cdFx0XHRcdFx0dGhpcy53YXRjaCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKVxuXHRcdH07XG5cblx0XHQvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG5cdFx0dGhpcy5fY29yZS5vcHRpb25zID0gJC5leHRlbmQoe30sIEF1dG9SZWZyZXNoLkRlZmF1bHRzLCB0aGlzLl9jb3JlLm9wdGlvbnMpO1xuXG5cdFx0Ly8gcmVnaXN0ZXIgZXZlbnQgaGFuZGxlcnNcblx0XHR0aGlzLl9jb3JlLiRlbGVtZW50Lm9uKHRoaXMuX2hhbmRsZXJzKTtcblx0fTtcblxuXHQvKipcblx0ICogRGVmYXVsdCBvcHRpb25zLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRBdXRvUmVmcmVzaC5EZWZhdWx0cyA9IHtcblx0XHRhdXRvUmVmcmVzaDogdHJ1ZSxcblx0XHRhdXRvUmVmcmVzaEludGVydmFsOiA1MDBcblx0fTtcblxuXHQvKipcblx0ICogV2F0Y2hlcyB0aGUgZWxlbWVudC5cblx0ICovXG5cdEF1dG9SZWZyZXNoLnByb3RvdHlwZS53YXRjaCA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLl9pbnRlcnZhbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX3Zpc2libGUgPSB0aGlzLl9jb3JlLiRlbGVtZW50LmlzKCc6dmlzaWJsZScpO1xuXHRcdHRoaXMuX2ludGVydmFsID0gd2luZG93LnNldEludGVydmFsKCQucHJveHkodGhpcy5yZWZyZXNoLCB0aGlzKSwgdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvUmVmcmVzaEludGVydmFsKTtcblx0fTtcblxuXHQvKipcblx0ICogUmVmcmVzaGVzIHRoZSBlbGVtZW50LlxuXHQgKi9cblx0QXV0b1JlZnJlc2gucHJvdG90eXBlLnJlZnJlc2ggPSBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5fY29yZS4kZWxlbWVudC5pcygnOnZpc2libGUnKSA9PT0gdGhpcy5fdmlzaWJsZSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX3Zpc2libGUgPSAhdGhpcy5fdmlzaWJsZTtcblxuXHRcdHRoaXMuX2NvcmUuJGVsZW1lbnQudG9nZ2xlQ2xhc3MoJ293bC1oaWRkZW4nLCAhdGhpcy5fdmlzaWJsZSk7XG5cblx0XHR0aGlzLl92aXNpYmxlICYmICh0aGlzLl9jb3JlLmludmFsaWRhdGUoJ3dpZHRoJykgJiYgdGhpcy5fY29yZS5yZWZyZXNoKCkpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZXN0cm95cyB0aGUgcGx1Z2luLlxuXHQgKi9cblx0QXV0b1JlZnJlc2gucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgaGFuZGxlciwgcHJvcGVydHk7XG5cblx0XHR3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCk7XG5cblx0XHRmb3IgKGhhbmRsZXIgaW4gdGhpcy5faGFuZGxlcnMpIHtcblx0XHRcdHRoaXMuX2NvcmUuJGVsZW1lbnQub2ZmKGhhbmRsZXIsIHRoaXMuX2hhbmRsZXJzW2hhbmRsZXJdKTtcblx0XHR9XG5cdFx0Zm9yIChwcm9wZXJ0eSBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkge1xuXHRcdFx0dHlwZW9mIHRoaXNbcHJvcGVydHldICE9ICdmdW5jdGlvbicgJiYgKHRoaXNbcHJvcGVydHldID0gbnVsbCk7XG5cdFx0fVxuXHR9O1xuXG5cdCQuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5BdXRvUmVmcmVzaCA9IEF1dG9SZWZyZXNoO1xuXG59KSh3aW5kb3cuWmVwdG8gfHwgd2luZG93LmpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7XG5cbi8qKlxuICogTGF6eSBQbHVnaW5cbiAqIEB2ZXJzaW9uIDIuMS4wXG4gKiBAYXV0aG9yIEJhcnRvc3ogV29qY2llY2hvd3NraVxuICogQGF1dGhvciBEYXZpZCBEZXV0c2NoXG4gKiBAbGljZW5zZSBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqL1xuOyhmdW5jdGlvbigkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgbGF6eSBwbHVnaW4uXG5cdCAqIEBjbGFzcyBUaGUgTGF6eSBQbHVnaW5cblx0ICogQHBhcmFtIHtPd2x9IGNhcm91c2VsIC0gVGhlIE93bCBDYXJvdXNlbFxuXHQgKi9cblx0dmFyIExhenkgPSBmdW5jdGlvbihjYXJvdXNlbCkge1xuXG5cdFx0LyoqXG5cdFx0ICogUmVmZXJlbmNlIHRvIHRoZSBjb3JlLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T3dsfVxuXHRcdCAqL1xuXHRcdHRoaXMuX2NvcmUgPSBjYXJvdXNlbDtcblxuXHRcdC8qKlxuXHRcdCAqIEFscmVhZHkgbG9hZGVkIGl0ZW1zLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7QXJyYXkuPGpRdWVyeT59XG5cdFx0ICovXG5cdFx0dGhpcy5fbG9hZGVkID0gW107XG5cblx0XHQvKipcblx0XHQgKiBFdmVudCBoYW5kbGVycy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0XHR0aGlzLl9oYW5kbGVycyA9IHtcblx0XHRcdCdpbml0aWFsaXplZC5vd2wuY2Fyb3VzZWwgY2hhbmdlLm93bC5jYXJvdXNlbCByZXNpemVkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoIWUubmFtZXNwYWNlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF0aGlzLl9jb3JlLnNldHRpbmdzIHx8ICF0aGlzLl9jb3JlLnNldHRpbmdzLmxhenlMb2FkKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKChlLnByb3BlcnR5ICYmIGUucHJvcGVydHkubmFtZSA9PSAncG9zaXRpb24nKSB8fCBlLnR5cGUgPT0gJ2luaXRpYWxpemVkJykge1xuXHRcdFx0XHRcdHZhciBzZXR0aW5ncyA9IHRoaXMuX2NvcmUuc2V0dGluZ3MsXG5cdFx0XHRcdFx0XHRuID0gKHNldHRpbmdzLmNlbnRlciAmJiBNYXRoLmNlaWwoc2V0dGluZ3MuaXRlbXMgLyAyKSB8fCBzZXR0aW5ncy5pdGVtcyksXG5cdFx0XHRcdFx0XHRpID0gKChzZXR0aW5ncy5jZW50ZXIgJiYgbiAqIC0xKSB8fCAwKSxcblx0XHRcdFx0XHRcdHBvc2l0aW9uID0gKGUucHJvcGVydHkgJiYgZS5wcm9wZXJ0eS52YWx1ZSAhPT0gdW5kZWZpbmVkID8gZS5wcm9wZXJ0eS52YWx1ZSA6IHRoaXMuX2NvcmUuY3VycmVudCgpKSArIGksXG5cdFx0XHRcdFx0XHRjbG9uZXMgPSB0aGlzLl9jb3JlLmNsb25lcygpLmxlbmd0aCxcblx0XHRcdFx0XHRcdGxvYWQgPSAkLnByb3h5KGZ1bmN0aW9uKGksIHYpIHsgdGhpcy5sb2FkKHYpIH0sIHRoaXMpO1xuXG5cdFx0XHRcdFx0d2hpbGUgKGkrKyA8IG4pIHtcblx0XHRcdFx0XHRcdHRoaXMubG9hZChjbG9uZXMgLyAyICsgdGhpcy5fY29yZS5yZWxhdGl2ZShwb3NpdGlvbikpO1xuXHRcdFx0XHRcdFx0Y2xvbmVzICYmICQuZWFjaCh0aGlzLl9jb3JlLmNsb25lcyh0aGlzLl9jb3JlLnJlbGF0aXZlKHBvc2l0aW9uKSksIGxvYWQpO1xuXHRcdFx0XHRcdFx0cG9zaXRpb24rKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpXG5cdFx0fTtcblxuXHRcdC8vIHNldCB0aGUgZGVmYXVsdCBvcHRpb25zXG5cdFx0dGhpcy5fY29yZS5vcHRpb25zID0gJC5leHRlbmQoe30sIExhenkuRGVmYXVsdHMsIHRoaXMuX2NvcmUub3B0aW9ucyk7XG5cblx0XHQvLyByZWdpc3RlciBldmVudCBoYW5kbGVyXG5cdFx0dGhpcy5fY29yZS4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIERlZmF1bHQgb3B0aW9ucy5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0TGF6eS5EZWZhdWx0cyA9IHtcblx0XHRsYXp5TG9hZDogZmFsc2Vcblx0fTtcblxuXHQvKipcblx0ICogTG9hZHMgYWxsIHJlc291cmNlcyBvZiBhbiBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBwb3NpdGlvbiAtIFRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgaXRlbS5cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0TGF6eS5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG5cdFx0dmFyICRpdGVtID0gdGhpcy5fY29yZS4kc3RhZ2UuY2hpbGRyZW4oKS5lcShwb3NpdGlvbiksXG5cdFx0XHQkZWxlbWVudHMgPSAkaXRlbSAmJiAkaXRlbS5maW5kKCcub3dsLWxhenknKTtcblxuXHRcdGlmICghJGVsZW1lbnRzIHx8ICQuaW5BcnJheSgkaXRlbS5nZXQoMCksIHRoaXMuX2xvYWRlZCkgPiAtMSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdCRlbGVtZW50cy5lYWNoKCQucHJveHkoZnVuY3Rpb24oaW5kZXgsIGVsZW1lbnQpIHtcblx0XHRcdHZhciAkZWxlbWVudCA9ICQoZWxlbWVudCksIGltYWdlLFxuXHRcdFx0XHR1cmwgPSAod2luZG93LmRldmljZVBpeGVsUmF0aW8gPiAxICYmICRlbGVtZW50LmF0dHIoJ2RhdGEtc3JjLXJldGluYScpKSB8fCAkZWxlbWVudC5hdHRyKCdkYXRhLXNyYycpO1xuXG5cdFx0XHR0aGlzLl9jb3JlLnRyaWdnZXIoJ2xvYWQnLCB7IGVsZW1lbnQ6ICRlbGVtZW50LCB1cmw6IHVybCB9LCAnbGF6eScpO1xuXG5cdFx0XHRpZiAoJGVsZW1lbnQuaXMoJ2ltZycpKSB7XG5cdFx0XHRcdCRlbGVtZW50Lm9uZSgnbG9hZC5vd2wubGF6eScsICQucHJveHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0JGVsZW1lbnQuY3NzKCdvcGFjaXR5JywgMSk7XG5cdFx0XHRcdFx0dGhpcy5fY29yZS50cmlnZ2VyKCdsb2FkZWQnLCB7IGVsZW1lbnQ6ICRlbGVtZW50LCB1cmw6IHVybCB9LCAnbGF6eScpO1xuXHRcdFx0XHR9LCB0aGlzKSkuYXR0cignc3JjJywgdXJsKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGltYWdlID0gbmV3IEltYWdlKCk7XG5cdFx0XHRcdGltYWdlLm9ubG9hZCA9ICQucHJveHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0JGVsZW1lbnQuY3NzKHtcblx0XHRcdFx0XHRcdCdiYWNrZ3JvdW5kLWltYWdlJzogJ3VybCgnICsgdXJsICsgJyknLFxuXHRcdFx0XHRcdFx0J29wYWNpdHknOiAnMSdcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR0aGlzLl9jb3JlLnRyaWdnZXIoJ2xvYWRlZCcsIHsgZWxlbWVudDogJGVsZW1lbnQsIHVybDogdXJsIH0sICdsYXp5Jyk7XG5cdFx0XHRcdH0sIHRoaXMpO1xuXHRcdFx0XHRpbWFnZS5zcmMgPSB1cmw7XG5cdFx0XHR9XG5cdFx0fSwgdGhpcykpO1xuXG5cdFx0dGhpcy5fbG9hZGVkLnB1c2goJGl0ZW0uZ2V0KDApKTtcblx0fTtcblxuXHQvKipcblx0ICogRGVzdHJveXMgdGhlIHBsdWdpbi5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0TGF6eS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBoYW5kbGVyLCBwcm9wZXJ0eTtcblxuXHRcdGZvciAoaGFuZGxlciBpbiB0aGlzLmhhbmRsZXJzKSB7XG5cdFx0XHR0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihoYW5kbGVyLCB0aGlzLmhhbmRsZXJzW2hhbmRsZXJdKTtcblx0XHR9XG5cdFx0Zm9yIChwcm9wZXJ0eSBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkge1xuXHRcdFx0dHlwZW9mIHRoaXNbcHJvcGVydHldICE9ICdmdW5jdGlvbicgJiYgKHRoaXNbcHJvcGVydHldID0gbnVsbCk7XG5cdFx0fVxuXHR9O1xuXG5cdCQuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5MYXp5ID0gTGF6eTtcblxufSkod2luZG93LlplcHRvIHx8IHdpbmRvdy5qUXVlcnksIHdpbmRvdywgZG9jdW1lbnQpO1xuXG4vKipcbiAqIEF1dG9IZWlnaHQgUGx1Z2luXG4gKiBAdmVyc2lvbiAyLjEuMFxuICogQGF1dGhvciBCYXJ0b3N6IFdvamNpZWNob3dza2lcbiAqIEBhdXRob3IgRGF2aWQgRGV1dHNjaFxuICogQGxpY2Vuc2UgVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKi9cbjsoZnVuY3Rpb24oJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIGF1dG8gaGVpZ2h0IHBsdWdpbi5cblx0ICogQGNsYXNzIFRoZSBBdXRvIEhlaWdodCBQbHVnaW5cblx0ICogQHBhcmFtIHtPd2x9IGNhcm91c2VsIC0gVGhlIE93bCBDYXJvdXNlbFxuXHQgKi9cblx0dmFyIEF1dG9IZWlnaHQgPSBmdW5jdGlvbihjYXJvdXNlbCkge1xuXHRcdC8qKlxuXHRcdCAqIFJlZmVyZW5jZSB0byB0aGUgY29yZS5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge093bH1cblx0XHQgKi9cblx0XHR0aGlzLl9jb3JlID0gY2Fyb3VzZWw7XG5cblx0XHQvKipcblx0XHQgKiBBbGwgZXZlbnQgaGFuZGxlcnMuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dGhpcy5faGFuZGxlcnMgPSB7XG5cdFx0XHQnaW5pdGlhbGl6ZWQub3dsLmNhcm91c2VsIHJlZnJlc2hlZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b0hlaWdodCkge1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J2NoYW5nZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiB0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9IZWlnaHQgJiYgZS5wcm9wZXJ0eS5uYW1lID09ICdwb3NpdGlvbicpe1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J2xvYWRlZC5vd2wubGF6eSc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvSGVpZ2h0XG5cdFx0XHRcdFx0JiYgZS5lbGVtZW50LmNsb3Nlc3QoJy4nICsgdGhpcy5fY29yZS5zZXR0aW5ncy5pdGVtQ2xhc3MpLmluZGV4KCkgPT09IHRoaXMuX2NvcmUuY3VycmVudCgpKSB7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcylcblx0XHR9O1xuXG5cdFx0Ly8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuXHRcdHRoaXMuX2NvcmUub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBBdXRvSGVpZ2h0LkRlZmF1bHRzLCB0aGlzLl9jb3JlLm9wdGlvbnMpO1xuXG5cdFx0Ly8gcmVnaXN0ZXIgZXZlbnQgaGFuZGxlcnNcblx0XHR0aGlzLl9jb3JlLiRlbGVtZW50Lm9uKHRoaXMuX2hhbmRsZXJzKTtcblx0fTtcblxuXHQvKipcblx0ICogRGVmYXVsdCBvcHRpb25zLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRBdXRvSGVpZ2h0LkRlZmF1bHRzID0ge1xuXHRcdGF1dG9IZWlnaHQ6IGZhbHNlLFxuXHRcdGF1dG9IZWlnaHRDbGFzczogJ293bC1oZWlnaHQnXG5cdH07XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIHZpZXcuXG5cdCAqL1xuXHRBdXRvSGVpZ2h0LnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgc3RhcnQgPSB0aGlzLl9jb3JlLl9jdXJyZW50LFxuXHRcdFx0ZW5kID0gc3RhcnQgKyB0aGlzLl9jb3JlLnNldHRpbmdzLml0ZW1zLFxuXHRcdFx0dmlzaWJsZSA9IHRoaXMuX2NvcmUuJHN0YWdlLmNoaWxkcmVuKCkudG9BcnJheSgpLnNsaWNlKHN0YXJ0LCBlbmQpLFxuXHRcdFx0aGVpZ2h0cyA9IFtdLFxuXHRcdFx0bWF4aGVpZ2h0ID0gMDtcblxuXHRcdCQuZWFjaCh2aXNpYmxlLCBmdW5jdGlvbihpbmRleCwgaXRlbSkge1xuXHRcdFx0aGVpZ2h0cy5wdXNoKCQoaXRlbSkuaGVpZ2h0KCkpO1xuXHRcdH0pO1xuXG5cdFx0bWF4aGVpZ2h0ID0gTWF0aC5tYXguYXBwbHkobnVsbCwgaGVpZ2h0cyk7XG5cblx0XHR0aGlzLl9jb3JlLiRzdGFnZS5wYXJlbnQoKVxuXHRcdFx0LmhlaWdodChtYXhoZWlnaHQpXG5cdFx0XHQuYWRkQ2xhc3ModGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvSGVpZ2h0Q2xhc3MpO1xuXHR9O1xuXG5cdEF1dG9IZWlnaHQucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgaGFuZGxlciwgcHJvcGVydHk7XG5cblx0XHRmb3IgKGhhbmRsZXIgaW4gdGhpcy5faGFuZGxlcnMpIHtcblx0XHRcdHRoaXMuX2NvcmUuJGVsZW1lbnQub2ZmKGhhbmRsZXIsIHRoaXMuX2hhbmRsZXJzW2hhbmRsZXJdKTtcblx0XHR9XG5cdFx0Zm9yIChwcm9wZXJ0eSBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkge1xuXHRcdFx0dHlwZW9mIHRoaXNbcHJvcGVydHldICE9ICdmdW5jdGlvbicgJiYgKHRoaXNbcHJvcGVydHldID0gbnVsbCk7XG5cdFx0fVxuXHR9O1xuXG5cdCQuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5BdXRvSGVpZ2h0ID0gQXV0b0hlaWdodDtcblxufSkod2luZG93LlplcHRvIHx8IHdpbmRvdy5qUXVlcnksIHdpbmRvdywgZG9jdW1lbnQpO1xuXG4vKipcbiAqIFZpZGVvIFBsdWdpblxuICogQHZlcnNpb24gMi4xLjBcbiAqIEBhdXRob3IgQmFydG9zeiBXb2pjaWVjaG93c2tpXG4gKiBAYXV0aG9yIERhdmlkIERldXRzY2hcbiAqIEBsaWNlbnNlIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICovXG47KGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSB2aWRlbyBwbHVnaW4uXG5cdCAqIEBjbGFzcyBUaGUgVmlkZW8gUGx1Z2luXG5cdCAqIEBwYXJhbSB7T3dsfSBjYXJvdXNlbCAtIFRoZSBPd2wgQ2Fyb3VzZWxcblx0ICovXG5cdHZhciBWaWRlbyA9IGZ1bmN0aW9uKGNhcm91c2VsKSB7XG5cdFx0LyoqXG5cdFx0ICogUmVmZXJlbmNlIHRvIHRoZSBjb3JlLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T3dsfVxuXHRcdCAqL1xuXHRcdHRoaXMuX2NvcmUgPSBjYXJvdXNlbDtcblxuXHRcdC8qKlxuXHRcdCAqIENhY2hlIGFsbCB2aWRlbyBVUkxzLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHRoaXMuX3ZpZGVvcyA9IHt9O1xuXG5cdFx0LyoqXG5cdFx0ICogQ3VycmVudCBwbGF5aW5nIGl0ZW0uXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtqUXVlcnl9XG5cdFx0ICovXG5cdFx0dGhpcy5fcGxheWluZyA9IG51bGw7XG5cblx0XHQvKipcblx0XHQgKiBBbGwgZXZlbnQgaGFuZGxlcnMuXG5cdFx0ICogQHRvZG8gVGhlIGNsb25lZCBjb250ZW50IHJlbW92YWxlIGlzIHRvbyBsYXRlXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dGhpcy5faGFuZGxlcnMgPSB7XG5cdFx0XHQnaW5pdGlhbGl6ZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSkge1xuXHRcdFx0XHRcdHRoaXMuX2NvcmUucmVnaXN0ZXIoeyB0eXBlOiAnc3RhdGUnLCBuYW1lOiAncGxheWluZycsIHRhZ3M6IFsgJ2ludGVyYWN0aW5nJyBdIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdyZXNpemUub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiB0aGlzLl9jb3JlLnNldHRpbmdzLnZpZGVvICYmIHRoaXMuaXNJbkZ1bGxTY3JlZW4oKSkge1xuXHRcdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQncmVmcmVzaGVkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgdGhpcy5fY29yZS5pcygncmVzaXppbmcnKSkge1xuXHRcdFx0XHRcdHRoaXMuX2NvcmUuJHN0YWdlLmZpbmQoJy5jbG9uZWQgLm93bC12aWRlby1mcmFtZScpLnJlbW92ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdjaGFuZ2VkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgZS5wcm9wZXJ0eS5uYW1lID09PSAncG9zaXRpb24nICYmIHRoaXMuX3BsYXlpbmcpIHtcblx0XHRcdFx0XHR0aGlzLnN0b3AoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQncHJlcGFyZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmICghZS5uYW1lc3BhY2UpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgJGVsZW1lbnQgPSAkKGUuY29udGVudCkuZmluZCgnLm93bC12aWRlbycpO1xuXG5cdFx0XHRcdGlmICgkZWxlbWVudC5sZW5ndGgpIHtcblx0XHRcdFx0XHQkZWxlbWVudC5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuXHRcdFx0XHRcdHRoaXMuZmV0Y2goJGVsZW1lbnQsICQoZS5jb250ZW50KSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpXG5cdFx0fTtcblxuXHRcdC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcblx0XHR0aGlzLl9jb3JlLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgVmlkZW8uRGVmYXVsdHMsIHRoaXMuX2NvcmUub3B0aW9ucyk7XG5cblx0XHQvLyByZWdpc3RlciBldmVudCBoYW5kbGVyc1xuXHRcdHRoaXMuX2NvcmUuJGVsZW1lbnQub24odGhpcy5faGFuZGxlcnMpO1xuXG5cdFx0dGhpcy5fY29yZS4kZWxlbWVudC5vbignY2xpY2sub3dsLnZpZGVvJywgJy5vd2wtdmlkZW8tcGxheS1pY29uJywgJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHR0aGlzLnBsYXkoZSk7XG5cdFx0fSwgdGhpcykpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZWZhdWx0IG9wdGlvbnMuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdFZpZGVvLkRlZmF1bHRzID0ge1xuXHRcdHZpZGVvOiBmYWxzZSxcblx0XHR2aWRlb0hlaWdodDogZmFsc2UsXG5cdFx0dmlkZW9XaWR0aDogZmFsc2Vcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyB0aGUgdmlkZW8gSUQgYW5kIHRoZSB0eXBlIChZb3VUdWJlL1ZpbWVvL3Z6YWFyIG9ubHkpLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7alF1ZXJ5fSB0YXJnZXQgLSBUaGUgdGFyZ2V0IGNvbnRhaW5pbmcgdGhlIHZpZGVvIGRhdGEuXG5cdCAqIEBwYXJhbSB7alF1ZXJ5fSBpdGVtIC0gVGhlIGl0ZW0gY29udGFpbmluZyB0aGUgdmlkZW8uXG5cdCAqL1xuXHRWaWRlby5wcm90b3R5cGUuZmV0Y2ggPSBmdW5jdGlvbih0YXJnZXQsIGl0ZW0pIHtcblx0XHRcdHZhciB0eXBlID0gKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICh0YXJnZXQuYXR0cignZGF0YS12aW1lby1pZCcpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJ3ZpbWVvJztcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHRhcmdldC5hdHRyKCdkYXRhLXZ6YWFyLWlkJykpIHtcblx0XHRcdFx0XHRcdHJldHVybiAndnphYXInXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiAneW91dHViZSc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSgpLFxuXHRcdFx0XHRpZCA9IHRhcmdldC5hdHRyKCdkYXRhLXZpbWVvLWlkJykgfHwgdGFyZ2V0LmF0dHIoJ2RhdGEteW91dHViZS1pZCcpIHx8IHRhcmdldC5hdHRyKCdkYXRhLXZ6YWFyLWlkJyksXG5cdFx0XHRcdHdpZHRoID0gdGFyZ2V0LmF0dHIoJ2RhdGEtd2lkdGgnKSB8fCB0aGlzLl9jb3JlLnNldHRpbmdzLnZpZGVvV2lkdGgsXG5cdFx0XHRcdGhlaWdodCA9IHRhcmdldC5hdHRyKCdkYXRhLWhlaWdodCcpIHx8IHRoaXMuX2NvcmUuc2V0dGluZ3MudmlkZW9IZWlnaHQsXG5cdFx0XHRcdHVybCA9IHRhcmdldC5hdHRyKCdocmVmJyk7XG5cblx0XHRpZiAodXJsKSB7XG5cblx0XHRcdC8qXG5cdFx0XHRcdFx0UGFyc2VzIHRoZSBpZCdzIG91dCBvZiB0aGUgZm9sbG93aW5nIHVybHMgKGFuZCBwcm9iYWJseSBtb3JlKTpcblx0XHRcdFx0XHRodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PTppZFxuXHRcdFx0XHRcdGh0dHBzOi8veW91dHUuYmUvOmlkXG5cdFx0XHRcdFx0aHR0cHM6Ly92aW1lby5jb20vOmlkXG5cdFx0XHRcdFx0aHR0cHM6Ly92aW1lby5jb20vY2hhbm5lbHMvOmNoYW5uZWwvOmlkXG5cdFx0XHRcdFx0aHR0cHM6Ly92aW1lby5jb20vZ3JvdXBzLzpncm91cC92aWRlb3MvOmlkXG5cdFx0XHRcdFx0aHR0cHM6Ly9hcHAudnphYXIuY29tL3ZpZGVvcy86aWRcblxuXHRcdFx0XHRcdFZpc3VhbCBleGFtcGxlOiBodHRwczovL3JlZ2V4cGVyLmNvbS8jKGh0dHAlM0ElN0NodHRwcyUzQSU3QyklNUMlMkYlNUMlMkYocGxheWVyLiU3Q3d3dy4lN0NhcHAuKSUzRih2aW1lbyU1Qy5jb20lN0N5b3V0dShiZSU1Qy5jb20lN0MlNUMuYmUlN0NiZSU1Qy5nb29nbGVhcGlzJTVDLmNvbSklN0N2emFhciU1Qy5jb20pJTVDJTJGKHZpZGVvJTVDJTJGJTdDdmlkZW9zJTVDJTJGJTdDZW1iZWQlNUMlMkYlN0NjaGFubmVscyU1QyUyRi4lMkIlNUMlMkYlN0Nncm91cHMlNUMlMkYuJTJCJTVDJTJGJTdDd2F0Y2glNUMlM0Z2JTNEJTdDdiU1QyUyRiklM0YoJTVCQS1aYS16MC05Ll8lMjUtJTVEKikoJTVDJTI2JTVDUyUyQiklM0Zcblx0XHRcdCovXG5cblx0XHRcdGlkID0gdXJsLm1hdGNoKC8oaHR0cDp8aHR0cHM6fClcXC9cXC8ocGxheWVyLnx3d3cufGFwcC4pPyh2aW1lb1xcLmNvbXx5b3V0dShiZVxcLmNvbXxcXC5iZXxiZVxcLmdvb2dsZWFwaXNcXC5jb20pfHZ6YWFyXFwuY29tKVxcLyh2aWRlb1xcL3x2aWRlb3NcXC98ZW1iZWRcXC98Y2hhbm5lbHNcXC8uK1xcL3xncm91cHNcXC8uK1xcL3x3YXRjaFxcP3Y9fHZcXC8pPyhbQS1aYS16MC05Ll8lLV0qKShcXCZcXFMrKT8vKTtcblxuXHRcdFx0aWYgKGlkWzNdLmluZGV4T2YoJ3lvdXR1JykgPiAtMSkge1xuXHRcdFx0XHR0eXBlID0gJ3lvdXR1YmUnO1xuXHRcdFx0fSBlbHNlIGlmIChpZFszXS5pbmRleE9mKCd2aW1lbycpID4gLTEpIHtcblx0XHRcdFx0dHlwZSA9ICd2aW1lbyc7XG5cdFx0XHR9IGVsc2UgaWYgKGlkWzNdLmluZGV4T2YoJ3Z6YWFyJykgPiAtMSkge1xuXHRcdFx0XHR0eXBlID0gJ3Z6YWFyJztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignVmlkZW8gVVJMIG5vdCBzdXBwb3J0ZWQuJyk7XG5cdFx0XHR9XG5cdFx0XHRpZCA9IGlkWzZdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdmlkZW8gVVJMLicpO1xuXHRcdH1cblxuXHRcdHRoaXMuX3ZpZGVvc1t1cmxdID0ge1xuXHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdGlkOiBpZCxcblx0XHRcdHdpZHRoOiB3aWR0aCxcblx0XHRcdGhlaWdodDogaGVpZ2h0XG5cdFx0fTtcblxuXHRcdGl0ZW0uYXR0cignZGF0YS12aWRlbycsIHVybCk7XG5cblx0XHR0aGlzLnRodW1ibmFpbCh0YXJnZXQsIHRoaXMuX3ZpZGVvc1t1cmxdKTtcblx0fTtcblxuXHQvKipcblx0ICogQ3JlYXRlcyB2aWRlbyB0aHVtYm5haWwuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtqUXVlcnl9IHRhcmdldCAtIFRoZSB0YXJnZXQgY29udGFpbmluZyB0aGUgdmlkZW8gZGF0YS5cblx0ICogQHBhcmFtIHtPYmplY3R9IGluZm8gLSBUaGUgdmlkZW8gaW5mbyBvYmplY3QuXG5cdCAqIEBzZWUgYGZldGNoYFxuXHQgKi9cblx0VmlkZW8ucHJvdG90eXBlLnRodW1ibmFpbCA9IGZ1bmN0aW9uKHRhcmdldCwgdmlkZW8pIHtcblx0XHR2YXIgdG5MaW5rLFxuXHRcdFx0aWNvbixcblx0XHRcdHBhdGgsXG5cdFx0XHRkaW1lbnNpb25zID0gdmlkZW8ud2lkdGggJiYgdmlkZW8uaGVpZ2h0ID8gJ3N0eWxlPVwid2lkdGg6JyArIHZpZGVvLndpZHRoICsgJ3B4O2hlaWdodDonICsgdmlkZW8uaGVpZ2h0ICsgJ3B4O1wiJyA6ICcnLFxuXHRcdFx0Y3VzdG9tVG4gPSB0YXJnZXQuZmluZCgnaW1nJyksXG5cdFx0XHRzcmNUeXBlID0gJ3NyYycsXG5cdFx0XHRsYXp5Q2xhc3MgPSAnJyxcblx0XHRcdHNldHRpbmdzID0gdGhpcy5fY29yZS5zZXR0aW5ncyxcblx0XHRcdGNyZWF0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcblx0XHRcdFx0aWNvbiA9ICc8ZGl2IGNsYXNzPVwib3dsLXZpZGVvLXBsYXktaWNvblwiPjwvZGl2Pic7XG5cblx0XHRcdFx0aWYgKHNldHRpbmdzLmxhenlMb2FkKSB7XG5cdFx0XHRcdFx0dG5MaW5rID0gJzxkaXYgY2xhc3M9XCJvd2wtdmlkZW8tdG4gJyArIGxhenlDbGFzcyArICdcIiAnICsgc3JjVHlwZSArICc9XCInICsgcGF0aCArICdcIj48L2Rpdj4nO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRuTGluayA9ICc8ZGl2IGNsYXNzPVwib3dsLXZpZGVvLXRuXCIgc3R5bGU9XCJvcGFjaXR5OjE7YmFja2dyb3VuZC1pbWFnZTp1cmwoJyArIHBhdGggKyAnKVwiPjwvZGl2Pic7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGFyZ2V0LmFmdGVyKHRuTGluayk7XG5cdFx0XHRcdHRhcmdldC5hZnRlcihpY29uKTtcblx0XHRcdH07XG5cblx0XHQvLyB3cmFwIHZpZGVvIGNvbnRlbnQgaW50byBvd2wtdmlkZW8td3JhcHBlciBkaXZcblx0XHR0YXJnZXQud3JhcCgnPGRpdiBjbGFzcz1cIm93bC12aWRlby13cmFwcGVyXCInICsgZGltZW5zaW9ucyArICc+PC9kaXY+Jyk7XG5cblx0XHRpZiAodGhpcy5fY29yZS5zZXR0aW5ncy5sYXp5TG9hZCkge1xuXHRcdFx0c3JjVHlwZSA9ICdkYXRhLXNyYyc7XG5cdFx0XHRsYXp5Q2xhc3MgPSAnb3dsLWxhenknO1xuXHRcdH1cblxuXHRcdC8vIGN1c3RvbSB0aHVtYm5haWxcblx0XHRpZiAoY3VzdG9tVG4ubGVuZ3RoKSB7XG5cdFx0XHRjcmVhdGUoY3VzdG9tVG4uYXR0cihzcmNUeXBlKSk7XG5cdFx0XHRjdXN0b21Ubi5yZW1vdmUoKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAodmlkZW8udHlwZSA9PT0gJ3lvdXR1YmUnKSB7XG5cdFx0XHRwYXRoID0gXCIvL2ltZy55b3V0dWJlLmNvbS92aS9cIiArIHZpZGVvLmlkICsgXCIvaHFkZWZhdWx0LmpwZ1wiO1xuXHRcdFx0Y3JlYXRlKHBhdGgpO1xuXHRcdH0gZWxzZSBpZiAodmlkZW8udHlwZSA9PT0gJ3ZpbWVvJykge1xuXHRcdFx0JC5hamF4KHtcblx0XHRcdFx0dHlwZTogJ0dFVCcsXG5cdFx0XHRcdHVybDogJy8vdmltZW8uY29tL2FwaS92Mi92aWRlby8nICsgdmlkZW8uaWQgKyAnLmpzb24nLFxuXHRcdFx0XHRqc29ucDogJ2NhbGxiYWNrJyxcblx0XHRcdFx0ZGF0YVR5cGU6ICdqc29ucCcsXG5cdFx0XHRcdHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcblx0XHRcdFx0XHRwYXRoID0gZGF0YVswXS50aHVtYm5haWxfbGFyZ2U7XG5cdFx0XHRcdFx0Y3JlYXRlKHBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKHZpZGVvLnR5cGUgPT09ICd2emFhcicpIHtcblx0XHRcdCQuYWpheCh7XG5cdFx0XHRcdHR5cGU6ICdHRVQnLFxuXHRcdFx0XHR1cmw6ICcvL3Z6YWFyLmNvbS9hcGkvdmlkZW9zLycgKyB2aWRlby5pZCArICcuanNvbicsXG5cdFx0XHRcdGpzb25wOiAnY2FsbGJhY2snLFxuXHRcdFx0XHRkYXRhVHlwZTogJ2pzb25wJyxcblx0XHRcdFx0c3VjY2VzczogZnVuY3Rpb24oZGF0YSkge1xuXHRcdFx0XHRcdHBhdGggPSBkYXRhLmZyYW1lZ3JhYl91cmw7XG5cdFx0XHRcdFx0Y3JlYXRlKHBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFN0b3BzIHRoZSBjdXJyZW50IHZpZGVvLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRWaWRlby5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuX2NvcmUudHJpZ2dlcignc3RvcCcsIG51bGwsICd2aWRlbycpO1xuXHRcdHRoaXMuX3BsYXlpbmcuZmluZCgnLm93bC12aWRlby1mcmFtZScpLnJlbW92ZSgpO1xuXHRcdHRoaXMuX3BsYXlpbmcucmVtb3ZlQ2xhc3MoJ293bC12aWRlby1wbGF5aW5nJyk7XG5cdFx0dGhpcy5fcGxheWluZyA9IG51bGw7XG5cdFx0dGhpcy5fY29yZS5sZWF2ZSgncGxheWluZycpO1xuXHRcdHRoaXMuX2NvcmUudHJpZ2dlcignc3RvcHBlZCcsIG51bGwsICd2aWRlbycpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTdGFydHMgdGhlIGN1cnJlbnQgdmlkZW8uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgYXJndW1lbnRzLlxuXHQgKi9cblx0VmlkZW8ucHJvdG90eXBlLnBsYXkgPSBmdW5jdGlvbihldmVudCkge1xuXHRcdHZhciB0YXJnZXQgPSAkKGV2ZW50LnRhcmdldCksXG5cdFx0XHRpdGVtID0gdGFyZ2V0LmNsb3Nlc3QoJy4nICsgdGhpcy5fY29yZS5zZXR0aW5ncy5pdGVtQ2xhc3MpLFxuXHRcdFx0dmlkZW8gPSB0aGlzLl92aWRlb3NbaXRlbS5hdHRyKCdkYXRhLXZpZGVvJyldLFxuXHRcdFx0d2lkdGggPSB2aWRlby53aWR0aCB8fCAnMTAwJScsXG5cdFx0XHRoZWlnaHQgPSB2aWRlby5oZWlnaHQgfHwgdGhpcy5fY29yZS4kc3RhZ2UuaGVpZ2h0KCksXG5cdFx0XHRodG1sO1xuXG5cdFx0aWYgKHRoaXMuX3BsYXlpbmcpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9jb3JlLmVudGVyKCdwbGF5aW5nJyk7XG5cdFx0dGhpcy5fY29yZS50cmlnZ2VyKCdwbGF5JywgbnVsbCwgJ3ZpZGVvJyk7XG5cblx0XHRpdGVtID0gdGhpcy5fY29yZS5pdGVtcyh0aGlzLl9jb3JlLnJlbGF0aXZlKGl0ZW0uaW5kZXgoKSkpO1xuXG5cdFx0dGhpcy5fY29yZS5yZXNldChpdGVtLmluZGV4KCkpO1xuXG5cdFx0aWYgKHZpZGVvLnR5cGUgPT09ICd5b3V0dWJlJykge1xuXHRcdFx0aHRtbCA9ICc8aWZyYW1lIHdpZHRoPVwiJyArIHdpZHRoICsgJ1wiIGhlaWdodD1cIicgKyBoZWlnaHQgKyAnXCIgc3JjPVwiLy93d3cueW91dHViZS5jb20vZW1iZWQvJyArXG5cdFx0XHRcdHZpZGVvLmlkICsgJz9hdXRvcGxheT0xJnY9JyArIHZpZGVvLmlkICsgJ1wiIGZyYW1lYm9yZGVyPVwiMFwiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT4nO1xuXHRcdH0gZWxzZSBpZiAodmlkZW8udHlwZSA9PT0gJ3ZpbWVvJykge1xuXHRcdFx0aHRtbCA9ICc8aWZyYW1lIHNyYz1cIi8vcGxheWVyLnZpbWVvLmNvbS92aWRlby8nICsgdmlkZW8uaWQgK1xuXHRcdFx0XHQnP2F1dG9wbGF5PTFcIiB3aWR0aD1cIicgKyB3aWR0aCArICdcIiBoZWlnaHQ9XCInICsgaGVpZ2h0ICtcblx0XHRcdFx0J1wiIGZyYW1lYm9yZGVyPVwiMFwiIHdlYmtpdGFsbG93ZnVsbHNjcmVlbiBtb3phbGxvd2Z1bGxzY3JlZW4gYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPic7XG5cdFx0fSBlbHNlIGlmICh2aWRlby50eXBlID09PSAndnphYXInKSB7XG5cdFx0XHRodG1sID0gJzxpZnJhbWUgZnJhbWVib3JkZXI9XCIwXCInICsgJ2hlaWdodD1cIicgKyBoZWlnaHQgKyAnXCInICsgJ3dpZHRoPVwiJyArIHdpZHRoICtcblx0XHRcdFx0J1wiIGFsbG93ZnVsbHNjcmVlbiBtb3phbGxvd2Z1bGxzY3JlZW4gd2Via2l0QWxsb3dGdWxsU2NyZWVuICcgK1xuXHRcdFx0XHQnc3JjPVwiLy92aWV3LnZ6YWFyLmNvbS8nICsgdmlkZW8uaWQgKyAnL3BsYXllcj9hdXRvcGxheT10cnVlXCI+PC9pZnJhbWU+Jztcblx0XHR9XG5cblx0XHQkKCc8ZGl2IGNsYXNzPVwib3dsLXZpZGVvLWZyYW1lXCI+JyArIGh0bWwgKyAnPC9kaXY+JykuaW5zZXJ0QWZ0ZXIoaXRlbS5maW5kKCcub3dsLXZpZGVvJykpO1xuXG5cdFx0dGhpcy5fcGxheWluZyA9IGl0ZW0uYWRkQ2xhc3MoJ293bC12aWRlby1wbGF5aW5nJyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIENoZWNrcyB3aGV0aGVyIGFuIHZpZGVvIGlzIGN1cnJlbnRseSBpbiBmdWxsIHNjcmVlbiBtb2RlIG9yIG5vdC5cblx0ICogQHRvZG8gQmFkIHN0eWxlIGJlY2F1c2UgbG9va3MgbGlrZSBhIHJlYWRvbmx5IG1ldGhvZCBidXQgY2hhbmdlcyBtZW1iZXJzLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEByZXR1cm5zIHtCb29sZWFufVxuXHQgKi9cblx0VmlkZW8ucHJvdG90eXBlLmlzSW5GdWxsU2NyZWVuID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGVsZW1lbnQgPSBkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCB8fCBkb2N1bWVudC5tb3pGdWxsU2NyZWVuRWxlbWVudCB8fFxuXHRcdFx0XHRkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudDtcblxuXHRcdHJldHVybiBlbGVtZW50ICYmICQoZWxlbWVudCkucGFyZW50KCkuaGFzQ2xhc3MoJ293bC12aWRlby1mcmFtZScpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZXN0cm95cyB0aGUgcGx1Z2luLlxuXHQgKi9cblx0VmlkZW8ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgaGFuZGxlciwgcHJvcGVydHk7XG5cblx0XHR0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZignY2xpY2sub3dsLnZpZGVvJyk7XG5cblx0XHRmb3IgKGhhbmRsZXIgaW4gdGhpcy5faGFuZGxlcnMpIHtcblx0XHRcdHRoaXMuX2NvcmUuJGVsZW1lbnQub2ZmKGhhbmRsZXIsIHRoaXMuX2hhbmRsZXJzW2hhbmRsZXJdKTtcblx0XHR9XG5cdFx0Zm9yIChwcm9wZXJ0eSBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkge1xuXHRcdFx0dHlwZW9mIHRoaXNbcHJvcGVydHldICE9ICdmdW5jdGlvbicgJiYgKHRoaXNbcHJvcGVydHldID0gbnVsbCk7XG5cdFx0fVxuXHR9O1xuXG5cdCQuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5WaWRlbyA9IFZpZGVvO1xuXG59KSh3aW5kb3cuWmVwdG8gfHwgd2luZG93LmpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7XG5cbi8qKlxuICogQW5pbWF0ZSBQbHVnaW5cbiAqIEB2ZXJzaW9uIDIuMS4wXG4gKiBAYXV0aG9yIEJhcnRvc3ogV29qY2llY2hvd3NraVxuICogQGF1dGhvciBEYXZpZCBEZXV0c2NoXG4gKiBAbGljZW5zZSBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqL1xuOyhmdW5jdGlvbigkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgYW5pbWF0ZSBwbHVnaW4uXG5cdCAqIEBjbGFzcyBUaGUgTmF2aWdhdGlvbiBQbHVnaW5cblx0ICogQHBhcmFtIHtPd2x9IHNjb3BlIC0gVGhlIE93bCBDYXJvdXNlbFxuXHQgKi9cblx0dmFyIEFuaW1hdGUgPSBmdW5jdGlvbihzY29wZSkge1xuXHRcdHRoaXMuY29yZSA9IHNjb3BlO1xuXHRcdHRoaXMuY29yZS5vcHRpb25zID0gJC5leHRlbmQoe30sIEFuaW1hdGUuRGVmYXVsdHMsIHRoaXMuY29yZS5vcHRpb25zKTtcblx0XHR0aGlzLnN3YXBwaW5nID0gdHJ1ZTtcblx0XHR0aGlzLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuXHRcdHRoaXMubmV4dCA9IHVuZGVmaW5lZDtcblxuXHRcdHRoaXMuaGFuZGxlcnMgPSB7XG5cdFx0XHQnY2hhbmdlLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgZS5wcm9wZXJ0eS5uYW1lID09ICdwb3NpdGlvbicpIHtcblx0XHRcdFx0XHR0aGlzLnByZXZpb3VzID0gdGhpcy5jb3JlLmN1cnJlbnQoKTtcblx0XHRcdFx0XHR0aGlzLm5leHQgPSBlLnByb3BlcnR5LnZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdkcmFnLm93bC5jYXJvdXNlbCBkcmFnZ2VkLm93bC5jYXJvdXNlbCB0cmFuc2xhdGVkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UpIHtcblx0XHRcdFx0XHR0aGlzLnN3YXBwaW5nID0gZS50eXBlID09ICd0cmFuc2xhdGVkJztcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQndHJhbnNsYXRlLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgdGhpcy5zd2FwcGluZyAmJiAodGhpcy5jb3JlLm9wdGlvbnMuYW5pbWF0ZU91dCB8fCB0aGlzLmNvcmUub3B0aW9ucy5hbmltYXRlSW4pKSB7XG5cdFx0XHRcdFx0dGhpcy5zd2FwKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpXG5cdFx0fTtcblxuXHRcdHRoaXMuY29yZS4kZWxlbWVudC5vbih0aGlzLmhhbmRsZXJzKTtcblx0fTtcblxuXHQvKipcblx0ICogRGVmYXVsdCBvcHRpb25zLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRBbmltYXRlLkRlZmF1bHRzID0ge1xuXHRcdGFuaW1hdGVPdXQ6IGZhbHNlLFxuXHRcdGFuaW1hdGVJbjogZmFsc2Vcblx0fTtcblxuXHQvKipcblx0ICogVG9nZ2xlcyB0aGUgYW5pbWF0aW9uIGNsYXNzZXMgd2hlbmV2ZXIgYW4gdHJhbnNsYXRpb25zIHN0YXJ0cy5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcmV0dXJucyB7Qm9vbGVhbnx1bmRlZmluZWR9XG5cdCAqL1xuXHRBbmltYXRlLnByb3RvdHlwZS5zd2FwID0gZnVuY3Rpb24oKSB7XG5cblx0XHRpZiAodGhpcy5jb3JlLnNldHRpbmdzLml0ZW1zICE9PSAxKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCEkLnN1cHBvcnQuYW5pbWF0aW9uIHx8ICEkLnN1cHBvcnQudHJhbnNpdGlvbikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuY29yZS5zcGVlZCgwKTtcblxuXHRcdHZhciBsZWZ0LFxuXHRcdFx0Y2xlYXIgPSAkLnByb3h5KHRoaXMuY2xlYXIsIHRoaXMpLFxuXHRcdFx0cHJldmlvdXMgPSB0aGlzLmNvcmUuJHN0YWdlLmNoaWxkcmVuKCkuZXEodGhpcy5wcmV2aW91cyksXG5cdFx0XHRuZXh0ID0gdGhpcy5jb3JlLiRzdGFnZS5jaGlsZHJlbigpLmVxKHRoaXMubmV4dCksXG5cdFx0XHRpbmNvbWluZyA9IHRoaXMuY29yZS5zZXR0aW5ncy5hbmltYXRlSW4sXG5cdFx0XHRvdXRnb2luZyA9IHRoaXMuY29yZS5zZXR0aW5ncy5hbmltYXRlT3V0O1xuXG5cdFx0aWYgKHRoaXMuY29yZS5jdXJyZW50KCkgPT09IHRoaXMucHJldmlvdXMpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAob3V0Z29pbmcpIHtcblx0XHRcdGxlZnQgPSB0aGlzLmNvcmUuY29vcmRpbmF0ZXModGhpcy5wcmV2aW91cykgLSB0aGlzLmNvcmUuY29vcmRpbmF0ZXModGhpcy5uZXh0KTtcblx0XHRcdHByZXZpb3VzLm9uZSgkLnN1cHBvcnQuYW5pbWF0aW9uLmVuZCwgY2xlYXIpXG5cdFx0XHRcdC5jc3MoIHsgJ2xlZnQnOiBsZWZ0ICsgJ3B4JyB9IClcblx0XHRcdFx0LmFkZENsYXNzKCdhbmltYXRlZCBvd2wtYW5pbWF0ZWQtb3V0Jylcblx0XHRcdFx0LmFkZENsYXNzKG91dGdvaW5nKTtcblx0XHR9XG5cblx0XHRpZiAoaW5jb21pbmcpIHtcblx0XHRcdG5leHQub25lKCQuc3VwcG9ydC5hbmltYXRpb24uZW5kLCBjbGVhcilcblx0XHRcdFx0LmFkZENsYXNzKCdhbmltYXRlZCBvd2wtYW5pbWF0ZWQtaW4nKVxuXHRcdFx0XHQuYWRkQ2xhc3MoaW5jb21pbmcpO1xuXHRcdH1cblx0fTtcblxuXHRBbmltYXRlLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKGUpIHtcblx0XHQkKGUudGFyZ2V0KS5jc3MoIHsgJ2xlZnQnOiAnJyB9IClcblx0XHRcdC5yZW1vdmVDbGFzcygnYW5pbWF0ZWQgb3dsLWFuaW1hdGVkLW91dCBvd2wtYW5pbWF0ZWQtaW4nKVxuXHRcdFx0LnJlbW92ZUNsYXNzKHRoaXMuY29yZS5zZXR0aW5ncy5hbmltYXRlSW4pXG5cdFx0XHQucmVtb3ZlQ2xhc3ModGhpcy5jb3JlLnNldHRpbmdzLmFuaW1hdGVPdXQpO1xuXHRcdHRoaXMuY29yZS5vblRyYW5zaXRpb25FbmQoKTtcblx0fTtcblxuXHQvKipcblx0ICogRGVzdHJveXMgdGhlIHBsdWdpbi5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QW5pbWF0ZS5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBoYW5kbGVyLCBwcm9wZXJ0eTtcblxuXHRcdGZvciAoaGFuZGxlciBpbiB0aGlzLmhhbmRsZXJzKSB7XG5cdFx0XHR0aGlzLmNvcmUuJGVsZW1lbnQub2ZmKGhhbmRsZXIsIHRoaXMuaGFuZGxlcnNbaGFuZGxlcl0pO1xuXHRcdH1cblx0XHRmb3IgKHByb3BlcnR5IGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7XG5cdFx0XHR0eXBlb2YgdGhpc1twcm9wZXJ0eV0gIT0gJ2Z1bmN0aW9uJyAmJiAodGhpc1twcm9wZXJ0eV0gPSBudWxsKTtcblx0XHR9XG5cdH07XG5cblx0JC5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLkFuaW1hdGUgPSBBbmltYXRlO1xuXG59KSh3aW5kb3cuWmVwdG8gfHwgd2luZG93LmpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7XG5cbi8qKlxuICogQXV0b3BsYXkgUGx1Z2luXG4gKiBAdmVyc2lvbiAyLjEuMFxuICogQGF1dGhvciBCYXJ0b3N6IFdvamNpZWNob3dza2lcbiAqIEBhdXRob3IgQXJ0dXMgS29sYW5vd3NraVxuICogQGF1dGhvciBEYXZpZCBEZXV0c2NoXG4gKiBAbGljZW5zZSBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqL1xuOyhmdW5jdGlvbigkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgYXV0b3BsYXkgcGx1Z2luLlxuXHQgKiBAY2xhc3MgVGhlIEF1dG9wbGF5IFBsdWdpblxuXHQgKiBAcGFyYW0ge093bH0gc2NvcGUgLSBUaGUgT3dsIENhcm91c2VsXG5cdCAqL1xuXHR2YXIgQXV0b3BsYXkgPSBmdW5jdGlvbihjYXJvdXNlbCkge1xuXHRcdC8qKlxuXHRcdCAqIFJlZmVyZW5jZSB0byB0aGUgY29yZS5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge093bH1cblx0XHQgKi9cblx0XHR0aGlzLl9jb3JlID0gY2Fyb3VzZWw7XG5cblx0XHQvKipcblx0XHQgKiBUaGUgYXV0b3BsYXkgdGltZW91dC5cblx0XHQgKiBAdHlwZSB7VGltZW91dH1cblx0XHQgKi9cblx0XHR0aGlzLl90aW1lb3V0ID0gbnVsbDtcblxuXHRcdC8qKlxuXHRcdCAqIEluZGljYXRlcyB3aGVuZXZlciB0aGUgYXV0b3BsYXkgaXMgcGF1c2VkLlxuXHRcdCAqIEB0eXBlIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHRoaXMuX3BhdXNlZCA9IGZhbHNlO1xuXG5cdFx0LyoqXG5cdFx0ICogQWxsIGV2ZW50IGhhbmRsZXJzLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHRoaXMuX2hhbmRsZXJzID0ge1xuXHRcdFx0J2NoYW5nZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiBlLnByb3BlcnR5Lm5hbWUgPT09ICdzZXR0aW5ncycpIHtcblx0XHRcdFx0XHRpZiAodGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheSkge1xuXHRcdFx0XHRcdFx0dGhpcy5wbGF5KCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHRoaXMuc3RvcCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChlLm5hbWVzcGFjZSAmJiBlLnByb3BlcnR5Lm5hbWUgPT09ICdwb3NpdGlvbicpIHtcblx0XHRcdFx0XHQvL2NvbnNvbGUubG9nKCdwbGF5PycsIGUpO1xuXHRcdFx0XHRcdGlmICh0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5KSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRBdXRvUGxheUludGVydmFsKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdpbml0aWFsaXplZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b3BsYXkpIHtcblx0XHRcdFx0XHR0aGlzLnBsYXkoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQncGxheS5vd2wuYXV0b3BsYXknOiAkLnByb3h5KGZ1bmN0aW9uKGUsIHQsIHMpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlKSB7XG5cdFx0XHRcdFx0dGhpcy5wbGF5KHQsIHMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdzdG9wLm93bC5hdXRvcGxheSc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UpIHtcblx0XHRcdFx0XHR0aGlzLnN0b3AoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQnbW91c2VvdmVyLm93bC5hdXRvcGxheSc6ICQucHJveHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5SG92ZXJQYXVzZSAmJiB0aGlzLl9jb3JlLmlzKCdyb3RhdGluZycpKSB7XG5cdFx0XHRcdFx0dGhpcy5wYXVzZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdtb3VzZWxlYXZlLm93bC5hdXRvcGxheSc6ICQucHJveHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5SG92ZXJQYXVzZSAmJiB0aGlzLl9jb3JlLmlzKCdyb3RhdGluZycpKSB7XG5cdFx0XHRcdFx0dGhpcy5wbGF5KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J3RvdWNoc3RhcnQub3dsLmNvcmUnOiAkLnByb3h5KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAodGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheUhvdmVyUGF1c2UgJiYgdGhpcy5fY29yZS5pcygncm90YXRpbmcnKSkge1xuXHRcdFx0XHRcdHRoaXMucGF1c2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQndG91Y2hlbmQub3dsLmNvcmUnOiAkLnByb3h5KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAodGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheUhvdmVyUGF1c2UpIHtcblx0XHRcdFx0XHR0aGlzLnBsYXkoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcylcblx0XHR9O1xuXG5cdFx0Ly8gcmVnaXN0ZXIgZXZlbnQgaGFuZGxlcnNcblx0XHR0aGlzLl9jb3JlLiRlbGVtZW50Lm9uKHRoaXMuX2hhbmRsZXJzKTtcblxuXHRcdC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcblx0XHR0aGlzLl9jb3JlLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgQXV0b3BsYXkuRGVmYXVsdHMsIHRoaXMuX2NvcmUub3B0aW9ucyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIERlZmF1bHQgb3B0aW9ucy5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QXV0b3BsYXkuRGVmYXVsdHMgPSB7XG5cdFx0YXV0b3BsYXk6IGZhbHNlLFxuXHRcdGF1dG9wbGF5VGltZW91dDogNTAwMCxcblx0XHRhdXRvcGxheUhvdmVyUGF1c2U6IGZhbHNlLFxuXHRcdGF1dG9wbGF5U3BlZWQ6IGZhbHNlXG5cdH07XG5cblx0LyoqXG5cdCAqIFN0YXJ0cyB0aGUgYXV0b3BsYXkuXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFt0aW1lb3V0XSAtIFRoZSBpbnRlcnZhbCBiZWZvcmUgdGhlIG5leHQgYW5pbWF0aW9uIHN0YXJ0cy5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtzcGVlZF0gLSBUaGUgYW5pbWF0aW9uIHNwZWVkIGZvciB0aGUgYW5pbWF0aW9ucy5cblx0ICovXG5cdEF1dG9wbGF5LnByb3RvdHlwZS5wbGF5ID0gZnVuY3Rpb24odGltZW91dCwgc3BlZWQpIHtcblx0XHR0aGlzLl9wYXVzZWQgPSBmYWxzZTtcblxuXHRcdGlmICh0aGlzLl9jb3JlLmlzKCdyb3RhdGluZycpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fY29yZS5lbnRlcigncm90YXRpbmcnKTtcblxuXHRcdHRoaXMuX3NldEF1dG9QbGF5SW50ZXJ2YWwoKTtcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyBhIG5ldyB0aW1lb3V0XG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbdGltZW91dF0gLSBUaGUgaW50ZXJ2YWwgYmVmb3JlIHRoZSBuZXh0IGFuaW1hdGlvbiBzdGFydHMuXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbc3BlZWRdIC0gVGhlIGFuaW1hdGlvbiBzcGVlZCBmb3IgdGhlIGFuaW1hdGlvbnMuXG5cdCAqIEByZXR1cm4ge1RpbWVvdXR9XG5cdCAqL1xuXHRBdXRvcGxheS5wcm90b3R5cGUuX2dldE5leHRUaW1lb3V0ID0gZnVuY3Rpb24odGltZW91dCwgc3BlZWQpIHtcblx0XHRpZiAoIHRoaXMuX3RpbWVvdXQgKSB7XG5cdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuXHRcdH1cblx0XHRyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoJC5wcm94eShmdW5jdGlvbigpIHtcblx0XHRcdGlmICh0aGlzLl9wYXVzZWQgfHwgdGhpcy5fY29yZS5pcygnYnVzeScpIHx8IHRoaXMuX2NvcmUuaXMoJ2ludGVyYWN0aW5nJykgfHwgZG9jdW1lbnQuaGlkZGVuKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRoaXMuX2NvcmUubmV4dChzcGVlZCB8fCB0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5U3BlZWQpO1xuXHRcdH0sIHRoaXMpLCB0aW1lb3V0IHx8IHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b3BsYXlUaW1lb3V0KTtcblx0fTtcblxuXHQvKipcblx0ICogU2V0cyBhdXRvcGxheSBpbiBtb3Rpb24uXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRBdXRvcGxheS5wcm90b3R5cGUuX3NldEF1dG9QbGF5SW50ZXJ2YWwgPSBmdW5jdGlvbigpIHtcblx0XHR0aGlzLl90aW1lb3V0ID0gdGhpcy5fZ2V0TmV4dFRpbWVvdXQoKTtcblx0fTtcblxuXHQvKipcblx0ICogU3RvcHMgdGhlIGF1dG9wbGF5LlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRBdXRvcGxheS5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy5fY29yZS5pcygncm90YXRpbmcnKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG5cdFx0dGhpcy5fY29yZS5sZWF2ZSgncm90YXRpbmcnKTtcblx0fTtcblxuXHQvKipcblx0ICogU3RvcHMgdGhlIGF1dG9wbGF5LlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRBdXRvcGxheS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMuX2NvcmUuaXMoJ3JvdGF0aW5nJykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9wYXVzZWQgPSB0cnVlO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZXN0cm95cyB0aGUgcGx1Z2luLlxuXHQgKi9cblx0QXV0b3BsYXkucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgaGFuZGxlciwgcHJvcGVydHk7XG5cblx0XHR0aGlzLnN0b3AoKTtcblxuXHRcdGZvciAoaGFuZGxlciBpbiB0aGlzLl9oYW5kbGVycykge1xuXHRcdFx0dGhpcy5fY29yZS4kZWxlbWVudC5vZmYoaGFuZGxlciwgdGhpcy5faGFuZGxlcnNbaGFuZGxlcl0pO1xuXHRcdH1cblx0XHRmb3IgKHByb3BlcnR5IGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7XG5cdFx0XHR0eXBlb2YgdGhpc1twcm9wZXJ0eV0gIT0gJ2Z1bmN0aW9uJyAmJiAodGhpc1twcm9wZXJ0eV0gPSBudWxsKTtcblx0XHR9XG5cdH07XG5cblx0JC5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLmF1dG9wbGF5ID0gQXV0b3BsYXk7XG5cbn0pKHdpbmRvdy5aZXB0byB8fCB3aW5kb3cualF1ZXJ5LCB3aW5kb3csIGRvY3VtZW50KTtcblxuLyoqXG4gKiBOYXZpZ2F0aW9uIFBsdWdpblxuICogQHZlcnNpb24gMi4xLjBcbiAqIEBhdXRob3IgQXJ0dXMgS29sYW5vd3NraVxuICogQGF1dGhvciBEYXZpZCBEZXV0c2NoXG4gKiBAbGljZW5zZSBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqL1xuOyhmdW5jdGlvbigkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBuYXZpZ2F0aW9uIHBsdWdpbi5cblx0ICogQGNsYXNzIFRoZSBOYXZpZ2F0aW9uIFBsdWdpblxuXHQgKiBAcGFyYW0ge093bH0gY2Fyb3VzZWwgLSBUaGUgT3dsIENhcm91c2VsLlxuXHQgKi9cblx0dmFyIE5hdmlnYXRpb24gPSBmdW5jdGlvbihjYXJvdXNlbCkge1xuXHRcdC8qKlxuXHRcdCAqIFJlZmVyZW5jZSB0byB0aGUgY29yZS5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge093bH1cblx0XHQgKi9cblx0XHR0aGlzLl9jb3JlID0gY2Fyb3VzZWw7XG5cblx0XHQvKipcblx0XHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcGx1Z2luIGlzIGluaXRpYWxpemVkIG9yIG5vdC5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge0Jvb2xlYW59XG5cdFx0ICovXG5cdFx0dGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuXHRcdC8qKlxuXHRcdCAqIFRoZSBjdXJyZW50IHBhZ2luZyBpbmRleGVzLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7QXJyYXl9XG5cdFx0ICovXG5cdFx0dGhpcy5fcGFnZXMgPSBbXTtcblxuXHRcdC8qKlxuXHRcdCAqIEFsbCBET00gZWxlbWVudHMgb2YgdGhlIHVzZXIgaW50ZXJmYWNlLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHRoaXMuX2NvbnRyb2xzID0ge307XG5cblx0XHQvKipcblx0XHQgKiBNYXJrdXAgZm9yIGFuIGluZGljYXRvci5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge0FycmF5LjxTdHJpbmc+fVxuXHRcdCAqL1xuXHRcdHRoaXMuX3RlbXBsYXRlcyA9IFtdO1xuXG5cdFx0LyoqXG5cdFx0ICogVGhlIGNhcm91c2VsIGVsZW1lbnQuXG5cdFx0ICogQHR5cGUge2pRdWVyeX1cblx0XHQgKi9cblx0XHR0aGlzLiRlbGVtZW50ID0gdGhpcy5fY29yZS4kZWxlbWVudDtcblxuXHRcdC8qKlxuXHRcdCAqIE92ZXJyaWRkZW4gbWV0aG9kcyBvZiB0aGUgY2Fyb3VzZWwuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dGhpcy5fb3ZlcnJpZGVzID0ge1xuXHRcdFx0bmV4dDogdGhpcy5fY29yZS5uZXh0LFxuXHRcdFx0cHJldjogdGhpcy5fY29yZS5wcmV2LFxuXHRcdFx0dG86IHRoaXMuX2NvcmUudG9cblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQWxsIGV2ZW50IGhhbmRsZXJzLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHRoaXMuX2hhbmRsZXJzID0ge1xuXHRcdFx0J3ByZXBhcmVkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgdGhpcy5fY29yZS5zZXR0aW5ncy5kb3RzRGF0YSkge1xuXHRcdFx0XHRcdHRoaXMuX3RlbXBsYXRlcy5wdXNoKCc8ZGl2IGNsYXNzPVwiJyArIHRoaXMuX2NvcmUuc2V0dGluZ3MuZG90Q2xhc3MgKyAnXCI+JyArXG5cdFx0XHRcdFx0XHQkKGUuY29udGVudCkuZmluZCgnW2RhdGEtZG90XScpLmFkZEJhY2soJ1tkYXRhLWRvdF0nKS5hdHRyKCdkYXRhLWRvdCcpICsgJzwvZGl2PicpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdhZGRlZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIHRoaXMuX2NvcmUuc2V0dGluZ3MuZG90c0RhdGEpIHtcblx0XHRcdFx0XHR0aGlzLl90ZW1wbGF0ZXMuc3BsaWNlKGUucG9zaXRpb24sIDAsIHRoaXMuX3RlbXBsYXRlcy5wb3AoKSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J3JlbW92ZS5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIHRoaXMuX2NvcmUuc2V0dGluZ3MuZG90c0RhdGEpIHtcblx0XHRcdFx0XHR0aGlzLl90ZW1wbGF0ZXMuc3BsaWNlKGUucG9zaXRpb24sIDEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdjaGFuZ2VkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgZS5wcm9wZXJ0eS5uYW1lID09ICdwb3NpdGlvbicpIHtcblx0XHRcdFx0XHR0aGlzLmRyYXcoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQnaW5pdGlhbGl6ZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiAhdGhpcy5faW5pdGlhbGl6ZWQpIHtcblx0XHRcdFx0XHR0aGlzLl9jb3JlLnRyaWdnZXIoJ2luaXRpYWxpemUnLCBudWxsLCAnbmF2aWdhdGlvbicpO1xuXHRcdFx0XHRcdHRoaXMuaW5pdGlhbGl6ZSgpO1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlKCk7XG5cdFx0XHRcdFx0dGhpcy5kcmF3KCk7XG5cdFx0XHRcdFx0dGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHRoaXMuX2NvcmUudHJpZ2dlcignaW5pdGlhbGl6ZWQnLCBudWxsLCAnbmF2aWdhdGlvbicpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdyZWZyZXNoZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiB0aGlzLl9pbml0aWFsaXplZCkge1xuXHRcdFx0XHRcdHRoaXMuX2NvcmUudHJpZ2dlcigncmVmcmVzaCcsIG51bGwsICduYXZpZ2F0aW9uJyk7XG5cdFx0XHRcdFx0dGhpcy51cGRhdGUoKTtcblx0XHRcdFx0XHR0aGlzLmRyYXcoKTtcblx0XHRcdFx0XHR0aGlzLl9jb3JlLnRyaWdnZXIoJ3JlZnJlc2hlZCcsIG51bGwsICduYXZpZ2F0aW9uJyk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpXG5cdFx0fTtcblxuXHRcdC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcblx0XHR0aGlzLl9jb3JlLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgTmF2aWdhdGlvbi5EZWZhdWx0cywgdGhpcy5fY29yZS5vcHRpb25zKTtcblxuXHRcdC8vIHJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzXG5cdFx0dGhpcy4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIERlZmF1bHQgb3B0aW9ucy5cblx0ICogQHB1YmxpY1xuXHQgKiBAdG9kbyBSZW5hbWUgYHNsaWRlQnlgIHRvIGBuYXZCeWBcblx0ICovXG5cdE5hdmlnYXRpb24uRGVmYXVsdHMgPSB7XG5cdFx0bmF2OiBmYWxzZSxcblx0XHRuYXZUZXh0OiBbICdwcmV2JywgJ25leHQnIF0sXG5cdFx0bmF2U3BlZWQ6IGZhbHNlLFxuXHRcdG5hdkVsZW1lbnQ6ICdkaXYnLFxuXHRcdG5hdkNvbnRhaW5lcjogZmFsc2UsXG5cdFx0bmF2Q29udGFpbmVyQ2xhc3M6ICdvd2wtbmF2Jyxcblx0XHRuYXZDbGFzczogWyAnb3dsLXByZXYnLCAnb3dsLW5leHQnIF0sXG5cdFx0c2xpZGVCeTogMSxcblx0XHRkb3RDbGFzczogJ293bC1kb3QnLFxuXHRcdGRvdHNDbGFzczogJ293bC1kb3RzJyxcblx0XHRkb3RzOiB0cnVlLFxuXHRcdGRvdHNFYWNoOiBmYWxzZSxcblx0XHRkb3RzRGF0YTogZmFsc2UsXG5cdFx0ZG90c1NwZWVkOiBmYWxzZSxcblx0XHRkb3RzQ29udGFpbmVyOiBmYWxzZVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplcyB0aGUgbGF5b3V0IG9mIHRoZSBwbHVnaW4gYW5kIGV4dGVuZHMgdGhlIGNhcm91c2VsLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHROYXZpZ2F0aW9uLnByb3RvdHlwZS5pbml0aWFsaXplID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG92ZXJyaWRlLFxuXHRcdFx0c2V0dGluZ3MgPSB0aGlzLl9jb3JlLnNldHRpbmdzO1xuXG5cdFx0Ly8gY3JlYXRlIERPTSBzdHJ1Y3R1cmUgZm9yIHJlbGF0aXZlIG5hdmlnYXRpb25cblx0XHR0aGlzLl9jb250cm9scy4kcmVsYXRpdmUgPSAoc2V0dGluZ3MubmF2Q29udGFpbmVyID8gJChzZXR0aW5ncy5uYXZDb250YWluZXIpXG5cdFx0XHQ6ICQoJzxkaXY+JykuYWRkQ2xhc3Moc2V0dGluZ3MubmF2Q29udGFpbmVyQ2xhc3MpLmFwcGVuZFRvKHRoaXMuJGVsZW1lbnQpKS5hZGRDbGFzcygnZGlzYWJsZWQnKTtcblxuXHRcdHRoaXMuX2NvbnRyb2xzLiRwcmV2aW91cyA9ICQoJzwnICsgc2V0dGluZ3MubmF2RWxlbWVudCArICc+Jylcblx0XHRcdC5hZGRDbGFzcyhzZXR0aW5ncy5uYXZDbGFzc1swXSlcblx0XHRcdC5odG1sKHNldHRpbmdzLm5hdlRleHRbMF0pXG5cdFx0XHQucHJlcGVuZFRvKHRoaXMuX2NvbnRyb2xzLiRyZWxhdGl2ZSlcblx0XHRcdC5vbignY2xpY2snLCAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0dGhpcy5wcmV2KHNldHRpbmdzLm5hdlNwZWVkKTtcblx0XHRcdH0sIHRoaXMpKTtcblx0XHR0aGlzLl9jb250cm9scy4kbmV4dCA9ICQoJzwnICsgc2V0dGluZ3MubmF2RWxlbWVudCArICc+Jylcblx0XHRcdC5hZGRDbGFzcyhzZXR0aW5ncy5uYXZDbGFzc1sxXSlcblx0XHRcdC5odG1sKHNldHRpbmdzLm5hdlRleHRbMV0pXG5cdFx0XHQuYXBwZW5kVG8odGhpcy5fY29udHJvbHMuJHJlbGF0aXZlKVxuXHRcdFx0Lm9uKCdjbGljaycsICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHR0aGlzLm5leHQoc2V0dGluZ3MubmF2U3BlZWQpO1xuXHRcdFx0fSwgdGhpcykpO1xuXG5cdFx0Ly8gY3JlYXRlIERPTSBzdHJ1Y3R1cmUgZm9yIGFic29sdXRlIG5hdmlnYXRpb25cblx0XHRpZiAoIXNldHRpbmdzLmRvdHNEYXRhKSB7XG5cdFx0XHR0aGlzLl90ZW1wbGF0ZXMgPSBbICQoJzxkaXY+Jylcblx0XHRcdFx0LmFkZENsYXNzKHNldHRpbmdzLmRvdENsYXNzKVxuXHRcdFx0XHQuYXBwZW5kKCQoJzxzcGFuPicpKVxuXHRcdFx0XHQucHJvcCgnb3V0ZXJIVE1MJykgXTtcblx0XHR9XG5cblx0XHR0aGlzLl9jb250cm9scy4kYWJzb2x1dGUgPSAoc2V0dGluZ3MuZG90c0NvbnRhaW5lciA/ICQoc2V0dGluZ3MuZG90c0NvbnRhaW5lcilcblx0XHRcdDogJCgnPGRpdj4nKS5hZGRDbGFzcyhzZXR0aW5ncy5kb3RzQ2xhc3MpLmFwcGVuZFRvKHRoaXMuJGVsZW1lbnQpKS5hZGRDbGFzcygnZGlzYWJsZWQnKTtcblxuXHRcdHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5vbignY2xpY2snLCAnZGl2JywgJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHR2YXIgaW5kZXggPSAkKGUudGFyZ2V0KS5wYXJlbnQoKS5pcyh0aGlzLl9jb250cm9scy4kYWJzb2x1dGUpXG5cdFx0XHRcdD8gJChlLnRhcmdldCkuaW5kZXgoKSA6ICQoZS50YXJnZXQpLnBhcmVudCgpLmluZGV4KCk7XG5cblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0dGhpcy50byhpbmRleCwgc2V0dGluZ3MuZG90c1NwZWVkKTtcblx0XHR9LCB0aGlzKSk7XG5cblx0XHQvLyBvdmVycmlkZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgY2Fyb3VzZWxcblx0XHRmb3IgKG92ZXJyaWRlIGluIHRoaXMuX292ZXJyaWRlcykge1xuXHRcdFx0dGhpcy5fY29yZVtvdmVycmlkZV0gPSAkLnByb3h5KHRoaXNbb3ZlcnJpZGVdLCB0aGlzKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIERlc3Ryb3lzIHRoZSBwbHVnaW4uXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdE5hdmlnYXRpb24ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgaGFuZGxlciwgY29udHJvbCwgcHJvcGVydHksIG92ZXJyaWRlO1xuXG5cdFx0Zm9yIChoYW5kbGVyIGluIHRoaXMuX2hhbmRsZXJzKSB7XG5cdFx0XHR0aGlzLiRlbGVtZW50Lm9mZihoYW5kbGVyLCB0aGlzLl9oYW5kbGVyc1toYW5kbGVyXSk7XG5cdFx0fVxuXHRcdGZvciAoY29udHJvbCBpbiB0aGlzLl9jb250cm9scykge1xuXHRcdFx0dGhpcy5fY29udHJvbHNbY29udHJvbF0ucmVtb3ZlKCk7XG5cdFx0fVxuXHRcdGZvciAob3ZlcnJpZGUgaW4gdGhpcy5vdmVyaWRlcykge1xuXHRcdFx0dGhpcy5fY29yZVtvdmVycmlkZV0gPSB0aGlzLl9vdmVycmlkZXNbb3ZlcnJpZGVdO1xuXHRcdH1cblx0XHRmb3IgKHByb3BlcnR5IGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7XG5cdFx0XHR0eXBlb2YgdGhpc1twcm9wZXJ0eV0gIT0gJ2Z1bmN0aW9uJyAmJiAodGhpc1twcm9wZXJ0eV0gPSBudWxsKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGludGVybmFsIHN0YXRlLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHROYXZpZ2F0aW9uLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgaSwgaiwgayxcblx0XHRcdGxvd2VyID0gdGhpcy5fY29yZS5jbG9uZXMoKS5sZW5ndGggLyAyLFxuXHRcdFx0dXBwZXIgPSBsb3dlciArIHRoaXMuX2NvcmUuaXRlbXMoKS5sZW5ndGgsXG5cdFx0XHRtYXhpbXVtID0gdGhpcy5fY29yZS5tYXhpbXVtKHRydWUpLFxuXHRcdFx0c2V0dGluZ3MgPSB0aGlzLl9jb3JlLnNldHRpbmdzLFxuXHRcdFx0c2l6ZSA9IHNldHRpbmdzLmNlbnRlciB8fCBzZXR0aW5ncy5hdXRvV2lkdGggfHwgc2V0dGluZ3MuZG90c0RhdGFcblx0XHRcdFx0PyAxIDogc2V0dGluZ3MuZG90c0VhY2ggfHwgc2V0dGluZ3MuaXRlbXM7XG5cblx0XHRpZiAoc2V0dGluZ3Muc2xpZGVCeSAhPT0gJ3BhZ2UnKSB7XG5cdFx0XHRzZXR0aW5ncy5zbGlkZUJ5ID0gTWF0aC5taW4oc2V0dGluZ3Muc2xpZGVCeSwgc2V0dGluZ3MuaXRlbXMpO1xuXHRcdH1cblxuXHRcdGlmIChzZXR0aW5ncy5kb3RzIHx8IHNldHRpbmdzLnNsaWRlQnkgPT0gJ3BhZ2UnKSB7XG5cdFx0XHR0aGlzLl9wYWdlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKGkgPSBsb3dlciwgaiA9IDAsIGsgPSAwOyBpIDwgdXBwZXI7IGkrKykge1xuXHRcdFx0XHRpZiAoaiA+PSBzaXplIHx8IGogPT09IDApIHtcblx0XHRcdFx0XHR0aGlzLl9wYWdlcy5wdXNoKHtcblx0XHRcdFx0XHRcdHN0YXJ0OiBNYXRoLm1pbihtYXhpbXVtLCBpIC0gbG93ZXIpLFxuXHRcdFx0XHRcdFx0ZW5kOiBpIC0gbG93ZXIgKyBzaXplIC0gMVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGlmIChNYXRoLm1pbihtYXhpbXVtLCBpIC0gbG93ZXIpID09PSBtYXhpbXVtKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aiA9IDAsICsraztcblx0XHRcdFx0fVxuXHRcdFx0XHRqICs9IHRoaXMuX2NvcmUubWVyZ2Vycyh0aGlzLl9jb3JlLnJlbGF0aXZlKGkpKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIERyYXdzIHRoZSB1c2VyIGludGVyZmFjZS5cblx0ICogQHRvZG8gVGhlIG9wdGlvbiBgZG90c0RhdGFgIHdvbnQgd29yay5cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0TmF2aWdhdGlvbi5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBkaWZmZXJlbmNlLFxuXHRcdFx0c2V0dGluZ3MgPSB0aGlzLl9jb3JlLnNldHRpbmdzLFxuXHRcdFx0ZGlzYWJsZWQgPSB0aGlzLl9jb3JlLml0ZW1zKCkubGVuZ3RoIDw9IHNldHRpbmdzLml0ZW1zLFxuXHRcdFx0aW5kZXggPSB0aGlzLl9jb3JlLnJlbGF0aXZlKHRoaXMuX2NvcmUuY3VycmVudCgpKSxcblx0XHRcdGxvb3AgPSBzZXR0aW5ncy5sb29wIHx8IHNldHRpbmdzLnJld2luZDtcblxuXHRcdHRoaXMuX2NvbnRyb2xzLiRyZWxhdGl2ZS50b2dnbGVDbGFzcygnZGlzYWJsZWQnLCAhc2V0dGluZ3MubmF2IHx8IGRpc2FibGVkKTtcblxuXHRcdGlmIChzZXR0aW5ncy5uYXYpIHtcblx0XHRcdHRoaXMuX2NvbnRyb2xzLiRwcmV2aW91cy50b2dnbGVDbGFzcygnZGlzYWJsZWQnLCAhbG9vcCAmJiBpbmRleCA8PSB0aGlzLl9jb3JlLm1pbmltdW0odHJ1ZSkpO1xuXHRcdFx0dGhpcy5fY29udHJvbHMuJG5leHQudG9nZ2xlQ2xhc3MoJ2Rpc2FibGVkJywgIWxvb3AgJiYgaW5kZXggPj0gdGhpcy5fY29yZS5tYXhpbXVtKHRydWUpKTtcblx0XHR9XG5cblx0XHR0aGlzLl9jb250cm9scy4kYWJzb2x1dGUudG9nZ2xlQ2xhc3MoJ2Rpc2FibGVkJywgIXNldHRpbmdzLmRvdHMgfHwgZGlzYWJsZWQpO1xuXG5cdFx0aWYgKHNldHRpbmdzLmRvdHMpIHtcblx0XHRcdGRpZmZlcmVuY2UgPSB0aGlzLl9wYWdlcy5sZW5ndGggLSB0aGlzLl9jb250cm9scy4kYWJzb2x1dGUuY2hpbGRyZW4oKS5sZW5ndGg7XG5cblx0XHRcdGlmIChzZXR0aW5ncy5kb3RzRGF0YSAmJiBkaWZmZXJlbmNlICE9PSAwKSB7XG5cdFx0XHRcdHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5odG1sKHRoaXMuX3RlbXBsYXRlcy5qb2luKCcnKSk7XG5cdFx0XHR9IGVsc2UgaWYgKGRpZmZlcmVuY2UgPiAwKSB7XG5cdFx0XHRcdHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5hcHBlbmQobmV3IEFycmF5KGRpZmZlcmVuY2UgKyAxKS5qb2luKHRoaXMuX3RlbXBsYXRlc1swXSkpO1xuXHRcdFx0fSBlbHNlIGlmIChkaWZmZXJlbmNlIDwgMCkge1xuXHRcdFx0XHR0aGlzLl9jb250cm9scy4kYWJzb2x1dGUuY2hpbGRyZW4oKS5zbGljZShkaWZmZXJlbmNlKS5yZW1vdmUoKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fY29udHJvbHMuJGFic29sdXRlLmZpbmQoJy5hY3RpdmUnKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG5cdFx0XHR0aGlzLl9jb250cm9scy4kYWJzb2x1dGUuY2hpbGRyZW4oKS5lcSgkLmluQXJyYXkodGhpcy5jdXJyZW50KCksIHRoaXMuX3BhZ2VzKSkuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogRXh0ZW5kcyBldmVudCBkYXRhLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IG9iamVjdCB3aGljaCBnZXRzIHRocm93bi5cblx0ICovXG5cdE5hdmlnYXRpb24ucHJvdG90eXBlLm9uVHJpZ2dlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0dmFyIHNldHRpbmdzID0gdGhpcy5fY29yZS5zZXR0aW5ncztcblxuXHRcdGV2ZW50LnBhZ2UgPSB7XG5cdFx0XHRpbmRleDogJC5pbkFycmF5KHRoaXMuY3VycmVudCgpLCB0aGlzLl9wYWdlcyksXG5cdFx0XHRjb3VudDogdGhpcy5fcGFnZXMubGVuZ3RoLFxuXHRcdFx0c2l6ZTogc2V0dGluZ3MgJiYgKHNldHRpbmdzLmNlbnRlciB8fCBzZXR0aW5ncy5hdXRvV2lkdGggfHwgc2V0dGluZ3MuZG90c0RhdGFcblx0XHRcdFx0PyAxIDogc2V0dGluZ3MuZG90c0VhY2ggfHwgc2V0dGluZ3MuaXRlbXMpXG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyB0aGUgY3VycmVudCBwYWdlIHBvc2l0aW9uIG9mIHRoZSBjYXJvdXNlbC5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfVxuXHQgKi9cblx0TmF2aWdhdGlvbi5wcm90b3R5cGUuY3VycmVudCA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBjdXJyZW50ID0gdGhpcy5fY29yZS5yZWxhdGl2ZSh0aGlzLl9jb3JlLmN1cnJlbnQoKSk7XG5cdFx0cmV0dXJuICQuZ3JlcCh0aGlzLl9wYWdlcywgJC5wcm94eShmdW5jdGlvbihwYWdlLCBpbmRleCkge1xuXHRcdFx0cmV0dXJuIHBhZ2Uuc3RhcnQgPD0gY3VycmVudCAmJiBwYWdlLmVuZCA+PSBjdXJyZW50O1xuXHRcdH0sIHRoaXMpKS5wb3AoKTtcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyB0aGUgY3VycmVudCBzdWNjZXNvci9wcmVkZWNlc3NvciBwb3NpdGlvbi5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfVxuXHQgKi9cblx0TmF2aWdhdGlvbi5wcm90b3R5cGUuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbihzdWNjZXNzb3IpIHtcblx0XHR2YXIgcG9zaXRpb24sIGxlbmd0aCxcblx0XHRcdHNldHRpbmdzID0gdGhpcy5fY29yZS5zZXR0aW5ncztcblxuXHRcdGlmIChzZXR0aW5ncy5zbGlkZUJ5ID09ICdwYWdlJykge1xuXHRcdFx0cG9zaXRpb24gPSAkLmluQXJyYXkodGhpcy5jdXJyZW50KCksIHRoaXMuX3BhZ2VzKTtcblx0XHRcdGxlbmd0aCA9IHRoaXMuX3BhZ2VzLmxlbmd0aDtcblx0XHRcdHN1Y2Nlc3NvciA/ICsrcG9zaXRpb24gOiAtLXBvc2l0aW9uO1xuXHRcdFx0cG9zaXRpb24gPSB0aGlzLl9wYWdlc1soKHBvc2l0aW9uICUgbGVuZ3RoKSArIGxlbmd0aCkgJSBsZW5ndGhdLnN0YXJ0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwb3NpdGlvbiA9IHRoaXMuX2NvcmUucmVsYXRpdmUodGhpcy5fY29yZS5jdXJyZW50KCkpO1xuXHRcdFx0bGVuZ3RoID0gdGhpcy5fY29yZS5pdGVtcygpLmxlbmd0aDtcblx0XHRcdHN1Y2Nlc3NvciA/IHBvc2l0aW9uICs9IHNldHRpbmdzLnNsaWRlQnkgOiBwb3NpdGlvbiAtPSBzZXR0aW5ncy5zbGlkZUJ5O1xuXHRcdH1cblxuXHRcdHJldHVybiBwb3NpdGlvbjtcblx0fTtcblxuXHQvKipcblx0ICogU2xpZGVzIHRvIHRoZSBuZXh0IGl0ZW0gb3IgcGFnZS5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gW3NwZWVkPWZhbHNlXSAtIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHRyYW5zaXRpb24uXG5cdCAqL1xuXHROYXZpZ2F0aW9uLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oc3BlZWQpIHtcblx0XHQkLnByb3h5KHRoaXMuX292ZXJyaWRlcy50bywgdGhpcy5fY29yZSkodGhpcy5nZXRQb3NpdGlvbih0cnVlKSwgc3BlZWQpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTbGlkZXMgdG8gdGhlIHByZXZpb3VzIGl0ZW0gb3IgcGFnZS5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gW3NwZWVkPWZhbHNlXSAtIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHRyYW5zaXRpb24uXG5cdCAqL1xuXHROYXZpZ2F0aW9uLnByb3RvdHlwZS5wcmV2ID0gZnVuY3Rpb24oc3BlZWQpIHtcblx0XHQkLnByb3h5KHRoaXMuX292ZXJyaWRlcy50bywgdGhpcy5fY29yZSkodGhpcy5nZXRQb3NpdGlvbihmYWxzZSksIHNwZWVkKTtcblx0fTtcblxuXHQvKipcblx0ICogU2xpZGVzIHRvIHRoZSBzcGVjaWZpZWQgaXRlbSBvciBwYWdlLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSBvciBwYWdlLlxuXHQgKiBAcGFyYW0ge051bWJlcn0gW3NwZWVkXSAtIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHRyYW5zaXRpb24uXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0YW5kYXJkPWZhbHNlXSAtIFdoZXRoZXIgdG8gdXNlIHRoZSBzdGFuZGFyZCBiZWhhdmlvdXIgb3Igbm90LlxuXHQgKi9cblx0TmF2aWdhdGlvbi5wcm90b3R5cGUudG8gPSBmdW5jdGlvbihwb3NpdGlvbiwgc3BlZWQsIHN0YW5kYXJkKSB7XG5cdFx0dmFyIGxlbmd0aDtcblxuXHRcdGlmICghc3RhbmRhcmQgJiYgdGhpcy5fcGFnZXMubGVuZ3RoKSB7XG5cdFx0XHRsZW5ndGggPSB0aGlzLl9wYWdlcy5sZW5ndGg7XG5cdFx0XHQkLnByb3h5KHRoaXMuX292ZXJyaWRlcy50bywgdGhpcy5fY29yZSkodGhpcy5fcGFnZXNbKChwb3NpdGlvbiAlIGxlbmd0aCkgKyBsZW5ndGgpICUgbGVuZ3RoXS5zdGFydCwgc3BlZWQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkLnByb3h5KHRoaXMuX292ZXJyaWRlcy50bywgdGhpcy5fY29yZSkocG9zaXRpb24sIHNwZWVkKTtcblx0XHR9XG5cdH07XG5cblx0JC5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLk5hdmlnYXRpb24gPSBOYXZpZ2F0aW9uO1xuXG59KSh3aW5kb3cuWmVwdG8gfHwgd2luZG93LmpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7XG5cbi8qKlxuICogSGFzaCBQbHVnaW5cbiAqIEB2ZXJzaW9uIDIuMS4wXG4gKiBAYXV0aG9yIEFydHVzIEtvbGFub3dza2lcbiAqIEBhdXRob3IgRGF2aWQgRGV1dHNjaFxuICogQGxpY2Vuc2UgVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKi9cbjsoZnVuY3Rpb24oJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgaGFzaCBwbHVnaW4uXG5cdCAqIEBjbGFzcyBUaGUgSGFzaCBQbHVnaW5cblx0ICogQHBhcmFtIHtPd2x9IGNhcm91c2VsIC0gVGhlIE93bCBDYXJvdXNlbFxuXHQgKi9cblx0dmFyIEhhc2ggPSBmdW5jdGlvbihjYXJvdXNlbCkge1xuXHRcdC8qKlxuXHRcdCAqIFJlZmVyZW5jZSB0byB0aGUgY29yZS5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge093bH1cblx0XHQgKi9cblx0XHR0aGlzLl9jb3JlID0gY2Fyb3VzZWw7XG5cblx0XHQvKipcblx0XHQgKiBIYXNoIGluZGV4IGZvciB0aGUgaXRlbXMuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dGhpcy5faGFzaGVzID0ge307XG5cblx0XHQvKipcblx0XHQgKiBUaGUgY2Fyb3VzZWwgZWxlbWVudC5cblx0XHQgKiBAdHlwZSB7alF1ZXJ5fVxuXHRcdCAqL1xuXHRcdHRoaXMuJGVsZW1lbnQgPSB0aGlzLl9jb3JlLiRlbGVtZW50O1xuXG5cdFx0LyoqXG5cdFx0ICogQWxsIGV2ZW50IGhhbmRsZXJzLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHRoaXMuX2hhbmRsZXJzID0ge1xuXHRcdFx0J2luaXRpYWxpemVkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgdGhpcy5fY29yZS5zZXR0aW5ncy5zdGFydFBvc2l0aW9uID09PSAnVVJMSGFzaCcpIHtcblx0XHRcdFx0XHQkKHdpbmRvdykudHJpZ2dlcignaGFzaGNoYW5nZS5vd2wubmF2aWdhdGlvbicpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdwcmVwYXJlZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlKSB7XG5cdFx0XHRcdFx0dmFyIGhhc2ggPSAkKGUuY29udGVudCkuZmluZCgnW2RhdGEtaGFzaF0nKS5hZGRCYWNrKCdbZGF0YS1oYXNoXScpLmF0dHIoJ2RhdGEtaGFzaCcpO1xuXG5cdFx0XHRcdFx0aWYgKCFoYXNoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5faGFzaGVzW2hhc2hdID0gZS5jb250ZW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdjaGFuZ2VkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgZS5wcm9wZXJ0eS5uYW1lID09PSAncG9zaXRpb24nKSB7XG5cdFx0XHRcdFx0dmFyIGN1cnJlbnQgPSB0aGlzLl9jb3JlLml0ZW1zKHRoaXMuX2NvcmUucmVsYXRpdmUodGhpcy5fY29yZS5jdXJyZW50KCkpKSxcblx0XHRcdFx0XHRcdGhhc2ggPSAkLm1hcCh0aGlzLl9oYXNoZXMsIGZ1bmN0aW9uKGl0ZW0sIGhhc2gpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGl0ZW0gPT09IGN1cnJlbnQgPyBoYXNoIDogbnVsbDtcblx0XHRcdFx0XHRcdH0pLmpvaW4oKTtcblxuXHRcdFx0XHRcdGlmICghaGFzaCB8fCB3aW5kb3cubG9jYXRpb24uaGFzaC5zbGljZSgxKSA9PT0gaGFzaCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gaGFzaDtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcylcblx0XHR9O1xuXG5cdFx0Ly8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuXHRcdHRoaXMuX2NvcmUub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBIYXNoLkRlZmF1bHRzLCB0aGlzLl9jb3JlLm9wdGlvbnMpO1xuXG5cdFx0Ly8gcmVnaXN0ZXIgdGhlIGV2ZW50IGhhbmRsZXJzXG5cdFx0dGhpcy4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyk7XG5cblx0XHQvLyByZWdpc3RlciBldmVudCBsaXN0ZW5lciBmb3IgaGFzaCBuYXZpZ2F0aW9uXG5cdFx0JCh3aW5kb3cpLm9uKCdoYXNoY2hhbmdlLm93bC5uYXZpZ2F0aW9uJywgJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHR2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKSxcblx0XHRcdFx0aXRlbXMgPSB0aGlzLl9jb3JlLiRzdGFnZS5jaGlsZHJlbigpLFxuXHRcdFx0XHRwb3NpdGlvbiA9IHRoaXMuX2hhc2hlc1toYXNoXSAmJiBpdGVtcy5pbmRleCh0aGlzLl9oYXNoZXNbaGFzaF0pO1xuXG5cdFx0XHRpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCB8fCBwb3NpdGlvbiA9PT0gdGhpcy5fY29yZS5jdXJyZW50KCkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9jb3JlLnRvKHRoaXMuX2NvcmUucmVsYXRpdmUocG9zaXRpb24pLCBmYWxzZSwgdHJ1ZSk7XG5cdFx0fSwgdGhpcykpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZWZhdWx0IG9wdGlvbnMuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEhhc2guRGVmYXVsdHMgPSB7XG5cdFx0VVJMaGFzaExpc3RlbmVyOiBmYWxzZVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZXN0cm95cyB0aGUgcGx1Z2luLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRIYXNoLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGhhbmRsZXIsIHByb3BlcnR5O1xuXG5cdFx0JCh3aW5kb3cpLm9mZignaGFzaGNoYW5nZS5vd2wubmF2aWdhdGlvbicpO1xuXG5cdFx0Zm9yIChoYW5kbGVyIGluIHRoaXMuX2hhbmRsZXJzKSB7XG5cdFx0XHR0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihoYW5kbGVyLCB0aGlzLl9oYW5kbGVyc1toYW5kbGVyXSk7XG5cdFx0fVxuXHRcdGZvciAocHJvcGVydHkgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHtcblx0XHRcdHR5cGVvZiB0aGlzW3Byb3BlcnR5XSAhPSAnZnVuY3Rpb24nICYmICh0aGlzW3Byb3BlcnR5XSA9IG51bGwpO1xuXHRcdH1cblx0fTtcblxuXHQkLmZuLm93bENhcm91c2VsLkNvbnN0cnVjdG9yLlBsdWdpbnMuSGFzaCA9IEhhc2g7XG5cbn0pKHdpbmRvdy5aZXB0byB8fCB3aW5kb3cualF1ZXJ5LCB3aW5kb3csIGRvY3VtZW50KTtcblxuLyoqXG4gKiBTdXBwb3J0IFBsdWdpblxuICpcbiAqIEB2ZXJzaW9uIDIuMS4wXG4gKiBAYXV0aG9yIFZpdmlkIFBsYW5ldCBTb2Z0d2FyZSBHbWJIXG4gKiBAYXV0aG9yIEFydHVzIEtvbGFub3dza2lcbiAqIEBhdXRob3IgRGF2aWQgRGV1dHNjaFxuICogQGxpY2Vuc2UgVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKi9cbjsoZnVuY3Rpb24oJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG5cblx0dmFyIHN0eWxlID0gJCgnPHN1cHBvcnQ+JykuZ2V0KDApLnN0eWxlLFxuXHRcdHByZWZpeGVzID0gJ1dlYmtpdCBNb3ogTyBtcycuc3BsaXQoJyAnKSxcblx0XHRldmVudHMgPSB7XG5cdFx0XHR0cmFuc2l0aW9uOiB7XG5cdFx0XHRcdGVuZDoge1xuXHRcdFx0XHRcdFdlYmtpdFRyYW5zaXRpb246ICd3ZWJraXRUcmFuc2l0aW9uRW5kJyxcblx0XHRcdFx0XHRNb3pUcmFuc2l0aW9uOiAndHJhbnNpdGlvbmVuZCcsXG5cdFx0XHRcdFx0T1RyYW5zaXRpb246ICdvVHJhbnNpdGlvbkVuZCcsXG5cdFx0XHRcdFx0dHJhbnNpdGlvbjogJ3RyYW5zaXRpb25lbmQnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRhbmltYXRpb246IHtcblx0XHRcdFx0ZW5kOiB7XG5cdFx0XHRcdFx0V2Via2l0QW5pbWF0aW9uOiAnd2Via2l0QW5pbWF0aW9uRW5kJyxcblx0XHRcdFx0XHRNb3pBbmltYXRpb246ICdhbmltYXRpb25lbmQnLFxuXHRcdFx0XHRcdE9BbmltYXRpb246ICdvQW5pbWF0aW9uRW5kJyxcblx0XHRcdFx0XHRhbmltYXRpb246ICdhbmltYXRpb25lbmQnXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdHRlc3RzID0ge1xuXHRcdFx0Y3NzdHJhbnNmb3JtczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIXRlc3QoJ3RyYW5zZm9ybScpO1xuXHRcdFx0fSxcblx0XHRcdGNzc3RyYW5zZm9ybXMzZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIXRlc3QoJ3BlcnNwZWN0aXZlJyk7XG5cdFx0XHR9LFxuXHRcdFx0Y3NzdHJhbnNpdGlvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISF0ZXN0KCd0cmFuc2l0aW9uJyk7XG5cdFx0XHR9LFxuXHRcdFx0Y3NzYW5pbWF0aW9uczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIXRlc3QoJ2FuaW1hdGlvbicpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0ZnVuY3Rpb24gdGVzdChwcm9wZXJ0eSwgcHJlZml4ZWQpIHtcblx0XHR2YXIgcmVzdWx0ID0gZmFsc2UsXG5cdFx0XHR1cHBlciA9IHByb3BlcnR5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc2xpY2UoMSk7XG5cblx0XHQkLmVhY2goKHByb3BlcnR5ICsgJyAnICsgcHJlZml4ZXMuam9pbih1cHBlciArICcgJykgKyB1cHBlcikuc3BsaXQoJyAnKSwgZnVuY3Rpb24oaSwgcHJvcGVydHkpIHtcblx0XHRcdGlmIChzdHlsZVtwcm9wZXJ0eV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXN1bHQgPSBwcmVmaXhlZCA/IHByb3BlcnR5IDogdHJ1ZTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGZ1bmN0aW9uIHByZWZpeGVkKHByb3BlcnR5KSB7XG5cdFx0cmV0dXJuIHRlc3QocHJvcGVydHksIHRydWUpO1xuXHR9XG5cblx0aWYgKHRlc3RzLmNzc3RyYW5zaXRpb25zKCkpIHtcblx0XHQvKiBqc2hpbnQgLVcwNTMgKi9cblx0XHQkLnN1cHBvcnQudHJhbnNpdGlvbiA9IG5ldyBTdHJpbmcocHJlZml4ZWQoJ3RyYW5zaXRpb24nKSlcblx0XHQkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQgPSBldmVudHMudHJhbnNpdGlvbi5lbmRbICQuc3VwcG9ydC50cmFuc2l0aW9uIF07XG5cdH1cblxuXHRpZiAodGVzdHMuY3NzYW5pbWF0aW9ucygpKSB7XG5cdFx0LyoganNoaW50IC1XMDUzICovXG5cdFx0JC5zdXBwb3J0LmFuaW1hdGlvbiA9IG5ldyBTdHJpbmcocHJlZml4ZWQoJ2FuaW1hdGlvbicpKVxuXHRcdCQuc3VwcG9ydC5hbmltYXRpb24uZW5kID0gZXZlbnRzLmFuaW1hdGlvbi5lbmRbICQuc3VwcG9ydC5hbmltYXRpb24gXTtcblx0fVxuXG5cdGlmICh0ZXN0cy5jc3N0cmFuc2Zvcm1zKCkpIHtcblx0XHQvKiBqc2hpbnQgLVcwNTMgKi9cblx0XHQkLnN1cHBvcnQudHJhbnNmb3JtID0gbmV3IFN0cmluZyhwcmVmaXhlZCgndHJhbnNmb3JtJykpO1xuXHRcdCQuc3VwcG9ydC50cmFuc2Zvcm0zZCA9IHRlc3RzLmNzc3RyYW5zZm9ybXMzZCgpO1xuXHR9XG5cbn0pKHdpbmRvdy5aZXB0byB8fCB3aW5kb3cualF1ZXJ5LCB3aW5kb3csIGRvY3VtZW50KTtcbiIsIi8qISBwaWN0dXJlZmlsbCAtIHYzLjAuMiAtIDIwMTYtMDItMTJcbiAqIGh0dHBzOi8vc2NvdHRqZWhsLmdpdGh1Yi5pby9waWN0dXJlZmlsbC9cbiAqIENvcHlyaWdodCAoYykgMjAxNiBodHRwczovL2dpdGh1Yi5jb20vc2NvdHRqZWhsL3BpY3R1cmVmaWxsL2Jsb2IvbWFzdGVyL0F1dGhvcnMudHh0OyBMaWNlbnNlZCBNSVRcbiAqL1xuIWZ1bmN0aW9uKGEpe3ZhciBiPW5hdmlnYXRvci51c2VyQWdlbnQ7YS5IVE1MUGljdHVyZUVsZW1lbnQmJi9lY2tvLy50ZXN0KGIpJiZiLm1hdGNoKC9ydlxcOihcXGQrKS8pJiZSZWdFeHAuJDE8NDUmJmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIixmdW5jdGlvbigpe3ZhciBiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNvdXJjZVwiKSxkPWZ1bmN0aW9uKGEpe3ZhciBiLGQsZT1hLnBhcmVudE5vZGU7XCJQSUNUVVJFXCI9PT1lLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk/KGI9Yy5jbG9uZU5vZGUoKSxlLmluc2VydEJlZm9yZShiLGUuZmlyc3RFbGVtZW50Q2hpbGQpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnJlbW92ZUNoaWxkKGIpfSkpOighYS5fcGZMYXN0U2l6ZXx8YS5vZmZzZXRXaWR0aD5hLl9wZkxhc3RTaXplKSYmKGEuX3BmTGFzdFNpemU9YS5vZmZzZXRXaWR0aCxkPWEuc2l6ZXMsYS5zaXplcys9XCIsMTAwdndcIixzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5zaXplcz1kfSkpfSxlPWZ1bmN0aW9uKCl7dmFyIGEsYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwicGljdHVyZSA+IGltZywgaW1nW3NyY3NldF1bc2l6ZXNdXCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspZChiW2FdKX0sZj1mdW5jdGlvbigpe2NsZWFyVGltZW91dChiKSxiPXNldFRpbWVvdXQoZSw5OSl9LGc9YS5tYXRjaE1lZGlhJiZtYXRjaE1lZGlhKFwiKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpXCIpLGg9ZnVuY3Rpb24oKXtmKCksZyYmZy5hZGRMaXN0ZW5lciYmZy5hZGRMaXN0ZW5lcihmKX07cmV0dXJuIGMuc3Jjc2V0PVwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBQUFBQ0g1QkFFS0FBRUFMQUFBQUFBQkFBRUFBQUlDVEFFQU93PT1cIiwvXltjfGldfGQkLy50ZXN0KGRvY3VtZW50LnJlYWR5U3RhdGV8fFwiXCIpP2goKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLGgpLGZ9KCkpfSh3aW5kb3cpLGZ1bmN0aW9uKGEsYixjKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkKGEpe3JldHVyblwiIFwiPT09YXx8XCJcdFwiPT09YXx8XCJcXG5cIj09PWF8fFwiXFxmXCI9PT1hfHxcIlxcclwiPT09YX1mdW5jdGlvbiBlKGIsYyl7dmFyIGQ9bmV3IGEuSW1hZ2U7cmV0dXJuIGQub25lcnJvcj1mdW5jdGlvbigpe0FbYl09ITEsYmEoKX0sZC5vbmxvYWQ9ZnVuY3Rpb24oKXtBW2JdPTE9PT1kLndpZHRoLGJhKCl9LGQuc3JjPWMsXCJwZW5kaW5nXCJ9ZnVuY3Rpb24gZigpe009ITEsUD1hLmRldmljZVBpeGVsUmF0aW8sTj17fSxPPXt9LHMuRFBSPVB8fDEsUS53aWR0aD1NYXRoLm1heChhLmlubmVyV2lkdGh8fDAsei5jbGllbnRXaWR0aCksUS5oZWlnaHQ9TWF0aC5tYXgoYS5pbm5lckhlaWdodHx8MCx6LmNsaWVudEhlaWdodCksUS52dz1RLndpZHRoLzEwMCxRLnZoPVEuaGVpZ2h0LzEwMCxyPVtRLmhlaWdodCxRLndpZHRoLFBdLmpvaW4oXCItXCIpLFEuZW09cy5nZXRFbVZhbHVlKCksUS5yZW09US5lbX1mdW5jdGlvbiBnKGEsYixjLGQpe3ZhciBlLGYsZyxoO3JldHVyblwic2F2ZURhdGFcIj09PUIuYWxnb3JpdGhtP2E+Mi43P2g9YysxOihmPWItYyxlPU1hdGgucG93KGEtLjYsMS41KSxnPWYqZSxkJiYoZys9LjEqZSksaD1hK2cpOmg9Yz4xP01hdGguc3FydChhKmIpOmEsaD5jfWZ1bmN0aW9uIGgoYSl7dmFyIGIsYz1zLmdldFNldChhKSxkPSExO1wicGVuZGluZ1wiIT09YyYmKGQ9cixjJiYoYj1zLnNldFJlcyhjKSxzLmFwcGx5U2V0Q2FuZGlkYXRlKGIsYSkpKSxhW3MubnNdLmV2YWxlZD1kfWZ1bmN0aW9uIGkoYSxiKXtyZXR1cm4gYS5yZXMtYi5yZXN9ZnVuY3Rpb24gaihhLGIsYyl7dmFyIGQ7cmV0dXJuIWMmJmImJihjPWFbcy5uc10uc2V0cyxjPWMmJmNbYy5sZW5ndGgtMV0pLGQ9ayhiLGMpLGQmJihiPXMubWFrZVVybChiKSxhW3MubnNdLmN1clNyYz1iLGFbcy5uc10uY3VyQ2FuPWQsZC5yZXN8fGFhKGQsZC5zZXQuc2l6ZXMpKSxkfWZ1bmN0aW9uIGsoYSxiKXt2YXIgYyxkLGU7aWYoYSYmYilmb3IoZT1zLnBhcnNlU2V0KGIpLGE9cy5tYWtlVXJsKGEpLGM9MDtjPGUubGVuZ3RoO2MrKylpZihhPT09cy5tYWtlVXJsKGVbY10udXJsKSl7ZD1lW2NdO2JyZWFrfXJldHVybiBkfWZ1bmN0aW9uIGwoYSxiKXt2YXIgYyxkLGUsZixnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzb3VyY2VcIik7Zm9yKGM9MCxkPWcubGVuZ3RoO2Q+YztjKyspZT1nW2NdLGVbcy5uc109ITAsZj1lLmdldEF0dHJpYnV0ZShcInNyY3NldFwiKSxmJiZiLnB1c2goe3NyY3NldDpmLG1lZGlhOmUuZ2V0QXR0cmlidXRlKFwibWVkaWFcIiksdHlwZTplLmdldEF0dHJpYnV0ZShcInR5cGVcIiksc2l6ZXM6ZS5nZXRBdHRyaWJ1dGUoXCJzaXplc1wiKX0pfWZ1bmN0aW9uIG0oYSxiKXtmdW5jdGlvbiBjKGIpe3ZhciBjLGQ9Yi5leGVjKGEuc3Vic3RyaW5nKG0pKTtyZXR1cm4gZD8oYz1kWzBdLG0rPWMubGVuZ3RoLGMpOnZvaWQgMH1mdW5jdGlvbiBlKCl7dmFyIGEsYyxkLGUsZixpLGosayxsLG09ITEsbz17fTtmb3IoZT0wO2U8aC5sZW5ndGg7ZSsrKWY9aFtlXSxpPWZbZi5sZW5ndGgtMV0saj1mLnN1YnN0cmluZygwLGYubGVuZ3RoLTEpLGs9cGFyc2VJbnQoaiwxMCksbD1wYXJzZUZsb2F0KGopLFgudGVzdChqKSYmXCJ3XCI9PT1pPygoYXx8YykmJihtPSEwKSwwPT09az9tPSEwOmE9ayk6WS50ZXN0KGopJiZcInhcIj09PWk/KChhfHxjfHxkKSYmKG09ITApLDA+bD9tPSEwOmM9bCk6WC50ZXN0KGopJiZcImhcIj09PWk/KChkfHxjKSYmKG09ITApLDA9PT1rP209ITA6ZD1rKTptPSEwO218fChvLnVybD1nLGEmJihvLnc9YSksYyYmKG8uZD1jKSxkJiYoby5oPWQpLGR8fGN8fGF8fChvLmQ9MSksMT09PW8uZCYmKGIuaGFzMXg9ITApLG8uc2V0PWIsbi5wdXNoKG8pKX1mdW5jdGlvbiBmKCl7Zm9yKGMoVCksaT1cIlwiLGo9XCJpbiBkZXNjcmlwdG9yXCI7Oyl7aWYoaz1hLmNoYXJBdChtKSxcImluIGRlc2NyaXB0b3JcIj09PWopaWYoZChrKSlpJiYoaC5wdXNoKGkpLGk9XCJcIixqPVwiYWZ0ZXIgZGVzY3JpcHRvclwiKTtlbHNle2lmKFwiLFwiPT09aylyZXR1cm4gbSs9MSxpJiZoLnB1c2goaSksdm9pZCBlKCk7aWYoXCIoXCI9PT1rKWkrPWssaj1cImluIHBhcmVuc1wiO2Vsc2V7aWYoXCJcIj09PWspcmV0dXJuIGkmJmgucHVzaChpKSx2b2lkIGUoKTtpKz1rfX1lbHNlIGlmKFwiaW4gcGFyZW5zXCI9PT1qKWlmKFwiKVwiPT09aylpKz1rLGo9XCJpbiBkZXNjcmlwdG9yXCI7ZWxzZXtpZihcIlwiPT09aylyZXR1cm4gaC5wdXNoKGkpLHZvaWQgZSgpO2krPWt9ZWxzZSBpZihcImFmdGVyIGRlc2NyaXB0b3JcIj09PWopaWYoZChrKSk7ZWxzZXtpZihcIlwiPT09aylyZXR1cm4gdm9pZCBlKCk7aj1cImluIGRlc2NyaXB0b3JcIixtLT0xfW0rPTF9fWZvcih2YXIgZyxoLGksaixrLGw9YS5sZW5ndGgsbT0wLG49W107Oyl7aWYoYyhVKSxtPj1sKXJldHVybiBuO2c9YyhWKSxoPVtdLFwiLFwiPT09Zy5zbGljZSgtMSk/KGc9Zy5yZXBsYWNlKFcsXCJcIiksZSgpKTpmKCl9fWZ1bmN0aW9uIG4oYSl7ZnVuY3Rpb24gYihhKXtmdW5jdGlvbiBiKCl7ZiYmKGcucHVzaChmKSxmPVwiXCIpfWZ1bmN0aW9uIGMoKXtnWzBdJiYoaC5wdXNoKGcpLGc9W10pfWZvcih2YXIgZSxmPVwiXCIsZz1bXSxoPVtdLGk9MCxqPTAsaz0hMTs7KXtpZihlPWEuY2hhckF0KGopLFwiXCI9PT1lKXJldHVybiBiKCksYygpLGg7aWYoayl7aWYoXCIqXCI9PT1lJiZcIi9cIj09PWFbaisxXSl7az0hMSxqKz0yLGIoKTtjb250aW51ZX1qKz0xfWVsc2V7aWYoZChlKSl7aWYoYS5jaGFyQXQoai0xKSYmZChhLmNoYXJBdChqLTEpKXx8IWYpe2orPTE7Y29udGludWV9aWYoMD09PWkpe2IoKSxqKz0xO2NvbnRpbnVlfWU9XCIgXCJ9ZWxzZSBpZihcIihcIj09PWUpaSs9MTtlbHNlIGlmKFwiKVwiPT09ZSlpLT0xO2Vsc2V7aWYoXCIsXCI9PT1lKXtiKCksYygpLGorPTE7Y29udGludWV9aWYoXCIvXCI9PT1lJiZcIipcIj09PWEuY2hhckF0KGorMSkpe2s9ITAsais9Mjtjb250aW51ZX19Zis9ZSxqKz0xfX19ZnVuY3Rpb24gYyhhKXtyZXR1cm4gay50ZXN0KGEpJiZwYXJzZUZsb2F0KGEpPj0wPyEwOmwudGVzdChhKT8hMDpcIjBcIj09PWF8fFwiLTBcIj09PWF8fFwiKzBcIj09PWE/ITA6ITF9dmFyIGUsZixnLGgsaSxqLGs9L14oPzpbKy1dP1swLTldK3xbMC05XSpcXC5bMC05XSspKD86W2VFXVsrLV0/WzAtOV0rKT8oPzpjaHxjbXxlbXxleHxpbnxtbXxwY3xwdHxweHxyZW18dmh8dm1pbnx2bWF4fHZ3KSQvaSxsPS9eY2FsY1xcKCg/OlswLTlhLXogXFwuXFwrXFwtXFwqXFwvXFwoXFwpXSspXFwpJC9pO2ZvcihmPWIoYSksZz1mLmxlbmd0aCxlPTA7Zz5lO2UrKylpZihoPWZbZV0saT1oW2gubGVuZ3RoLTFdLGMoaSkpe2lmKGo9aSxoLnBvcCgpLDA9PT1oLmxlbmd0aClyZXR1cm4gajtpZihoPWguam9pbihcIiBcIikscy5tYXRjaGVzTWVkaWEoaCkpcmV0dXJuIGp9cmV0dXJuXCIxMDB2d1wifWIuY3JlYXRlRWxlbWVudChcInBpY3R1cmVcIik7dmFyIG8scCxxLHIscz17fSx0PSExLHU9ZnVuY3Rpb24oKXt9LHY9Yi5jcmVhdGVFbGVtZW50KFwiaW1nXCIpLHc9di5nZXRBdHRyaWJ1dGUseD12LnNldEF0dHJpYnV0ZSx5PXYucmVtb3ZlQXR0cmlidXRlLHo9Yi5kb2N1bWVudEVsZW1lbnQsQT17fSxCPXthbGdvcml0aG06XCJcIn0sQz1cImRhdGEtcGZzcmNcIixEPUMrXCJzZXRcIixFPW5hdmlnYXRvci51c2VyQWdlbnQsRj0vcmlkZW50Ly50ZXN0KEUpfHwvZWNrby8udGVzdChFKSYmRS5tYXRjaCgvcnZcXDooXFxkKykvKSYmUmVnRXhwLiQxPjM1LEc9XCJjdXJyZW50U3JjXCIsSD0vXFxzK1xcKz9cXGQrKGVcXGQrKT93LyxJPS8oXFwoW14pXStcXCkpP1xccyooLispLyxKPWEucGljdHVyZWZpbGxDRkcsSz1cInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt2aXNpYmlsaXR5OmhpZGRlbjtkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MDtib3JkZXI6bm9uZTtmb250LXNpemU6MWVtO3dpZHRoOjFlbTtvdmVyZmxvdzpoaWRkZW47Y2xpcDpyZWN0KDBweCwgMHB4LCAwcHgsIDBweClcIixMPVwiZm9udC1zaXplOjEwMCUhaW1wb3J0YW50O1wiLE09ITAsTj17fSxPPXt9LFA9YS5kZXZpY2VQaXhlbFJhdGlvLFE9e3B4OjEsXCJpblwiOjk2fSxSPWIuY3JlYXRlRWxlbWVudChcImFcIiksUz0hMSxUPS9eWyBcXHRcXG5cXHJcXHUwMDBjXSsvLFU9L15bLCBcXHRcXG5cXHJcXHUwMDBjXSsvLFY9L15bXiBcXHRcXG5cXHJcXHUwMDBjXSsvLFc9L1ssXSskLyxYPS9eXFxkKyQvLFk9L14tPyg/OlswLTldK3xbMC05XSpcXC5bMC05XSspKD86W2VFXVsrLV0/WzAtOV0rKT8kLyxaPWZ1bmN0aW9uKGEsYixjLGQpe2EuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIoYixjLGR8fCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KFwib25cIitiLGMpfSwkPWZ1bmN0aW9uKGEpe3ZhciBiPXt9O3JldHVybiBmdW5jdGlvbihjKXtyZXR1cm4gYyBpbiBifHwoYltjXT1hKGMpKSxiW2NdfX0sXz1mdW5jdGlvbigpe3ZhciBhPS9eKFtcXGRcXC5dKykoZW18dnd8cHgpJC8sYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1hcmd1bWVudHMsYj0wLGM9YVswXTsrK2IgaW4gYTspYz1jLnJlcGxhY2UoYVtiXSxhWysrYl0pO3JldHVybiBjfSxjPSQoZnVuY3Rpb24oYSl7cmV0dXJuXCJyZXR1cm4gXCIrYigoYXx8XCJcIikudG9Mb3dlckNhc2UoKSwvXFxiYW5kXFxiL2csXCImJlwiLC8sL2csXCJ8fFwiLC9taW4tKFthLXotXFxzXSspOi9nLFwiZS4kMT49XCIsL21heC0oW2Etei1cXHNdKyk6L2csXCJlLiQxPD1cIiwvY2FsYyhbXildKykvZyxcIigkMSlcIiwvKFxcZCtbXFwuXSpbXFxkXSopKFthLXpdKykvZyxcIigkMSAqIGUuJDIpXCIsL14oPyEoZS5bYS16XXxbMC05XFwuJj18PjxcXCtcXC1cXCpcXChcXClcXC9dKSkuKi9naSxcIlwiKStcIjtcIn0pO3JldHVybiBmdW5jdGlvbihiLGQpe3ZhciBlO2lmKCEoYiBpbiBOKSlpZihOW2JdPSExLGQmJihlPWIubWF0Y2goYSkpKU5bYl09ZVsxXSpRW2VbMl1dO2Vsc2UgdHJ5e05bYl09bmV3IEZ1bmN0aW9uKFwiZVwiLGMoYikpKFEpfWNhdGNoKGYpe31yZXR1cm4gTltiXX19KCksYWE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS53PyhhLmNXaWR0aD1zLmNhbGNMaXN0TGVuZ3RoKGJ8fFwiMTAwdndcIiksYS5yZXM9YS53L2EuY1dpZHRoKTphLnJlcz1hLmQsYX0sYmE9ZnVuY3Rpb24oYSl7aWYodCl7dmFyIGMsZCxlLGY9YXx8e307aWYoZi5lbGVtZW50cyYmMT09PWYuZWxlbWVudHMubm9kZVR5cGUmJihcIklNR1wiPT09Zi5lbGVtZW50cy5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpP2YuZWxlbWVudHM9W2YuZWxlbWVudHNdOihmLmNvbnRleHQ9Zi5lbGVtZW50cyxmLmVsZW1lbnRzPW51bGwpKSxjPWYuZWxlbWVudHN8fHMucXNhKGYuY29udGV4dHx8YixmLnJlZXZhbHVhdGV8fGYucmVzZWxlY3Q/cy5zZWw6cy5zZWxTaG9ydCksZT1jLmxlbmd0aCl7Zm9yKHMuc2V0dXBSdW4oZiksUz0hMCxkPTA7ZT5kO2QrKylzLmZpbGxJbWcoY1tkXSxmKTtzLnRlYXJkb3duUnVuKGYpfX19O289YS5jb25zb2xlJiZjb25zb2xlLndhcm4/ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKGEpfTp1LEcgaW4gdnx8KEc9XCJzcmNcIiksQVtcImltYWdlL2pwZWdcIl09ITAsQVtcImltYWdlL2dpZlwiXT0hMCxBW1wiaW1hZ2UvcG5nXCJdPSEwLEFbXCJpbWFnZS9zdmcreG1sXCJdPWIuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZShcImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjSW1hZ2VcIixcIjEuMVwiKSxzLm5zPShcInBmXCIrKG5ldyBEYXRlKS5nZXRUaW1lKCkpLnN1YnN0cigwLDkpLHMuc3VwU3Jjc2V0PVwic3Jjc2V0XCJpbiB2LHMuc3VwU2l6ZXM9XCJzaXplc1wiaW4gdixzLnN1cFBpY3R1cmU9ISFhLkhUTUxQaWN0dXJlRWxlbWVudCxzLnN1cFNyY3NldCYmcy5zdXBQaWN0dXJlJiYhcy5zdXBTaXplcyYmIWZ1bmN0aW9uKGEpe3Yuc3Jjc2V0PVwiZGF0YTosYVwiLGEuc3JjPVwiZGF0YTosYVwiLHMuc3VwU3Jjc2V0PXYuY29tcGxldGU9PT1hLmNvbXBsZXRlLHMuc3VwUGljdHVyZT1zLnN1cFNyY3NldCYmcy5zdXBQaWN0dXJlfShiLmNyZWF0ZUVsZW1lbnQoXCJpbWdcIikpLHMuc3VwU3Jjc2V0JiYhcy5zdXBTaXplcz8hZnVuY3Rpb24oKXt2YXIgYT1cImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFnQUJBUEFBQVAvLy93QUFBQ0g1QkFBQUFBQUFMQUFBQUFBQ0FBRUFBQUlDQkFvQU93PT1cIixjPVwiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBQUFBQ0g1QkFFS0FBRUFMQUFBQUFBQkFBRUFBQUlDVEFFQU93PT1cIixkPWIuY3JlYXRlRWxlbWVudChcImltZ1wiKSxlPWZ1bmN0aW9uKCl7dmFyIGE9ZC53aWR0aDsyPT09YSYmKHMuc3VwU2l6ZXM9ITApLHE9cy5zdXBTcmNzZXQmJiFzLnN1cFNpemVzLHQ9ITAsc2V0VGltZW91dChiYSl9O2Qub25sb2FkPWUsZC5vbmVycm9yPWUsZC5zZXRBdHRyaWJ1dGUoXCJzaXplc1wiLFwiOXB4XCIpLGQuc3Jjc2V0PWMrXCIgMXcsXCIrYStcIiA5d1wiLGQuc3JjPWN9KCk6dD0hMCxzLnNlbFNob3J0PVwicGljdHVyZT5pbWcsaW1nW3NyY3NldF1cIixzLnNlbD1zLnNlbFNob3J0LHMuY2ZnPUIscy5EUFI9UHx8MSxzLnU9USxzLnR5cGVzPUEscy5zZXRTaXplPXUscy5tYWtlVXJsPSQoZnVuY3Rpb24oYSl7cmV0dXJuIFIuaHJlZj1hLFIuaHJlZn0pLHMucXNhPWZ1bmN0aW9uKGEsYil7cmV0dXJuXCJxdWVyeVNlbGVjdG9yXCJpbiBhP2EucXVlcnlTZWxlY3RvckFsbChiKTpbXX0scy5tYXRjaGVzTWVkaWE9ZnVuY3Rpb24oKXtyZXR1cm4gYS5tYXRjaE1lZGlhJiYobWF0Y2hNZWRpYShcIihtaW4td2lkdGg6IDAuMWVtKVwiKXx8e30pLm1hdGNoZXM/cy5tYXRjaGVzTWVkaWE9ZnVuY3Rpb24oYSl7cmV0dXJuIWF8fG1hdGNoTWVkaWEoYSkubWF0Y2hlc306cy5tYXRjaGVzTWVkaWE9cy5tTVEscy5tYXRjaGVzTWVkaWEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxzLm1NUT1mdW5jdGlvbihhKXtyZXR1cm4gYT9fKGEpOiEwfSxzLmNhbGNMZW5ndGg9ZnVuY3Rpb24oYSl7dmFyIGI9XyhhLCEwKXx8ITE7cmV0dXJuIDA+YiYmKGI9ITEpLGJ9LHMuc3VwcG9ydHNUeXBlPWZ1bmN0aW9uKGEpe3JldHVybiBhP0FbYV06ITB9LHMucGFyc2VTaXplPSQoZnVuY3Rpb24oYSl7dmFyIGI9KGF8fFwiXCIpLm1hdGNoKEkpO3JldHVybnttZWRpYTpiJiZiWzFdLGxlbmd0aDpiJiZiWzJdfX0pLHMucGFyc2VTZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2FuZHN8fChhLmNhbmRzPW0oYS5zcmNzZXQsYSkpLGEuY2FuZHN9LHMuZ2V0RW1WYWx1ZT1mdW5jdGlvbigpe3ZhciBhO2lmKCFwJiYoYT1iLmJvZHkpKXt2YXIgYz1iLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksZD16LnN0eWxlLmNzc1RleHQsZT1hLnN0eWxlLmNzc1RleHQ7Yy5zdHlsZS5jc3NUZXh0PUssei5zdHlsZS5jc3NUZXh0PUwsYS5zdHlsZS5jc3NUZXh0PUwsYS5hcHBlbmRDaGlsZChjKSxwPWMub2Zmc2V0V2lkdGgsYS5yZW1vdmVDaGlsZChjKSxwPXBhcnNlRmxvYXQocCwxMCksei5zdHlsZS5jc3NUZXh0PWQsYS5zdHlsZS5jc3NUZXh0PWV9cmV0dXJuIHB8fDE2fSxzLmNhbGNMaXN0TGVuZ3RoPWZ1bmN0aW9uKGEpe2lmKCEoYSBpbiBPKXx8Qi51VCl7dmFyIGI9cy5jYWxjTGVuZ3RoKG4oYSkpO09bYV09Yj9iOlEud2lkdGh9cmV0dXJuIE9bYV19LHMuc2V0UmVzPWZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpe2I9cy5wYXJzZVNldChhKTtmb3IodmFyIGM9MCxkPWIubGVuZ3RoO2Q+YztjKyspYWEoYltjXSxhLnNpemVzKX1yZXR1cm4gYn0scy5zZXRSZXMucmVzPWFhLHMuYXBwbHlTZXRDYW5kaWRhdGU9ZnVuY3Rpb24oYSxiKXtpZihhLmxlbmd0aCl7dmFyIGMsZCxlLGYsaCxrLGwsbSxuLG89YltzLm5zXSxwPXMuRFBSO2lmKGs9by5jdXJTcmN8fGJbR10sbD1vLmN1ckNhbnx8aihiLGssYVswXS5zZXQpLGwmJmwuc2V0PT09YVswXS5zZXQmJihuPUYmJiFiLmNvbXBsZXRlJiZsLnJlcy0uMT5wLG58fChsLmNhY2hlZD0hMCxsLnJlcz49cCYmKGg9bCkpKSwhaClmb3IoYS5zb3J0KGkpLGY9YS5sZW5ndGgsaD1hW2YtMV0sZD0wO2Y+ZDtkKyspaWYoYz1hW2RdLGMucmVzPj1wKXtlPWQtMSxoPWFbZV0mJihufHxrIT09cy5tYWtlVXJsKGMudXJsKSkmJmcoYVtlXS5yZXMsYy5yZXMscCxhW2VdLmNhY2hlZCk/YVtlXTpjO2JyZWFrfWgmJihtPXMubWFrZVVybChoLnVybCksby5jdXJTcmM9bSxvLmN1ckNhbj1oLG0hPT1rJiZzLnNldFNyYyhiLGgpLHMuc2V0U2l6ZShiKSl9fSxzLnNldFNyYz1mdW5jdGlvbihhLGIpe3ZhciBjO2Euc3JjPWIudXJsLFwiaW1hZ2Uvc3ZnK3htbFwiPT09Yi5zZXQudHlwZSYmKGM9YS5zdHlsZS53aWR0aCxhLnN0eWxlLndpZHRoPWEub2Zmc2V0V2lkdGgrMStcInB4XCIsYS5vZmZzZXRXaWR0aCsxJiYoYS5zdHlsZS53aWR0aD1jKSl9LHMuZ2V0U2V0PWZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPSExLGY9YVtzLm5zXS5zZXRzO2ZvcihiPTA7YjxmLmxlbmd0aCYmIWU7YisrKWlmKGM9ZltiXSxjLnNyY3NldCYmcy5tYXRjaGVzTWVkaWEoYy5tZWRpYSkmJihkPXMuc3VwcG9ydHNUeXBlKGMudHlwZSkpKXtcInBlbmRpbmdcIj09PWQmJihjPWQpLGU9YzticmVha31yZXR1cm4gZX0scy5wYXJzZVNldHM9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGYsZyxoLGk9YiYmXCJQSUNUVVJFXCI9PT1iLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCksaj1hW3MubnNdOyhqLnNyYz09PWN8fGQuc3JjKSYmKGouc3JjPXcuY2FsbChhLFwic3JjXCIpLGouc3JjP3guY2FsbChhLEMsai5zcmMpOnkuY2FsbChhLEMpKSwoai5zcmNzZXQ9PT1jfHxkLnNyY3NldHx8IXMuc3VwU3Jjc2V0fHxhLnNyY3NldCkmJihlPXcuY2FsbChhLFwic3Jjc2V0XCIpLGouc3Jjc2V0PWUsaD0hMCksai5zZXRzPVtdLGkmJihqLnBpYz0hMCxsKGIsai5zZXRzKSksai5zcmNzZXQ/KGY9e3NyY3NldDpqLnNyY3NldCxzaXplczp3LmNhbGwoYSxcInNpemVzXCIpfSxqLnNldHMucHVzaChmKSxnPShxfHxqLnNyYykmJkgudGVzdChqLnNyY3NldHx8XCJcIiksZ3x8IWouc3JjfHxrKGouc3JjLGYpfHxmLmhhczF4fHwoZi5zcmNzZXQrPVwiLCBcIitqLnNyYyxmLmNhbmRzLnB1c2goe3VybDpqLnNyYyxkOjEsc2V0OmZ9KSkpOmouc3JjJiZqLnNldHMucHVzaCh7c3Jjc2V0Omouc3JjLHNpemVzOm51bGx9KSxqLmN1ckNhbj1udWxsLGouY3VyU3JjPWMsai5zdXBwb3J0ZWQ9IShpfHxmJiYhcy5zdXBTcmNzZXR8fGcmJiFzLnN1cFNpemVzKSxoJiZzLnN1cFNyY3NldCYmIWouc3VwcG9ydGVkJiYoZT8oeC5jYWxsKGEsRCxlKSxhLnNyY3NldD1cIlwiKTp5LmNhbGwoYSxEKSksai5zdXBwb3J0ZWQmJiFqLnNyY3NldCYmKCFqLnNyYyYmYS5zcmN8fGEuc3JjIT09cy5tYWtlVXJsKGouc3JjKSkmJihudWxsPT09ai5zcmM/YS5yZW1vdmVBdHRyaWJ1dGUoXCJzcmNcIik6YS5zcmM9ai5zcmMpLGoucGFyc2VkPSEwfSxzLmZpbGxJbWc9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPWIucmVzZWxlY3R8fGIucmVldmFsdWF0ZTthW3MubnNdfHwoYVtzLm5zXT17fSksYz1hW3MubnNdLChkfHxjLmV2YWxlZCE9PXIpJiYoKCFjLnBhcnNlZHx8Yi5yZWV2YWx1YXRlKSYmcy5wYXJzZVNldHMoYSxhLnBhcmVudE5vZGUsYiksYy5zdXBwb3J0ZWQ/Yy5ldmFsZWQ9cjpoKGEpKX0scy5zZXR1cFJ1bj1mdW5jdGlvbigpeyghU3x8TXx8UCE9PWEuZGV2aWNlUGl4ZWxSYXRpbykmJmYoKX0scy5zdXBQaWN0dXJlPyhiYT11LHMuZmlsbEltZz11KTohZnVuY3Rpb24oKXt2YXIgYyxkPWEuYXR0YWNoRXZlbnQ/L2QkfF5jLzovZCR8XmN8XmkvLGU9ZnVuY3Rpb24oKXt2YXIgYT1iLnJlYWR5U3RhdGV8fFwiXCI7Zj1zZXRUaW1lb3V0KGUsXCJsb2FkaW5nXCI9PT1hPzIwMDo5OTkpLGIuYm9keSYmKHMuZmlsbEltZ3MoKSxjPWN8fGQudGVzdChhKSxjJiZjbGVhclRpbWVvdXQoZikpfSxmPXNldFRpbWVvdXQoZSxiLmJvZHk/OTo5OSksZz1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZT1mdW5jdGlvbigpe3ZhciBmPW5ldyBEYXRlLWQ7Yj5mP2M9c2V0VGltZW91dChlLGItZik6KGM9bnVsbCxhKCkpfTtyZXR1cm4gZnVuY3Rpb24oKXtkPW5ldyBEYXRlLGN8fChjPXNldFRpbWVvdXQoZSxiKSl9fSxoPXouY2xpZW50SGVpZ2h0LGk9ZnVuY3Rpb24oKXtNPU1hdGgubWF4KGEuaW5uZXJXaWR0aHx8MCx6LmNsaWVudFdpZHRoKSE9PVEud2lkdGh8fHouY2xpZW50SGVpZ2h0IT09aCxoPXouY2xpZW50SGVpZ2h0LE0mJnMuZmlsbEltZ3MoKX07WihhLFwicmVzaXplXCIsZyhpLDk5KSksWihiLFwicmVhZHlzdGF0ZWNoYW5nZVwiLGUpfSgpLHMucGljdHVyZWZpbGw9YmEscy5maWxsSW1ncz1iYSxzLnRlYXJkb3duUnVuPXUsYmEuXz1zLGEucGljdHVyZWZpbGxDRkc9e3BmOnMscHVzaDpmdW5jdGlvbihhKXt2YXIgYj1hLnNoaWZ0KCk7XCJmdW5jdGlvblwiPT10eXBlb2Ygc1tiXT9zW2JdLmFwcGx5KHMsYSk6KEJbYl09YVswXSxTJiZzLmZpbGxJbWdzKHtyZXNlbGVjdDohMH0pKX19O2Zvcig7SiYmSi5sZW5ndGg7KWEucGljdHVyZWZpbGxDRkcucHVzaChKLnNoaWZ0KCkpO2EucGljdHVyZWZpbGw9YmEsXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZSYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZS5leHBvcnRzP21vZHVsZS5leHBvcnRzPWJhOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKFwicGljdHVyZWZpbGxcIixmdW5jdGlvbigpe3JldHVybiBiYX0pLHMuc3VwUGljdHVyZXx8KEFbXCJpbWFnZS93ZWJwXCJdPWUoXCJpbWFnZS93ZWJwXCIsXCJkYXRhOmltYWdlL3dlYnA7YmFzZTY0LFVrbEdSa29BQUFCWFJVSlFWbEE0V0FvQUFBQVFBQUFBQUFBQUFBQUFRVXhRU0F3QUFBQUJCeEFSL1E5RVJQOERBQUJXVURnZ0dBQUFBREFCQUowQktnRUFBUUFEQURRbHBBQURjQUQrKy8xUUFBPT1cIikpfSh3aW5kb3csZG9jdW1lbnQpOyIsIi8qISBVSWtpdCAyLjI1LjAgfCBodHRwOi8vd3d3LmdldHVpa2l0LmNvbSB8IChjKSAyMDE0IFlPT3RoZW1lIHwgTUlUIExpY2Vuc2UgKi9cbiFmdW5jdGlvbih0KXt2YXIgaTt3aW5kb3cuVUlraXQmJihpPXQoVUlraXQpKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZShcInVpa2l0LWFjY29yZGlvblwiLFtcInVpa2l0XCJdLGZ1bmN0aW9uKCl7cmV0dXJuIGl8fHQoVUlraXQpfSl9KGZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGkoaSl7dmFyIG89dC4kKGkpLGU9XCJhdXRvXCI7aWYoby5pcyhcIjp2aXNpYmxlXCIpKWU9by5vdXRlckhlaWdodCgpO2Vsc2V7dmFyIGE9e3Bvc2l0aW9uOm8uY3NzKFwicG9zaXRpb25cIiksdmlzaWJpbGl0eTpvLmNzcyhcInZpc2liaWxpdHlcIiksZGlzcGxheTpvLmNzcyhcImRpc3BsYXlcIil9O2U9by5jc3Moe3Bvc2l0aW9uOlwiYWJzb2x1dGVcIix2aXNpYmlsaXR5OlwiaGlkZGVuXCIsZGlzcGxheTpcImJsb2NrXCJ9KS5vdXRlckhlaWdodCgpLG8uY3NzKGEpfXJldHVybiBlfXJldHVybiB0LmNvbXBvbmVudChcImFjY29yZGlvblwiLHtkZWZhdWx0czp7c2hvd2ZpcnN0OiEwLGNvbGxhcHNlOiEwLGFuaW1hdGU6ITAsZWFzaW5nOlwic3dpbmdcIixkdXJhdGlvbjozMDAsdG9nZ2xlOlwiLnVrLWFjY29yZGlvbi10aXRsZVwiLGNvbnRhaW5lcnM6XCIudWstYWNjb3JkaW9uLWNvbnRlbnRcIixjbHNhY3RpdmU6XCJ1ay1hY3RpdmVcIn0sYm9vdDpmdW5jdGlvbigpe3QucmVhZHkoZnVuY3Rpb24oaSl7c2V0VGltZW91dChmdW5jdGlvbigpe3QuJChcIltkYXRhLXVrLWFjY29yZGlvbl1cIixpKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9dC4kKHRoaXMpO2kuZGF0YShcImFjY29yZGlvblwiKXx8dC5hY2NvcmRpb24oaSx0LlV0aWxzLm9wdGlvbnMoaS5hdHRyKFwiZGF0YS11ay1hY2NvcmRpb25cIikpKX0pfSwwKX0pfSxpbml0OmZ1bmN0aW9uKCl7dmFyIGk9dGhpczt0aGlzLmVsZW1lbnQub24oXCJjbGljay51ay5hY2NvcmRpb25cIix0aGlzLm9wdGlvbnMudG9nZ2xlLGZ1bmN0aW9uKG8pe28ucHJldmVudERlZmF1bHQoKSxpLnRvZ2dsZUl0ZW0odC4kKHRoaXMpLmRhdGEoXCJ3cmFwcGVyXCIpLGkub3B0aW9ucy5hbmltYXRlLGkub3B0aW9ucy5jb2xsYXBzZSl9KSx0aGlzLnVwZGF0ZSgpLHRoaXMub3B0aW9ucy5zaG93Zmlyc3QmJnRoaXMudG9nZ2xlSXRlbSh0aGlzLnRvZ2dsZS5lcSgwKS5kYXRhKFwid3JhcHBlclwiKSwhMSwhMSl9LHRvZ2dsZUl0ZW06ZnVuY3Rpb24obyxlLGEpe3ZhciBuPXRoaXM7by5kYXRhKFwidG9nZ2xlXCIpLnRvZ2dsZUNsYXNzKHRoaXMub3B0aW9ucy5jbHNhY3RpdmUpLG8uZGF0YShcImNvbnRlbnRcIikudG9nZ2xlQ2xhc3ModGhpcy5vcHRpb25zLmNsc2FjdGl2ZSk7dmFyIHM9by5kYXRhKFwidG9nZ2xlXCIpLmhhc0NsYXNzKHRoaXMub3B0aW9ucy5jbHNhY3RpdmUpO2EmJih0aGlzLnRvZ2dsZS5ub3Qoby5kYXRhKFwidG9nZ2xlXCIpKS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuY2xzYWN0aXZlKSx0aGlzLmNvbnRlbnQubm90KG8uZGF0YShcImNvbnRlbnRcIikpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5jbHNhY3RpdmUpLnBhcmVudCgpLnN0b3AoKS5jc3MoXCJvdmVyZmxvd1wiLFwiaGlkZGVuXCIpLmFuaW1hdGUoe2hlaWdodDowfSx7ZWFzaW5nOnRoaXMub3B0aW9ucy5lYXNpbmcsZHVyYXRpb246ZT90aGlzLm9wdGlvbnMuZHVyYXRpb246MH0pLmF0dHIoXCJhcmlhLWV4cGFuZGVkXCIsXCJmYWxzZVwiKSksby5zdG9wKCkuY3NzKFwib3ZlcmZsb3dcIixcImhpZGRlblwiKSxlP28uYW5pbWF0ZSh7aGVpZ2h0OnM/aShvLmRhdGEoXCJjb250ZW50XCIpKTowfSx7ZWFzaW5nOnRoaXMub3B0aW9ucy5lYXNpbmcsZHVyYXRpb246dGhpcy5vcHRpb25zLmR1cmF0aW9uLGNvbXBsZXRlOmZ1bmN0aW9uKCl7cyYmKG8uY3NzKHtvdmVyZmxvdzpcIlwiLGhlaWdodDpcImF1dG9cIn0pLHQuVXRpbHMuY2hlY2tEaXNwbGF5KG8uZGF0YShcImNvbnRlbnRcIikpKSxuLnRyaWdnZXIoXCJkaXNwbGF5LnVrLmNoZWNrXCIpfX0pOihvLmhlaWdodChzP1wiYXV0b1wiOjApLHMmJihvLmNzcyh7b3ZlcmZsb3c6XCJcIn0pLHQuVXRpbHMuY2hlY2tEaXNwbGF5KG8uZGF0YShcImNvbnRlbnRcIikpKSx0aGlzLnRyaWdnZXIoXCJkaXNwbGF5LnVrLmNoZWNrXCIpKSxvLmF0dHIoXCJhcmlhLWV4cGFuZGVkXCIscyksdGhpcy5lbGVtZW50LnRyaWdnZXIoXCJ0b2dnbGUudWsuYWNjb3JkaW9uXCIsW3Msby5kYXRhKFwidG9nZ2xlXCIpLG8uZGF0YShcImNvbnRlbnRcIildKX0sdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIGksbyxlLGE9dGhpczt0aGlzLnRvZ2dsZT10aGlzLmZpbmQodGhpcy5vcHRpb25zLnRvZ2dsZSksdGhpcy5jb250ZW50PXRoaXMuZmluZCh0aGlzLm9wdGlvbnMuY29udGFpbmVycyksdGhpcy5jb250ZW50LmVhY2goZnVuY3Rpb24obil7aT10LiQodGhpcyksaS5wYXJlbnQoKS5kYXRhKFwid3JhcHBlclwiKT9vPWkucGFyZW50KCk6KG89dC4kKHRoaXMpLndyYXAoJzxkaXYgZGF0YS13cmFwcGVyPVwidHJ1ZVwiIHN0eWxlPVwib3ZlcmZsb3c6aGlkZGVuO2hlaWdodDowO3Bvc2l0aW9uOnJlbGF0aXZlO1wiPjwvZGl2PicpLnBhcmVudCgpLG8uYXR0cihcImFyaWEtZXhwYW5kZWRcIixcImZhbHNlXCIpKSxlPWEudG9nZ2xlLmVxKG4pLG8uZGF0YShcInRvZ2dsZVwiLGUpLG8uZGF0YShcImNvbnRlbnRcIixpKSxlLmRhdGEoXCJ3cmFwcGVyXCIsbyksaS5kYXRhKFwid3JhcHBlclwiLG8pfSksdGhpcy5lbGVtZW50LnRyaWdnZXIoXCJ1cGRhdGUudWsuYWNjb3JkaW9uXCIsW3RoaXNdKX19KSx0LmFjY29yZGlvbn0pOyIsIi8qISBVSWtpdCAyLjI3LjQgfCBodHRwOi8vd3d3LmdldHVpa2l0LmNvbSB8IChjKSAyMDE0IFlPT3RoZW1lIHwgTUlUIExpY2Vuc2UgKi9cbiFmdW5jdGlvbihpKXt2YXIgdDt3aW5kb3cuVUlraXQyJiYodD1pKFVJa2l0MikpLFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKFwidWlraXQtbGlnaHRib3hcIixbXCJ1aWtpdFwiXSxmdW5jdGlvbigpe3JldHVybiB0fHxpKFVJa2l0Mil9KX0oZnVuY3Rpb24oaSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gdCh0KXtpZihlKXJldHVybiBlLmxpZ2h0Ym94PXQsZTtlPWkuJChbJzxkaXYgY2xhc3M9XCJ1ay1tb2RhbFwiPicsJzxkaXYgY2xhc3M9XCJ1ay1tb2RhbC1kaWFsb2cgdWstbW9kYWwtZGlhbG9nLWxpZ2h0Ym94IHVrLXNsaWRlbmF2LXBvc2l0aW9uXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDphdXRvO21hcmdpbi1yaWdodDphdXRvO3dpZHRoOjIwMHB4O2hlaWdodDoyMDBweDt0b3A6JytNYXRoLmFicyh3aW5kb3cuaW5uZXJIZWlnaHQvMi0yMDApKydweDtcIj4nLCc8YSBocmVmPVwiI1wiIGNsYXNzPVwidWstbW9kYWwtY2xvc2UgdWstY2xvc2UgdWstY2xvc2UtYWx0XCI+PC9hPicsJzxkaXYgY2xhc3M9XCJ1ay1saWdodGJveC1jb250ZW50XCI+PC9kaXY+JywnPGRpdiBjbGFzcz1cInVrLW1vZGFsLXNwaW5uZXIgdWstaGlkZGVuXCI+PC9kaXY+JyxcIjwvZGl2PlwiLFwiPC9kaXY+XCJdLmpvaW4oXCJcIikpLmFwcGVuZFRvKFwiYm9keVwiKSxlLmRpYWxvZz1lLmZpbmQoXCIudWstbW9kYWwtZGlhbG9nOmZpcnN0XCIpLGUuY29udGVudD1lLmZpbmQoXCIudWstbGlnaHRib3gtY29udGVudDpmaXJzdFwiKSxlLmxvYWRlcj1lLmZpbmQoXCIudWstbW9kYWwtc3Bpbm5lcjpmaXJzdFwiKSxlLmNsb3Nlcj1lLmZpbmQoXCIudWstY2xvc2UudWstY2xvc2UtYWx0XCIpLGUubW9kYWw9aS5tb2RhbChlLHttb2RhbDohMX0pLGUub24oXCJzd2lwZVJpZ2h0IHN3aXBlTGVmdFwiLGZ1bmN0aW9uKGkpe2UubGlnaHRib3hbXCJzd2lwZUxlZnRcIj09aS50eXBlP1wibmV4dFwiOlwicHJldmlvdXNcIl0oKX0pLm9uKFwiY2xpY2tcIixcIltkYXRhLWxpZ2h0Ym94LXByZXZpb3VzXSwgW2RhdGEtbGlnaHRib3gtbmV4dF1cIixmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCksZS5saWdodGJveFtpLiQodGhpcykuaXMoXCJbZGF0YS1saWdodGJveC1uZXh0XVwiKT9cIm5leHRcIjpcInByZXZpb3VzXCJdKCl9KSxlLm9uKFwiaGlkZS51ay5tb2RhbFwiLGZ1bmN0aW9uKCl7ZS5jb250ZW50Lmh0bWwoXCJcIil9KTt2YXIgbz17dzp3aW5kb3cuaW5uZXJXaWR0aCxoOndpbmRvdy5pbm5lckhlaWdodH07cmV0dXJuIGkuJHdpbi5vbihcImxvYWQgcmVzaXplIG9yaWVudGF0aW9uY2hhbmdlXCIsaS5VdGlscy5kZWJvdW5jZShmdW5jdGlvbigpe28udyE9PXdpbmRvdy5pbm5lcldpZHRoJiZlLmlzKFwiOnZpc2libGVcIikmJiFpLlV0aWxzLmlzRnVsbHNjcmVlbigpJiZlLmxpZ2h0Ym94LmZpdFNpemUoKSxvPXt3OndpbmRvdy5pbm5lcldpZHRoLGg6d2luZG93LmlubmVySGVpZ2h0fX0sMTAwKSksZS5saWdodGJveD10LGV9dmFyIGUsbz17fTtyZXR1cm4gaS5jb21wb25lbnQoXCJsaWdodGJveFwiLHtkZWZhdWx0czp7YWxsb3dmdWxsc2NyZWVuOiEwLGR1cmF0aW9uOjQwMCxncm91cDohMSxrZXlib2FyZDohMH0saW5kZXg6MCxpdGVtczohMSxib290OmZ1bmN0aW9uKCl7aS4kaHRtbC5vbihcImNsaWNrXCIsXCJbZGF0YS11ay1saWdodGJveF1cIixmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCk7dmFyIGU9aS4kKHRoaXMpO2UuZGF0YShcImxpZ2h0Ym94XCIpfHxpLmxpZ2h0Ym94KGUsaS5VdGlscy5vcHRpb25zKGUuYXR0cihcImRhdGEtdWstbGlnaHRib3hcIikpKSxlLmRhdGEoXCJsaWdodGJveFwiKS5zaG93KGUpfSksaS4kZG9jLm9uKFwia2V5dXBcIixmdW5jdGlvbihpKXtpZihlJiZlLmlzKFwiOnZpc2libGVcIikmJmUubGlnaHRib3gub3B0aW9ucy5rZXlib2FyZClzd2l0Y2goaS5wcmV2ZW50RGVmYXVsdCgpLGkua2V5Q29kZSl7Y2FzZSAzNzplLmxpZ2h0Ym94LnByZXZpb3VzKCk7YnJlYWs7Y2FzZSAzOTplLmxpZ2h0Ym94Lm5leHQoKX19KX0saW5pdDpmdW5jdGlvbigpe3ZhciB0PVtdO2lmKHRoaXMuaW5kZXg9MCx0aGlzLnNpYmxpbmdzPVtdLHRoaXMuZWxlbWVudCYmdGhpcy5lbGVtZW50Lmxlbmd0aCl7dmFyIGU9dGhpcy5vcHRpb25zLmdyb3VwP2kuJCgnW2RhdGEtdWstbGlnaHRib3gqPVwiJyt0aGlzLm9wdGlvbnMuZ3JvdXArJ1wiXScpOnRoaXMuZWxlbWVudDtlLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1pLiQodGhpcyk7dC5wdXNoKHtzb3VyY2U6ZS5hdHRyKFwiaHJlZlwiKSx0aXRsZTplLmF0dHIoXCJkYXRhLXRpdGxlXCIpfHxlLmF0dHIoXCJ0aXRsZVwiKSx0eXBlOmUuYXR0cihcImRhdGEtbGlnaHRib3gtdHlwZVwiKXx8XCJhdXRvXCIsbGluazplfSl9KSx0aGlzLmluZGV4PWUuaW5kZXgodGhpcy5lbGVtZW50KSx0aGlzLnNpYmxpbmdzPXR9ZWxzZSB0aGlzLm9wdGlvbnMuZ3JvdXAmJnRoaXMub3B0aW9ucy5ncm91cC5sZW5ndGgmJih0aGlzLnNpYmxpbmdzPXRoaXMub3B0aW9ucy5ncm91cCk7dGhpcy50cmlnZ2VyKFwibGlnaHRib3gtaW5pdFwiLFt0aGlzXSl9LHNob3c6ZnVuY3Rpb24oZSl7dGhpcy5tb2RhbD10KHRoaXMpLHRoaXMubW9kYWwuZGlhbG9nLnN0b3AoKSx0aGlzLm1vZGFsLmNvbnRlbnQuc3RvcCgpO3ZhciBvLG4scz10aGlzLGg9aS4kLkRlZmVycmVkKCk7ZT1lfHwwLFwib2JqZWN0XCI9PXR5cGVvZiBlJiZ0aGlzLnNpYmxpbmdzLmZvckVhY2goZnVuY3Rpb24oaSx0KXtlWzBdPT09aS5saW5rWzBdJiYoZT10KX0pLDA+ZT9lPXRoaXMuc2libGluZ3MubGVuZ3RoLWU6dGhpcy5zaWJsaW5nc1tlXXx8KGU9MCksbj10aGlzLnNpYmxpbmdzW2VdLG89e2xpZ2h0Ym94OnMsc291cmNlOm4uc291cmNlLHR5cGU6bi50eXBlLGluZGV4OmUscHJvbWlzZTpoLHRpdGxlOm4udGl0bGUsaXRlbTpuLG1ldGE6e2NvbnRlbnQ6XCJcIix3aWR0aDpudWxsLGhlaWdodDpudWxsfX0sdGhpcy5pbmRleD1lLHRoaXMubW9kYWwuY29udGVudC5lbXB0eSgpLHRoaXMubW9kYWwuaXMoXCI6dmlzaWJsZVwiKXx8KHRoaXMubW9kYWwuY29udGVudC5jc3Moe3dpZHRoOlwiXCIsaGVpZ2h0OlwiXCJ9KS5lbXB0eSgpLHRoaXMubW9kYWwubW9kYWwuc2hvdygpKSx0aGlzLm1vZGFsLmxvYWRlci5yZW1vdmVDbGFzcyhcInVrLWhpZGRlblwiKSxoLnByb21pc2UoKS5kb25lKGZ1bmN0aW9uKCl7cy5kYXRhPW8scy5maXRTaXplKG8pfSkuZmFpbChmdW5jdGlvbigpe28ubWV0YS5jb250ZW50PSc8ZGl2IGNsYXNzPVwidWstcG9zaXRpb24tY292ZXIgdWstZmxleCB1ay1mbGV4LW1pZGRsZSB1ay1mbGV4LWNlbnRlclwiPjxzdHJvbmc+TG9hZGluZyByZXNvdXJjZSBmYWlsZWQhPC9zdHJvbmc+PC9kaXY+JyxvLm1ldGEud2lkdGg9NDAwLG8ubWV0YS5oZWlnaHQ9MzAwLHMuZGF0YT1vLHMuZml0U2l6ZShvKX0pLHMudHJpZ2dlcihcInNob3dpdGVtLnVrLmxpZ2h0Ym94XCIsW29dKX0sZml0U2l6ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLmRhdGEsbz10aGlzLm1vZGFsLmRpYWxvZy5vdXRlcldpZHRoKCktdGhpcy5tb2RhbC5kaWFsb2cud2lkdGgoKSxuPXBhcnNlSW50KHRoaXMubW9kYWwuZGlhbG9nLmNzcyhcIm1hcmdpbi10b3BcIiksMTApLHM9cGFyc2VJbnQodGhpcy5tb2RhbC5kaWFsb2cuY3NzKFwibWFyZ2luLWJvdHRvbVwiKSwxMCksaD1uK3MsYT1lLm1ldGEuY29udGVudCxsPXQub3B0aW9ucy5kdXJhdGlvbjt0aGlzLnNpYmxpbmdzLmxlbmd0aD4xJiYoYT1bYSwnPGEgaHJlZj1cIiNcIiBjbGFzcz1cInVrLXNsaWRlbmF2IHVrLXNsaWRlbmF2LWNvbnRyYXN0IHVrLXNsaWRlbmF2LXByZXZpb3VzIHVrLWhpZGRlbi10b3VjaFwiIGRhdGEtbGlnaHRib3gtcHJldmlvdXM+PC9hPicsJzxhIGhyZWY9XCIjXCIgY2xhc3M9XCJ1ay1zbGlkZW5hdiB1ay1zbGlkZW5hdi1jb250cmFzdCB1ay1zbGlkZW5hdi1uZXh0IHVrLWhpZGRlbi10b3VjaFwiIGRhdGEtbGlnaHRib3gtbmV4dD48L2E+J10uam9pbihcIlwiKSk7dmFyIGQscix1PWkuJChcIjxkaXY+Jm5ic3A7PC9kaXY+XCIpLmNzcyh7b3BhY2l0eTowLHBvc2l0aW9uOlwiYWJzb2x1dGVcIix0b3A6MCxsZWZ0OjAsd2lkdGg6XCIxMDAlXCIsbWF4V2lkdGg6dC5tb2RhbC5kaWFsb2cuY3NzKFwibWF4LXdpZHRoXCIpLHBhZGRpbmc6dC5tb2RhbC5kaWFsb2cuY3NzKFwicGFkZGluZ1wiKSxtYXJnaW46dC5tb2RhbC5kaWFsb2cuY3NzKFwibWFyZ2luXCIpfSksYz1lLm1ldGEud2lkdGgsZz1lLm1ldGEuaGVpZ2h0O3UuYXBwZW5kVG8oXCJib2R5XCIpLndpZHRoKCksZD11LndpZHRoKCkscj13aW5kb3cuaW5uZXJIZWlnaHQtaCx1LnJlbW92ZSgpLHRoaXMubW9kYWwuZGlhbG9nLmZpbmQoXCIudWstbW9kYWwtY2FwdGlvblwiKS5yZW1vdmUoKSxlLnRpdGxlJiYodGhpcy5tb2RhbC5kaWFsb2cuYXBwZW5kKCc8ZGl2IGNsYXNzPVwidWstbW9kYWwtY2FwdGlvblwiPicrZS50aXRsZStcIjwvZGl2PlwiKSxyLT10aGlzLm1vZGFsLmRpYWxvZy5maW5kKFwiLnVrLW1vZGFsLWNhcHRpb25cIikub3V0ZXJIZWlnaHQoKSksZDxlLm1ldGEud2lkdGgmJihnPU1hdGguZmxvb3IoZyooZC9jKSksYz1kKSxnPnImJihnPU1hdGguZmxvb3IociksYz1NYXRoLmNlaWwoZS5tZXRhLndpZHRoKihyL2UubWV0YS5oZWlnaHQpKSksdGhpcy5tb2RhbC5jb250ZW50LmNzcyhcIm9wYWNpdHlcIiwwKS53aWR0aChjKS5odG1sKGEpLFwiaWZyYW1lXCI9PWUudHlwZSYmdGhpcy5tb2RhbC5jb250ZW50LmZpbmQoXCJpZnJhbWU6Zmlyc3RcIikuaGVpZ2h0KGcpO3ZhciBtPWcrbyxwPU1hdGguZmxvb3Iod2luZG93LmlubmVySGVpZ2h0LzItbS8yKS1oOzA+cCYmKHA9MCksdGhpcy5tb2RhbC5jbG9zZXIuYWRkQ2xhc3MoXCJ1ay1oaWRkZW5cIiksdC5tb2RhbC5kYXRhKFwibXdpZHRoXCIpPT1jJiZ0Lm1vZGFsLmRhdGEoXCJtaGVpZ2h0XCIpPT1nJiYobD0wKSx0aGlzLm1vZGFsLmRpYWxvZy5hbmltYXRlKHt3aWR0aDpjK28saGVpZ2h0Omcrbyx0b3A6cH0sbCxcInN3aW5nXCIsZnVuY3Rpb24oKXt0Lm1vZGFsLmxvYWRlci5hZGRDbGFzcyhcInVrLWhpZGRlblwiKSx0Lm1vZGFsLmNvbnRlbnQuY3NzKHt3aWR0aDpcIlwifSkuYW5pbWF0ZSh7b3BhY2l0eToxfSxmdW5jdGlvbigpe3QubW9kYWwuY2xvc2VyLnJlbW92ZUNsYXNzKFwidWstaGlkZGVuXCIpfSksdC5tb2RhbC5kYXRhKHttd2lkdGg6YyxtaGVpZ2h0Omd9KX0pfSxuZXh0OmZ1bmN0aW9uKCl7dGhpcy5zaG93KHRoaXMuc2libGluZ3NbdGhpcy5pbmRleCsxXT90aGlzLmluZGV4KzE6MCl9LHByZXZpb3VzOmZ1bmN0aW9uKCl7dGhpcy5zaG93KHRoaXMuc2libGluZ3NbdGhpcy5pbmRleC0xXT90aGlzLmluZGV4LTE6dGhpcy5zaWJsaW5ncy5sZW5ndGgtMSl9fSksaS5wbHVnaW4oXCJsaWdodGJveFwiLFwiaW1hZ2VcIix7aW5pdDpmdW5jdGlvbihpKXtpLm9uKFwic2hvd2l0ZW0udWsubGlnaHRib3hcIixmdW5jdGlvbihpLHQpe2lmKFwiaW1hZ2VcIj09dC50eXBlfHx0LnNvdXJjZSYmdC5zb3VyY2UubWF0Y2goL1xcLihqcGd8anBlZ3xwbmd8Z2lmfHN2ZykkL2kpKXt2YXIgZT1mdW5jdGlvbihpLGUsbyl7dC5tZXRhPXtjb250ZW50Oic8aW1nIGNsYXNzPVwidWstcmVzcG9uc2l2ZS13aWR0aFwiIHdpZHRoPVwiJytlKydcIiBoZWlnaHQ9XCInK28rJ1wiIHNyYyA9XCInK2krJ1wiPicsd2lkdGg6ZSxoZWlnaHQ6b30sdC50eXBlPVwiaW1hZ2VcIix0LnByb21pc2UucmVzb2x2ZSgpfTtpZihvW3Quc291cmNlXSllKHQuc291cmNlLG9bdC5zb3VyY2VdLndpZHRoLG9bdC5zb3VyY2VdLmhlaWdodCk7ZWxzZXt2YXIgbj1uZXcgSW1hZ2U7bi5vbmVycm9yPWZ1bmN0aW9uKCl7dC5wcm9taXNlLnJlamVjdChcIkxvYWRpbmcgaW1hZ2UgZmFpbGVkXCIpfSxuLm9ubG9hZD1mdW5jdGlvbigpe29bdC5zb3VyY2VdPXt3aWR0aDpuLndpZHRoLGhlaWdodDpuLmhlaWdodH0sZSh0LnNvdXJjZSxvW3Quc291cmNlXS53aWR0aCxvW3Quc291cmNlXS5oZWlnaHQpfSxuLnNyYz10LnNvdXJjZX19fSl9fSksaS5wbHVnaW4oXCJsaWdodGJveFwiLFwieW91dHViZVwiLHtpbml0OmZ1bmN0aW9uKGkpe3ZhciB0PS8oXFwvXFwvLio/eW91dHViZVxcLlthLXpdKylcXC93YXRjaFxcP3Y9KFteJl0rKSY/KC4qKS8sbj0veW91dHVcXC5iZVxcLyguKikvO2kub24oXCJzaG93aXRlbS51ay5saWdodGJveFwiLGZ1bmN0aW9uKGkscyl7dmFyIGgsYSxsPWZ1bmN0aW9uKGksdCxvKXtzLm1ldGE9e2NvbnRlbnQ6JzxpZnJhbWUgc3JjPVwiLy93d3cueW91dHViZS5jb20vZW1iZWQvJytpKydcIiB3aWR0aD1cIicrdCsnXCIgaGVpZ2h0PVwiJytvKydcIiBzdHlsZT1cIm1heC13aWR0aDoxMDAlO1wiJysoZS5saWdodGJveC5vcHRpb25zLmFsbG93ZnVsbHNjcmVlbj9cIiBhbGxvd2Z1bGxzY3JlZW5cIjpcIlwiKStcIj48L2lmcmFtZT5cIix3aWR0aDp0LGhlaWdodDpvfSxzLnR5cGU9XCJpZnJhbWVcIixzLnByb21pc2UucmVzb2x2ZSgpfTtpZigoYT1zLnNvdXJjZS5tYXRjaCh0KSkmJihoPWFbMl0pLChhPXMuc291cmNlLm1hdGNoKG4pKSYmKGg9YVsxXSksaCl7aWYob1toXSlsKGgsb1toXS53aWR0aCxvW2hdLmhlaWdodCk7ZWxzZXt2YXIgZD1uZXcgSW1hZ2Uscj0hMTtkLm9uZXJyb3I9ZnVuY3Rpb24oKXtvW2hdPXt3aWR0aDo2NDAsaGVpZ2h0OjMyMH0sbChoLG9baF0ud2lkdGgsb1toXS5oZWlnaHQpfSxkLm9ubG9hZD1mdW5jdGlvbigpezEyMD09ZC53aWR0aCYmOTA9PWQuaGVpZ2h0P3I/KG9baF09e3dpZHRoOjY0MCxoZWlnaHQ6MzIwfSxsKGgsb1toXS53aWR0aCxvW2hdLmhlaWdodCkpOihyPSEwLGQuc3JjPVwiLy9pbWcueW91dHViZS5jb20vdmkvXCIraCtcIi8wLmpwZ1wiKToob1toXT17d2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9LGwoaCxkLndpZHRoLGQuaGVpZ2h0KSl9LGQuc3JjPVwiLy9pbWcueW91dHViZS5jb20vdmkvXCIraCtcIi9tYXhyZXNkZWZhdWx0LmpwZ1wifWkuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9fSl9fSksaS5wbHVnaW4oXCJsaWdodGJveFwiLFwidmltZW9cIix7aW5pdDpmdW5jdGlvbih0KXt2YXIgbixzPS8oXFwvXFwvLio/KXZpbWVvXFwuW2Etel0rXFwvKFswLTldKykuKj8vO3Qub24oXCJzaG93aXRlbS51ay5saWdodGJveFwiLGZ1bmN0aW9uKHQsaCl7dmFyIGEsbD1mdW5jdGlvbihpLHQsbyl7aC5tZXRhPXtjb250ZW50Oic8aWZyYW1lIHNyYz1cIi8vcGxheWVyLnZpbWVvLmNvbS92aWRlby8nK2krJ1wiIHdpZHRoPVwiJyt0KydcIiBoZWlnaHQ9XCInK28rJ1wiIHN0eWxlPVwid2lkdGg6MTAwJTtib3gtc2l6aW5nOmJvcmRlci1ib3g7XCInKyhlLmxpZ2h0Ym94Lm9wdGlvbnMuYWxsb3dmdWxsc2NyZWVuP1wiIGFsbG93ZnVsbHNjcmVlblwiOlwiXCIpK1wiPjwvaWZyYW1lPlwiLHdpZHRoOnQsaGVpZ2h0Om99LGgudHlwZT1cImlmcmFtZVwiLGgucHJvbWlzZS5yZXNvbHZlKCl9OyhuPWguc291cmNlLm1hdGNoKHMpKSYmKGE9blsyXSxvW2FdP2woYSxvW2FdLndpZHRoLG9bYV0uaGVpZ2h0KTppLiQuYWpheCh7dHlwZTpcIkdFVFwiLHVybDpcIi8vdmltZW8uY29tL2FwaS9vZW1iZWQuanNvbj91cmw9XCIrZW5jb2RlVVJJKGguc291cmNlKSxqc29ucDpcImNhbGxiYWNrXCIsZGF0YVR5cGU6XCJqc29ucFwiLHN1Y2Nlc3M6ZnVuY3Rpb24oaSl7b1thXT17d2lkdGg6aS53aWR0aCxoZWlnaHQ6aS5oZWlnaHR9LGwoYSxvW2FdLndpZHRoLG9bYV0uaGVpZ2h0KX19KSx0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpKX0pfX0pLGkucGx1Z2luKFwibGlnaHRib3hcIixcInZpZGVvXCIse2luaXQ6ZnVuY3Rpb24odCl7dC5vbihcInNob3dpdGVtLnVrLmxpZ2h0Ym94XCIsZnVuY3Rpb24odCxlKXt2YXIgbj1mdW5jdGlvbihpLHQsbyl7ZS5tZXRhPXtjb250ZW50Oic8dmlkZW8gY2xhc3M9XCJ1ay1yZXNwb25zaXZlLXdpZHRoXCIgc3JjPVwiJytpKydcIiB3aWR0aD1cIicrdCsnXCIgaGVpZ2h0PVwiJytvKydcIiBjb250cm9scz48L3ZpZGVvPicsd2lkdGg6dCxoZWlnaHQ6b30sZS50eXBlPVwidmlkZW9cIixlLnByb21pc2UucmVzb2x2ZSgpfTtpZihcInZpZGVvXCI9PWUudHlwZXx8ZS5zb3VyY2UubWF0Y2goL1xcLihtcDR8d2VibXxvZ3YpJC9pKSlpZihvW2Uuc291cmNlXSluKGUuc291cmNlLG9bZS5zb3VyY2VdLndpZHRoLG9bZS5zb3VyY2VdLmhlaWdodCk7ZWxzZSB2YXIgcz1pLiQoJzx2aWRlbyBzdHlsZT1cInBvc2l0aW9uOmZpeGVkO3Zpc2liaWxpdHk6aGlkZGVuO3RvcDotMTAwMDBweDtcIj48L3ZpZGVvPicpLmF0dHIoXCJzcmNcIixlLnNvdXJjZSkuYXBwZW5kVG8oXCJib2R5XCIpLGg9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtzWzBdLnZpZGVvV2lkdGgmJihjbGVhckludGVydmFsKGgpLG9bZS5zb3VyY2VdPXt3aWR0aDpzWzBdLnZpZGVvV2lkdGgsaGVpZ2h0OnNbMF0udmlkZW9IZWlnaHR9LG4oZS5zb3VyY2Usb1tlLnNvdXJjZV0ud2lkdGgsb1tlLnNvdXJjZV0uaGVpZ2h0KSxzLnJlbW92ZSgpKX0sMjApfSl9fSksaS5wbHVnaW4oXCJsaWdodGJveFwiLFwiaWZyYW1lXCIse2luaXQ6ZnVuY3Rpb24oaSl7aS5vbihcInNob3dpdGVtLnVrLmxpZ2h0Ym94XCIsZnVuY3Rpb24odCxvKXt2YXIgbj1mdW5jdGlvbihpLHQsbil7by5tZXRhPXtjb250ZW50Oic8aWZyYW1lIGNsYXNzPVwidWstcmVzcG9uc2l2ZS13aWR0aFwiIHNyYz1cIicraSsnXCIgd2lkdGg9XCInK3QrJ1wiIGhlaWdodD1cIicrbisnXCInKyhlLmxpZ2h0Ym94Lm9wdGlvbnMuYWxsb3dmdWxsc2NyZWVuP1wiIGFsbG93ZnVsbHNjcmVlblwiOlwiXCIpK1wiPjwvaWZyYW1lPlwiLHdpZHRoOnQsaGVpZ2h0Om59LG8udHlwZT1cImlmcmFtZVwiLG8ucHJvbWlzZS5yZXNvbHZlKCl9OyhcImlmcmFtZVwiPT09by50eXBlfHxvLnNvdXJjZS5tYXRjaCgvXFwuKGh0bWx8cGhwKSQvKSkmJm4oby5zb3VyY2UsaS5vcHRpb25zLndpZHRofHw4MDAsaS5vcHRpb25zLmhlaWdodHx8NjAwKX0pfX0pLGkubGlnaHRib3guY3JlYXRlPWZ1bmN0aW9uKHQsZSl7aWYodCl7dmFyIG8sbj1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe24ucHVzaChpLiQuZXh0ZW5kKHtzb3VyY2U6XCJcIix0aXRsZTpcIlwiLHR5cGU6XCJhdXRvXCIsbGluazohMX0sXCJzdHJpbmdcIj09dHlwZW9mIHQ/e3NvdXJjZTp0fTp0KSl9KSxvPWkubGlnaHRib3goaS4kLmV4dGVuZCh7fSxlLHtncm91cDpufSkpfX0saS5saWdodGJveH0pOyIsIi8qISBVSWtpdCAyLjI3LjQgfCBodHRwOi8vd3d3LmdldHVpa2l0LmNvbSB8IChjKSAyMDE0IFlPT3RoZW1lIHwgTUlUIExpY2Vuc2UgKi9cbiFmdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpKGksZSl7cmV0dXJuIGU/KFwib2JqZWN0XCI9PXR5cGVvZiBpPyhpPWkgaW5zdGFuY2VvZiBqUXVlcnk/aTp0LiQoaSksaS5wYXJlbnQoKS5sZW5ndGgmJihlLnBlcnNpc3Q9aSxlLnBlcnNpc3QuZGF0YShcIm1vZGFsUGVyc2lzdFBhcmVudFwiLGkucGFyZW50KCkpKSk6aT1cInN0cmluZ1wiPT10eXBlb2YgaXx8XCJudW1iZXJcIj09dHlwZW9mIGk/dC4kKFwiPGRpdj48L2Rpdj5cIikuaHRtbChpKTp0LiQoXCI8ZGl2PjwvZGl2PlwiKS5odG1sKFwiVUlraXQyLm1vZGFsIEVycm9yOiBVbnN1cHBvcnRlZCBkYXRhIHR5cGU6IFwiK3R5cGVvZiBpKSxpLmFwcGVuZFRvKGUuZWxlbWVudC5maW5kKFwiLnVrLW1vZGFsLWRpYWxvZ1wiKSksZSk6dm9pZCAwfXZhciBlLG89ITEsbj0wLHM9dC4kaHRtbDt0LiR3aW4ub24oXCJyZXNpemUgb3JpZW50YXRpb25jaGFuZ2VcIix0LlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uKCl7dC4kKFwiLnVrLW1vZGFsLnVrLW9wZW5cIikuZWFjaChmdW5jdGlvbigpe3JldHVybiB0LiQodGhpcykuZGF0YShcIm1vZGFsXCIpJiZ0LiQodGhpcykuZGF0YShcIm1vZGFsXCIpLnJlc2l6ZSgpfSl9LDE1MCkpLHQuY29tcG9uZW50KFwibW9kYWxcIix7ZGVmYXVsdHM6e2tleWJvYXJkOiEwLGJnY2xvc2U6ITAsbWluU2Nyb2xsSGVpZ2h0OjE1MCxjZW50ZXI6ITEsbW9kYWw6ITB9LHNjcm9sbGFibGU6ITEsdHJhbnNpdGlvbjohMSxoYXNUcmFuc2l0aW9uZWQ6ITAsaW5pdDpmdW5jdGlvbigpe2lmKGV8fChlPXQuJChcImJvZHlcIikpLHRoaXMuZWxlbWVudC5sZW5ndGgpe3ZhciBpPXRoaXM7dGhpcy5wYWRkaW5nZGlyPVwicGFkZGluZy1cIisoXCJsZWZ0XCI9PXQubGFuZ2RpcmVjdGlvbj9cInJpZ2h0XCI6XCJsZWZ0XCIpLHRoaXMuZGlhbG9nPXRoaXMuZmluZChcIi51ay1tb2RhbC1kaWFsb2dcIiksdGhpcy5hY3RpdmU9ITEsdGhpcy5lbGVtZW50LmF0dHIoXCJhcmlhLWhpZGRlblwiLHRoaXMuZWxlbWVudC5oYXNDbGFzcyhcInVrLW9wZW5cIikpLHRoaXMub24oXCJjbGlja1wiLFwiLnVrLW1vZGFsLWNsb3NlXCIsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLGkuaGlkZSgpfSkub24oXCJjbGlja1wiLGZ1bmN0aW9uKGUpe3ZhciBvPXQuJChlLnRhcmdldCk7b1swXT09aS5lbGVtZW50WzBdJiZpLm9wdGlvbnMuYmdjbG9zZSYmaS5oaWRlKCl9KSx0LmRvbU9ic2VydmUodGhpcy5lbGVtZW50LGZ1bmN0aW9uKCl7aS5yZXNpemUoKX0pfX0sdG9nZ2xlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGhpcy5pc0FjdGl2ZSgpP1wiaGlkZVwiOlwic2hvd1wiXSgpfSxzaG93OmZ1bmN0aW9uKCl7aWYodGhpcy5lbGVtZW50Lmxlbmd0aCl7dmFyIGk9dGhpcztpZighdGhpcy5pc0FjdGl2ZSgpKXJldHVybiB0aGlzLm9wdGlvbnMubW9kYWwmJm8mJm8uaGlkZSghMCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKFwidWstb3BlblwiKS5zaG93KCksdGhpcy5yZXNpemUoITApLHRoaXMub3B0aW9ucy5tb2RhbCYmKG89dGhpcyksdGhpcy5hY3RpdmU9ITAsbisrLHQuc3VwcG9ydC50cmFuc2l0aW9uPyh0aGlzLmhhc1RyYW5zaXRpb25lZD0hMSx0aGlzLmVsZW1lbnQub25lKHQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCxmdW5jdGlvbigpe2kuaGFzVHJhbnNpdGlvbmVkPSEwLHQuVXRpbHMuZm9jdXMoaS5kaWFsb2csXCJhW2hyZWZdXCIpfSkuYWRkQ2xhc3MoXCJ1ay1vcGVuXCIpKToodGhpcy5lbGVtZW50LmFkZENsYXNzKFwidWstb3BlblwiKSx0LlV0aWxzLmZvY3VzKHRoaXMuZGlhbG9nLFwiYVtocmVmXVwiKSkscy5hZGRDbGFzcyhcInVrLW1vZGFsLXBhZ2VcIikuaGVpZ2h0KCksdGhpcy5lbGVtZW50LmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIiksdGhpcy5lbGVtZW50LnRyaWdnZXIoXCJzaG93LnVrLm1vZGFsXCIpLHQuVXRpbHMuY2hlY2tEaXNwbGF5KHRoaXMuZGlhbG9nLCEwKSx0aGlzfX0saGlkZTpmdW5jdGlvbihpKXtpZighaSYmdC5zdXBwb3J0LnRyYW5zaXRpb24mJnRoaXMuaGFzVHJhbnNpdGlvbmVkKXt2YXIgZT10aGlzO3RoaXMub25lKHQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCxmdW5jdGlvbigpe2UuX2hpZGUoKX0pLnJlbW92ZUNsYXNzKFwidWstb3BlblwiKX1lbHNlIHRoaXMuX2hpZGUoKTtyZXR1cm4gdGhpc30scmVzaXplOmZ1bmN0aW9uKHQpe2lmKHRoaXMuaXNBY3RpdmUoKXx8dCl7dmFyIGk9ZS53aWR0aCgpO2lmKHRoaXMuc2Nyb2xsYmFyd2lkdGg9d2luZG93LmlubmVyV2lkdGgtaSxlLmNzcyh0aGlzLnBhZGRpbmdkaXIsdGhpcy5zY3JvbGxiYXJ3aWR0aCksdGhpcy5lbGVtZW50LmNzcyhcIm92ZXJmbG93LXlcIix0aGlzLnNjcm9sbGJhcndpZHRoP1wic2Nyb2xsXCI6XCJhdXRvXCIpLCF0aGlzLnVwZGF0ZVNjcm9sbGFibGUoKSYmdGhpcy5vcHRpb25zLmNlbnRlcil7dmFyIG89dGhpcy5kaWFsb2cub3V0ZXJIZWlnaHQoKSxuPXBhcnNlSW50KHRoaXMuZGlhbG9nLmNzcyhcIm1hcmdpbi10b3BcIiksMTApK3BhcnNlSW50KHRoaXMuZGlhbG9nLmNzcyhcIm1hcmdpbi1ib3R0b21cIiksMTApO28rbjx3aW5kb3cuaW5uZXJIZWlnaHQ/dGhpcy5kaWFsb2cuY3NzKHt0b3A6d2luZG93LmlubmVySGVpZ2h0LzItby8yLW59KTp0aGlzLmRpYWxvZy5jc3Moe3RvcDpcIlwifSl9fX0sdXBkYXRlU2Nyb2xsYWJsZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZGlhbG9nLmZpbmQoXCIudWstb3ZlcmZsb3ctY29udGFpbmVyOnZpc2libGU6Zmlyc3RcIik7aWYodC5sZW5ndGgpe3QuY3NzKFwiaGVpZ2h0XCIsMCk7dmFyIGk9TWF0aC5hYnMocGFyc2VJbnQodGhpcy5kaWFsb2cuY3NzKFwibWFyZ2luLXRvcFwiKSwxMCkpLGU9dGhpcy5kaWFsb2cub3V0ZXJIZWlnaHQoKSxvPXdpbmRvdy5pbm5lckhlaWdodCxuPW8tMiooMjA+aT8yMDppKS1lO3JldHVybiB0LmNzcyh7bWF4SGVpZ2h0Om48dGhpcy5vcHRpb25zLm1pblNjcm9sbEhlaWdodD9cIlwiOm4saGVpZ2h0OlwiXCJ9KSwhMH1yZXR1cm4hMX0sX2hpZGU6ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZT0hMSxuPjA/bi0tOm49MCx0aGlzLmVsZW1lbnQuaGlkZSgpLnJlbW92ZUNsYXNzKFwidWstb3BlblwiKSx0aGlzLmVsZW1lbnQuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJ0cnVlXCIpLG58fChzLnJlbW92ZUNsYXNzKFwidWstbW9kYWwtcGFnZVwiKSxlLmNzcyh0aGlzLnBhZGRpbmdkaXIsXCJcIikpLG89PT10aGlzJiYobz0hMSksdGhpcy50cmlnZ2VyKFwiaGlkZS51ay5tb2RhbFwiKX0saXNBY3RpdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50Lmhhc0NsYXNzKFwidWstb3BlblwiKX19KSx0LmNvbXBvbmVudChcIm1vZGFsVHJpZ2dlclwiLHtib290OmZ1bmN0aW9uKCl7dC4kaHRtbC5vbihcImNsaWNrLm1vZGFsLnVpa2l0XCIsXCJbZGF0YS11ay1tb2RhbF1cIixmdW5jdGlvbihpKXt2YXIgZT10LiQodGhpcyk7aWYoZS5pcyhcImFcIikmJmkucHJldmVudERlZmF1bHQoKSwhZS5kYXRhKFwibW9kYWxUcmlnZ2VyXCIpKXt2YXIgbz10Lm1vZGFsVHJpZ2dlcihlLHQuVXRpbHMub3B0aW9ucyhlLmF0dHIoXCJkYXRhLXVrLW1vZGFsXCIpKSk7by5zaG93KCl9fSksdC4kaHRtbC5vbihcImtleWRvd24ubW9kYWwudWlraXRcIixmdW5jdGlvbih0KXtvJiYyNz09PXQua2V5Q29kZSYmby5vcHRpb25zLmtleWJvYXJkJiYodC5wcmV2ZW50RGVmYXVsdCgpLG8uaGlkZSgpKX0pfSxpbml0OmZ1bmN0aW9uKCl7dmFyIGk9dGhpczt0aGlzLm9wdGlvbnM9dC4kLmV4dGVuZCh7dGFyZ2V0OmkuZWxlbWVudC5pcyhcImFcIik/aS5lbGVtZW50LmF0dHIoXCJocmVmXCIpOiExfSx0aGlzLm9wdGlvbnMpLHRoaXMubW9kYWw9dC5tb2RhbCh0aGlzLm9wdGlvbnMudGFyZ2V0LHRoaXMub3B0aW9ucyksdGhpcy5vbihcImNsaWNrXCIsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLGkuc2hvdygpfSksdGhpcy5wcm94eSh0aGlzLm1vZGFsLFwic2hvdyBoaWRlIGlzQWN0aXZlXCIpfX0pLHQubW9kYWwuZGlhbG9nPWZ1bmN0aW9uKGUsbyl7dmFyIG49dC5tb2RhbCh0LiQodC5tb2RhbC5kaWFsb2cudGVtcGxhdGUpLmFwcGVuZFRvKFwiYm9keVwiKSxvKTtyZXR1cm4gbi5vbihcImhpZGUudWsubW9kYWxcIixmdW5jdGlvbigpe24ucGVyc2lzdCYmKG4ucGVyc2lzdC5hcHBlbmRUbyhuLnBlcnNpc3QuZGF0YShcIm1vZGFsUGVyc2lzdFBhcmVudFwiKSksbi5wZXJzaXN0PSExKSxuLmVsZW1lbnQucmVtb3ZlKCl9KSxpKGUsbiksbn0sdC5tb2RhbC5kaWFsb2cudGVtcGxhdGU9JzxkaXYgY2xhc3M9XCJ1ay1tb2RhbFwiPjxkaXYgY2xhc3M9XCJ1ay1tb2RhbC1kaWFsb2dcIiBzdHlsZT1cIm1pbi1oZWlnaHQ6MDtcIj48L2Rpdj48L2Rpdj4nLHQubW9kYWwuYWxlcnQ9ZnVuY3Rpb24oaSxlKXtlPXQuJC5leHRlbmQoITAse2JnY2xvc2U6ITEsa2V5Ym9hcmQ6ITEsbW9kYWw6ITEsbGFiZWxzOnQubW9kYWwubGFiZWxzfSxlKTt2YXIgbz10Lm1vZGFsLmRpYWxvZyhbJzxkaXYgY2xhc3M9XCJ1ay1tYXJnaW4gdWstbW9kYWwtY29udGVudFwiPicrU3RyaW5nKGkpK1wiPC9kaXY+XCIsJzxkaXYgY2xhc3M9XCJ1ay1tb2RhbC1mb290ZXIgdWstdGV4dC1yaWdodFwiPjxidXR0b24gY2xhc3M9XCJ1ay1idXR0b24gdWstYnV0dG9uLXByaW1hcnkgdWstbW9kYWwtY2xvc2VcIj4nK2UubGFiZWxzLk9rK1wiPC9idXR0b24+PC9kaXY+XCJdLmpvaW4oXCJcIiksZSk7cmV0dXJuIG8ub24oXCJzaG93LnVrLm1vZGFsXCIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5lbGVtZW50LmZpbmQoXCJidXR0b246Zmlyc3RcIikuZm9jdXMoKX0sNTApfSksby5zaG93KCl9LHQubW9kYWwuY29uZmlybT1mdW5jdGlvbihpLGUsbyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0xXT9hcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0xXTp7fTtlPXQuJC5pc0Z1bmN0aW9uKGUpP2U6ZnVuY3Rpb24oKXt9LG89dC4kLmlzRnVuY3Rpb24obyk/bzpmdW5jdGlvbigpe30sbj10LiQuZXh0ZW5kKCEwLHtiZ2Nsb3NlOiExLGtleWJvYXJkOiExLG1vZGFsOiExLGxhYmVsczp0Lm1vZGFsLmxhYmVsc30sdC4kLmlzRnVuY3Rpb24obik/e306bik7dmFyIHM9dC5tb2RhbC5kaWFsb2coWyc8ZGl2IGNsYXNzPVwidWstbWFyZ2luIHVrLW1vZGFsLWNvbnRlbnRcIj4nK1N0cmluZyhpKStcIjwvZGl2PlwiLCc8ZGl2IGNsYXNzPVwidWstbW9kYWwtZm9vdGVyIHVrLXRleHQtcmlnaHRcIj48YnV0dG9uIGNsYXNzPVwidWstYnV0dG9uIGpzLW1vZGFsLWNvbmZpcm0tY2FuY2VsXCI+JytuLmxhYmVscy5DYW5jZWwrJzwvYnV0dG9uPiA8YnV0dG9uIGNsYXNzPVwidWstYnV0dG9uIHVrLWJ1dHRvbi1wcmltYXJ5IGpzLW1vZGFsLWNvbmZpcm1cIj4nK24ubGFiZWxzLk9rK1wiPC9idXR0b24+PC9kaXY+XCJdLmpvaW4oXCJcIiksbik7cmV0dXJuIHMuZWxlbWVudC5maW5kKFwiLmpzLW1vZGFsLWNvbmZpcm0sIC5qcy1tb2RhbC1jb25maXJtLWNhbmNlbFwiKS5vbihcImNsaWNrXCIsZnVuY3Rpb24oKXt0LiQodGhpcykuaXMoXCIuanMtbW9kYWwtY29uZmlybVwiKT9lKCk6bygpLHMuaGlkZSgpfSkscy5vbihcInNob3cudWsubW9kYWxcIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtzLmVsZW1lbnQuZmluZChcIi5qcy1tb2RhbC1jb25maXJtXCIpLmZvY3VzKCl9LDUwKX0pLHMuc2hvdygpfSx0Lm1vZGFsLnByb21wdD1mdW5jdGlvbihpLGUsbyxuKXtvPXQuJC5pc0Z1bmN0aW9uKG8pP286ZnVuY3Rpb24oKXt9LG49dC4kLmV4dGVuZCghMCx7YmdjbG9zZTohMSxrZXlib2FyZDohMSxtb2RhbDohMSxsYWJlbHM6dC5tb2RhbC5sYWJlbHN9LG4pO3ZhciBzPXQubW9kYWwuZGlhbG9nKFtpPyc8ZGl2IGNsYXNzPVwidWstbW9kYWwtY29udGVudCB1ay1mb3JtXCI+JytTdHJpbmcoaSkrXCI8L2Rpdj5cIjpcIlwiLCc8ZGl2IGNsYXNzPVwidWstbWFyZ2luLXNtYWxsLXRvcCB1ay1tb2RhbC1jb250ZW50IHVrLWZvcm1cIj48cD48aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cInVrLXdpZHRoLTEtMVwiPjwvcD48L2Rpdj4nLCc8ZGl2IGNsYXNzPVwidWstbW9kYWwtZm9vdGVyIHVrLXRleHQtcmlnaHRcIj48YnV0dG9uIGNsYXNzPVwidWstYnV0dG9uIHVrLW1vZGFsLWNsb3NlXCI+JytuLmxhYmVscy5DYW5jZWwrJzwvYnV0dG9uPiA8YnV0dG9uIGNsYXNzPVwidWstYnV0dG9uIHVrLWJ1dHRvbi1wcmltYXJ5IGpzLW1vZGFsLW9rXCI+JytuLmxhYmVscy5PaytcIjwvYnV0dG9uPjwvZGl2PlwiXS5qb2luKFwiXCIpLG4pLGE9cy5lbGVtZW50LmZpbmQoXCJpbnB1dFt0eXBlPSd0ZXh0J11cIikudmFsKGV8fFwiXCIpLm9uKFwia2V5dXBcIixmdW5jdGlvbih0KXsxMz09dC5rZXlDb2RlJiZzLmVsZW1lbnQuZmluZChcIi5qcy1tb2RhbC1va1wiKS50cmlnZ2VyKFwiY2xpY2tcIil9KTtyZXR1cm4gcy5lbGVtZW50LmZpbmQoXCIuanMtbW9kYWwtb2tcIikub24oXCJjbGlja1wiLGZ1bmN0aW9uKCl7byhhLnZhbCgpKSE9PSExJiZzLmhpZGUoKX0pLHMuc2hvdygpfSx0Lm1vZGFsLmJsb2NrVUk9ZnVuY3Rpb24oaSxlKXt2YXIgbz10Lm1vZGFsLmRpYWxvZyhbJzxkaXYgY2xhc3M9XCJ1ay1tYXJnaW4gdWstbW9kYWwtY29udGVudFwiPicrU3RyaW5nKGl8fCc8ZGl2IGNsYXNzPVwidWstdGV4dC1jZW50ZXJcIj4uLi48L2Rpdj4nKStcIjwvZGl2PlwiXS5qb2luKFwiXCIpLHQuJC5leHRlbmQoe2JnY2xvc2U6ITEsa2V5Ym9hcmQ6ITEsbW9kYWw6ITF9LGUpKTtyZXR1cm4gby5jb250ZW50PW8uZWxlbWVudC5maW5kKFwiLnVrLW1vZGFsLWNvbnRlbnQ6Zmlyc3RcIiksby5zaG93KCl9LHQubW9kYWwubGFiZWxzPXtPazpcIk9rXCIsQ2FuY2VsOlwiQ2FuY2VsXCJ9fShVSWtpdDIpOyIsIi8qISBVSWtpdCAyLjI1LjAgfCBodHRwOi8vd3d3LmdldHVpa2l0LmNvbSB8IChjKSAyMDE0IFlPT3RoZW1lIHwgTUlUIExpY2Vuc2UgKi9cbiFmdW5jdGlvbih0KXt2YXIgZTt3aW5kb3cuVUlraXQmJihlPXQoVUlraXQpKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZShcInVpa2l0LXNsaWRlclwiLFtcInVpa2l0XCJdLGZ1bmN0aW9uKCl7cmV0dXJuIGV8fHQoVUlraXQpfSl9KGZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3ZhciBlLGkscyxuLGE9e307cmV0dXJuIHQuY29tcG9uZW50KFwic2xpZGVyXCIse2RlZmF1bHRzOntjZW50ZXI6ITEsdGhyZXNob2xkOjEwLGluZmluaXRlOiEwLGF1dG9wbGF5OiExLGF1dG9wbGF5SW50ZXJ2YWw6N2UzLHBhdXNlT25Ib3ZlcjohMCxhY3RpdmVjbHM6XCJ1ay1hY3RpdmVcIn0sYm9vdDpmdW5jdGlvbigpe3QucmVhZHkoZnVuY3Rpb24oZSl7c2V0VGltZW91dChmdW5jdGlvbigpe3QuJChcIltkYXRhLXVrLXNsaWRlcl1cIixlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9dC4kKHRoaXMpO2UuZGF0YShcInNsaWRlclwiKXx8dC5zbGlkZXIoZSx0LlV0aWxzLm9wdGlvbnMoZS5hdHRyKFwiZGF0YS11ay1zbGlkZXJcIikpKX0pfSwwKX0pfSxpbml0OmZ1bmN0aW9uKCl7dmFyIG89dGhpczt0aGlzLmNvbnRhaW5lcj10aGlzLmVsZW1lbnQuZmluZChcIi51ay1zbGlkZXJcIiksdGhpcy5mb2N1cz0wLHQuJHdpbi5vbihcInJlc2l6ZSBsb2FkXCIsdC5VdGlscy5kZWJvdW5jZShmdW5jdGlvbigpe28ucmVzaXplKCEwKX0sMTAwKSksdGhpcy5vbihcImNsaWNrLnVrLnNsaWRlclwiLFwiW2RhdGEtdWstc2xpZGVyLWl0ZW1dXCIsZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpO3ZhciBpPXQuJCh0aGlzKS5hdHRyKFwiZGF0YS11ay1zbGlkZXItaXRlbVwiKTtpZihvLmZvY3VzIT1pKXN3aXRjaChvLnN0b3AoKSxpKXtjYXNlXCJuZXh0XCI6Y2FzZVwicHJldmlvdXNcIjpvW1wibmV4dFwiPT1pP1wibmV4dFwiOlwicHJldmlvdXNcIl0oKTticmVhaztkZWZhdWx0Om8udXBkYXRlRm9jdXMocGFyc2VJbnQoaSwxMCkpfX0pLHRoaXMuY29udGFpbmVyLm9uKHtcInRvdWNoc3RhcnQgbW91c2Vkb3duXCI6ZnVuY3Rpb24oaCl7aC5vcmlnaW5hbEV2ZW50JiZoLm9yaWdpbmFsRXZlbnQudG91Y2hlcyYmKGg9aC5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0pLGguYnV0dG9uJiYyPT1oLmJ1dHRvbnx8IW8uYWN0aXZlfHwoby5zdG9wKCkscz10LiQoaC50YXJnZXQpLmlzKFwiYVwiKT90LiQoaC50YXJnZXQpOnQuJChoLnRhcmdldCkucGFyZW50cyhcImE6Zmlyc3RcIiksbj0hMSxzLmxlbmd0aCYmcy5vbmUoXCJjbGlja1wiLGZ1bmN0aW9uKHQpe24mJnQucHJldmVudERlZmF1bHQoKX0pLGk9ZnVuY3Rpb24odCl7bj0hMCxlPW8sYT17dG91Y2h4OnBhcnNlSW50KHQucGFnZVgsMTApLGRpcjoxLGZvY3VzOm8uZm9jdXMsYmFzZTpvLm9wdGlvbnMuY2VudGVyP1wiY2VudGVyXCI6XCJhcmVhXCJ9LHQub3JpZ2luYWxFdmVudCYmdC5vcmlnaW5hbEV2ZW50LnRvdWNoZXMmJih0PXQub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdKSxlLmVsZW1lbnQuZGF0YSh7XCJwb2ludGVyLXN0YXJ0XCI6e3g6cGFyc2VJbnQodC5wYWdlWCwxMCkseTpwYXJzZUludCh0LnBhZ2VZLDEwKX0sXCJwb2ludGVyLXBvcy1zdGFydFwiOm8ucG9zfSksby5jb250YWluZXIuYWRkQ2xhc3MoXCJ1ay1kcmFnXCIpLGk9ITF9LGkueD1wYXJzZUludChoLnBhZ2VYLDEwKSxpLnRocmVzaG9sZD1vLm9wdGlvbnMudGhyZXNob2xkKX0sbW91c2VlbnRlcjpmdW5jdGlvbigpe28ub3B0aW9ucy5wYXVzZU9uSG92ZXImJihvLmhvdmVyaW5nPSEwKX0sbW91c2VsZWF2ZTpmdW5jdGlvbigpe28uaG92ZXJpbmc9ITF9fSksdGhpcy5yZXNpemUoITApLHRoaXMub24oXCJkaXNwbGF5LnVrLmNoZWNrXCIsZnVuY3Rpb24oKXtvLmVsZW1lbnQuaXMoXCI6dmlzaWJsZVwiKSYmby5yZXNpemUoITApfSksdGhpcy5lbGVtZW50LmZpbmQoXCJhLGltZ1wiKS5hdHRyKFwiZHJhZ2dhYmxlXCIsXCJmYWxzZVwiKSx0aGlzLm9wdGlvbnMuYXV0b3BsYXkmJnRoaXMuc3RhcnQoKX0scmVzaXplOmZ1bmN0aW9uKGUpe3ZhciBpLHMsbixhLG89dGhpcyxoPTAscj0wO3JldHVybiB0aGlzLml0ZW1zPXRoaXMuY29udGFpbmVyLmNoaWxkcmVuKCkuZmlsdGVyKFwiOnZpc2libGVcIiksdGhpcy52cD10aGlzLmVsZW1lbnRbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgsdGhpcy5jb250YWluZXIuY3NzKHtcIm1pbi13aWR0aFwiOlwiXCIsXCJtaW4taGVpZ2h0XCI6XCJcIn0pLHRoaXMuaXRlbXMuZWFjaChmdW5jdGlvbihlKXtpPXQuJCh0aGlzKSxhPWkuY3NzKHtsZWZ0OlwiXCIsd2lkdGg6XCJcIn0pWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHM9YS53aWR0aCxuPWkud2lkdGgoKSxyPU1hdGgubWF4KHIsYS5oZWlnaHQpLGkuY3NzKHtsZWZ0Omgsd2lkdGg6c30pLmRhdGEoe2lkeDplLGxlZnQ6aCx3aWR0aDpzLGN3aWR0aDpuLGFyZWE6aCtzLGNlbnRlcjpoLShvLnZwLzItbi8yKX0pLGgrPXN9KSx0aGlzLmNvbnRhaW5lci5jc3Moe1wibWluLXdpZHRoXCI6aCxcIm1pbi1oZWlnaHRcIjpyfSksdGhpcy5vcHRpb25zLmluZmluaXRlJiYoaDw9Mip0aGlzLnZwfHx0aGlzLml0ZW1zLmxlbmd0aDw1KSYmIXRoaXMuaXRlbXNSZXNpemVkPyh0aGlzLmNvbnRhaW5lci5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24odCl7by5jb250YWluZXIuYXBwZW5kKG8uaXRlbXMuZXEodCkuY2xvbmUoITApLmF0dHIoXCJpZFwiLFwiXCIpKX0pLmVhY2goZnVuY3Rpb24odCl7by5jb250YWluZXIuYXBwZW5kKG8uaXRlbXMuZXEodCkuY2xvbmUoITApLmF0dHIoXCJpZFwiLFwiXCIpKX0pLHRoaXMuaXRlbXNSZXNpemVkPSEwLHRoaXMucmVzaXplKCkpOih0aGlzLmN3PWgsdGhpcy5wb3M9MCx0aGlzLmFjdGl2ZT1oPj10aGlzLnZwLHRoaXMuY29udGFpbmVyLmNzcyh7XCItbXMtdHJhbnNmb3JtXCI6XCJcIixcIi13ZWJraXQtdHJhbnNmb3JtXCI6XCJcIix0cmFuc2Zvcm06XCJcIn0pLGUmJnRoaXMudXBkYXRlRm9jdXModGhpcy5mb2N1cyksdm9pZCAwKX0sdXBkYXRlUG9zOmZ1bmN0aW9uKHQpe3RoaXMucG9zPXQsdGhpcy5jb250YWluZXIuY3NzKHtcIi1tcy10cmFuc2Zvcm1cIjpcInRyYW5zbGF0ZVgoXCIrdCtcInB4KVwiLFwiLXdlYmtpdC10cmFuc2Zvcm1cIjpcInRyYW5zbGF0ZVgoXCIrdCtcInB4KVwiLHRyYW5zZm9ybTpcInRyYW5zbGF0ZVgoXCIrdCtcInB4KVwifSl9LHVwZGF0ZUZvY3VzOmZ1bmN0aW9uKGUsaSl7aWYodGhpcy5hY3RpdmUpe2k9aXx8KGU+dGhpcy5mb2N1cz8xOi0xKTt2YXIgcyxuLGE9dGhpcy5pdGVtcy5lcShlKTtpZih0aGlzLm9wdGlvbnMuaW5maW5pdGUmJnRoaXMuaW5maW5pdGUoZSxpKSx0aGlzLm9wdGlvbnMuY2VudGVyKXRoaXMudXBkYXRlUG9zKC0xKmEuZGF0YShcImNlbnRlclwiKSksdGhpcy5pdGVtcy5maWx0ZXIoXCIuXCIrdGhpcy5vcHRpb25zLmFjdGl2ZWNscykucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZWNscyksYS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlY2xzKTtlbHNlIGlmKHRoaXMub3B0aW9ucy5pbmZpbml0ZSl0aGlzLnVwZGF0ZVBvcygtMSphLmRhdGEoXCJsZWZ0XCIpKTtlbHNle2ZvcihzPTAsbj1lO248dGhpcy5pdGVtcy5sZW5ndGg7bisrKXMrPXRoaXMuaXRlbXMuZXEobikuZGF0YShcIndpZHRoXCIpO2lmKHM+dGhpcy52cCl0aGlzLnVwZGF0ZVBvcygtMSphLmRhdGEoXCJsZWZ0XCIpKTtlbHNlIGlmKDE9PWkpe2ZvcihzPTAsbj10aGlzLml0ZW1zLmxlbmd0aC0xO24+PTA7bi0tKXtpZihzKz10aGlzLml0ZW1zLmVxKG4pLmRhdGEoXCJ3aWR0aFwiKSxzPT10aGlzLnZwKXtlPW47YnJlYWt9aWYocz50aGlzLnZwKXtlPW48dGhpcy5pdGVtcy5sZW5ndGgtMT9uKzE6bjticmVha319cz50aGlzLnZwP3RoaXMudXBkYXRlUG9zKC0xKih0aGlzLmNvbnRhaW5lci53aWR0aCgpLXRoaXMudnApKTp0aGlzLnVwZGF0ZVBvcygtMSp0aGlzLml0ZW1zLmVxKGUpLmRhdGEoXCJsZWZ0XCIpKX19dmFyIG89dGhpcy5pdGVtcy5lcShlKS5kYXRhKFwibGVmdFwiKTt0aGlzLml0ZW1zLnJlbW92ZUNsYXNzKFwidWstc2xpZGUtYmVmb3JlIHVrLXNsaWRlLWFmdGVyXCIpLmVhY2goZnVuY3Rpb24oaSl7aSE9PWUmJnQuJCh0aGlzKS5hZGRDbGFzcyh0LiQodGhpcykuZGF0YShcImxlZnRcIik8bz9cInVrLXNsaWRlLWJlZm9yZVwiOlwidWstc2xpZGUtYWZ0ZXJcIil9KSx0aGlzLmZvY3VzPWUsdGhpcy50cmlnZ2VyKFwiZm9jdXNpdGVtLnVrLnNsaWRlclwiLFtlLHRoaXMuaXRlbXMuZXEoZSksdGhpc10pfX0sbmV4dDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaXRlbXNbdGhpcy5mb2N1cysxXT90aGlzLmZvY3VzKzE6dGhpcy5vcHRpb25zLmluZmluaXRlPzA6dGhpcy5mb2N1czt0aGlzLnVwZGF0ZUZvY3VzKHQsMSl9LHByZXZpb3VzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5pdGVtc1t0aGlzLmZvY3VzLTFdP3RoaXMuZm9jdXMtMTp0aGlzLm9wdGlvbnMuaW5maW5pdGU/dGhpcy5pdGVtc1t0aGlzLmZvY3VzLTFdP3RoaXMuaXRlbXMtMTp0aGlzLml0ZW1zLmxlbmd0aC0xOnRoaXMuZm9jdXM7dGhpcy51cGRhdGVGb2N1cyh0LC0xKX0sc3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0b3AoKTt2YXIgdD10aGlzO3RoaXMuaW50ZXJ2YWw9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0LmhvdmVyaW5nfHx0Lm5leHQoKX0sdGhpcy5vcHRpb25zLmF1dG9wbGF5SW50ZXJ2YWwpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5pbnRlcnZhbCYmY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKX0saW5maW5pdGU6ZnVuY3Rpb24odCxlKXt2YXIgaSxzPXRoaXMsbj10aGlzLml0ZW1zLmVxKHQpLGE9dCxvPVtdLGg9MDtpZigxPT1lKXtmb3IoaT0wO2k8dGhpcy5pdGVtcy5sZW5ndGgmJihhIT10JiYoaCs9dGhpcy5pdGVtcy5lcShhKS5kYXRhKFwid2lkdGhcIiksby5wdXNoKHRoaXMuaXRlbXMuZXEoYSkpKSwhKGg+dGhpcy52cCkpO2krKylhPWErMT09dGhpcy5pdGVtcy5sZW5ndGg/MDphKzE7by5sZW5ndGgmJm8uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT1uLmRhdGEoXCJhcmVhXCIpO3QuY3NzKHtsZWZ0OmV9KS5kYXRhKHtsZWZ0OmUsYXJlYTplK3QuZGF0YShcIndpZHRoXCIpLGNlbnRlcjplLShzLnZwLzItdC5kYXRhKFwiY3dpZHRoXCIpLzIpfSksbj10fSl9ZWxzZXtmb3IoaT10aGlzLml0ZW1zLmxlbmd0aC0xO2k+LTEmJihoKz10aGlzLml0ZW1zLmVxKGEpLmRhdGEoXCJ3aWR0aFwiKSxhIT10JiZvLnB1c2godGhpcy5pdGVtcy5lcShhKSksIShoPnRoaXMudnApKTtpLS0pYT1hLTE9PS0xP3RoaXMuaXRlbXMubGVuZ3RoLTE6YS0xO28ubGVuZ3RoJiZvLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9bi5kYXRhKFwibGVmdFwiKS10LmRhdGEoXCJ3aWR0aFwiKTt0LmNzcyh7bGVmdDplfSkuZGF0YSh7bGVmdDplLGFyZWE6ZSt0LmRhdGEoXCJ3aWR0aFwiKSxjZW50ZXI6ZS0ocy52cC8yLXQuZGF0YShcImN3aWR0aFwiKS8yKX0pLG49dH0pfX19KSx0LiRkb2Mub24oXCJtb3VzZW1vdmUudWsuc2xpZGVyIHRvdWNobW92ZS51ay5zbGlkZXJcIixmdW5jdGlvbih0KXtpZih0Lm9yaWdpbmFsRXZlbnQmJnQub3JpZ2luYWxFdmVudC50b3VjaGVzJiYodD10Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXSksaSYmTWF0aC5hYnModC5wYWdlWC1pLngpPmkudGhyZXNob2xkJiYod2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCk/ZT1pPSExOmkodCkpLGUpe3ZhciBzLG4sbyxoLHIsYyxmLHUsZCxsO2lmKHQuY2xpZW50WHx8dC5jbGllbnRZP3M9dC5jbGllbnRYOih0LnBhZ2VYfHx0LnBhZ2VZKSYmKHM9dC5wYWdlWC1kb2N1bWVudC5ib2R5LnNjcm9sbExlZnQtZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQpLHI9YS5mb2N1cyxuPXMtZS5lbGVtZW50LmRhdGEoXCJwb2ludGVyLXN0YXJ0XCIpLngsbz1lLmVsZW1lbnQuZGF0YShcInBvaW50ZXItcG9zLXN0YXJ0XCIpK24saD1zPmUuZWxlbWVudC5kYXRhKFwicG9pbnRlci1zdGFydFwiKS54Py0xOjEsYz1lLml0ZW1zLmVxKGEuZm9jdXMpLDE9PWgpZm9yKGY9Yy5kYXRhKFwibGVmdFwiKStNYXRoLmFicyhuKSx1PTAsZD1hLmZvY3VzO3U8ZS5pdGVtcy5sZW5ndGg7dSsrKXtpZihsPWUuaXRlbXMuZXEoZCksZCE9YS5mb2N1cyYmbC5kYXRhKFwibGVmdFwiKTxmJiZsLmRhdGEoXCJhcmVhXCIpPmYpe3I9ZDticmVha31kPWQrMT09ZS5pdGVtcy5sZW5ndGg/MDpkKzF9ZWxzZSBmb3IoZj1jLmRhdGEoXCJsZWZ0XCIpLU1hdGguYWJzKG4pLHU9MCxkPWEuZm9jdXM7dTxlLml0ZW1zLmxlbmd0aDt1Kyspe2lmKGw9ZS5pdGVtcy5lcShkKSxkIT1hLmZvY3VzJiZsLmRhdGEoXCJhcmVhXCIpPD1jLmRhdGEoXCJsZWZ0XCIpJiZsLmRhdGEoXCJjZW50ZXJcIik8Zil7cj1kO2JyZWFrfWQ9ZC0xPT0tMT9lLml0ZW1zLmxlbmd0aC0xOmQtMX1lLm9wdGlvbnMuaW5maW5pdGUmJnIhPWEuX2ZvY3VzJiZlLmluZmluaXRlKHIsaCksZS51cGRhdGVQb3MobyksYS5kaXI9aCxhLl9mb2N1cz1yLGEudG91Y2h4PXBhcnNlSW50KHQucGFnZVgsMTApLGEuZGlmZj1mfX0pLHQuJGRvYy5vbihcIm1vdXNldXAudWsuc2xpZGVyIHRvdWNoZW5kLnVrLnNsaWRlclwiLGZ1bmN0aW9uKCl7aWYoZSl7ZS5jb250YWluZXIucmVtb3ZlQ2xhc3MoXCJ1ay1kcmFnXCIpLGUuaXRlbXMuZXEoYS5mb2N1cyk7dmFyIHQscyxuLG89ITE7aWYoMT09YS5kaXIpZm9yKHM9MCxuPWEuZm9jdXM7czxlLml0ZW1zLmxlbmd0aDtzKyspe2lmKHQ9ZS5pdGVtcy5lcShuKSxuIT1hLmZvY3VzJiZ0LmRhdGEoXCJsZWZ0XCIpPmEuZGlmZil7bz1uO2JyZWFrfW49bisxPT1lLml0ZW1zLmxlbmd0aD8wOm4rMX1lbHNlIGZvcihzPTAsbj1hLmZvY3VzO3M8ZS5pdGVtcy5sZW5ndGg7cysrKXtpZih0PWUuaXRlbXMuZXEobiksbiE9YS5mb2N1cyYmdC5kYXRhKFwibGVmdFwiKTxhLmRpZmYpe289bjticmVha31uPW4tMT09LTE/ZS5pdGVtcy5sZW5ndGgtMTpuLTF9ZS51cGRhdGVGb2N1cyhvIT09ITE/bzphLl9mb2N1cyl9ZT1pPSExfSksdC5zbGlkZXJ9KTsiLCIvKiEgVUlraXQgMi4yNS4wIHwgaHR0cDovL3d3dy5nZXR1aWtpdC5jb20gfCAoYykgMjAxNCBZT090aGVtZSB8IE1JVCBMaWNlbnNlICovXG4hZnVuY3Rpb24odCl7dmFyIGk7d2luZG93LlVJa2l0JiYoaT10KFVJa2l0KSksXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoXCJ1aWtpdC1zbGlkZXNldFwiLFtcInVpa2l0XCJdLGZ1bmN0aW9uKCl7cmV0dXJuIGl8fHQoVUlraXQpfSl9KGZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGkoaSxlLHMsbil7dmFyIGEsbyxyLGwsaD10LiQuRGVmZXJyZWQoKSx1PXRoaXMub3B0aW9ucy5kZWxheT09PSExP01hdGguZmxvb3IodGhpcy5vcHRpb25zLmR1cmF0aW9uLzIpOnRoaXMub3B0aW9ucy5kZWxheSxkPXRoaXM7aWYobj1ufHwxLHRoaXMuZWxlbWVudC5jc3MoXCJtaW4taGVpZ2h0XCIsdGhpcy5lbGVtZW50LmhlaWdodCgpKSxzWzBdPT09ZVswXSlyZXR1cm4gaC5yZXNvbHZlKCksaC5wcm9taXNlKCk7aWYoXCJvYmplY3RcIj09dHlwZW9mIGk/KGE9aVswXSxvPWlbMV18fGlbMF0pOihhPWksbz1hKSxyPWZ1bmN0aW9uKCl7aWYoZSYmZS5sZW5ndGgmJmUuaGlkZSgpLnJlbW92ZUNsYXNzKG8rXCIgdWstYW5pbWF0aW9uLXJldmVyc2VcIikuY3NzKHtvcGFjaXR5OlwiXCIsXCJhbmltYXRpb24tZGVsYXlcIjpcIlwiLGFuaW1hdGlvbjpcIlwifSksIXMubGVuZ3RoKXJldHVybiBoLnJlc29sdmUoKSx2b2lkIDA7Zm9yKGw9MDtsPHMubGVuZ3RoO2wrKylzLmVxKDE9PW4/bDpzLmxlbmd0aC1sLTEpLmNzcyhcImFuaW1hdGlvbi1kZWxheVwiLGwqdStcIm1zXCIpO3ZhciBpPWZ1bmN0aW9uKCl7cy5yZW1vdmVDbGFzcyhcIlwiK2EpLmNzcyh7b3BhY2l0eTpcIlwiLGRpc3BsYXk6XCJcIixcImFuaW1hdGlvbi1kZWxheVwiOlwiXCIsYW5pbWF0aW9uOlwiXCJ9KSxoLnJlc29sdmUoKSxkLmVsZW1lbnQuY3NzKFwibWluLWhlaWdodFwiLFwiXCIpLGk9ITF9O3MuYWRkQ2xhc3MoYSlbMT09bj9cImxhc3RcIjpcImZpcnN0XCJdKCkub25lKHQuc3VwcG9ydC5hbmltYXRpb24uZW5kLGZ1bmN0aW9uKCl7aSYmaSgpfSkuZW5kKCkuY3NzKFwiZGlzcGxheVwiLFwiXCIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpJiZpKCl9LHMubGVuZ3RoKnUqMil9LHMubGVuZ3RoJiZzLmNzcyhcImFuaW1hdGlvbi1kdXJhdGlvblwiLHRoaXMub3B0aW9ucy5kdXJhdGlvbitcIm1zXCIpLGUmJmUubGVuZ3RoKWZvcihlLmNzcyhcImFuaW1hdGlvbi1kdXJhdGlvblwiLHRoaXMub3B0aW9ucy5kdXJhdGlvbitcIm1zXCIpWzE9PW4/XCJsYXN0XCI6XCJmaXJzdFwiXSgpLm9uZSh0LnN1cHBvcnQuYW5pbWF0aW9uLmVuZCxmdW5jdGlvbigpe3IoKX0pLGw9MDtsPGUubGVuZ3RoO2wrKykhZnVuY3Rpb24oaSxlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5jc3MoXCJkaXNwbGF5XCIsXCJub25lXCIpLmNzcyhcImRpc3BsYXlcIixcIlwiKS5jc3MoXCJvcGFjaXR5XCIsMCkub24odC5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsZnVuY3Rpb24oKXtlLnJlbW92ZUNsYXNzKG8pfSkuYWRkQ2xhc3MobytcIiB1ay1hbmltYXRpb24tcmV2ZXJzZVwiKX0uYmluZCh0aGlzKSxsKnUpfShsLGUuZXEoMT09bj9sOmUubGVuZ3RoLWwtMSkpO2Vsc2UgcigpO3JldHVybiBoLnByb21pc2UoKX1mdW5jdGlvbiBlKHQsaSl7dmFyIGUscz0wLG49LTEsYT10Lmxlbmd0aHx8MCxvPVtdO2lmKDE+aSlyZXR1cm4gbnVsbDtmb3IoO2E+czspZT1zJWksZT9vW25dW2VdPXRbc106b1srK25dPVt0W3NdXSxzKys7Zm9yKHM9MCxhPW8ubGVuZ3RoO2E+czspb1tzXT1qUXVlcnkob1tzXSkscysrO3JldHVybiBvfXZhciBzO3QuY29tcG9uZW50KFwic2xpZGVzZXRcIix7ZGVmYXVsdHM6e1wiZGVmYXVsdFwiOjEsYW5pbWF0aW9uOlwiZmFkZVwiLGR1cmF0aW9uOjIwMCxmaWx0ZXI6XCJcIixkZWxheTohMSxjb250cm9sczohMSxhdXRvcGxheTohMSxhdXRvcGxheUludGVydmFsOjdlMyxwYXVzZU9uSG92ZXI6ITB9LHNldHM6W10sYm9vdDpmdW5jdGlvbigpe3QucmVhZHkoZnVuY3Rpb24oaSl7dC4kKFwiW2RhdGEtdWstc2xpZGVzZXRdXCIsaSkuZWFjaChmdW5jdGlvbigpe3ZhciBpPXQuJCh0aGlzKTtpLmRhdGEoXCJzbGlkZXNldFwiKXx8dC5zbGlkZXNldChpLHQuVXRpbHMub3B0aW9ucyhpLmF0dHIoXCJkYXRhLXVrLXNsaWRlc2V0XCIpKSl9KX0pfSxpbml0OmZ1bmN0aW9uKCl7dmFyIGk9dGhpczt0aGlzLmFjdGl2ZVNldD0hMSx0aGlzLmxpc3Q9dGhpcy5lbGVtZW50LmZpbmQoXCIudWstc2xpZGVzZXRcIiksdGhpcy5uYXY9dGhpcy5lbGVtZW50LmZpbmQoXCIudWstc2xpZGVzZXQtbmF2XCIpLHRoaXMuY29udHJvbHM9dGhpcy5vcHRpb25zLmNvbnRyb2xzP3QuJCh0aGlzLm9wdGlvbnMuY29udHJvbHMpOnRoaXMuZWxlbWVudCx0LiR3aW4ub24oXCJyZXNpemUgbG9hZFwiLHQuVXRpbHMuZGVib3VuY2UoZnVuY3Rpb24oKXtpLnVwZGF0ZVNldHMoKX0sMTAwKSksaS5saXN0LmFkZENsYXNzKFwidWstZ3JpZC13aWR0aC0xLVwiK2kub3B0aW9ucy5kZWZhdWx0KSxbXCJ4bGFyZ2VcIixcImxhcmdlXCIsXCJtZWRpdW1cIixcInNtYWxsXCJdLmZvckVhY2goZnVuY3Rpb24odCl7aS5vcHRpb25zW3RdJiZpLmxpc3QuYWRkQ2xhc3MoXCJ1ay1ncmlkLXdpZHRoLVwiK3QrXCItMS1cIitpLm9wdGlvbnNbdF0pfSksdGhpcy5vbihcImNsaWNrLnVrLnNsaWRlc2V0XCIsXCJbZGF0YS11ay1zbGlkZXNldC1pdGVtXVwiLGZ1bmN0aW9uKGUpe2lmKGUucHJldmVudERlZmF1bHQoKSwhaS5hbmltYXRpbmcpe3ZhciBzPXQuJCh0aGlzKS5hdHRyKFwiZGF0YS11ay1zbGlkZXNldC1pdGVtXCIpO2lmKGkuYWN0aXZlU2V0IT09cylzd2l0Y2gocyl7Y2FzZVwibmV4dFwiOmNhc2VcInByZXZpb3VzXCI6aVtcIm5leHRcIj09cz9cIm5leHRcIjpcInByZXZpb3VzXCJdKCk7YnJlYWs7ZGVmYXVsdDppLnNob3cocGFyc2VJbnQocywxMCkpfX19KSx0aGlzLmNvbnRyb2xzLm9uKFwiY2xpY2sudWsuc2xpZGVzZXRcIixcIltkYXRhLXVrLWZpbHRlcl1cIixmdW5jdGlvbihlKXt2YXIgcz10LiQodGhpcyk7cy5wYXJlbnQoKS5oYXNDbGFzcyhcInVrLXNsaWRlc2V0XCIpfHwoZS5wcmV2ZW50RGVmYXVsdCgpLGkuYW5pbWF0aW5nfHxpLmN1cnJlbnRGaWx0ZXI9PXMuYXR0cihcImRhdGEtdWstZmlsdGVyXCIpfHwoaS51cGRhdGVGaWx0ZXIocy5hdHRyKFwiZGF0YS11ay1maWx0ZXJcIikpLGkuX2hpZGUoKS50aGVuKGZ1bmN0aW9uKCl7aS51cGRhdGVTZXRzKCEwLCEwKX0pKSl9KSx0aGlzLm9uKFwic3dpcGVSaWdodCBzd2lwZUxlZnRcIixmdW5jdGlvbih0KXtpW1wic3dpcGVMZWZ0XCI9PXQudHlwZT9cIm5leHRcIjpcInByZXZpb3VzXCJdKCl9KSx0aGlzLnVwZGF0ZUZpbHRlcih0aGlzLm9wdGlvbnMuZmlsdGVyKSx0aGlzLnVwZGF0ZVNldHMoKSx0aGlzLmVsZW1lbnQub24oe21vdXNlZW50ZXI6ZnVuY3Rpb24oKXtpLm9wdGlvbnMucGF1c2VPbkhvdmVyJiYoaS5ob3ZlcmluZz0hMCl9LG1vdXNlbGVhdmU6ZnVuY3Rpb24oKXtpLmhvdmVyaW5nPSExfX0pLHRoaXMub3B0aW9ucy5hdXRvcGxheSYmdGhpcy5zdGFydCgpfSx1cGRhdGVTZXRzOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbj10aGlzLnZpc2libGU7aWYodGhpcy52aXNpYmxlPXRoaXMuZ2V0VmlzaWJsZU9uQ3VycmVuQnJlYWtwb2ludCgpLG4hPXRoaXMudmlzaWJsZXx8aSl7Zm9yKHRoaXMuY2hpbGRyZW49dGhpcy5saXN0LmNoaWxkcmVuKCkuaGlkZSgpLHRoaXMuaXRlbXM9dGhpcy5nZXRJdGVtcygpLHRoaXMuc2V0cz1lKHRoaXMuaXRlbXMsdGhpcy52aXNpYmxlKSxzPTA7czx0aGlzLnNldHMubGVuZ3RoO3MrKyl0aGlzLnNldHNbc10uY3NzKHtkaXNwbGF5Olwibm9uZVwifSk7aWYodGhpcy5uYXYubGVuZ3RoJiZ0aGlzLm5hdi5lbXB0eSgpKXtmb3Iocz0wO3M8dGhpcy5zZXRzLmxlbmd0aDtzKyspdGhpcy5uYXYuYXBwZW5kKCc8bGkgZGF0YS11ay1zbGlkZXNldC1pdGVtPVwiJytzKydcIj48YT48L2E+PC9saT4nKTt0aGlzLm5hdlsxPT10aGlzLm5hdi5jaGlsZHJlbigpLmxlbmd0aD9cImFkZENsYXNzXCI6XCJyZW1vdmVDbGFzc1wiXShcInVrLWludmlzaWJsZVwiKX10aGlzLmFjdGl2ZVNldD0hMSx0aGlzLnNob3coMCwhdCl9fSx1cGRhdGVGaWx0ZXI6ZnVuY3Rpb24oaSl7dmFyIGUscz10aGlzO3RoaXMuY3VycmVudEZpbHRlcj1pLHRoaXMuY29udHJvbHMuZmluZChcIltkYXRhLXVrLWZpbHRlcl1cIikuZWFjaChmdW5jdGlvbigpe2U9dC4kKHRoaXMpLGUucGFyZW50KCkuaGFzQ2xhc3MoXCJ1ay1zbGlkZXNldFwiKXx8KGUuYXR0cihcImRhdGEtdWstZmlsdGVyXCIpPT1zLmN1cnJlbnRGaWx0ZXI/ZS5hZGRDbGFzcyhcInVrLWFjdGl2ZVwiKTplLnJlbW92ZUNsYXNzKFwidWstYWN0aXZlXCIpKX0pfSxnZXRWaXNpYmxlT25DdXJyZW5CcmVha3BvaW50OmZ1bmN0aW9uKCl7dmFyIGk9bnVsbCxlPXQuJCgnPGRpdiBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlO2hlaWdodDoxcHg7dG9wOi0xMDAwcHg7d2lkdGg6MTAwcHhcIj48ZGl2PjwvZGl2PjwvZGl2PicpLmFwcGVuZFRvKFwiYm9keVwiKSxzPWUuY2hpbGRyZW4oKS5lcSgwKSxuPXRoaXMub3B0aW9ucztyZXR1cm5bXCJ4bGFyZ2VcIixcImxhcmdlXCIsXCJtZWRpdW1cIixcInNtYWxsXCJdLmZvckVhY2goZnVuY3Rpb24odCl7blt0XSYmIWkmJihlLmF0dHIoXCJjbGFzc1wiLFwidWstZ3JpZC13aWR0aC1cIit0K1wiLTEtMlwiKS53aWR0aCgpLDUwPT1zLndpZHRoKCkmJihpPXQpKX0pLGUucmVtb3ZlKCksdGhpcy5vcHRpb25zW2ldfHx0aGlzLm9wdGlvbnNbXCJkZWZhdWx0XCJdfSxnZXRJdGVtczpmdW5jdGlvbigpe3ZhciBpLGU9W107cmV0dXJuIHRoaXMuY3VycmVudEZpbHRlcj8oaT10aGlzLmN1cnJlbnRGaWx0ZXJ8fFtdLFwic3RyaW5nXCI9PXR5cGVvZiBpJiYoaT1pLnNwbGl0KC8sLykubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKX0pKSx0aGlzLmNoaWxkcmVuLmVhY2goZnVuY3Rpb24oKXt2YXIgcz10LiQodGhpcyksbj1zLmF0dHIoXCJkYXRhLXVrLWZpbHRlclwiKSxhPWkubGVuZ3RoPyExOiEwO24mJihuPW4uc3BsaXQoLywvKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbSgpfSksaS5mb3JFYWNoKGZ1bmN0aW9uKHQpe24uaW5kZXhPZih0KT4tMSYmKGE9ITApfSkpLGEmJmUucHVzaChzWzBdKX0pLGU9dC4kKGUpKTplPXRoaXMubGlzdC5jaGlsZHJlbigpLGV9LHNob3c6ZnVuY3Rpb24oaSxlLG4pe3ZhciBhPXRoaXM7aWYodGhpcy5hY3RpdmVTZXQhPT1pJiYhdGhpcy5hbmltYXRpbmcpe249bnx8KGk8dGhpcy5hY3RpdmVTZXQ/LTE6MSk7dmFyIG89dGhpcy5zZXRzW3RoaXMuYWN0aXZlU2V0XXx8W10scj10aGlzLnNldHNbaV0sbD10aGlzLl9nZXRBbmltYXRpb24oKTsoZXx8IXQuc3VwcG9ydC5hbmltYXRpb24pJiYobD1zLm5vbmUpLHRoaXMuYW5pbWF0aW5nPSEwLHRoaXMubmF2Lmxlbmd0aCYmdGhpcy5uYXYuY2hpbGRyZW4oKS5yZW1vdmVDbGFzcyhcInVrLWFjdGl2ZVwiKS5lcShpKS5hZGRDbGFzcyhcInVrLWFjdGl2ZVwiKSxsLmFwcGx5KGEsW28scixuXSkudGhlbihmdW5jdGlvbigpe3QuVXRpbHMuY2hlY2tEaXNwbGF5KHIsITApLGEuY2hpbGRyZW4uaGlkZSgpLnJlbW92ZUNsYXNzKFwidWstYWN0aXZlXCIpLHIuYWRkQ2xhc3MoXCJ1ay1hY3RpdmVcIikuY3NzKHtkaXNwbGF5OlwiXCIsb3BhY2l0eTpcIlwifSksYS5hbmltYXRpbmc9ITEsYS5hY3RpdmVTZXQ9aSx0LlV0aWxzLmNoZWNrRGlzcGxheShyLCEwKSxhLnRyaWdnZXIoXCJzaG93LnVrLnNsaWRlc2V0XCIsW3JdKX0pfX0sX2dldEFuaW1hdGlvbjpmdW5jdGlvbigpe3ZhciBpPXNbdGhpcy5vcHRpb25zLmFuaW1hdGlvbl18fHMubm9uZTtyZXR1cm4gdC5zdXBwb3J0LmFuaW1hdGlvbnx8KGk9cy5ub25lKSxpfSxfaGlkZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsaT10aGlzLnNldHNbdGhpcy5hY3RpdmVTZXRdfHxbXSxlPXRoaXMuX2dldEFuaW1hdGlvbigpO3JldHVybiB0aGlzLmFuaW1hdGluZz0hMCxlLmFwcGx5KHQsW2ksW10sMV0pLnRoZW4oZnVuY3Rpb24oKXt0LmFuaW1hdGluZz0hMX0pfSxuZXh0OmZ1bmN0aW9uKCl7dGhpcy5zaG93KHRoaXMuc2V0c1t0aGlzLmFjdGl2ZVNldCsxXT90aGlzLmFjdGl2ZVNldCsxOjAsITEsMSl9LHByZXZpb3VzOmZ1bmN0aW9uKCl7dGhpcy5zaG93KHRoaXMuc2V0c1t0aGlzLmFjdGl2ZVNldC0xXT90aGlzLmFjdGl2ZVNldC0xOnRoaXMuc2V0cy5sZW5ndGgtMSwhMSwtMSl9LHN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdG9wKCk7dmFyIHQ9dGhpczt0aGlzLmludGVydmFsPXNldEludGVydmFsKGZ1bmN0aW9uKCl7dC5ob3ZlcmluZ3x8dC5hbmltYXRpbmd8fHQubmV4dCgpfSx0aGlzLm9wdGlvbnMuYXV0b3BsYXlJbnRlcnZhbCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmludGVydmFsJiZjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpfX0pLHM9e25vbmU6ZnVuY3Rpb24oKXt2YXIgaT10LiQuRGVmZXJyZWQoKTtyZXR1cm4gaS5yZXNvbHZlKCksaS5wcm9taXNlKCl9LGZhZGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gaS5hcHBseSh0aGlzLFtcInVrLWFuaW1hdGlvbi1mYWRlXCIsdCxlXSl9LFwic2xpZGUtYm90dG9tXCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gaS5hcHBseSh0aGlzLFtcInVrLWFuaW1hdGlvbi1zbGlkZS1ib3R0b21cIix0LGVdKX0sXCJzbGlkZS10b3BcIjpmdW5jdGlvbih0LGUpe3JldHVybiBpLmFwcGx5KHRoaXMsW1widWstYW5pbWF0aW9uLXNsaWRlLXRvcFwiLHQsZV0pfSxcInNsaWRlLXZlcnRpY2FsXCI6ZnVuY3Rpb24odCxlLHMpe3ZhciBuPVtcInVrLWFuaW1hdGlvbi1zbGlkZS10b3BcIixcInVrLWFuaW1hdGlvbi1zbGlkZS1ib3R0b21cIl07cmV0dXJuLTE9PXMmJm4ucmV2ZXJzZSgpLGkuYXBwbHkodGhpcyxbbix0LGVdKX0sXCJzbGlkZS1ob3Jpem9udGFsXCI6ZnVuY3Rpb24odCxlLHMpe3ZhciBuPVtcInVrLWFuaW1hdGlvbi1zbGlkZS1yaWdodFwiLFwidWstYW5pbWF0aW9uLXNsaWRlLWxlZnRcIl07cmV0dXJuLTE9PXMmJm4ucmV2ZXJzZSgpLGkuYXBwbHkodGhpcyxbbix0LGUsc10pfSxzY2FsZTpmdW5jdGlvbih0LGUpe3JldHVybiBpLmFwcGx5KHRoaXMsW1widWstYW5pbWF0aW9uLXNjYWxlLXVwXCIsdCxlXSl9fSx0LnNsaWRlc2V0LmFuaW1hdGlvbnM9c30pOyIsIi8qISBVSWtpdCAyLjI1LjAgfCBodHRwOi8vd3d3LmdldHVpa2l0LmNvbSB8IChjKSAyMDE0IFlPT3RoZW1lIHwgTUlUIExpY2Vuc2UgKi9cbiFmdW5jdGlvbiAoaSkge1xuICAgIHZhciB0O1xuICAgIHdpbmRvdy5VSWtpdCAmJiAodCA9IGkoVUlraXQpKSwgXCJmdW5jdGlvblwiID09IHR5cGVvZiBkZWZpbmUgJiYgZGVmaW5lLmFtZCAmJiBkZWZpbmUoXCJ1aWtpdC1zbGlkZXNob3dcIiwgW1widWlraXRcIl0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHQgfHwgaShVSWtpdClcbiAgICB9KVxufShmdW5jdGlvbiAoaSkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIHZhciB0LCBzID0gMDtcbiAgICBpLmNvbXBvbmVudChcInNsaWRlc2hvd1wiLCB7XG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICBhbmltYXRpb246IFwiZmFkZVwiLFxuICAgICAgICAgICAgZHVyYXRpb246IDUwMCxcbiAgICAgICAgICAgIGhlaWdodDogXCJhdXRvXCIsXG4gICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgIGF1dG9wbGF5OiAhMSxcbiAgICAgICAgICAgIGF1dG9wbGF5SW50ZXJ2YWw6IDdlMyxcbiAgICAgICAgICAgIHZpZGVvYXV0b3BsYXk6ICEwLFxuICAgICAgICAgICAgdmlkZW9tdXRlOiAhMCxcbiAgICAgICAgICAgIHNsaWNlczogMTUsXG4gICAgICAgICAgICBwYXVzZU9uSG92ZXI6ICEwLFxuICAgICAgICAgICAga2VuYnVybnM6ICExLFxuICAgICAgICAgICAga2VuYnVybnNhbmltYXRpb25zOiBbXCJ1ay1hbmltYXRpb24tbWlkZGxlLWxlZnRcIiwgXCJ1ay1hbmltYXRpb24tdG9wLXJpZ2h0XCIsIFwidWstYW5pbWF0aW9uLWJvdHRvbS1sZWZ0XCIsIFwidWstYW5pbWF0aW9uLXRvcC1jZW50ZXJcIiwgXCJcIiwgXCJ1ay1hbmltYXRpb24tYm90dG9tLXJpZ2h0XCJdXG4gICAgICAgIH0sIGN1cnJlbnQ6ICExLCBpbnRlcnZhbDogbnVsbCwgaG92ZXJpbmc6ICExLCBib290OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpLnJlYWR5KGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgaS4kKFwiW2RhdGEtdWstc2xpZGVzaG93XVwiLCB0KS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBpLiQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHQuZGF0YShcInNsaWRlc2hvd1wiKSB8fCBpLnNsaWRlc2hvdyh0LCBpLlV0aWxzLm9wdGlvbnModC5hdHRyKFwiZGF0YS11ay1zbGlkZXNob3dcIikpKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICB9LCBpbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdCwgZSwgYSA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMuZWxlbWVudC5oYXNDbGFzcyhcInVrLXNsaWRlc2hvd1wiKSA/IHRoaXMuZWxlbWVudCA6IGkuJCh0aGlzLmZpbmQoXCIudWstc2xpZGVzaG93XCIpKSwgdGhpcy5zbGlkZXMgPSB0aGlzLmNvbnRhaW5lci5jaGlsZHJlbigpLCB0aGlzLnNsaWRlc0NvdW50ID0gdGhpcy5zbGlkZXMubGVuZ3RoLCB0aGlzLmN1cnJlbnQgPSB0aGlzLm9wdGlvbnMuc3RhcnQsIHRoaXMuYW5pbWF0aW5nID0gITEsIHRoaXMudHJpZ2dlcnMgPSB0aGlzLmZpbmQoXCJbZGF0YS11ay1zbGlkZXNob3ctaXRlbV1cIiksIHRoaXMuZml4RnVsbHNjcmVlbiA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyhpUGFkfGlQaG9uZXxpUG9kKS9nKSAmJiB0aGlzLmNvbnRhaW5lci5oYXNDbGFzcyhcInVrLXNsaWRlc2hvdy1mdWxsc2NyZWVuXCIpLCB0aGlzLm9wdGlvbnMua2VuYnVybnMgJiYgKGUgPSB0aGlzLm9wdGlvbnMua2VuYnVybnMgPT09ICEwID8gXCIxNXNcIiA6IHRoaXMub3B0aW9ucy5rZW5idXJucywgU3RyaW5nKGUpLm1hdGNoKC8obXN8cykkLykgfHwgKGUgKz0gXCJtc1wiKSwgXCJzdHJpbmdcIiA9PSB0eXBlb2YgdGhpcy5vcHRpb25zLmtlbmJ1cm5zYW5pbWF0aW9ucyAmJiAodGhpcy5vcHRpb25zLmtlbmJ1cm5zYW5pbWF0aW9ucyA9IHRoaXMub3B0aW9ucy5rZW5idXJuc2FuaW1hdGlvbnMuc3BsaXQoXCIsXCIpKSksIHRoaXMuc2xpZGVzLmVhY2goZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgICAgICAgICB2YXIgbyA9IGkuJCh0aGlzKSwgciA9IG8uY2hpbGRyZW4oXCJpbWcsdmlkZW8saWZyYW1lXCIpLmVxKDApO1xuICAgICAgICAgICAgICAgIGlmIChvLmRhdGEoXCJtZWRpYVwiLCByKSwgby5kYXRhKFwic2l6ZXJcIiwgciksIHIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHJbMF0ubm9kZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcIlBJQ1RVUkVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcIklNR1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gaS4kKCc8ZGl2IGNsYXNzPVwidWstY292ZXItYmFja2dyb3VuZCB1ay1wb3NpdGlvbi1jb3ZlclwiPjwvZGl2PicpLmNzcyh7XCJiYWNrZ3JvdW5kLWltYWdlXCI6IFwidXJsKFwiICsgci5hdHRyKFwic3JjXCIpICsgXCIpXCJ9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmF0dHIoXCJ3aWR0aFwiKSAmJiByLmF0dHIoXCJoZWlnaHRcIikgJiYgKGQgPSBpLiQoXCI8Y2FudmFzPjwvY2FudmFzPlwiKS5hdHRyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHIuYXR0cihcIndpZHRoXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHIuYXR0cihcImhlaWdodFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByLnJlcGxhY2VXaXRoKGQpLCByID0gZCwgZCA9IHZvaWQgMCksIHIuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IFwiYXV0b1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG8ucHJlcGVuZCh1KS5kYXRhKFwiY292ZXJcIiwgdSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJJRlJBTUVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IHJbMF0uc3JjLCBjID0gXCJzdy1cIiArICsrcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmF0dHIoXCJzcmNcIiwgXCJcIikub24oXCJsb2FkXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuICE9PSBhLmN1cnJlbnQgfHwgbiA9PSBhLmN1cnJlbnQgJiYgIWEub3B0aW9ucy52aWRlb2F1dG9wbGF5KSAmJiBhLnBhdXNlbWVkaWEociksIGEub3B0aW9ucy52aWRlb211dGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubXV0ZW1lZGlhKHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubXV0ZW1lZGlhKHIpLCArK3QgPj0gNCAmJiBjbGVhckludGVydmFsKGkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgwKSwgMjUwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZGF0YShcInNsaWRlc2hvd1wiLCBhKS5hdHRyKFwiZGF0YS1wbGF5ZXItaWRcIiwgYykuYXR0cihcInNyY1wiLCBbaCwgaC5pbmRleE9mKFwiP1wiKSA+IC0xID8gXCImXCIgOiBcIj9cIiwgXCJlbmFibGVqc2FwaT0xJmFwaT0xJnBsYXllcl9pZD1cIiArIGNdLmpvaW4oXCJcIikpLmFkZENsYXNzKFwidWstcG9zaXRpb24tYWJzb2x1dGVcIiksIGkuc3VwcG9ydC50b3VjaCB8fCByLmNzcyhcInBvaW50ZXItZXZlbnRzXCIsIFwibm9uZVwiKSwgZCA9ICEwLCBpLmNvdmVyICYmIChpLmNvdmVyKHIpLCByLmF0dHIoXCJkYXRhLXVrLWNvdmVyXCIsIFwie31cIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiVklERU9cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmFkZENsYXNzKFwidWstY292ZXItb2JqZWN0IHVrLXBvc2l0aW9uLWFic29sdXRlXCIpLCBkID0gITAsIGEub3B0aW9ucy52aWRlb211dGUgJiYgYS5tdXRlbWVkaWEocilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGkuJChcIjxjYW52YXM+PC9jYW52YXM+XCIpLmF0dHIoe3dpZHRoOiByWzBdLndpZHRoLCBoZWlnaHQ6IHJbMF0uaGVpZ2h0fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IGkuJCgnPGltZyBzdHlsZT1cIndpZHRoOjEwMCU7aGVpZ2h0OmF1dG87XCI+JykuYXR0cihcInNyY1wiLCB0WzBdLnRvRGF0YVVSTCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG8ucHJlcGVuZChsKSwgby5kYXRhKFwic2l6ZXJcIiwgbClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBvLmRhdGEoXCJzaXplclwiLCBvKTtcbiAgICAgICAgICAgICAgICBhLmhhc0tlbkJ1cm5zKG8pICYmIG8uZGF0YShcImNvdmVyXCIpLmNzcyh7XCItd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvblwiOiBlLCBcImFuaW1hdGlvbi1kdXJhdGlvblwiOiBlfSlcbiAgICAgICAgICAgIH0pLCB0aGlzLm9uKFwiY2xpY2sudWsuc2xpZGVzaG93XCIsIFwiW2RhdGEtdWstc2xpZGVzaG93LWl0ZW1dXCIsIGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHZhciBzID0gaS4kKHRoaXMpLmF0dHIoXCJkYXRhLXVrLXNsaWRlc2hvdy1pdGVtXCIpO1xuICAgICAgICAgICAgICAgIGlmIChhLmN1cnJlbnQgIT0gcykge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcIm5leHRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcInByZXZpb3VzXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtcIm5leHRcIiA9PSBzID8gXCJuZXh0XCIgOiBcInByZXZpb3VzXCJdKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc2hvdyhwYXJzZUludChzLCAxMCkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYS5zdG9wKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSwgdGhpcy5zbGlkZXMuYXR0cihcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKS5lcSh0aGlzLmN1cnJlbnQpLmFkZENsYXNzKFwidWstYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLCBcImZhbHNlXCIpLCB0aGlzLnRyaWdnZXJzLmZpbHRlcignW2RhdGEtdWstc2xpZGVzaG93LWl0ZW09XCInICsgdGhpcy5jdXJyZW50ICsgJ1wiXScpLmFkZENsYXNzKFwidWstYWN0aXZlXCIpLCBpLiR3aW4ub24oXCJyZXNpemUgbG9hZFwiLCBpLlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBhLnJlc2l6ZSgpLCBhLmZpeEZ1bGxzY3JlZW4gJiYgKGEuY29udGFpbmVyLmNzcyhcImhlaWdodFwiLCB3aW5kb3cuaW5uZXJIZWlnaHQpLCBhLnNsaWRlcy5jc3MoXCJoZWlnaHRcIiwgd2luZG93LmlubmVySGVpZ2h0KSlcbiAgICAgICAgICAgIH0sIDEwMCkpLCBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBhLnJlc2l6ZSgpXG4gICAgICAgICAgICB9LCA4MCksIHRoaXMub3B0aW9ucy5hdXRvcGxheSAmJiB0aGlzLnN0YXJ0KCksIHRoaXMub3B0aW9ucy52aWRlb2F1dG9wbGF5ICYmIHRoaXMuc2xpZGVzLmVxKHRoaXMuY3VycmVudCkuZGF0YShcIm1lZGlhXCIpICYmIHRoaXMucGxheW1lZGlhKHRoaXMuc2xpZGVzLmVxKHRoaXMuY3VycmVudCkuZGF0YShcIm1lZGlhXCIpKSwgdGhpcy5vcHRpb25zLmtlbmJ1cm5zICYmIHRoaXMuYXBwbHlLZW5CdXJucyh0aGlzLnNsaWRlcy5lcSh0aGlzLmN1cnJlbnQpKSwgdGhpcy5jb250YWluZXIub24oe1xuICAgICAgICAgICAgICAgIG1vdXNlZW50ZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgYS5vcHRpb25zLnBhdXNlT25Ib3ZlciAmJiAoYS5ob3ZlcmluZyA9ICEwKVxuICAgICAgICAgICAgICAgIH0sIG1vdXNlbGVhdmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgYS5ob3ZlcmluZyA9ICExXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksIHRoaXMub24oXCJzd2lwZVJpZ2h0IHN3aXBlTGVmdFwiLCBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgIGFbXCJzd2lwZUxlZnRcIiA9PSBpLnR5cGUgPyBcIm5leHRcIiA6IFwicHJldmlvdXNcIl0oKVxuICAgICAgICAgICAgfSksIHRoaXMub24oXCJkaXNwbGF5LnVrLmNoZWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBhLmVsZW1lbnQuaXMoXCI6dmlzaWJsZVwiKSAmJiAoYS5yZXNpemUoKSwgYS5maXhGdWxsc2NyZWVuICYmIChhLmNvbnRhaW5lci5jc3MoXCJoZWlnaHRcIiwgd2luZG93LmlubmVySGVpZ2h0KSwgYS5zbGlkZXMuY3NzKFwiaGVpZ2h0XCIsIHdpbmRvdy5pbm5lckhlaWdodCkpKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSwgcmVzaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29udGFpbmVyLmhhc0NsYXNzKFwidWstc2xpZGVzaG93LWZ1bGxzY3JlZW5cIikpIHtcbiAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMub3B0aW9ucy5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgXCJhdXRvXCIgPT09IHRoaXMub3B0aW9ucy5oZWlnaHQgJiYgKHQgPSAwLCB0aGlzLnNsaWRlcy5jc3MoXCJoZWlnaHRcIiwgXCJcIikuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHQgPSBNYXRoLm1heCh0LCBpLiQodGhpcykuaGVpZ2h0KCkpXG4gICAgICAgICAgICAgICAgfSkpLCB0aGlzLmNvbnRhaW5lci5jc3MoXCJoZWlnaHRcIiwgdCksIHRoaXMuc2xpZGVzLmNzcyhcImhlaWdodFwiLCB0KVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCBzaG93OiBmdW5jdGlvbiAocywgZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFuaW1hdGluZyAmJiB0aGlzLmN1cnJlbnQgIT0gcykge1xuICAgICAgICAgICAgICAgIHRoaXMuYW5pbWF0aW5nID0gITA7XG4gICAgICAgICAgICAgICAgdmFyIGEgPSB0aGlzLCBuID0gdGhpcy5zbGlkZXMuZXEodGhpcy5jdXJyZW50KSwgbyA9IHRoaXMuc2xpZGVzLmVxKHMpLCByID0gZSA/IGUgOiB0aGlzLmN1cnJlbnQgPCBzID8gMSA6IC0xLCBkID0gbi5kYXRhKFwibWVkaWFcIiksIHUgPSB0W3RoaXMub3B0aW9ucy5hbmltYXRpb25dID8gdGhpcy5vcHRpb25zLmFuaW1hdGlvbiA6IFwiZmFkZVwiLCBoID0gby5kYXRhKFwibWVkaWFcIiksIGMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGEuYW5pbWF0aW5nICYmIChkICYmIGQuaXMoXCJ2aWRlbyxpZnJhbWVcIikgJiYgYS5wYXVzZW1lZGlhKGQpLCBoICYmIGguaXMoXCJ2aWRlbyxpZnJhbWVcIikgJiYgYS5wbGF5bWVkaWEoaCksIG8uYWRkQ2xhc3MoXCJ1ay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsIFwiZmFsc2VcIiksIG4ucmVtb3ZlQ2xhc3MoXCJ1ay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsIFwidHJ1ZVwiKSwgYS5hbmltYXRpbmcgPSAhMSwgYS5jdXJyZW50ID0gcywgaS5VdGlscy5jaGVja0Rpc3BsYXkobywgJ1tjbGFzcyo9XCJ1ay1hbmltYXRpb24tXCJdOm5vdCgudWstY292ZXItYmFja2dyb3VuZC51ay1wb3NpdGlvbi1jb3ZlciknKSwgYS50cmlnZ2VyKFwic2hvdy51ay5zbGlkZXNob3dcIiwgW28sIG4sIGFdKSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGEuYXBwbHlLZW5CdXJucyhvKSwgaS5zdXBwb3J0LmFuaW1hdGlvbiB8fCAodSA9IFwibm9uZVwiKSwgbiA9IGkuJChuKSwgbyA9IGkuJChvKSwgYS50cmlnZ2VyKFwiYmVmb3Jlc2hvdy51ay5zbGlkZXNob3dcIiwgW28sIG4sIGFdKSwgdFt1XS5hcHBseSh0aGlzLCBbbiwgbywgcl0pLnRoZW4oYyksIGEudHJpZ2dlcnMucmVtb3ZlQ2xhc3MoXCJ1ay1hY3RpdmVcIiksIGEudHJpZ2dlcnMuZmlsdGVyKCdbZGF0YS11ay1zbGlkZXNob3ctaXRlbT1cIicgKyBzICsgJ1wiXScpLmFkZENsYXNzKFwidWstYWN0aXZlXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGFwcGx5S2VuQnVybnM6IGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oYXNLZW5CdXJucyhpKSkge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5vcHRpb25zLmtlbmJ1cm5zYW5pbWF0aW9ucywgcyA9IHRoaXMua2JpbmRleCB8fCAwO1xuICAgICAgICAgICAgICAgIGkuZGF0YShcImNvdmVyXCIpLmF0dHIoXCJjbGFzc1wiLCBcInVrLWNvdmVyLWJhY2tncm91bmQgdWstcG9zaXRpb24tY292ZXJcIikud2lkdGgoKSwgaS5kYXRhKFwiY292ZXJcIikuYWRkQ2xhc3MoW1widWstYW5pbWF0aW9uLXNjYWxlXCIsIFwidWstYW5pbWF0aW9uLXJldmVyc2VcIiwgdFtzXS50cmltKCldLmpvaW4oXCIgXCIpKSwgdGhpcy5rYmluZGV4ID0gdFtzICsgMV0gPyBzICsgMSA6IDBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgaGFzS2VuQnVybnM6IGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLmtlbmJ1cm5zICYmIGkuZGF0YShcImNvdmVyXCIpXG4gICAgICAgIH0sIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvdyh0aGlzLnNsaWRlc1t0aGlzLmN1cnJlbnQgKyAxXSA/IHRoaXMuY3VycmVudCArIDEgOiAwLCAxKVxuICAgICAgICB9LCBwcmV2aW91czogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5zaG93KHRoaXMuc2xpZGVzW3RoaXMuY3VycmVudCAtIDFdID8gdGhpcy5jdXJyZW50IC0gMSA6IHRoaXMuc2xpZGVzLmxlbmd0aCAtIDEsIC0xKVxuICAgICAgICB9LCBzdGFydDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5zdG9wKCk7XG4gICAgICAgICAgICB2YXIgaSA9IHRoaXM7XG4gICAgICAgICAgICB0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGkuaG92ZXJpbmcgfHwgaS5uZXh0KClcbiAgICAgICAgICAgIH0sIHRoaXMub3B0aW9ucy5hdXRvcGxheUludGVydmFsKVxuICAgICAgICB9LCBzdG9wOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmludGVydmFsICYmIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbClcbiAgICAgICAgfSwgcGxheW1lZGlhOiBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgaWYgKGkgJiYgaVswXSlzd2l0Y2ggKGlbMF0ubm9kZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlXCJWSURFT1wiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudmlkZW9tdXRlIHx8IChpWzBdLm11dGVkID0gITEpLCBpWzBdLnBsYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZVwiSUZSQU1FXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy52aWRlb211dGUgfHwgaVswXS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCd7IFwiZXZlbnRcIjogXCJjb21tYW5kXCIsIFwiZnVuY1wiOiBcInVubXV0ZVwiLCBcIm1ldGhvZFwiOlwic2V0Vm9sdW1lXCIsIFwidmFsdWVcIjoxfScsIFwiKlwiKSwgaVswXS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCd7IFwiZXZlbnRcIjogXCJjb21tYW5kXCIsIFwiZnVuY1wiOiBcInBsYXlWaWRlb1wiLCBcIm1ldGhvZFwiOlwicGxheVwifScsIFwiKlwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCBwYXVzZW1lZGlhOiBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgc3dpdGNoIChpWzBdLm5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgY2FzZVwiVklERU9cIjpcbiAgICAgICAgICAgICAgICAgICAgaVswXS5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlXCJJRlJBTUVcIjpcbiAgICAgICAgICAgICAgICAgICAgaVswXS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCd7IFwiZXZlbnRcIjogXCJjb21tYW5kXCIsIFwiZnVuY1wiOiBcInBhdXNlVmlkZW9cIiwgXCJtZXRob2RcIjpcInBhdXNlXCJ9JywgXCIqXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIG11dGVtZWRpYTogZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoaVswXS5ub2RlTmFtZSkge1xuICAgICAgICAgICAgICAgIGNhc2VcIlZJREVPXCI6XG4gICAgICAgICAgICAgICAgICAgIGlbMF0ubXV0ZWQgPSAhMDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZVwiSUZSQU1FXCI6XG4gICAgICAgICAgICAgICAgICAgIGlbMF0uY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgneyBcImV2ZW50XCI6IFwiY29tbWFuZFwiLCBcImZ1bmNcIjogXCJtdXRlXCIsIFwibWV0aG9kXCI6XCJzZXRWb2x1bWVcIiwgXCJ2YWx1ZVwiOjB9JywgXCIqXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KSwgdCA9IHtcbiAgICAgICAgbm9uZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHQgPSBpLiQuRGVmZXJyZWQoKTtcbiAgICAgICAgICAgIHJldHVybiB0LnJlc29sdmUoKSwgdC5wcm9taXNlKClcbiAgICAgICAgfSwgc2Nyb2xsOiBmdW5jdGlvbiAodCwgcywgZSkge1xuICAgICAgICAgICAgdmFyIGEgPSBpLiQuRGVmZXJyZWQoKTtcbiAgICAgICAgICAgIHJldHVybiB0LmNzcyhcImFuaW1hdGlvbi1kdXJhdGlvblwiLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKyBcIm1zXCIpLCBzLmNzcyhcImFuaW1hdGlvbi1kdXJhdGlvblwiLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKyBcIm1zXCIpLCBzLmNzcyhcIm9wYWNpdHlcIiwgMSkub25lKGkuc3VwcG9ydC5hbmltYXRpb24uZW5kLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdC5yZW1vdmVDbGFzcygtMSA9PSBlID8gXCJ1ay1zbGlkZXNob3ctc2Nyb2xsLWJhY2t3YXJkLW91dFwiIDogXCJ1ay1zbGlkZXNob3ctc2Nyb2xsLWZvcndhcmQtb3V0XCIpLCBzLmNzcyhcIm9wYWNpdHlcIiwgXCJcIikucmVtb3ZlQ2xhc3MoLTEgPT0gZSA/IFwidWstc2xpZGVzaG93LXNjcm9sbC1iYWNrd2FyZC1pblwiIDogXCJ1ay1zbGlkZXNob3ctc2Nyb2xsLWZvcndhcmQtaW5cIiksIGEucmVzb2x2ZSgpXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpLCB0LmFkZENsYXNzKC0xID09IGUgPyBcInVrLXNsaWRlc2hvdy1zY3JvbGwtYmFja3dhcmQtb3V0XCIgOiBcInVrLXNsaWRlc2hvdy1zY3JvbGwtZm9yd2FyZC1vdXRcIiksIHMuYWRkQ2xhc3MoLTEgPT0gZSA/IFwidWstc2xpZGVzaG93LXNjcm9sbC1iYWNrd2FyZC1pblwiIDogXCJ1ay1zbGlkZXNob3ctc2Nyb2xsLWZvcndhcmQtaW5cIiksIHMud2lkdGgoKSwgYS5wcm9taXNlKClcbiAgICAgICAgfSwgc3dpcGU6IGZ1bmN0aW9uICh0LCBzLCBlKSB7XG4gICAgICAgICAgICB2YXIgYSA9IGkuJC5EZWZlcnJlZCgpO1xuICAgICAgICAgICAgcmV0dXJuIHQuY3NzKFwiYW5pbWF0aW9uLWR1cmF0aW9uXCIsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiArIFwibXNcIiksIHMuY3NzKFwiYW5pbWF0aW9uLWR1cmF0aW9uXCIsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiArIFwibXNcIiksIHMuY3NzKFwib3BhY2l0eVwiLCAxKS5vbmUoaS5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0LnJlbW92ZUNsYXNzKC0xID09PSBlID8gXCJ1ay1zbGlkZXNob3ctc3dpcGUtYmFja3dhcmQtb3V0XCIgOiBcInVrLXNsaWRlc2hvdy1zd2lwZS1mb3J3YXJkLW91dFwiKSwgcy5jc3MoXCJvcGFjaXR5XCIsIFwiXCIpLnJlbW92ZUNsYXNzKC0xID09PSBlID8gXCJ1ay1zbGlkZXNob3ctc3dpcGUtYmFja3dhcmQtaW5cIiA6IFwidWstc2xpZGVzaG93LXN3aXBlLWZvcndhcmQtaW5cIiksIGEucmVzb2x2ZSgpXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpLCB0LmFkZENsYXNzKC0xID09IGUgPyBcInVrLXNsaWRlc2hvdy1zd2lwZS1iYWNrd2FyZC1vdXRcIiA6IFwidWstc2xpZGVzaG93LXN3aXBlLWZvcndhcmQtb3V0XCIpLCBzLmFkZENsYXNzKC0xID09IGUgPyBcInVrLXNsaWRlc2hvdy1zd2lwZS1iYWNrd2FyZC1pblwiIDogXCJ1ay1zbGlkZXNob3ctc3dpcGUtZm9yd2FyZC1pblwiKSwgcy53aWR0aCgpLCBhLnByb21pc2UoKVxuICAgICAgICB9LCBzY2FsZTogZnVuY3Rpb24gKHQsIHMpIHtcbiAgICAgICAgICAgIHZhciBlID0gaS4kLkRlZmVycmVkKCk7XG4gICAgICAgICAgICByZXR1cm4gdC5jc3MoXCJhbmltYXRpb24tZHVyYXRpb25cIiwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICsgXCJtc1wiKSwgcy5jc3MoXCJhbmltYXRpb24tZHVyYXRpb25cIiwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICsgXCJtc1wiKSwgcy5jc3MoXCJvcGFjaXR5XCIsIDEpLCB0Lm9uZShpLnN1cHBvcnQuYW5pbWF0aW9uLmVuZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHQucmVtb3ZlQ2xhc3MoXCJ1ay1zbGlkZXNob3ctc2NhbGUtb3V0XCIpLCBzLmNzcyhcIm9wYWNpdHlcIiwgXCJcIiksIGUucmVzb2x2ZSgpXG4gICAgICAgICAgICB9LmJpbmQodGhpcykpLCB0LmFkZENsYXNzKFwidWstc2xpZGVzaG93LXNjYWxlLW91dFwiKSwgdC53aWR0aCgpLCBlLnByb21pc2UoKVxuICAgICAgICB9LCBmYWRlOiBmdW5jdGlvbiAodCwgcykge1xuICAgICAgICAgICAgdmFyIGUgPSBpLiQuRGVmZXJyZWQoKTtcbiAgICAgICAgICAgIHJldHVybiB0LmNzcyhcImFuaW1hdGlvbi1kdXJhdGlvblwiLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKyBcIm1zXCIpLCBzLmNzcyhcImFuaW1hdGlvbi1kdXJhdGlvblwiLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKyBcIm1zXCIpLCBzLmNzcyhcIm9wYWNpdHlcIiwgMSksIHMuZGF0YShcImNvdmVyXCIpIHx8IHMuZGF0YShcInBsYWNlaG9sZGVyXCIpIHx8IHMuY3NzKFwib3BhY2l0eVwiLCAxKS5vbmUoaS5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzLnJlbW92ZUNsYXNzKFwidWstc2xpZGVzaG93LWZhZGUtaW5cIilcbiAgICAgICAgICAgIH0pLmFkZENsYXNzKFwidWstc2xpZGVzaG93LWZhZGUtaW5cIiksIHQub25lKGkuc3VwcG9ydC5hbmltYXRpb24uZW5kLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdC5yZW1vdmVDbGFzcyhcInVrLXNsaWRlc2hvdy1mYWRlLW91dFwiKSwgcy5jc3MoXCJvcGFjaXR5XCIsIFwiXCIpLCBlLnJlc29sdmUoKVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKSwgdC5hZGRDbGFzcyhcInVrLXNsaWRlc2hvdy1mYWRlLW91dFwiKSwgdC53aWR0aCgpLCBlLnByb21pc2UoKVxuICAgICAgICB9XG4gICAgfSwgaS5zbGlkZXNob3cuYW5pbWF0aW9ucyA9IHQsIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgcywgZSA9IHQuZGF0YTtcbiAgICAgICAgaWYgKFwic3RyaW5nXCIgPT0gdHlwZW9mIGUpdHJ5IHtcbiAgICAgICAgICAgIGUgPSBKU09OLnBhcnNlKGUpXG4gICAgICAgIH0gY2F0Y2ggKGEpIHtcbiAgICAgICAgICAgIGUgPSB7fVxuICAgICAgICB9XG4gICAgICAgIHQub3JpZ2luICYmIHQub3JpZ2luLmluZGV4T2YoXCJ2aW1lb1wiKSA+IC0xICYmIFwicmVhZHlcIiA9PSBlLmV2ZW50ICYmIGUucGxheWVyX2lkICYmIChzID0gaS4kKCdbZGF0YS1wbGF5ZXItaWQ9XCInICsgZS5wbGF5ZXJfaWQgKyAnXCJdJyksIHMubGVuZ3RoICYmIHMuZGF0YShcInNsaWRlc2hvd1wiKS5tdXRlbWVkaWEocykpXG4gICAgfSwgITEpXG59KTsiLCIvKiEgVUlraXQgMi4yNi4zIHwgaHR0cDovL3d3dy5nZXR1aWtpdC5jb20gfCAoYykgMjAxNCBZT090aGVtZSB8IE1JVCBMaWNlbnNlICovXG4hZnVuY3Rpb24odCl7dmFyIGk7d2luZG93LlVJa2l0JiYoaT10KFVJa2l0KSksXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoXCJ1aWtpdC1zdGlja3lcIixbXCJ1aWtpdFwiXSxmdW5jdGlvbigpe3JldHVybiBpfHx0KFVJa2l0KX0pfShmdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpKCl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHM6bjtpZihpLmxlbmd0aCYmIShlLnNjcm9sbFRvcCgpPDApKWZvcih2YXIgbyxhLHIsaCxwPWUuc2Nyb2xsVG9wKCksYz1zLmhlaWdodCgpLGw9ZS5oZWlnaHQoKSxkPWMtbCx1PXA+ZD9kLXA6MCxtPTA7bTxpLmxlbmd0aDttKyspaWYoaD1pW21dLGguZWxlbWVudC5pcyhcIjp2aXNpYmxlXCIpJiYhaC5hbmltYXRlKXtpZihoLmNoZWNrKCkpe2lmKGgudG9wPDA/bz0wOihyPWguZWxlbWVudC5vdXRlckhlaWdodCgpLG89Yy1yLWgudG9wLWgub3B0aW9ucy5ib3R0b20tcC11LG89MD5vP28raC50b3A6aC50b3ApLGguYm91bmRhcnkmJmguYm91bmRhcnkubGVuZ3RoKXt2YXIgZj1oLmJvdW5kYXJ5Lm9mZnNldCgpLnRvcDthPWguYm91bmR0b3BhcmVudD9jLShmK2guYm91bmRhcnkub3V0ZXJIZWlnaHQoKSkrcGFyc2VJbnQoaC5ib3VuZGFyeS5jc3MoXCJwYWRkaW5nLWJvdHRvbVwiKSk6Yy1mLG89cCtyPmMtYS0oaC50b3A8MD8wOmgudG9wKT9jLWEtKHArcik6b31pZihoLmN1cnJlbnRUb3AhPW8pe2lmKGguZWxlbWVudC5jc3Moe3Bvc2l0aW9uOlwiZml4ZWRcIix0b3A6byx3aWR0aDpoLmdldFdpZHRoRnJvbS5sZW5ndGg/aC5nZXRXaWR0aEZyb20ud2lkdGgoKTpoLmVsZW1lbnQud2lkdGgoKX0pLCFoLmluaXQmJihoLmVsZW1lbnQuYWRkQ2xhc3MoaC5vcHRpb25zLmNsc2luaXQpLGxvY2F0aW9uLmhhc2gmJnA+MCYmaC5vcHRpb25zLnRhcmdldCkpe3ZhciBnPXQuJChsb2NhdGlvbi5oYXNoKTtnLmxlbmd0aCYmc2V0VGltZW91dChmdW5jdGlvbih0LGkpe3JldHVybiBmdW5jdGlvbigpe2kuZWxlbWVudC53aWR0aCgpO3ZhciBlPXQub2Zmc2V0KCkscz1lLnRvcCt0Lm91dGVySGVpZ2h0KCksbj1pLmVsZW1lbnQub2Zmc2V0KCksbz1pLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSxhPW4udG9wK287bi50b3A8cyYmZS50b3A8YSYmKHA9ZS50b3Atby1pLm9wdGlvbnMudGFyZ2V0LHdpbmRvdy5zY3JvbGxUbygwLHApKX19KGcsaCksMCl9aC5lbGVtZW50LmFkZENsYXNzKGgub3B0aW9ucy5jbHNhY3RpdmUpLnJlbW92ZUNsYXNzKGgub3B0aW9ucy5jbHNpbmFjdGl2ZSksaC5lbGVtZW50LnRyaWdnZXIoXCJhY3RpdmUudWsuc3RpY2t5XCIpLGguZWxlbWVudC5jc3MoXCJtYXJnaW5cIixcIlwiKSxoLm9wdGlvbnMuYW5pbWF0aW9uJiZoLmluaXQmJiF0LlV0aWxzLmlzSW5WaWV3KGgud3JhcHBlcikmJmguZWxlbWVudC5hZGRDbGFzcyhoLm9wdGlvbnMuYW5pbWF0aW9uKSxoLmN1cnJlbnRUb3A9b319ZWxzZSBudWxsIT09aC5jdXJyZW50VG9wJiZoLnJlc2V0KCk7aC5pbml0PSEwfX12YXIgZT10LiR3aW4scz10LiRkb2Msbj1bXSxvPTE7cmV0dXJuIHQuY29tcG9uZW50KFwic3RpY2t5XCIse2RlZmF1bHRzOnt0b3A6MCxib3R0b206MCxhbmltYXRpb246XCJcIixjbHNpbml0OlwidWstc3RpY2t5LWluaXRcIixjbHNhY3RpdmU6XCJ1ay1hY3RpdmVcIixjbHNpbmFjdGl2ZTpcIlwiLGdldFdpZHRoRnJvbTpcIlwiLHNob3d1cDohMSxib3VuZGFyeTohMSxtZWRpYTohMSx0YXJnZXQ6ITEsZGlzYWJsZWQ6ITF9LGJvb3Q6ZnVuY3Rpb24oKXt0LiRkb2Mub24oXCJzY3JvbGxpbmcudWsuZG9jdW1lbnRcIixmdW5jdGlvbih0LGUpe2UmJmUuZGlyJiYobz1lLmRpci55LGkoKSl9KSx0LiR3aW4ub24oXCJyZXNpemUgb3JpZW50YXRpb25jaGFuZ2VcIix0LlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uKCl7aWYobi5sZW5ndGgpe2Zvcih2YXIgdD0wO3Q8bi5sZW5ndGg7dCsrKW5bdF0ucmVzZXQoITApO2koKX19LDEwMCkpLHQucmVhZHkoZnVuY3Rpb24oZSl7c2V0VGltZW91dChmdW5jdGlvbigpe3QuJChcIltkYXRhLXVrLXN0aWNreV1cIixlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9dC4kKHRoaXMpO2kuZGF0YShcInN0aWNreVwiKXx8dC5zdGlja3koaSx0LlV0aWxzLm9wdGlvbnMoaS5hdHRyKFwiZGF0YS11ay1zdGlja3lcIikpKX0pLGkoKX0sMCl9KX0saW5pdDpmdW5jdGlvbigpe3ZhciBpLGE9dGhpcy5vcHRpb25zLmJvdW5kYXJ5O3RoaXMud3JhcHBlcj10aGlzLmVsZW1lbnQud3JhcCgnPGRpdiBjbGFzcz1cInVrLXN0aWNreS1wbGFjZWhvbGRlclwiPjwvZGl2PicpLnBhcmVudCgpLHRoaXMuY29tcHV0ZVdyYXBwZXIoKSx0aGlzLmVsZW1lbnQuY3NzKFwibWFyZ2luXCIsMCksYSYmKGE9PT0hMHx8XCIhXCI9PT1hWzBdPyhhPWE9PT0hMD90aGlzLndyYXBwZXIucGFyZW50KCk6dGhpcy53cmFwcGVyLmNsb3Nlc3QoYS5zdWJzdHIoMSkpLGk9ITApOlwic3RyaW5nXCI9PXR5cGVvZiBhJiYoYT10LiQoYSkpKSx0aGlzLnN0aWNreT17c2VsZjp0aGlzLG9wdGlvbnM6dGhpcy5vcHRpb25zLGVsZW1lbnQ6dGhpcy5lbGVtZW50LGN1cnJlbnRUb3A6bnVsbCx3cmFwcGVyOnRoaXMud3JhcHBlcixpbml0OiExLGdldFdpZHRoRnJvbTp0LiQodGhpcy5vcHRpb25zLmdldFdpZHRoRnJvbXx8dGhpcy53cmFwcGVyKSxib3VuZGFyeTphLGJvdW5kdG9wYXJlbnQ6aSx0b3A6MCxjYWxjVG9wOmZ1bmN0aW9uKCl7dmFyIGk9dGhpcy5vcHRpb25zLnRvcDtpZih0aGlzLm9wdGlvbnMudG9wJiZcInN0cmluZ1wiPT10eXBlb2YgdGhpcy5vcHRpb25zLnRvcClpZih0aGlzLm9wdGlvbnMudG9wLm1hdGNoKC9eKC18KShcXGQrKXZoJC8pKWk9d2luZG93LmlubmVySGVpZ2h0KnBhcnNlSW50KHRoaXMub3B0aW9ucy50b3AsMTApLzEwMDtlbHNle3ZhciBlPXQuJCh0aGlzLm9wdGlvbnMudG9wKS5maXJzdCgpO2UubGVuZ3RoJiZlLmlzKFwiOnZpc2libGVcIikmJihpPS0xKihlLm9mZnNldCgpLnRvcCtlLm91dGVySGVpZ2h0KCktdGhpcy53cmFwcGVyLm9mZnNldCgpLnRvcCkpfXRoaXMudG9wPWl9LHJlc2V0OmZ1bmN0aW9uKGkpe3RoaXMuY2FsY1RvcCgpO3ZhciBlPWZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LmNzcyh7cG9zaXRpb246XCJcIix0b3A6XCJcIix3aWR0aDpcIlwiLGxlZnQ6XCJcIixtYXJnaW46XCIwXCJ9KSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoW3RoaXMub3B0aW9ucy5hbmltYXRpb24sXCJ1ay1hbmltYXRpb24tcmV2ZXJzZVwiLHRoaXMub3B0aW9ucy5jbHNhY3RpdmVdLmpvaW4oXCIgXCIpKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmNsc2luYWN0aXZlKSx0aGlzLmVsZW1lbnQudHJpZ2dlcihcImluYWN0aXZlLnVrLnN0aWNreVwiKSx0aGlzLmN1cnJlbnRUb3A9bnVsbCx0aGlzLmFuaW1hdGU9ITF9LmJpbmQodGhpcyk7IWkmJnRoaXMub3B0aW9ucy5hbmltYXRpb24mJnQuc3VwcG9ydC5hbmltYXRpb24mJiF0LlV0aWxzLmlzSW5WaWV3KHRoaXMud3JhcHBlcik/KHRoaXMuYW5pbWF0ZT0hMCx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFuaW1hdGlvbikub25lKHQuc3VwcG9ydC5hbmltYXRpb24uZW5kLGZ1bmN0aW9uKCl7ZSgpfSkud2lkdGgoKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmFuaW1hdGlvbitcIiB1ay1hbmltYXRpb24tcmV2ZXJzZVwiKSk6ZSgpfSxjaGVjazpmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5kaXNhYmxlZClyZXR1cm4hMTtpZih0aGlzLm9wdGlvbnMubWVkaWEpc3dpdGNoKHR5cGVvZiB0aGlzLm9wdGlvbnMubWVkaWEpe2Nhc2VcIm51bWJlclwiOmlmKHdpbmRvdy5pbm5lcldpZHRoPHRoaXMub3B0aW9ucy5tZWRpYSlyZXR1cm4hMTticmVhaztjYXNlXCJzdHJpbmdcIjppZih3aW5kb3cubWF0Y2hNZWRpYSYmIXdpbmRvdy5tYXRjaE1lZGlhKHRoaXMub3B0aW9ucy5tZWRpYSkubWF0Y2hlcylyZXR1cm4hMX12YXIgaT1lLnNjcm9sbFRvcCgpLG49cy5oZWlnaHQoKSxhPW4td2luZG93LmlubmVySGVpZ2h0LHI9aT5hP2EtaTowLGg9dGhpcy53cmFwcGVyLm9mZnNldCgpLnRvcCxwPWgtdGhpcy50b3AtcixjPWk+PXA7cmV0dXJuIGMmJnRoaXMub3B0aW9ucy5zaG93dXAmJigxPT1vJiYoYz0hMSksLTE9PW8mJiF0aGlzLmVsZW1lbnQuaGFzQ2xhc3ModGhpcy5vcHRpb25zLmNsc2FjdGl2ZSkmJnQuVXRpbHMuaXNJblZpZXcodGhpcy53cmFwcGVyKSYmKGM9ITEpKSxjfX0sdGhpcy5zdGlja3kuY2FsY1RvcCgpLG4ucHVzaCh0aGlzLnN0aWNreSl9LHVwZGF0ZTpmdW5jdGlvbigpe2kodGhpcy5zdGlja3kpfSxlbmFibGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuZGlzYWJsZWQ9ITEsdGhpcy51cGRhdGUoKX0sZGlzYWJsZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMuZGlzYWJsZWQ9ITAsdGhpcy5zdGlja3kucmVzZXQodCl9LGNvbXB1dGVXcmFwcGVyOmZ1bmN0aW9uKCl7dGhpcy53cmFwcGVyLmNzcyh7aGVpZ2h0Oi0xPT1bXCJhYnNvbHV0ZVwiLFwiZml4ZWRcIl0uaW5kZXhPZih0aGlzLmVsZW1lbnQuY3NzKFwicG9zaXRpb25cIikpP3RoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpOlwiXCIsXCJmbG9hdFwiOlwibm9uZVwiIT10aGlzLmVsZW1lbnQuY3NzKFwiZmxvYXRcIik/dGhpcy5lbGVtZW50LmNzcyhcImZsb2F0XCIpOlwiXCIsbWFyZ2luOnRoaXMuZWxlbWVudC5jc3MoXCJtYXJnaW5cIil9KSxcImZpeGVkXCI9PXRoaXMuZWxlbWVudC5jc3MoXCJwb3NpdGlvblwiKSYmdGhpcy5lbGVtZW50LmNzcyh7d2lkdGg6dGhpcy5zdGlja3kuZ2V0V2lkdGhGcm9tLmxlbmd0aD90aGlzLnN0aWNreS5nZXRXaWR0aEZyb20ud2lkdGgoKTp0aGlzLmVsZW1lbnQud2lkdGgoKX0pfX0pLHQuc3RpY2t5fSk7IiwiLyohIFVJa2l0IDIuMjYuMyB8IGh0dHA6Ly93d3cuZ2V0dWlraXQuY29tIHwgKGMpIDIwMTQgWU9PdGhlbWUgfCBNSVQgTGljZW5zZSAqL1xuIWZ1bmN0aW9uKHQpe3ZhciBpO3dpbmRvdy5VSWtpdCYmKGk9dChVSWtpdCkpLFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKFwidWlraXQtdG9vbHRpcFwiLFtcInVpa2l0XCJdLGZ1bmN0aW9uKCl7cmV0dXJuIGl8fHQoVUlraXQpfSl9KGZ1bmN0aW9uKHQpe1widXNlIHN0cmljdFwiO3ZhciBpLG8sZTtyZXR1cm4gdC5jb21wb25lbnQoXCJ0b29sdGlwXCIse2RlZmF1bHRzOntvZmZzZXQ6NSxwb3M6XCJ0b3BcIixhbmltYXRpb246ITEsZGVsYXk6MCxjbHM6XCJcIixhY3RpdmVDbGFzczpcInVrLWFjdGl2ZVwiLHNyYzpmdW5jdGlvbih0KXt2YXIgaT10LmF0dHIoXCJ0aXRsZVwiKTtyZXR1cm4gdm9pZCAwIT09aSYmdC5kYXRhKFwiY2FjaGVkLXRpdGxlXCIsaSkucmVtb3ZlQXR0cihcInRpdGxlXCIpLHQuZGF0YShcImNhY2hlZC10aXRsZVwiKX19LHRpcDpcIlwiLGJvb3Q6ZnVuY3Rpb24oKXt0LiRodG1sLm9uKFwibW91c2VlbnRlci50b29sdGlwLnVpa2l0IGZvY3VzLnRvb2x0aXAudWlraXRcIixcIltkYXRhLXVrLXRvb2x0aXBdXCIsZnVuY3Rpb24oKXt2YXIgaT10LiQodGhpcyk7aS5kYXRhKFwidG9vbHRpcFwiKXx8KHQudG9vbHRpcChpLHQuVXRpbHMub3B0aW9ucyhpLmF0dHIoXCJkYXRhLXVrLXRvb2x0aXBcIikpKSxpLnRyaWdnZXIoXCJtb3VzZWVudGVyXCIpKX0pfSxpbml0OmZ1bmN0aW9uKCl7dmFyIG89dGhpcztpfHwoaT10LiQoJzxkaXYgY2xhc3M9XCJ1ay10b29sdGlwXCI+PC9kaXY+JykuYXBwZW5kVG8oXCJib2R5XCIpKSx0aGlzLm9uKHtmb2N1czpmdW5jdGlvbigpe28uc2hvdygpfSxibHVyOmZ1bmN0aW9uKCl7by5oaWRlKCl9LG1vdXNlZW50ZXI6ZnVuY3Rpb24oKXtvLnNob3coKX0sbW91c2VsZWF2ZTpmdW5jdGlvbigpe28uaGlkZSgpfX0pfSxzaG93OmZ1bmN0aW9uKCl7aWYodGhpcy50aXA9XCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLnNyYz90aGlzLm9wdGlvbnMuc3JjKHRoaXMuZWxlbWVudCk6dGhpcy5vcHRpb25zLnNyYyxvJiZjbGVhclRpbWVvdXQobyksZSYmY2xlYXJUaW1lb3V0KGUpLFwic3RyaW5nXCI9PXR5cGVvZiB0aGlzLnRpcD90aGlzLnRpcC5sZW5ndGg6MCl7aS5zdG9wKCkuY3NzKHt0b3A6LTJlMyx2aXNpYmlsaXR5OlwiaGlkZGVuXCJ9KS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLnNob3coKSxpLmh0bWwoJzxkaXYgY2xhc3M9XCJ1ay10b29sdGlwLWlubmVyXCI+Jyt0aGlzLnRpcCtcIjwvZGl2PlwiKTt2YXIgcz10aGlzLG49dC4kLmV4dGVuZCh7fSx0aGlzLmVsZW1lbnQub2Zmc2V0KCkse3dpZHRoOnRoaXMuZWxlbWVudFswXS5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5lbGVtZW50WzBdLm9mZnNldEhlaWdodH0pLGw9aVswXS5vZmZzZXRXaWR0aCxmPWlbMF0ub2Zmc2V0SGVpZ2h0LHA9XCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLm9mZnNldD90aGlzLm9wdGlvbnMub2Zmc2V0LmNhbGwodGhpcy5lbGVtZW50KTp0aGlzLm9wdGlvbnMub2Zmc2V0LGE9XCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLnBvcz90aGlzLm9wdGlvbnMucG9zLmNhbGwodGhpcy5lbGVtZW50KTp0aGlzLm9wdGlvbnMucG9zLGg9YS5zcGxpdChcIi1cIiksYz17ZGlzcGxheTpcIm5vbmVcIix2aXNpYmlsaXR5OlwidmlzaWJsZVwiLHRvcDpuLnRvcCtuLmhlaWdodCtmLGxlZnQ6bi5sZWZ0fTtpZihcImZpeGVkXCI9PXQuJGh0bWwuY3NzKFwicG9zaXRpb25cIil8fFwiZml4ZWRcIj09dC4kYm9keS5jc3MoXCJwb3NpdGlvblwiKSl7dmFyIHI9dC4kKFwiYm9keVwiKS5vZmZzZXQoKSxkPXQuJChcImh0bWxcIikub2Zmc2V0KCksdT17dG9wOmQudG9wK3IudG9wLGxlZnQ6ZC5sZWZ0K3IubGVmdH07bi5sZWZ0LT11LmxlZnQsbi50b3AtPXUudG9wfVwibGVmdFwiIT1oWzBdJiZcInJpZ2h0XCIhPWhbMF18fFwicmlnaHRcIiE9dC5sYW5nZGlyZWN0aW9ufHwoaFswXT1cImxlZnRcIj09aFswXT9cInJpZ2h0XCI6XCJsZWZ0XCIpO3ZhciBtPXtib3R0b206e3RvcDpuLnRvcCtuLmhlaWdodCtwLGxlZnQ6bi5sZWZ0K24ud2lkdGgvMi1sLzJ9LHRvcDp7dG9wOm4udG9wLWYtcCxsZWZ0Om4ubGVmdCtuLndpZHRoLzItbC8yfSxsZWZ0Ont0b3A6bi50b3Arbi5oZWlnaHQvMi1mLzIsbGVmdDpuLmxlZnQtbC1wfSxyaWdodDp7dG9wOm4udG9wK24uaGVpZ2h0LzItZi8yLGxlZnQ6bi5sZWZ0K24ud2lkdGgrcH19O3QuJC5leHRlbmQoYyxtW2hbMF1dKSwyPT1oLmxlbmd0aCYmKGMubGVmdD1cImxlZnRcIj09aFsxXT9uLmxlZnQ6bi5sZWZ0K24ud2lkdGgtbCk7dmFyIHY9dGhpcy5jaGVja0JvdW5kYXJ5KGMubGVmdCxjLnRvcCxsLGYpO2lmKHYpe3N3aXRjaCh2KXtjYXNlXCJ4XCI6YT0yPT1oLmxlbmd0aD9oWzBdK1wiLVwiKyhjLmxlZnQ8MD9cImxlZnRcIjpcInJpZ2h0XCIpOmMubGVmdDwwP1wicmlnaHRcIjpcImxlZnRcIjticmVhaztjYXNlXCJ5XCI6YT0yPT1oLmxlbmd0aD8oYy50b3A8MD9cImJvdHRvbVwiOlwidG9wXCIpK1wiLVwiK2hbMV06Yy50b3A8MD9cImJvdHRvbVwiOlwidG9wXCI7YnJlYWs7Y2FzZVwieHlcIjphPTI9PWgubGVuZ3RoPyhjLnRvcDwwP1wiYm90dG9tXCI6XCJ0b3BcIikrXCItXCIrKGMubGVmdDwwP1wibGVmdFwiOlwicmlnaHRcIik6Yy5sZWZ0PDA/XCJyaWdodFwiOlwibGVmdFwifWg9YS5zcGxpdChcIi1cIiksdC4kLmV4dGVuZChjLG1baFswXV0pLDI9PWgubGVuZ3RoJiYoYy5sZWZ0PVwibGVmdFwiPT1oWzFdP24ubGVmdDpuLmxlZnQrbi53aWR0aC1sKX1jLmxlZnQtPXQuJGJvZHkucG9zaXRpb24oKS5sZWZ0LG89c2V0VGltZW91dChmdW5jdGlvbigpe2kuY3NzKGMpLmF0dHIoXCJjbGFzc1wiLFtcInVrLXRvb2x0aXBcIixcInVrLXRvb2x0aXAtXCIrYSxzLm9wdGlvbnMuY2xzXS5qb2luKFwiIFwiKSkscy5vcHRpb25zLmFuaW1hdGlvbj9pLmNzcyh7b3BhY2l0eTowLGRpc3BsYXk6XCJibG9ja1wifSkuYWRkQ2xhc3Mocy5vcHRpb25zLmFjdGl2ZUNsYXNzKS5hbmltYXRlKHtvcGFjaXR5OjF9LHBhcnNlSW50KHMub3B0aW9ucy5hbmltYXRpb24sMTApfHw0MDApOmkuc2hvdygpLmFkZENsYXNzKHMub3B0aW9ucy5hY3RpdmVDbGFzcyksbz0hMSxlPXNldEludGVydmFsKGZ1bmN0aW9uKCl7cy5lbGVtZW50LmlzKFwiOnZpc2libGVcIil8fHMuaGlkZSgpfSwxNTApfSxwYXJzZUludCh0aGlzLm9wdGlvbnMuZGVsYXksMTApfHwwKX19LGhpZGU6ZnVuY3Rpb24oKXtpZighdGhpcy5lbGVtZW50LmlzKFwiaW5wdXRcIil8fHRoaXMuZWxlbWVudFswXSE9PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpaWYobyYmY2xlYXJUaW1lb3V0KG8pLGUmJmNsZWFyVGltZW91dChlKSxpLnN0b3AoKSx0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKXt2YXIgdD10aGlzO2kuZmFkZU91dChwYXJzZUludCh0aGlzLm9wdGlvbnMuYW5pbWF0aW9uLDEwKXx8NDAwLGZ1bmN0aW9uKCl7aS5yZW1vdmVDbGFzcyh0Lm9wdGlvbnMuYWN0aXZlQ2xhc3MpfSl9ZWxzZSBpLmhpZGUoKS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpfSxjb250ZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGlwfSxjaGVja0JvdW5kYXJ5OmZ1bmN0aW9uKGksbyxlLHMpe3ZhciBuPVwiXCI7cmV0dXJuKDA+aXx8aS10LiR3aW4uc2Nyb2xsTGVmdCgpK2U+d2luZG93LmlubmVyV2lkdGgpJiYobis9XCJ4XCIpLCgwPm98fG8tdC4kd2luLnNjcm9sbFRvcCgpK3M+d2luZG93LmlubmVySGVpZ2h0KSYmKG4rPVwieVwiKSxufX0pLHQudG9vbHRpcH0pOyJdfQ==

/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=s.map,p=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(a=a.split("/"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,"")),a=n.slice(0,n.length-1).concat(a),k=0;k<a.length;k+=1)if(m=a[k],"."===m)a.splice(k,1),k-=1;else if(".."===m){if(1===k&&(".."===a[2]||".."===a[0]))break;k>0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=v.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),n.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,"undefined"===v||"function"===v){for(c=!c.length&&d.length?["require","exports","module"]:c,n=0;n<c.length;n+=1)if(m=o(c[n],f),k=m.f,"require"===k)u[n]=p.require(a);else if("exports"===k)u[n]=p.exports(a),s=!0;else if("module"===k)h=u[n]=p.module(a);else if(e(q,k)||e(r,k)||e(t,k))u[n]=j(k);else{if(!m.p)throw new Error(a+" missing "+k);m.p.load(m.n,g(f,!0),i(k),{}),u[n]=q[k]}l=d?d.apply(q[a],u):void 0,a&&(h&&h.exports!==b&&h.exports!==q[a]?q[a]=h.exports:l===b&&s||(q[a]=l))}else a&&(q[a]=d)},a=c=n=function(a,c,d,e,f){if("string"==typeof a)return p[a]?p[a](c):j(o(a,c).f);if(!a.splice){if(s=a,s.deps&&n(s.deps,s.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},"function"==typeof d&&(d=e,e=f),e?m(b,a,c,d):setTimeout(function(){m(b,a,c,d)},4),n},n.config=function(a){return n(a)},a._defined=q,d=function(a,b,c){if("string"!=typeof a)throw new Error("See almond README: incorrect module build, no module name");b.splice||(c=b,b=[]),e(q,a)||e(r,a)||(r[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define("almond",function(){}),b.define("jquery",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),b}),b.define("select2/utils",["jquery"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){var e=b[d];"function"==typeof e&&"constructor"!==d&&c.push(d)}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){var a=Array.prototype.unshift;return a.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};return d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice,c=b.call(arguments,1);this.listeners=this.listeners||{},null==c&&(c=[]),0===c.length&&c.push({}),c[0]._type=a,a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;d>c;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return e!==f||"hidden"!==f&&"visible"!==f?"scroll"===e||"scroll"===f?!0:d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth:!1},c.escapeMarkup=function(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('<li role="treeitem" aria-live="assertive" class="select2-results__option"></li>'),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){var c=b.find(".select2-results");c.append(a)},c.prototype.sort=function(a){var b=this.options.get("sorter");return b(a)},c.prototype.highlightFirstItem=function(){var a=this.$results.find(".select2-results__option[aria-selected]"),b=a.filter("[aria-selected=true]");b.length>0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(".select2-results__option[aria-selected]");e.each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";a(h);this.template(b,h);for(var i=[],j=0;j<b.children.length;j++){var k=b.children[j],l=this.option(k);i.push(l)}var m=a("<ul></ul>",{"class":"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b,c){var d=this,e=b.id+"-results";this.$results.attr("id",e),b.on("results:all",function(a){d.clear(),d.append(a.data),b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("results:append",function(a){d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("query",function(a){d.hideMessages(),d.showLoading(a)}),b.on("select",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("unselect",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("open",function(){d.$results.attr("aria-expanded","true"),d.$results.attr("aria-hidden","false"),d.setClasses(),d.ensureHighlightVisible()}),b.on("close",function(){d.$results.attr("aria-expanded","false"),d.$results.attr("aria-hidden","true"),d.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=d.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=d.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?d.trigger("close",{}):d.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a);if(0!==c){var e=c-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top,h=f.offset().top,i=d.$results.scrollTop()+(h-g);0===e?d.$results.scrollTop(0):0>h-g&&d.$results.scrollTop(i)}}),b.on("results:next",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a),e=c+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top+d.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=d.$results.scrollTop()+h-g;0===e?d.$results.scrollTop(0):h>g&&d.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){d.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=d.$results.scrollTop(),c=d.$results.get(0).scrollHeight-b+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=d.$results.height();e?(d.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(d.$results.scrollTop(d.$results.get(0).scrollHeight-d.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var c=a(this),e=c.data("data");return"true"===c.attr("aria-selected")?void(d.options.get("multiple")?d.trigger("unselect",{originalEvent:b,data:e}):d.trigger("close",{})):void d.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(b){var c=a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted"),d.trigger("results:focus",{data:c,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(".select2-results__option--highlighted");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('<span class="select2-selection" role="combobox"  aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a,b){var d=this,e=(a.id+"-container",a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),d.$selection.focus(),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2"),e=a(".select2.select2-container--open");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data("element");c.select2("close")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){var c=b.find(".selection");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()}),a.on("selection:update",function(a){c.update(a.data)})},e.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},e.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},e.prototype.selectionContainer=function(){return a("<span></span>")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.prop("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('<ul class="select2-selection__rendered"></ul>'),a},d.prototype.bind=function(b,c){var e=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){e.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!e.options.get("disabled")){var c=a(this),d=c.parent(),f=d.data("data");e.trigger("unselect",{originalEvent:b,data:f})}})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},d.prototype.selectionContainer=function(){var b=a('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.selectionContainer(),g=this.display(e,f);f.append(g),f.prop("title",e.title||e.text),f.data("data",e),b.push(f)}var h=this.$selection.find(".select2-selection__rendered");c.appendMany(h,b)}},d}),b.define("select2/selection/placeholder",["../utils"],function(a){function b(a,b,c){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c)}return b.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},b.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),c},b.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id,d=b.length>1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e)},b}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e<d.length;e++){var f={data:d[e]};if(this.trigger("unselect",f),f.prevented)return}this.$element.val(this.placeholder.id).trigger("change"),this.trigger("toggle",{})}}},c.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||(c.which==b.DELETE||c.which==b.BACKSPACE)&&this._handleClear(c)},c.prototype.update=function(b,c){if(b.call(this,c),!(this.$selection.find(".select2-selection__placeholder").length>0||0===c.length)){var d=a('<span class="select2-selection__clear">&times;</span>');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" aria-autocomplete="list" /></li>');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}});var f=document.documentMode,g=f&&11>=f;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){return g?void e.$selection.off("input.search input.searchcheck"):void e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(g&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"Ⓐ":"A","Ａ":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","Ｂ":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","Ｃ":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","Ｄ":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","Ǳ":"DZ","Ǆ":"DZ","ǲ":"Dz","ǅ":"Dz","Ⓔ":"E","Ｅ":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","Ｆ":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","Ｇ":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","Ｈ":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","Ｉ":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","Ｊ":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","Ｋ":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","Ｌ":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","Ǉ":"LJ","ǈ":"Lj","Ⓜ":"M","Ｍ":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","Ｎ":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","Ǌ":"NJ","ǋ":"Nj","Ⓞ":"O","Ｏ":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","Ｐ":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Ｑ":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","Ｒ":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","Ｓ":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","Ｔ":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","Ｕ":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","Ｖ":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","Ｗ":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","Ｘ":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Ｙ":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Ｚ":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","ａ":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","ｂ":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","ｃ":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","ｄ":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","ǳ":"dz","ǆ":"dz","ⓔ":"e","ｅ":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","ｆ":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","ｇ":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","ｈ":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","ｉ":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","ｊ":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","ｋ":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","ｌ":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","ǉ":"lj","ⓜ":"m","ｍ":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","ｎ":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ŉ":"n","ꞑ":"n","ꞥ":"n","ǌ":"nj","ⓞ":"o","ｏ":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","ｐ":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","ｑ":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","ｒ":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","ｓ":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","ｔ":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","ｕ":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","ｖ":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","ｗ":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","ｘ":"x","ẋ":"x","ẍ":"x","ⓨ":"y","ｙ":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","ｚ":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");
if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")});else{var d=a.id;this.$element.val(d),this.$element.trigger("change")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop("multiple"))return a.selected=!1,c(a.element).is("option")?(a.element.selected=!1,void this.$element.trigger("change")):void this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")})},d.prototype.bind=function(a,b){var c=this;this.container=a,a.on("select",function(a){c.select(a.data)}),a.on("unselect",function(a){c.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find("*").each(function(){c.removeData(this,"data")})},d.prototype.query=function(a,b){var d=[],e=this,f=this.$element.children();f.each(function(){var b=c(this);if(b.is("option")||b.is("optgroup")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var b;a.children?(b=document.createElement("optgroup"),b.label=a.text):(b=document.createElement("option"),void 0!==b.textContent?b.textContent=a.text:b.innerText=a.text),a.id&&(b.value=a.id),a.disabled&&(b.disabled=!0),a.selected&&(b.selected=!0),a.title&&(b.title=a.title);var d=c(b),e=this._normalizeItem(a);return e.element=b,c.data(b,"data",e),d},d.prototype.item=function(a){var b={};if(b=c.data(a[0],"data"),null!=b)return b;if(a.is("option"))b={id:a.val(),text:a.text(),disabled:a.prop("disabled"),selected:a.prop("selected"),title:a.prop("title")};else if(a.is("optgroup")){b={text:a.prop("label"),children:[],title:a.prop("title")};for(var d=a.children("option"),e=[],f=0;f<d.length;f++){var g=c(d[f]),h=this.item(g);e.push(h)}b.children=e}return b=this._normalizeItem(b),b.element=a[0],c.data(a[0],"data",b),b},d.prototype._normalizeItem=function(a){c.isPlainObject(a)||(a={id:a,text:a}),a=c.extend({},{text:""},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){var c=this.options.get("matcher");return c(a,b)},d}),b.define("select2/data/array",["./select","../utils","jquery"],function(a,b,c){function d(a,b){var c=b.get("data")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find("option").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find("option"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h<e.length;h++){var i=e[h],j=this._normalizeItem(i),k=this.option(j);this.$element.append(k)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0),k=i.text===b.term;if(k||j)return f?!1:(a.data=g,void c(a))}if(f)return!0;var l=e.createTag(b);if(null!=l){var m=e.option(l);m.attr("data-select2-tag",!0),e.addOptions([m]),e.insertTag(g,l)}a.results=g,c(a)}var e=this;return this._removeOldTags(),null==b.term||null!=b.page?void a.call(this,b,c):void a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return""===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(b){var c=(this._lastTag,this.$element.find("option[data-select2-tag]"));c.each(function(){this.selected||a(this).remove()})},b}),b.define("select2/data/tokenizer",["jquery"],function(a){function b(a,b,c){var d=c.get("tokenizer");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(".select2-search__field")},b.prototype.query=function(b,c,d){function e(b){var c=g._normalizeItem(b),d=g.$element.find("option").filter(function(){return a(this).val()===c.id});if(!d.length){var e=g.option(c);e.attr("data-select2-tag",!0),g._removeOldTags(),g.addOptions([e])}f(c)}function f(a){g.trigger("select",{data:a})}var g=this;c.term=c.term||"";var h=this.tokenizer(c,this.options,e);h.term!==c.term&&(this.$search.length&&(this.$search.val(h.term),this.$search.focus()),c.term=h.term),b.call(this,c,d)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get("tokenSeparators")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);null!=m?(e(m),g=g.substr(h+1)||"",h=0):h++}else h++}return{term:g}},b}),b.define("select2/data/minimumInputLength",[],function(){function a(a,b,c){this.minimumInputLength=c.get("minimumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",b.term.length<this.minimumInputLength?void this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumInputLength",[],function(){function a(a,b,c){this.maximumInputLength=c.get("maximumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",this.maximumInputLength>0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class="select2-dropdown"><span class="select2-results"></span></span>');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("focus",function(){c.isOpen()&&e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class="select2-results__option select2-results__option--load-more"role="treeitem" aria-disabled="true"></li>'),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a("<span></span>"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id,h=this.$container.parents().filter(b.hasScroll);h.off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return a(c.data.results)<this.minimumResultsForSearch?!1:b.call(this,c)},b}),b.define("select2/dropdown/selectOnClose",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("close",function(a){d._handleSelectOnClose(a)})},a.prototype._handleSelectOnClose=function(a,b){if(b&&null!=b.originalSelect2Event){var c=b.originalSelect2Event;if("select"===c._type||"unselect"===c._type)return}var d=this.getHighlightedResults();if(!(d.length<1)){var e=d.data("data");null!=e.element&&e.element.selected||null==e.element&&e.selected||this.trigger("select",{data:e})}},a}),b.define("select2/dropdown/closeOnSelect",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("select",function(a){d._selectTriggered(a)}),b.on("unselect",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger("close",{originalEvent:c,originalSelect2Event:b})},a}),b.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(a){var b=a.input.length-a.maximum,c="Please delete "+b+" character";return 1!=b&&(c+="s"),c},inputTooShort:function(a){var b=a.minimum-a.input.length,c="Please enter "+b+" or more characters";return c},loadingMore:function(){return"Loading more results…"},maximumSelected:function(a){var b="You can only select "+a.maximum+" item";return 1!=a.maximum&&(b+="s"),b},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),b.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}D.prototype.apply=function(l){if(l=a.extend(!0,{},this.defaults,l),null==l.dataAdapter){if(null!=l.ajax?l.dataAdapter=o:null!=l.data?l.dataAdapter=n:l.dataAdapter=m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(O){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(P){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+M+'" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var Q=k.loadPath(this.defaults.amdLanguageBase+"en"),R=new k(l.language);R.extend(Q),l.translations=R}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function c(d,e){if(""===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e<b.addedNodes.length;e++){var f=b.addedNodes[e];f.selected&&(c=!0)}else b.removedNodes&&b.removedNodes.length>0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null;
},e.prototype.render=function(){var b=a('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("jquery-mousewheel",["jquery"],function(a){return a}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function(a,b,c,d){if(null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if(b=b||{},"object"==typeof b)return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,f=Array.prototype.slice.call(arguments,1);return this.each(function(){var c=a(this).data("select2");null==c&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=c[b].apply(c,f)}),a.inArray(b,e)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c});