( function ( $) { $.fn .gSwipe = function ( options) { var element= this ; var isTouch= 'ontouchstart' in window; var start= isTouch? 'touchstart' : 'mousedown' ; var move= isTouch? 'touchmove' : 'mousemove' ; var end= isTouch? 'touchend' : 'mouseup' ; var cancel= isTouch? 'touchcancel' : 'mouseup' ; var minimalMovePixels, marginInSlides, changeOpacity, opacityValue, useCssTransition, animationSteps, showIndicator, slideFade, beforeSwitch= $.noop ; options= options|| { }
marginInSlides= options.marginInSlides || 8 ; minimalMovePixels= options.minimalMovePixels || 50 ; animationSteps= options.animationSteps || 30 ; if ( options.changeOpacity === undefined ) { changeOpacity= true ; } else { changeOpacity= options.changeOpacity ; }
if ( options.useCssTransition === undefined ) { useCssTransition= false ; } else { useCssTransition= options.useCssTransition ; }
if ( options.showIndicator === undefined ) { showIndicator= true ; } else { showIndicator= options.showIndicator ; }
if ( options.opacityValue === undefined ) { opacityValue= 0.86 ; } else { opacityValue= options.opacityValue ; }
if ( options.slideFade === undefined ) { slideFade= false ; } else { slideFade= options.slideFade ; }
if ( 'beforeSwitch' in options) { beforeSwitch= options.beforeSwitch ; }
var Slides= function ( ) { var currentSlideIndex= 0 ; var slides= element.children ( '.slide' ) ; var slidesCount= slides.length ; this .index = function ( ) { return currentSlideIndex; }
this .count = function ( ) { return slidesCount; }
var indicator; if ( showIndicator) { indicator= new Indicator( this ) ; } else { indicator= new DummyIndicator( ) ; }
this .next = function ( ) { if ( currentSlideIndex< ( slidesCount- 1 ) ) { currentSlideIndex+= 1 ; } } ; this .prev = function ( ) { if ( currentSlideIndex> 0 ) { currentSlideIndex-= 1 ; } } ; var fixAndroidWhiteSpaceBug= function ( ) { e.removeEventListener ( 'webkitTransitionEnd' , fixAndroidWhiteSpaceBug, false ) ; e.setAttribute ( 'style' , changeOpacity? '-webkit-transition:opacity 0.2s linear;-webkit-transform:translate3d(' + position+ 'px, 0, 0);opacity: 1;' : '-webkit-transform:translate3d(' + position+ 'px, 0, 0);' ) ; } ; this .move = function ( direction, forced) { if ( ! forced) { beforeSwitch( ) ; }
var oldSlideIndex= currentSlideIndex; direction> 0 ? this .next ( ) : this .prev ( ) ; if ( ! forced&& oldSlideIndex=== currentSlideIndex) { return false ; }
var hiddenSlides= slides.slice ( 0 , currentSlideIndex) ; var position= 0 ; for ( var index= 0 ; index< hiddenSlides.length ; index++ ) { var slide= slides[ index] ; position-= slide.clientWidth ; position-= marginInSlides; }
var e= element[ 0 ] ; if ( useCssTransition) { e.setAttribute ( 'style' , changeOpacity? '-webkit-transition:-webkit-transform .2s ease,opacity 0.2s linear;-webkit-transform:translate3d(' + position+ 'px, 0, 0);opacity: ' + opacityValue+ ';' : '-webkit-transition:-webkit-transform .2s ease;-webkit-transform:translate3d(' + position+ 'px, 0, 0);' ) ; e.addEventListener ( 'webkitTransitionEnd' , fixAndroidWhiteSpaceBug, false ) ; } else { if ( changeOpacity) { e.style .webkitTransition = 'opacity 0.2s linear' ; e.style .opacity = opacityValue; }
var callback= changeOpacity? function ( ) { e.style .opacity = 1 ; } : null ; animator.moveTo ( position, callback) ; }
indicator.indicateCurrent ( ) ; } ; this .move ( - 1 , true ) ; }
var Indicator= function ( slides) { var container; var initialize= function ( ) { container= $( '.slide_indicator' ) ; container.html ( '' ) ; var html= '' , cssClass; for ( var index= 0 ; index< slides.count ( ) ; index++ ) { cssClass= slides.index ( ) == index? 'current' : '' ; html+= '<li class="' + cssClass+ '"></li>' ; }
container.html ( html) ; container.css ( { 'margin-left' :- ( slides.count ( ) * 16 / 2 ) + 'px' } ) ; } ; this .indicateCurrent = function ( ) { if ( slideFade) { container.stop ( true , true ) .fadeIn ( ) .animate ( { display: 'block' } , 2000 ) .fadeOut ( ) ; }
container.children ( 'li' ) .removeClass ( 'current' ) ; $( ".slide_indicator li:eq(" + slides.index ( ) + ")" ) .addClass ( 'current' ) ; } ; initialize( ) ; }
var DummyIndicator= function ( ) { this .indicateCurrent = $.noop ; }
var Animator= function ( element, steps) { var inAnimation= false , self= this ; var requestAnimationFrame= ( function ( ) { var poormansRAF= function ( animate) { window.setTimeout ( animate, 1000 / 60 ) ; }
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || poormansRAF; } ) ( ) ; function easeOut( step_index, originalPosition, positionDelta, steps) { var easeOutFactor= step_index=== steps? 1 : 1 - Math .pow ( 2 ,- 10 * step_index/ steps) ; return originalPosition+ positionDelta* easeOutFactor; }
function currentXPositionOf( element) { match= /\w+\(([\+\-]?[\d.]+)px,/g .exec ( element.style .webkitTransform ) ; if ( match) { return parseInt( match[ 1 ] ) ; } else { return 0 ; } }
function moveToPosition( targetPosition) { element.style .webkitTransform = 'translate3d(' + targetPosition+ 'px, 0, 0)' ; }
this .callback = null ; this .moveTo = function ( targetPosition, callback) { this .stop ( ) ; this .callback = callback; var step_index= 0 ; var initPosition= currentXPositionOf( element) ; var moveDelta= targetPosition- initPosition; var animate= function ( ) { if ( step_index< steps) { step_index+= 1 ; var positionX= easeOut( step_index, initPosition, moveDelta, steps) ; if ( Math .abs ( targetPosition- positionX) < 1 ) { self.stop ( ) ; moveToPosition( targetPosition) ; } else { moveToPosition( positionX) ; } } else { self.stop ( ) ; moveToPosition( targetPosition) ; }
if ( inAnimation) { requestAnimationFrame( animate) ; } } ; inAnimation= true ; requestAnimationFrame( animate) ; }
this .stop = function ( ) { if ( inAnimation) { if ( $.isFunction ( this .callback ) ) { this .callback .call ( this ) ; this .callback = null ; }
inAnimation= false ; } } ; }
var animator= new Animator( element[ 0 ] , animationSteps) ; var slides= new Slides( ) ; var startListener= function ( ) { if ( isTouch&& event.targetTouches .length !== 1 ) { this .started = false ; return ; }
event.stopPropagation ( ) ; animator.stop ( ) ; var touch= isTouch? event.targetTouches [ 0 ] : event; this .originalX = touch.pageX ; this .originalY = touch.pageY ; this .deltaX = 0 ; this .started = true ; element.bind ( move, moveListener) ; element.bind ( end, endListener) ; element.bind ( cancel, endListener) ; }
var moveListener= function ( ) { event.stopPropagation ( ) ; var touch= isTouch? event.targetTouches [ 0 ] : event; var deltaX= touch.pageX - this .originalX ; var deltaY= touch.pageY - this .originalY ; var isHorizontal= Math .abs ( deltaX) > Math .abs ( deltaY) ; if ( isHorizontal) { event.preventDefault ( ) ; if ( this .started && ( Math .abs ( deltaX) > minimalMovePixels) ) { slides.move ( deltaX< 0 ? 1 :- 1 ) ; this .started = false ; } } }
var endListener= function ( ) { element.unbind ( move) ; element.unbind ( end) ; element.bind ( cancel) ; }
element.unbind ( start) ; element.bind ( start, startListener) ; } } ) ( jQuery) ;
CihmdW5jdGlvbigkKXskLmZuLmdTd2lwZT1mdW5jdGlvbihvcHRpb25zKXt2YXIgZWxlbWVudD10aGlzO3ZhciBpc1RvdWNoPSdvbnRvdWNoc3RhcnQnaW4gd2luZG93O3ZhciBzdGFydD1pc1RvdWNoPyd0b3VjaHN0YXJ0JzonbW91c2Vkb3duJzt2YXIgbW92ZT1pc1RvdWNoPyd0b3VjaG1vdmUnOidtb3VzZW1vdmUnO3ZhciBlbmQ9aXNUb3VjaD8ndG91Y2hlbmQnOidtb3VzZXVwJzt2YXIgY2FuY2VsPWlzVG91Y2g/J3RvdWNoY2FuY2VsJzonbW91c2V1cCc7dmFyIG1pbmltYWxNb3ZlUGl4ZWxzLG1hcmdpbkluU2xpZGVzLGNoYW5nZU9wYWNpdHksb3BhY2l0eVZhbHVlLHVzZUNzc1RyYW5zaXRpb24sYW5pbWF0aW9uU3RlcHMsc2hvd0luZGljYXRvcixzbGlkZUZhZGUsYmVmb3JlU3dpdGNoPSQubm9vcDtvcHRpb25zPW9wdGlvbnN8fHt9Cm1hcmdpbkluU2xpZGVzPW9wdGlvbnMubWFyZ2luSW5TbGlkZXN8fDg7bWluaW1hbE1vdmVQaXhlbHM9b3B0aW9ucy5taW5pbWFsTW92ZVBpeGVsc3x8NTA7YW5pbWF0aW9uU3RlcHM9b3B0aW9ucy5hbmltYXRpb25TdGVwc3x8MzA7aWYob3B0aW9ucy5jaGFuZ2VPcGFjaXR5PT09dW5kZWZpbmVkKXtjaGFuZ2VPcGFjaXR5PXRydWU7fWVsc2V7Y2hhbmdlT3BhY2l0eT1vcHRpb25zLmNoYW5nZU9wYWNpdHk7fQppZihvcHRpb25zLnVzZUNzc1RyYW5zaXRpb249PT11bmRlZmluZWQpe3VzZUNzc1RyYW5zaXRpb249ZmFsc2U7fWVsc2V7dXNlQ3NzVHJhbnNpdGlvbj1vcHRpb25zLnVzZUNzc1RyYW5zaXRpb247fQppZihvcHRpb25zLnNob3dJbmRpY2F0b3I9PT11bmRlZmluZWQpe3Nob3dJbmRpY2F0b3I9dHJ1ZTt9ZWxzZXtzaG93SW5kaWNhdG9yPW9wdGlvbnMuc2hvd0luZGljYXRvcjt9CmlmKG9wdGlvbnMub3BhY2l0eVZhbHVlPT09dW5kZWZpbmVkKXtvcGFjaXR5VmFsdWU9MC44Njt9ZWxzZXtvcGFjaXR5VmFsdWU9b3B0aW9ucy5vcGFjaXR5VmFsdWU7fQppZihvcHRpb25zLnNsaWRlRmFkZT09PXVuZGVmaW5lZCl7c2xpZGVGYWRlPWZhbHNlO31lbHNle3NsaWRlRmFkZT1vcHRpb25zLnNsaWRlRmFkZTt9CmlmKCdiZWZvcmVTd2l0Y2gnaW4gb3B0aW9ucyl7YmVmb3JlU3dpdGNoPW9wdGlvbnMuYmVmb3JlU3dpdGNoO30KdmFyIFNsaWRlcz1mdW5jdGlvbigpe3ZhciBjdXJyZW50U2xpZGVJbmRleD0wO3ZhciBzbGlkZXM9ZWxlbWVudC5jaGlsZHJlbignLnNsaWRlJyk7dmFyIHNsaWRlc0NvdW50PXNsaWRlcy5sZW5ndGg7dGhpcy5pbmRleD1mdW5jdGlvbigpe3JldHVybiBjdXJyZW50U2xpZGVJbmRleDt9CnRoaXMuY291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4gc2xpZGVzQ291bnQ7fQp2YXIgaW5kaWNhdG9yO2lmKHNob3dJbmRpY2F0b3Ipe2luZGljYXRvcj1uZXcgSW5kaWNhdG9yKHRoaXMpO31lbHNle2luZGljYXRvcj1uZXcgRHVtbXlJbmRpY2F0b3IoKTt9CnRoaXMubmV4dD1mdW5jdGlvbigpe2lmKGN1cnJlbnRTbGlkZUluZGV4PChzbGlkZXNDb3VudC0xKSl7Y3VycmVudFNsaWRlSW5kZXgrPTE7fX07dGhpcy5wcmV2PWZ1bmN0aW9uKCl7aWYoY3VycmVudFNsaWRlSW5kZXg+MCl7Y3VycmVudFNsaWRlSW5kZXgtPTE7fX07dmFyIGZpeEFuZHJvaWRXaGl0ZVNwYWNlQnVnPWZ1bmN0aW9uKCl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRUcmFuc2l0aW9uRW5kJyxmaXhBbmRyb2lkV2hpdGVTcGFjZUJ1ZyxmYWxzZSk7ZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJyxjaGFuZ2VPcGFjaXR5Pyctd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAwLjJzIGxpbmVhcjstd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgnK3Bvc2l0aW9uKydweCwgMCwgMCk7b3BhY2l0eTogMTsnOictd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgnK3Bvc2l0aW9uKydweCwgMCwgMCk7Jyk7fTt0aGlzLm1vdmU9ZnVuY3Rpb24oZGlyZWN0aW9uLGZvcmNlZCl7aWYoIWZvcmNlZCl7YmVmb3JlU3dpdGNoKCk7fQp2YXIgb2xkU2xpZGVJbmRleD1jdXJyZW50U2xpZGVJbmRleDtkaXJlY3Rpb24+MD90aGlzLm5leHQoKTp0aGlzLnByZXYoKTtpZighZm9yY2VkJiZvbGRTbGlkZUluZGV4PT09Y3VycmVudFNsaWRlSW5kZXgpe3JldHVybiBmYWxzZTt9CnZhciBoaWRkZW5TbGlkZXM9c2xpZGVzLnNsaWNlKDAsY3VycmVudFNsaWRlSW5kZXgpO3ZhciBwb3NpdGlvbj0wO2Zvcih2YXIgaW5kZXg9MDtpbmRleDxoaWRkZW5TbGlkZXMubGVuZ3RoO2luZGV4Kyspe3ZhciBzbGlkZT1zbGlkZXNbaW5kZXhdO3Bvc2l0aW9uLT1zbGlkZS5jbGllbnRXaWR0aDtwb3NpdGlvbi09bWFyZ2luSW5TbGlkZXM7fQp2YXIgZT1lbGVtZW50WzBdO2lmKHVzZUNzc1RyYW5zaXRpb24pe2Uuc2V0QXR0cmlidXRlKCdzdHlsZScsY2hhbmdlT3BhY2l0eT8nLXdlYmtpdC10cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC4ycyBlYXNlLG9wYWNpdHkgMC4ycyBsaW5lYXI7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoJytwb3NpdGlvbisncHgsIDAsIDApO29wYWNpdHk6ICcrb3BhY2l0eVZhbHVlKyc7JzonLXdlYmtpdC10cmFuc2l0aW9uOi13ZWJraXQtdHJhbnNmb3JtIC4ycyBlYXNlOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKCcrcG9zaXRpb24rJ3B4LCAwLCAwKTsnKTtlLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdFRyYW5zaXRpb25FbmQnLGZpeEFuZHJvaWRXaGl0ZVNwYWNlQnVnLGZhbHNlKTt9ZWxzZXtpZihjaGFuZ2VPcGFjaXR5KXtlLnN0eWxlLndlYmtpdFRyYW5zaXRpb249J29wYWNpdHkgMC4ycyBsaW5lYXInO2Uuc3R5bGUub3BhY2l0eT1vcGFjaXR5VmFsdWU7fQp2YXIgY2FsbGJhY2s9Y2hhbmdlT3BhY2l0eT9mdW5jdGlvbigpe2Uuc3R5bGUub3BhY2l0eT0xO306bnVsbDthbmltYXRvci5tb3ZlVG8ocG9zaXRpb24sY2FsbGJhY2spO30KaW5kaWNhdG9yLmluZGljYXRlQ3VycmVudCgpO307dGhpcy5tb3ZlKC0xLHRydWUpO30KdmFyIEluZGljYXRvcj1mdW5jdGlvbihzbGlkZXMpe3ZhciBjb250YWluZXI7dmFyIGluaXRpYWxpemU9ZnVuY3Rpb24oKXtjb250YWluZXI9JCgnLnNsaWRlX2luZGljYXRvcicpO2NvbnRhaW5lci5odG1sKCcnKTt2YXIgaHRtbD0nJyxjc3NDbGFzcztmb3IodmFyIGluZGV4PTA7aW5kZXg8c2xpZGVzLmNvdW50KCk7aW5kZXgrKyl7Y3NzQ2xhc3M9c2xpZGVzLmluZGV4KCk9PWluZGV4PydjdXJyZW50JzonJztodG1sKz0nPGxpIGNsYXNzPSInK2Nzc0NsYXNzKyciPjwvbGk+Jzt9CmNvbnRhaW5lci5odG1sKGh0bWwpO2NvbnRhaW5lci5jc3MoeydtYXJnaW4tbGVmdCc6LShzbGlkZXMuY291bnQoKSoxNi8yKSsncHgnfSk7fTt0aGlzLmluZGljYXRlQ3VycmVudD1mdW5jdGlvbigpe2lmKHNsaWRlRmFkZSl7Y29udGFpbmVyLnN0b3AodHJ1ZSx0cnVlKS5mYWRlSW4oKS5hbmltYXRlKHtkaXNwbGF5OidibG9jayd9LDIwMDApLmZhZGVPdXQoKTt9CmNvbnRhaW5lci5jaGlsZHJlbignbGknKS5yZW1vdmVDbGFzcygnY3VycmVudCcpOyQoIi5zbGlkZV9pbmRpY2F0b3IgbGk6ZXEoIitzbGlkZXMuaW5kZXgoKSsiKSIpLmFkZENsYXNzKCdjdXJyZW50Jyk7fTtpbml0aWFsaXplKCk7fQp2YXIgRHVtbXlJbmRpY2F0b3I9ZnVuY3Rpb24oKXt0aGlzLmluZGljYXRlQ3VycmVudD0kLm5vb3A7fQp2YXIgQW5pbWF0b3I9ZnVuY3Rpb24oZWxlbWVudCxzdGVwcyl7dmFyIGluQW5pbWF0aW9uPWZhbHNlLHNlbGY9dGhpczt2YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lPShmdW5jdGlvbigpe3ZhciBwb29ybWFuc1JBRj1mdW5jdGlvbihhbmltYXRlKXt3aW5kb3cuc2V0VGltZW91dChhbmltYXRlLDEwMDAvNjApO30KcmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHBvb3JtYW5zUkFGO30pKCk7ZnVuY3Rpb24gZWFzZU91dChzdGVwX2luZGV4LG9yaWdpbmFsUG9zaXRpb24scG9zaXRpb25EZWx0YSxzdGVwcyl7dmFyIGVhc2VPdXRGYWN0b3I9c3RlcF9pbmRleD09PXN0ZXBzPzE6MS1NYXRoLnBvdygyLC0xMCpzdGVwX2luZGV4L3N0ZXBzKTtyZXR1cm4gb3JpZ2luYWxQb3NpdGlvbitwb3NpdGlvbkRlbHRhKmVhc2VPdXRGYWN0b3I7fQpmdW5jdGlvbiBjdXJyZW50WFBvc2l0aW9uT2YoZWxlbWVudCl7bWF0Y2g9L1x3K1woKFtcK1wtXT9bXGQuXSspcHgsL2cuZXhlYyhlbGVtZW50LnN0eWxlLndlYmtpdFRyYW5zZm9ybSk7aWYobWF0Y2gpe3JldHVybiBwYXJzZUludChtYXRjaFsxXSk7fWVsc2V7cmV0dXJuIDA7fX0KZnVuY3Rpb24gbW92ZVRvUG9zaXRpb24odGFyZ2V0UG9zaXRpb24pe2VsZW1lbnQuc3R5bGUud2Via2l0VHJhbnNmb3JtPSd0cmFuc2xhdGUzZCgnK3RhcmdldFBvc2l0aW9uKydweCwgMCwgMCknO30KdGhpcy5jYWxsYmFjaz1udWxsO3RoaXMubW92ZVRvPWZ1bmN0aW9uKHRhcmdldFBvc2l0aW9uLGNhbGxiYWNrKXt0aGlzLnN0b3AoKTt0aGlzLmNhbGxiYWNrPWNhbGxiYWNrO3ZhciBzdGVwX2luZGV4PTA7dmFyIGluaXRQb3NpdGlvbj1jdXJyZW50WFBvc2l0aW9uT2YoZWxlbWVudCk7dmFyIG1vdmVEZWx0YT10YXJnZXRQb3NpdGlvbi1pbml0UG9zaXRpb247dmFyIGFuaW1hdGU9ZnVuY3Rpb24oKXtpZihzdGVwX2luZGV4PHN0ZXBzKXtzdGVwX2luZGV4Kz0xO3ZhciBwb3NpdGlvblg9ZWFzZU91dChzdGVwX2luZGV4LGluaXRQb3NpdGlvbixtb3ZlRGVsdGEsc3RlcHMpO2lmKE1hdGguYWJzKHRhcmdldFBvc2l0aW9uLXBvc2l0aW9uWCk8MSl7c2VsZi5zdG9wKCk7bW92ZVRvUG9zaXRpb24odGFyZ2V0UG9zaXRpb24pO31lbHNle21vdmVUb1Bvc2l0aW9uKHBvc2l0aW9uWCk7fX1lbHNle3NlbGYuc3RvcCgpO21vdmVUb1Bvc2l0aW9uKHRhcmdldFBvc2l0aW9uKTt9CmlmKGluQW5pbWF0aW9uKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7fX07aW5BbmltYXRpb249dHJ1ZTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7fQp0aGlzLnN0b3A9ZnVuY3Rpb24oKXtpZihpbkFuaW1hdGlvbil7aWYoJC5pc0Z1bmN0aW9uKHRoaXMuY2FsbGJhY2spKXt0aGlzLmNhbGxiYWNrLmNhbGwodGhpcyk7dGhpcy5jYWxsYmFjaz1udWxsO30KaW5BbmltYXRpb249ZmFsc2U7fX07fQp2YXIgYW5pbWF0b3I9bmV3IEFuaW1hdG9yKGVsZW1lbnRbMF0sYW5pbWF0aW9uU3RlcHMpO3ZhciBzbGlkZXM9bmV3IFNsaWRlcygpO3ZhciBzdGFydExpc3RlbmVyPWZ1bmN0aW9uKCl7aWYoaXNUb3VjaCYmZXZlbnQudGFyZ2V0VG91Y2hlcy5sZW5ndGghPT0xKXt0aGlzLnN0YXJ0ZWQ9ZmFsc2U7cmV0dXJuO30KZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7YW5pbWF0b3Iuc3RvcCgpO3ZhciB0b3VjaD1pc1RvdWNoP2V2ZW50LnRhcmdldFRvdWNoZXNbMF06ZXZlbnQ7dGhpcy5vcmlnaW5hbFg9dG91Y2gucGFnZVg7dGhpcy5vcmlnaW5hbFk9dG91Y2gucGFnZVk7dGhpcy5kZWx0YVg9MDt0aGlzLnN0YXJ0ZWQ9dHJ1ZTtlbGVtZW50LmJpbmQobW92ZSxtb3ZlTGlzdGVuZXIpO2VsZW1lbnQuYmluZChlbmQsZW5kTGlzdGVuZXIpO2VsZW1lbnQuYmluZChjYW5jZWwsZW5kTGlzdGVuZXIpO30KdmFyIG1vdmVMaXN0ZW5lcj1mdW5jdGlvbigpe2V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO3ZhciB0b3VjaD1pc1RvdWNoP2V2ZW50LnRhcmdldFRvdWNoZXNbMF06ZXZlbnQ7dmFyIGRlbHRhWD10b3VjaC5wYWdlWC10aGlzLm9yaWdpbmFsWDt2YXIgZGVsdGFZPXRvdWNoLnBhZ2VZLXRoaXMub3JpZ2luYWxZO3ZhciBpc0hvcml6b250YWw9TWF0aC5hYnMoZGVsdGFYKT5NYXRoLmFicyhkZWx0YVkpO2lmKGlzSG9yaXpvbnRhbCl7ZXZlbnQucHJldmVudERlZmF1bHQoKTtpZih0aGlzLnN0YXJ0ZWQmJihNYXRoLmFicyhkZWx0YVgpPm1pbmltYWxNb3ZlUGl4ZWxzKSl7c2xpZGVzLm1vdmUoZGVsdGFYPDA/MTotMSk7dGhpcy5zdGFydGVkPWZhbHNlO319fQp2YXIgZW5kTGlzdGVuZXI9ZnVuY3Rpb24oKXtlbGVtZW50LnVuYmluZChtb3ZlKTtlbGVtZW50LnVuYmluZChlbmQpO2VsZW1lbnQuYmluZChjYW5jZWwpO30KZWxlbWVudC51bmJpbmQoc3RhcnQpO2VsZW1lbnQuYmluZChzdGFydCxzdGFydExpc3RlbmVyKTt9fSkoalF1ZXJ5KTsK