403Webshell
Server IP : 85.158.181.41  /  Your IP : 216.73.217.12
Web Server : Apache
System : Linux cloud9-vm129 6.1.178+1-ph #ph SMP PREEMPT_DYNAMIC Wed Jul 29 09:00:54 UTC 2026 x86_64
User : moncbefd ( 1024)
PHP Version : 7.3.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/moncbefd/www.moneta.at/public/tmp/theme210318125255/javascripts/system/widgets/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/moncbefd/www.moneta.at/public/tmp/theme210318125255/javascripts/system/widgets/live_search.js
'use strict';

/* --------------------------------------------------------------
 live_search.js 2016-03-09
 Gambio GmbH
 http://www.gambio.de
 Copyright (c) 2016 Gambio GmbH
 Released under the GNU General Public License (Version 2)
 [http://www.gnu.org/licenses/gpl-2.0.html]
 --------------------------------------------------------------
 */

/**
 * Widget that adds a autosuggest functionality to
 * the search box
 */
gambio.widgets.module('live_search', ['form', 'xhr', gambio.source + '/libs/events', gambio.source + '/libs/responsive'], function (data) {

    'use strict';

    // ########## VARIABLE INITIALIZATION ##########

    var $this = $(this),
        $body = $('body'),
        $target = null,
        $input = null,
        ajaxCall = null,
        timeout = null,
        mobile = null,
        transition = {},
        defaults = {
        // The minimum diget count for the search needle
        needle: 3,
        // The selector where the result is placed
        target: '.search-result-container',
        // Delay (in ms) after the last keyup event is triggered (for ajax request)
        delay: 200,
        // URL to which the request ist posted
        url: 'shop.php?do=LiveSearch',
        // Minimum breakpoint to switch to mobile view
        breakpoint: 40,
        // If true, the layer will reopen on focus
        reopen: true,
        // Class that gets added to open the auto suggest layer
        classOpen: 'open'
    },
        options = $.extend(true, {}, defaults, data),
        module = {};

    // ########## HELPER FUNCTIONS ##########

    /**
     * Helper function that sets the active
     * item inside the autosuggest layer
     * @param       {int}       index       The index of the item that is set to active
     * @private
     */
    var _setAutosuggestActive = function _setAutosuggestActive(index) {
        var $all = $target.find('li'),
            $element = $all.eq(index);

        $all.removeClass('active');

        if (index >= 0) {
            $element.addClass('active');
        }
    };

    /**
     * Handler for the key events (up / down arrow & enter)
     * If the autosuggest layer is opened, navigate through
     * the items of the list
     * @param       {object}    e       jQuery event object
     * @private
     */
    var _autoSuggestNavigationHandler = function _autoSuggestNavigationHandler(e) {
        var $all = $target.find('li'),
            $active = $all.filter('.active'),
            index = null,
            href = null;

        // Handler for the different key codes
        switch (e.keyCode) {
            case 13:
                // ENTER
                if ($active.length) {
                    e.preventDefault();
                    e.stopPropagation();

                    href = $active.find('a').attr('href');

                    location.href = href;
                }
                break;
            case 38:
                // UP
                index = $active.length ? $active.index() - 1 : $all.length - 1;
                _setAutosuggestActive(index);
                break;
            case 40:
                // DOWN
                index = $active.length ? $active.index() + 1 : 0;
                _setAutosuggestActive(index);
                break;
            default:
                break;
        }
    };

    /**
     * Helper function to show the ajax
     * result in the search dropdown
     * @param       {string}      content     HTML markup
     * @private
     */
    var _show = function _show(content) {
        transition.open = true;
        $target.html(content).trigger(jse.libs.theme.events.TRANSITION(), transition);

        // Inform other layers
        $this.trigger(jse.libs.theme.events.OPEN_FLYOUT(), [$this]);

        $this.off('keydown.autosuggest').on('keydown.autosuggest', _autoSuggestNavigationHandler);
    };

    /**
     * Helper function to hide the dropdown
     * @private
     */
    var _hide = function _hide() {
        transition.open = false;
        $target.off().one(jse.libs.theme.events.TRANSITION_FINISHED(), function () {
            $target.empty();
        }).trigger(jse.libs.theme.events.TRANSITION(), transition);

        $this.off('keydown.autosuggest');
    };

    // ########## EVENT HANDLER ##########

    /**
     * Handler for the keyup event inside the search
     * input field. It performs an ajax request after
     * a given delay time to relieve the server
     * @private
     */
    var _keyupHandler = function _keyupHandler(e) {

        if ($.inArray(e.keyCode, [13, 37, 38, 39, 40]) > -1) {
            return true;
        }

        var dataset = jse.libs.form.getData($this);

        // Clear timeout irrespective of
        // the needle length
        if (timeout) {
            clearTimeout(timeout);
        }

        // Only proceed if the needle contains
        // at least a certain number of digits
        if (dataset.keywords.length < options.needle) {
            _hide();
            return;
        }

        timeout = setTimeout(function () {
            // Abort a pending ajax request
            if (ajaxCall) {
                ajaxCall.abort();
            }

            // Request the server for the search result
            ajaxCall = jse.libs.xhr.post({
                url: options.url,
                data: dataset,
                dataType: 'html'
            }, true).done(function (result) {
                if (result) {
                    _show(result);
                } else {
                    _hide();
                }
            });
        }, options.delay);
    };

    /**
     * Helper handler to reopen the autosuggests
     * on category dropdown change by triggering
     * the focus event. This needs the option
     * "reopen" to be set
     * @private
     */
    var _categoryChangeHandler = function _categoryChangeHandler() {
        $input.trigger('focus', []);
    };

    /**
     * Handles the switch between the breakpoints. If
     * a switch between desktop & mobile view is detected
     * the autosuggest layer will be closed
     * again
     * @private
     */
    var _breakpointHandler = function _breakpointHandler() {

        var switchToMobile = jse.libs.theme.responsive.breakpoint().id <= options.breakpoint && !mobile,
            switchToDesktop = jse.libs.theme.responsive.breakpoint().id > options.breakpoint && mobile;

        if (switchToMobile || switchToDesktop) {
            $target.removeClass(options.classOpen);
        }
    };

    /**
     * Event handler for closing the autosuggest
     * if the user interacts with the page
     * outside of the layer
     * @param       {object}    e       jQuery event object
     * @param       {object}    d       jQuery selection of the event emitter
     * @private
     */
    var _closeFlyout = function _closeFlyout(e, d) {
        if (d !== $this && !$this.find($(e.target)).length) {
            $target.removeClass(options.classOpen);
            $input.trigger('blur', []);
        }
    };

    // ########## INITIALIZATION ##########

    /**
     * Init function of the widget
     * @constructor
     */
    module.init = function (done) {

        var focus = options.reopen ? ' focus' : '';

        mobile = jse.libs.theme.responsive.breakpoint().id <= options.breakpoint;
        transition.classOpen = options.classOpen;
        $target = $this.find(options.target);
        $input = $this.find('input');
        $target.hide();

        $body.on(jse.libs.theme.events.OPEN_FLYOUT() + ' click', _closeFlyout).on(jse.libs.theme.events.BREAKPOINT(), _breakpointHandler);

        $this.on('keyup' + focus, 'input', _keyupHandler).on('change', 'select', _categoryChangeHandler);

        done();
    };

    // Return data to widget engine
    return module;
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndpZGdldHMvbGl2ZV9zZWFyY2guanMiXSwibmFtZXMiOlsiZ2FtYmlvIiwid2lkZ2V0cyIsIm1vZHVsZSIsInNvdXJjZSIsImRhdGEiLCIkdGhpcyIsIiQiLCIkYm9keSIsIiR0YXJnZXQiLCIkaW5wdXQiLCJhamF4Q2FsbCIsInRpbWVvdXQiLCJtb2JpbGUiLCJ0cmFuc2l0aW9uIiwiZGVmYXVsdHMiLCJuZWVkbGUiLCJ0YXJnZXQiLCJkZWxheSIsInVybCIsImJyZWFrcG9pbnQiLCJyZW9wZW4iLCJjbGFzc09wZW4iLCJvcHRpb25zIiwiZXh0ZW5kIiwiX3NldEF1dG9zdWdnZXN0QWN0aXZlIiwiaW5kZXgiLCIkYWxsIiwiZmluZCIsIiRlbGVtZW50IiwiZXEiLCJyZW1vdmVDbGFzcyIsImFkZENsYXNzIiwiX2F1dG9TdWdnZXN0TmF2aWdhdGlvbkhhbmRsZXIiLCJlIiwiJGFjdGl2ZSIsImZpbHRlciIsImhyZWYiLCJrZXlDb2RlIiwibGVuZ3RoIiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJhdHRyIiwibG9jYXRpb24iLCJfc2hvdyIsImNvbnRlbnQiLCJvcGVuIiwiaHRtbCIsInRyaWdnZXIiLCJqc2UiLCJsaWJzIiwidGhlbWUiLCJldmVudHMiLCJUUkFOU0lUSU9OIiwiT1BFTl9GTFlPVVQiLCJvZmYiLCJvbiIsIl9oaWRlIiwib25lIiwiVFJBTlNJVElPTl9GSU5JU0hFRCIsImVtcHR5IiwiX2tleXVwSGFuZGxlciIsImluQXJyYXkiLCJkYXRhc2V0IiwiZm9ybSIsImdldERhdGEiLCJjbGVhclRpbWVvdXQiLCJrZXl3b3JkcyIsInNldFRpbWVvdXQiLCJhYm9ydCIsInhociIsInBvc3QiLCJkYXRhVHlwZSIsImRvbmUiLCJyZXN1bHQiLCJfY2F0ZWdvcnlDaGFuZ2VIYW5kbGVyIiwiX2JyZWFrcG9pbnRIYW5kbGVyIiwic3dpdGNoVG9Nb2JpbGUiLCJyZXNwb25zaXZlIiwiaWQiLCJzd2l0Y2hUb0Rlc2t0b3AiLCJfY2xv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Q1EsVUFBVTRCLEtBRGxCLEVBQ3lCLE9BRHpCLEVBQ2tDdkIsYUFEbEMsRUFFS0wsRUFGTCxDQUVRLFFBRlIsRUFFa0IsUUFGbEIsRUFFNEJtQixzQkFGNUI7O0FBSUFGO0FBQ0gsS0FuQkQ7O0FBcUJBO0FBQ0EsV0FBT3RFLE1BQVA7QUFDSCxDQXZRTCIsImZpbGUiOiJ3aWRnZXRzL2xpdmVfc2VhcmNoLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiBsaXZlX3NlYXJjaC5qcyAyMDE2LTAzLTA5XG4gR2FtYmlvIEdtYkhcbiBodHRwOi8vd3d3LmdhbWJpby5kZVxuIENvcHlyaWdodCAoYykgMjAxNiBHYW1iaW8gR21iSFxuIFJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoVmVyc2lvbiAyKVxuIFtodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sXVxuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuLyoqXG4gKiBXaWRnZXQgdGhhdCBhZGRzIGEgYXV0b3N1Z2dlc3QgZnVuY3Rpb25hbGl0eSB0b1xuICogdGhlIHNlYXJjaCBib3hcbiAqL1xuZ2FtYmlvLndpZGdldHMubW9kdWxlKFxuICAgICdsaXZlX3NlYXJjaCcsXG5cbiAgICBbXG4gICAgICAgICdmb3JtJyxcbiAgICAgICAgJ3hocicsXG4gICAgICAgIGdhbWJpby5zb3VyY2UgKyAnL2xpYnMvZXZlbnRzJyxcbiAgICAgICAgZ2FtYmlvLnNvdXJjZSArICcvbGlicy9yZXNwb25zaXZlJ1xuICAgIF0sXG5cbiAgICBmdW5jdGlvbiAoZGF0YSkge1xuXG4gICAgICAgICd1c2Ugc3RyaWN0JztcblxuLy8gIyMjIyMjIyMjIyBWQVJJQUJMRSBJTklUSUFMSVpBVElPTiAjIyMjIyMjIyMjXG5cbiAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKSxcbiAgICAgICAgICAgICRib2R5ID0gJCgnYm9keScpLFxuICAgICAgICAgICAgJHRhcmdldCA9IG51bGwsXG4gICAgICAgICAgICAkaW5wdXQgPSBudWxsLFxuICAgICAgICAgICAgYWpheENhbGwgPSBudWxsLFxuICAgICAgICAgICAgdGltZW91dCA9IG51bGwsXG4gICAgICAgICAgICBtb2JpbGUgPSBudWxsLFxuICAgICAgICAgICAgdHJhbnNpdGlvbiA9IHt9LFxuICAgICAgICAgICAgZGVmYXVsdHMgPSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIG1pbmltdW0gZGlnZXQgY291bnQgZm9yIHRoZSBzZWFyY2ggbmVlZGxlXG4gICAgICAgICAgICAgICAgbmVlZGxlOiAzLFxuICAgICAgICAgICAgICAgIC8vIFRoZSBzZWxlY3RvciB3aGVyZSB0aGUgcmVzdWx0IGlzIHBsYWNlZFxuICAgICAgICAgICAgICAgIHRhcmdldDogJy5zZWFyY2gtcmVzdWx0LWNvbnRhaW5lcicsXG4gICAgICAgICAgICAgICAgLy8gRGVsYXkgKGluIG1zKSBhZnRlciB0aGUgbGFzdCBrZXl1cCBldmVudCBpcyB0cmlnZ2VyZWQgKGZvciBhamF4IHJlcXVlc3QpXG4gICAgICAgICAgICAgICAgZGVsYXk6IDIwMCxcbiAgICAgICAgICAgICAgICAvLyBVUkwgdG8gd2hpY2ggdGhlIHJlcXVlc3QgaXN0IHBvc3RlZFxuICAgICAgICAgICAgICAgIHVybDogJ3Nob3AucGhwP2RvPUxpdmVTZWFyY2gnLFxuICAgICAgICAgICAgICAgIC8vIE1pbmltdW0gYnJlYWtwb2ludCB0byBzd2l0Y2ggdG8gbW9iaWxlIHZpZXdcbiAgICAgICAgICAgICAgICBicmVha3BvaW50OiA0MCxcbiAgICAgICAgICAgICAgICAvLyBJZiB0cnVlLCB0aGUgbGF5ZXIgd2lsbCByZW9wZW4gb24gZm9jdXNcbiAgICAgICAgICAgICAgICByZW9wZW46IHRydWUsXG4gICAgICAgICAgICAgICAgLy8gQ2xhc3MgdGhhdCBnZXRzIGFkZGVkIHRvIG9wZW4gdGhlIGF1dG8gc3VnZ2VzdCBsYXllclxuICAgICAgICAgICAgICAgIGNsYXNzT3BlbjogJ29wZW4nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBkZWZhdWx0cywgZGF0YSksXG4gICAgICAgICAgICBtb2R1bGUgPSB7fTtcblxuXG4vLyAjIyMjIyMjIyMjIEhFTFBFUiBGVU5DVElPTlMgIyMjIyMjIyMjI1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBzZXRzIHRoZSBhY3RpdmVcbiAgICAgICAgICogaXRlbSBpbnNpZGUgdGhlIGF1dG9zdWdnZXN0IGxheWVyXG4gICAgICAgICAqIEBwYXJhbSAgICAgICB7aW50fSAgICAgICBpbmRleCAgICAgICBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdGhhdCBpcyBzZXQgdG8gYWN0aXZlXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB2YXIgX3NldEF1dG9zdWdnZXN0QWN0aXZlID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICB2YXIgJGFsbCA9ICR0YXJnZXQuZmluZCgnbGknKSxcbiAgICAgICAgICAgICAgICAkZWxlbWVudCA9ICRhbGwuZXEoaW5kZXgpO1xuXG4gICAgICAgICAgICAkYWxsLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcblxuICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICAkZWxlbWVudC5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhhbmRsZXIgZm9yIHRoZSBrZXkgZXZlbnRzICh1cCAvIGRvd24gYXJyb3cgJiBlbnRlcilcbiAgICAgICAgICogSWYgdGhlIGF1dG9zdWdnZXN0IGxheWVyIGlzIG9wZW5lZCwgbmF2aWdhdGUgdGhyb3VnaFxuICAgICAgICAgKiB0aGUgaXRlbXMgb2YgdGhlIGxpc3RcbiAgICAgICAgICogQHBhcmFtICAgICAgIHtvYmplY3R9ICAgIGUgICAgICAgalF1ZXJ5IGV2ZW50IG9iamVjdFxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIF9hdXRvU3VnZ2VzdE5hdmlnYXRpb25IYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHZhciAkYWxsID0gJHRhcmdldC5maW5kKCdsaScpLFxuICAgICAgICAgICAgICAgICRhY3RpdmUgPSAkYWxsLmZpbHRlcignLmFjdGl2ZScpLFxuICAgICAgICAgICAgICAgIGluZGV4ID0gbnVsbCxcbiAgICAgICAgICAgICAgICBocmVmID0gbnVsbDtcblxuICAgICAgICAgICAgLy8gSGFuZGxlciBmb3IgdGhlIGRpZmZlcmVudCBrZXkgY29kZXNcbiAgICAgICAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxMzogLy8gRU5URVJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRhY3RpdmUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gJGFjdGl2ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCdhJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignaHJlZicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gaHJlZjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM4OiAvLyBVUFxuICAgICAgICAgICAgICAgICAgICBpbmRleCA9ICgkYWN0aXZlLmxlbmd0aCkgPyAoJGFjdGl2ZS5pbmRleCgpIC0gMSkgOiAoJGFsbC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgX3NldEF1dG9zdWdnZXN0QWN0aXZlKGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0MDogLy8gRE9XTlxuICAgICAgICAgICAgICAgICAgICBpbmRleCA9ICgkYWN0aXZlLmxlbmd0aCkgPyAoJGFjdGl2ZS5pbmRleCgpICsgMSkgOiAwO1xuICAgICAgICAgICAgICAgICAgICBfc2V0QXV0b3N1Z2dlc3RBY3RpdmUoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHNob3cgdGhlIGFqYXhcbiAgICAgICAgICogcmVzdWx0IGluIHRoZSBzZWFyY2ggZHJvcGRvd25cbiAgICAgICAgICogQHBhcmFtICAgICAgIHtzdHJpbmd9ICAgICAgY29udGVudCAgICAgSFRNTCBtYXJrdXBcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHZhciBfc2hvdyA9IGZ1bmN0aW9uIChjb250ZW50KSB7XG4gICAgICAgICAgICB0cmFuc2l0aW9uLm9wZW4gPSB0cnVlO1xuICAgICAgICAgICAgJHRhcmdldFxuICAgICAgICAgICAgICAgIC5odG1sKGNvbnRlbnQpXG4gICAgICAgICAgICAgICAgLnRyaWdnZXIoanNlLmxpYnMudGhlbWUuZXZlbnRzLlRSQU5TSVRJT04oKSwgdHJhbnNpdGlvbik7XG5cbiAgICAgICAgICAgIC8vIEluZm9ybSBvdGhlciBsYXllcnNcbiAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoanNlLmxpYnMudGhlbWUuZXZlbnRzLk9QRU5fRkxZT1VUKCksIFskdGhpc10pO1xuXG4gICAgICAgICAgICAkdGhpc1xuICAgICAgICAgICAgICAgIC5vZmYoJ2tleWRvd24uYXV0b3N1Z2dlc3QnKVxuICAgICAgICAgICAgICAgIC5vbigna2V5ZG93bi5hdXRvc3VnZ2VzdCcsIF9hdXRvU3VnZ2VzdE5hdmlnYXRpb25IYW5kbGVyKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGhpZGUgdGhlIGRyb3Bkb3duXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB2YXIgX2hpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cmFuc2l0aW9uLm9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICR0YXJnZXRcbiAgICAgICAgICAgICAgICAub2ZmKClcbiAgICAgICAgICAgICAgICAub25lKGpzZS5saWJzLnRoZW1lLmV2ZW50cy5UUkFOU0lUSU9OX0ZJTklTSEVEKCksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgJHRhcmdldC5lbXB0eSgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRyaWdnZXIoanNlLmxpYnMudGhlbWUuZXZlbnRzLlRSQU5TSVRJT04oKSwgdHJhbnNpdGlvbik7XG5cbiAgICAgICAgICAgICR0aGlzLm9mZigna2V5ZG93bi5hdXRvc3VnZ2VzdCcpO1xuICAgICAgICB9O1xuXG5cbi8vICMjIyMjIyMjIyMgRVZFTlQgSEFORExFUiAjIyMjIyMjIyMjXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhhbmRsZXIgZm9yIHRoZSBrZXl1cCBldmVudCBpbnNpZGUgdGhlIHNlYXJjaFxuICAgICAgICAgKiBpbnB1dCBmaWVsZC4gSXQgcGVyZm9ybXMgYW4gYWpheCByZXF1ZXN0IGFmdGVyXG4gICAgICAgICAqIGEgZ2l2ZW4gZGVsYXkgdGltZSB0byByZWxpZXZlIHRoZSBzZXJ2ZXJcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHZhciBfa2V5dXBIYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcblxuICAgICAgICAgICAgaWYgKCQuaW5BcnJheShlLmtleUNvZGUsIFsxMywgMzcsIDM4LCAzOSwgNDBdKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBkYXRhc2V0ID0ganNlLmxpYnMuZm9ybS5nZXREYXRhKCR0aGlzKTtcblxuICAgICAgICAgICAgLy8gQ2xlYXIgdGltZW91dCBpcnJlc3BlY3RpdmUgb2ZcbiAgICAgICAgICAgIC8vIHRoZSBuZWVkbGUgbGVuZ3RoXG4gICAgICAgICAgICBpZiAodGltZW91dCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT25seSBwcm9jZWVkIGlmIHRoZSBuZWVkbGUgY29udGFpbnNcbiAgICAgICAgICAgIC8vIGF0IGxlYXN0IGEgY2VydGFpbiBudW1iZXIgb2YgZGlnaXRzXG4gICAgICAgICAgICBpZiAoZGF0YXNldC5rZXl3b3Jkcy5sZW5ndGggPCBvcHRpb25zLm5lZWRsZSkge1xuICAgICAgICAgICAgICAgIF9oaWRlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgLy8gQWJvcnQgYSBwZW5kaW5nIGFqYXggcmVxdWVzdFxuICAgICAgICAgICAgICAgIGlmIChhamF4Q2FsbCkge1xuICAgICAgICAgICAgICAgICAgICBhamF4Q2FsbC5hYm9ydCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFJlcXVlc3QgdGhlIHNlcnZlciBmb3IgdGhlIHNlYXJjaCByZXN1bHRcbiAgICAgICAgICAgICAgICBhamF4Q2FsbCA9IGpzZS5saWJzLnhoci5wb3N0KHtcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBvcHRpb25zLnVybCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YXNldCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdodG1sJ1xuICAgICAgICAgICAgICAgIH0sIHRydWUpLmRvbmUoZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfc2hvdyhyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2hpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgb3B0aW9ucy5kZWxheSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhlbHBlciBoYW5kbGVyIHRvIHJlb3BlbiB0aGUgYXV0b3N1Z2dlc3RzXG4gICAgICAgICAqIG9uIGNhdGVnb3J5IGRyb3Bkb3duIGNoYW5nZSBieSB0cmlnZ2VyaW5nXG4gICAgICAgICAqIHRoZSBmb2N1cyBldmVudC4gVGhpcyBuZWVkcyB0aGUgb3B0aW9uXG4gICAgICAgICAqIFwicmVvcGVuXCIgdG8gYmUgc2V0XG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB2YXIgX2NhdGVnb3J5Q2hhbmdlSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICRpbnB1dC50cmlnZ2VyKCdmb2N1cycsIFtdKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSGFuZGxlcyB0aGUgc3dpdGNoIGJldHdlZW4gdGhlIGJyZWFrcG9pbnRzLiBJZlxuICAgICAgICAgKiBhIHN3aXRjaCBiZXR3ZWVuIGRlc2t0b3AgJiBtb2JpbGUgdmlldyBpcyBkZXRlY3RlZFxuICAgICAgICAgKiB0aGUgYXV0b3N1Z2dlc3QgbGF5ZXIgd2lsbCBiZSBjbG9zZWRcbiAgICAgICAgICogYWdhaW5cbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHZhciBfYnJlYWtwb2ludEhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgIHZhciBzd2l0Y2hUb01vYmlsZSA9IGpzZS5saWJzLnRoZW1lLnJlc3BvbnNpdmUuYnJlYWtwb2ludCgpLmlkIDw9IG9wdGlvbnMuYnJlYWtwb2ludCAmJiAhbW9iaWxlLFxuICAgICAgICAgICAgICAgIHN3aXRjaFRvRGVza3RvcCA9IGpzZS5saWJzLnRoZW1lLnJlc3BvbnNpdmUuYnJlYWtwb2ludCgpLmlkID4gb3B0aW9ucy5icmVha3BvaW50ICYmIG1vYmlsZTtcblxuICAgICAgICAgICAgaWYgKHN3aXRjaFRvTW9iaWxlIHx8IHN3aXRjaFRvRGVza3RvcCkge1xuICAgICAgICAgICAgICAgICR0YXJnZXQucmVtb3ZlQ2xhc3Mob3B0aW9ucy5jbGFzc09wZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBjbG9zaW5nIHRoZSBhdXRvc3VnZ2VzdFxuICAgICAgICAgKiBpZiB0aGUgdXNlciBpbnRlcmFjdHMgd2l0aCB0aGUgcGFnZVxuICAgICAgICAgKiBvdXRzaWRlIG9mIHRoZSBsYXllclxuICAgICAgICAgKiBAcGFyYW0gICAgICAge29iamVjdH0gICAgZSAgICAgICBqUXVlcnkgZXZlbnQgb2JqZWN0XG4gICAgICAgICAqIEBwYXJhbSAgICAgICB7b2JqZWN0fSAgICBkICAgICAgIGpRdWVyeSBzZWxlY3Rpb24gb2YgdGhlIGV2ZW50IGVtaXR0ZXJcbiAgICAgICAgICogQHByaXZhdGVcbiAgICAgICAgICovXG4gICAgICAgIHZhciBfY2xvc2VGbHlvdXQgPSBmdW5jdGlvbiAoZSwgZCkge1xuICAgICAgICAgICAgaWYgKGQgIT09ICR0aGlzICYmICEkdGhpcy5maW5kKCQoZS50YXJnZXQpKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAkdGFyZ2V0LnJlbW92ZUNsYXNzKG9wdGlvbnMuY2xhc3NPcGVuKTtcbiAgICAgICAgICAgICAgICAkaW5wdXQudHJpZ2dlcignYmx1cicsIFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuXG4vLyAjIyMjIyMjIyMjIElOSVRJQUxJWkFUSU9OICMjIyMjIyMjIyNcblxuICAgICAgICAvKipcbiAgICAgICAgICogSW5pdCBmdW5jdGlvbiBvZiB0aGUgd2lkZ2V0XG4gICAgICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAgICAgKi9cbiAgICAgICAgbW9kdWxlLmluaXQgPSBmdW5jdGlvbiAoZG9uZSkge1xuXG4gICAgICAgICAgICB2YXIgZm9jdXMgPSBvcHRpb25zLnJlb3BlbiA/ICcgZm9jdXMnIDogJyc7XG5cbiAgICAgICAgICAgIG1vYmlsZSA9IGpzZS5saWJzLnRoZW1lLnJlc3BvbnNpdmUuYnJlYWtwb2ludCgpLmlkIDw9IG9wdGlvbnMuYnJlYWtwb2ludDtcbiAgICAgICAgICAgIHRyYW5zaXRpb24uY2xhc3NPcGVuID0gb3B0aW9ucy5jbGFzc09wZW47XG4gICAgICAgICAgICAkdGFyZ2V0ID0gJHRoaXMuZmluZChvcHRpb25zLnRhcmdldCk7XG4gICAgICAgICAgICAkaW5wdXQgPSAkdGhpcy5maW5kKCdpbnB1dCcpO1xuICAgICAgICAgICAgJHRhcmdldC5oaWRlKCk7XG5cbiAgICAgICAgICAgICRib2R5XG4gICAgICAgICAgICAgICAgLm9uKGpzZS5saWJzLnRoZW1lLmV2ZW50cy5PUEVOX0ZMWU9VVCgpICsgJyBjbGljaycsIF9jbG9zZUZseW91dClcbiAgICAgICAgICAgICAgICAub24oanNlLmxpYnMudGhlbWUuZXZlbnRzLkJSRUFLUE9JTlQoKSwgX2JyZWFrcG9pbnRIYW5kbGVyKTtcblxuICAgICAgICAgICAgJHRoaXNcbiAgICAgICAgICAgICAgICAub24oJ2tleXVwJyArIGZvY3VzLCAnaW5wdXQnLCBfa2V5dXBIYW5kbGVyKVxuICAgICAgICAgICAgICAgIC5vbignY2hhbmdlJywgJ3NlbGVjdCcsIF9jYXRlZ29yeUNoYW5nZUhhbmRsZXIpO1xuXG4gICAgICAgICAgICBkb25lKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gUmV0dXJuIGRhdGEgdG8gd2lkZ2V0IGVuZ2luZVxuICAgICAgICByZXR1cm4gbW9kdWxlO1xuICAgIH0pO1xuIl19

Youez - 2016 - github.com/yon3zu
LinuXploit