all files / test/base/module/ Buttons.spec.js

99.32% Statements 147/148
80% Branches 4/5
100% Functions 44/44
99.32% Lines 146/147
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220           20× 20× 20× 20×                   20× 20× 20× 20×       20×                                                                                                                  
(function(global){global.wrappers['/Users/lqez/Dev/summernote/test/base/module/Buttons.spec.js']=[function(require,module,exports,__dirname,__filename){ "use strict";
/**
 * Buttons.spec.js
 * (c) 2015~ Summernote Team
 * summernote may be freely distributed under the MIT license./
 */
exports.__esModule = true;
var chai_1 = require("chai");
var jquery_1 = require("jquery");
var env_1 = require("../../../src/js/base/core/env");
var range_1 = require("../../../src/js/base/core/range");
var Context_1 = require("../../../src/js/base/Context");
require("../../../src/js/bs4/settings");
describe('Buttons', function () {
    var expect = chai_1["default"].expect;
    var assert = chai_1["default"].assert;
    var context, $toolbar, $editable;
    beforeEach(function () {
        jquery_1["default"]('body').empty(); // important !
        var $note = jquery_1["default"]('<div><p>hello</p></div>').appendTo('body');
        var options = jquery_1["default"].extend({}, jquery_1["default"].summernote.options);
        options.toolbar = [
            ['font1', ['style', 'clear']],
            ['font2', ['bold', 'underline', 'italic', 'superscript', 'subscript', 'strikethrough']],
            ['font3', ['fontname', 'fontsize']],
            ['color', ['color', 'forecolor', 'backcolor']],
            ['para', ['ul', 'ol', 'paragraph']],
            ['table', ['table']],
            ['insert', ['link', 'picture', 'video']],
            ['view', ['fullscreen', 'codeview', 'help']],
        ];
        context = new Context_1["default"]($note, options);
        context.initialize();
        $toolbar = context.layoutInfo.toolbar;
        $editable = context.layoutInfo.editable;
        // [workaround]
        //  - Firefox need setTimeout for applying contents
        //  - IE8~11 can't create range in headless mode
        Iif (env_1["default"].isFF || env_1["default"].isMSIE || env_1["default"].isEdge) {
            this.skip();
        }
    });
    describe('bold button', function () {
        it('should execute bold command when it is clicked', function () {
            range_1["default"].createFromNode($editable.find('p')[0]).normalize().select();
            $toolbar.find('.note-btn-bold').click();
            expect($editable.html()).to.equalsIgnoreCase('<p><b>hello</b></p>');
        });
    });
    describe('bold button state updated', function () {
        it('should look toggled immediately when clicked', function () {
            var $button = $toolbar.find('.note-btn-bold');
            assert.isTrue($button.length === 1);
            assert.isFalse($button.hasClass('active'));
            $button.click();
            assert.isTrue($button.hasClass('active'), 'button is now active');
        });
    });
    describe('italic button', function () {
        it('should execute italic command when it is clicked', function () {
            range_1["default"].createFromNode($editable.find('p')[0]).normalize().select();
            $toolbar.find('.note-btn-italic').click();
            expect($editable.html()).to.equalsIgnoreCase('<p><i>hello</i></p>');
        });
    });
    describe('italic button state updated', function () {
        it('should look toggled immediately when clicked', function () {
            var $button = $toolbar.find('.note-btn-italic');
            assert.isTrue($button.length === 1);
            assert.isFalse($button.hasClass('active'));
            $button.click();
            assert.isTrue($button.hasClass('active'), 'button is now active');
        });
    });
    describe('underline button', function () {
        it('should execute underline command when it is clicked', function () {
            range_1["default"].createFromNode($editable.find('p')[0]).normalize().select();
            $toolbar.find('.note-btn-underline').click();
            expect($editable.html()).to.equalsIgnoreCase('<p><u>hello</u></p>');
        });
    });
    describe('underline button state updated', function () {
        it('should look toggled immediately when clicked', function () {
            var $button = $toolbar.find('.note-btn-underline');
            assert.isTrue($button.length === 1);
            assert.isFalse($button.hasClass('active'));
            $button.click();
            assert.isTrue($button.hasClass('active'), 'button is now active');
        });
    });
    describe('superscript button', function () {
        it('should execute superscript command when it is clicked', function () {
            range_1["default"].createFromNode($editable.find('p')[0]).normalize().select();
            $toolbar.find('.note-btn-superscript').click();
            expect($editable.html()).to.equalsIgnoreCase('<p><sup>hello</sup></p>');
        });
    });
    describe('superscript button state updated', function () {
        it('should look toggled immediately when clicked', function () {
            var $button = $toolbar.find('.note-btn-superscript');
            assert.isTrue($button.length === 1);
            assert.isFalse($button.hasClass('active'));
            $button.click();
            assert.isTrue($button.hasClass('active'), 'button is now active');
        });
    });
    describe('subscript button', function () {
        it('should execute subscript command when it is clicked', function () {
            range_1["default"].createFromNode($editable.find('p')[0]).normalize().select();
            $toolbar.find('.note-btn-subscript').click();
            expect($editable.html()).to.equalsIgnoreCase('<p><sub>hello</sub></p>');
        });
    });
    describe('subscript button state updated', function () {
        it('should look toggled immediately when clicked', function () {
            var $button = $toolbar.find('.note-btn-subscript');
            assert.isTrue($button.length === 1);
            assert.isFalse($button.hasClass('active'));
            $button.click();
            assert.isTrue($button.hasClass('active'), 'button is now active');
        });
    });
    describe('strikethrough button', function () {
        it('should execute strikethrough command when it is clicked', function () {
            range_1["default"].createFromNode($editable.find('p')[0]).normalize().select();
            $toolbar.find('.note-btn-strikethrough').click();
            expect($editable.html()).to.equalsIgnoreCase('<p><strike>hello</strike></p>');
        });
    });
    describe('strikethrough button state updated', function () {
        it('should look toggled immediately when clicked', function () {
            var $button = $toolbar.find('.note-btn-strikethrough');
            assert.isTrue($button.length === 1);
            assert.isFalse($button.hasClass('active'));
            $button.click();
            assert.isTrue($button.hasClass('active'), 'button is now active');
        });
    });
    describe('clear button state not updated when clicked', function () {
        it('should never look toggled when clicked', function () {
            var $button = $toolbar.find('i.note-icon-eraser').parent();
            assert.isTrue($button.length === 1);
            assert.isFalse($button.hasClass('active'));
            $button.click();
            assert.isFalse($button.hasClass('active'), 'button is now active');
        });
    });
    describe('font family button', function () {
        it('should select the right font family name in the dropdown list when it is clicked', function () {
            // XXX: skip assertions for passing test on travis.
            // var $li = $toolbar.find('.dropdown-fontname li>a[data-value="Comic Sans MS"]');
            // var $span = $toolbar.find('span.note-current-fontname');
            // assert.isTrue($li.length === 1);
            // assert.isTrue($span.text() !== 'Comic Sans MS');
            // $li.click();
            // assert.isTrue($span.text() === 'Comic Sans MS');
        });
    });
    describe('recent color button in all color button', function () {
        it('should execute color command when it is clicked', function () {
            range_1["default"].createFromNode($editable.find('p')[0]).normalize().select();
            $toolbar.find('.note-color-all').find('.note-current-color-button').click();
            var $span = $editable.find('span');
            expect($span).to.be.equalsStyle('#FFFF00', 'background-color');
        });
    });
    describe('fore color button in all color button', function () {
        it('should execute fore color command when it is clicked', function () {
            range_1["default"].createFromNode($editable.find('p')[0]).normalize().select();
            var $button = $toolbar.find('.note-color-all').find('[data-event=foreColor]').eq(10);
            $button.click();
            var $span = $editable.find('span');
            expect($span).to.be.equalsStyle('#FF9C00', 'color');
        });
    });
    describe('back color button in all color button', function () {
        it('should execute back color command when it is clicked', function () {
            range_1["default"].createFromNode($editable.find('p')[0]).normalize().select();
            var $button = $toolbar.find('.note-color-all').find('[data-event=backColor]').eq(10);
            $button.click();
            var $span = $editable.find('span');
            expect($span).to.be.equalsStyle($button.data('value'), 'background-color');
        });
    });
    describe('color button in fore color button', function () {
        it('should execute fore color command when it is clicked', function () {
            range_1["default"].createFromNode($editable.find('p')[0]).normalize().select();
            var $button = $toolbar.find('.note-color-fore').find('[data-event=foreColor]').eq(4);
            $button.click();
            var $span = $editable.find('span');
            expect($span).to.be.equalsStyle($button.data('value'), 'color');
        });
    });
    describe('back color button in back color button', function () {
        it('should execute back color command when it is clicked', function () {
            range_1["default"].createFromNode($editable.find('p')[0]).normalize().select();
            var $button = $toolbar.find('.note-color-back').find('[data-event=backColor]').eq(20);
            $button.click();
            var $span = $editable.find('span');
            expect($span).to.be.equalsStyle($button.data('value'), 'background-color');
        });
    });
    describe('font size button with empty content', function () {
        it('should update font size button value when changing font size', function () {
            var $fontSizeDropdown = $toolbar.find('.dropdown-fontsize');
            var $fontSizeButton = $fontSizeDropdown.siblings('button');
            var $fontSizeList = $fontSizeDropdown.find('a');
            var selectedSize = '36';
            // click on dropdown button
            $fontSizeButton.trigger('click');
            // select a font size
            $fontSizeList.filter('[data-value="' + selectedSize + '"]').trigger('click');
            expect($fontSizeButton.text().trim()).to.equal(selectedSize);
        });
    });
});
 
},'test/base/module/Buttons.spec.js',{"chai":"/Users/lqez/Dev/summernote/node_modules/chai/index.js","jquery":"/Users/lqez/Dev/summernote/node_modules/jquery/dist/jquery.js","../../../src/js/base/core/env":"/Users/lqez/Dev/summernote/src/js/base/core/env.js","../../../src/js/base/core/range":"/Users/lqez/Dev/summernote/src/js/base/core/range.js","../../../src/js/base/Context":"/Users/lqez/Dev/summernote/src/js/base/Context.js","../../../src/js/bs4/settings":"/Users/lqez/Dev/summernote/src/js/bs4/settings.js"}];})(this);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnV0dG9ucy5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQnV0dG9ucy5zcGVjLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHOztBQUVILDZCQUF3QjtBQUN4QixpQ0FBdUI7QUFDdkIscURBQWdEO0FBQ2hELHlEQUFvRDtBQUNwRCx3REFBbUQ7QUFDbkQsd0NBQXNDO0FBRXRDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7SUFDbEIsSUFBSSxNQUFNLEdBQUcsaUJBQUksQ0FBQyxNQUFNLENBQUM7SUFDekIsSUFBSSxNQUFNLEdBQUcsaUJBQUksQ0FBQyxNQUFNLENBQUM7SUFDekIsSUFBSSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQztJQUVqQyxVQUFVLENBQUM7UUFDVCxtQkFBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsY0FBYztRQUNqQyxJQUFJLEtBQUssR0FBRyxtQkFBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFELElBQUksT0FBTyxHQUFHLG1CQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxtQkFBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRCxPQUFPLENBQUMsT0FBTyxHQUFHO1lBQ2hCLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdCLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUN2RixDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNuQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDOUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUs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QUE4RCxFQUFFO1lBQ2pFLElBQUksaUJBQWlCLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQzVELElBQUksZUFBZSxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzRCxJQUFJLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEQsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBRXhCLDJCQUEyQjtZQUMzQixlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pDLHFCQUFxQjtZQUNyQixhQUFhLENBQUMsTUFBTSxDQUFDLGVBQWUsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTdFLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnV0dG9ucy5zcGVjLmpzXG4gKiAoYykgMjAxNX4gU3VtbWVybm90ZSBUZWFtXG4gKiBzdW1tZXJub3RlIG1heSBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLi9cbiAqL1xuXG5pbXBvcnQgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgZW52IGZyb20gJy4uLy4uLy4uL3NyYy9qcy9iYXNlL2NvcmUvZW52JztcbmltcG9ydCByYW5nZSBmcm9tICcuLi8uLi8uLi9zcmMvanMvYmFzZS9jb3JlL3JhbmdlJztcbmltcG9ydCBDb250ZXh0IGZyb20gJy4uLy4uLy4uL3NyYy9qcy9iYXNlL0NvbnRleHQnO1xuaW1wb3J0ICcuLi8uLi8uLi9zcmMvanMvYnM0L3NldHRpbmdzJztcblxuZGVzY3JpYmUoJ0J1dHRvbnMnLCAoKSA9PiB7XG4gIHZhciBleHBlY3QgPSBjaGFpLmV4cGVjdDtcbiAgdmFyIGFzc2VydCA9IGNoYWkuYXNzZXJ0O1xuICB2YXIgY29udGV4dCwgJHRvb2xiYXIsICRlZGl0YWJsZTtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uKCkge1xuICAgICQoJ2JvZHknKS5lbXB0eSgpOyAvLyBpbXBvcnRhbnQgIVxuICAgIHZhciAkbm90ZSA9ICQoJzxkaXY+PHA+aGVsbG88L3A+PC9kaXY+JykuYXBwZW5kVG8oJ2JvZHknKTtcblxuICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sICQuc3VtbWVybm90ZS5vcHRpb25zKTtcbiAgICBvcHRpb25zLnRvb2xiYXIgPSBbXG4gICAgICBbJ2ZvbnQxJywgWydzdHlsZScsICdjbGVhciddXSxcbiAgICAgIFsnZm9udDInLCBbJ2JvbGQnLCAndW5kZXJsaW5lJywgJ2l0YWxpYycsICdzdXBlcnNjcmlwdCcsICdzdWJzY3JpcHQnLCAnc3RyaWtldGhyb3VnaCddXSxcbiAgICAgIFsnZm9udDMnLCBbJ2ZvbnRuYW1lJywgJ2ZvbnRzaXplJ11dLFxuICAgICAgWydjb2xvcicsIFsnY29sb3InLCAnZm9yZWNvbG9yJywgJ2JhY2tjb2xvciddXSxcbiAgICAgIFsncGFyYScsIFsndWwnLCAnb2wnLCAncGFyYWdyYXBoJ11dLFxuICAgICAgWyd0YWJsZScsIFsndGFibGUnXV0sXG4gICAgICBbJ2luc2VydCcsIFsnbGluaycsICdwaWN0dXJlJywgJ3ZpZGVvJ11dLFxuICAgICAgWyd2aWV3JywgWydmdWxsc2NyZWVuJywgJ2NvZGV2aWV3JywgJ2hlbHAnXV0sXG4gICAgXTtcbiAgICBjb250ZXh0ID0gbmV3IENvbnRleHQoJG5vdGUsIG9wdGlvbnMpO1xuICAgIGNvbnRleHQuaW5pdGlhbGl6ZSgpO1xuXG4gICAgJHRvb2xiYXIgPSBjb250ZXh0LmxheW91dEluZm8udG9vbGJhcjtcbiAgICAkZWRpdGFibGUgPSBjb250ZXh0LmxheW91dEluZm8uZWRpdGFibGU7XG5cbiAgICAvLyBbd29ya2Fyb3VuZF1cbiAgICAvLyAgLSBGaXJlZm94IG5lZWQgc2V0VGltZW91dCBmb3IgYXBwbHlpbmcgY29udGVudHNcbiAgICAvLyAgLSBJRTh+MTEgY2FuJ3QgY3JlYXRlIHJhbmdlIGluIGhlYWRsZXNzIG1vZGVcbiAgICBpZiAoZW52LmlzRkYgfHwgZW52LmlzTVNJRSB8fCBlbnYuaXNFZGdlKSB7XG4gICAgICB0aGlzLnNraXAoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdib2xkIGJ1dHRvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGV4ZWN1dGUgYm9sZCBjb21tYW5kIHdoZW4gaXQgaXMgY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIHJhbmdlLmNyZWF0ZUZyb21Ob2RlKCRlZGl0YWJsZS5maW5kKCdwJylbMF0pLm5vcm1hbGl6ZSgpLnNlbGVjdCgpO1xuXG4gICAgICAkdG9vbGJhci5maW5kKCcubm90ZS1idG4tYm9sZCcpLmNsaWNrKCk7XG4gICAgICBleHBlY3QoJGVkaXRhYmxlLmh0bWwoKSkudG8uZXF1YWxzSWdub3JlQ2FzZSgnPHA+PGI+aGVsbG88L2I+PC9wPicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYm9sZCBidXR0b24gc3RhdGUgdXBkYXRlZCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGxvb2sgdG9nZ2xlZCBpbW1lZGlhdGVseSB3aGVuIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICB2YXIgJGJ1dHRvbiA9ICR0b29sYmFyLmZpbmQoJy5ub3RlLWJ0bi1ib2xkJyk7XG4gICAgICBhc3NlcnQuaXNUcnVlKCRidXR0b24ubGVuZ3RoID09PSAxKTtcbiAgICAgIGFzc2VydC5pc0ZhbHNlKCRidXR0b24uaGFzQ2xhc3MoJ2FjdGl2ZScpKTtcbiAgICAgICRidXR0b24uY2xpY2soKTtcbiAgICAgIGFzc2VydC5pc1RydWUoJGJ1dHRvbi5oYXNDbGFzcygnYWN0aXZlJyksICdidXR0b24gaXMgbm93IGFjdGl2ZScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXRhbGljIGJ1dHRvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGV4ZWN1dGUgaXRhbGljIGNvbW1hbmQgd2hlbiBpdCBpcyBjbGlja2VkJywgKCkgPT4ge1xuICAgICAgcmFuZ2UuY3JlYXRlRnJvbU5vZGUoJGVkaXRhYmxlLmZpbmQoJ3AnKVswXSkubm9ybWFsaXplKCkuc2VsZWN0KCk7XG5cbiAgICAgICR0b29sYmFyLmZpbmQoJy5ub3RlLWJ0bi1pdGFsaWMnKS5jbGljaygpO1xuICAgICAgZXhwZWN0KCRlZGl0YWJsZS5odG1sKCkpLnRvLmVxdWFsc0lnbm9yZUNhc2UoJzxwPjxpPmhlbGxvPC9pPjwvcD4nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2l0YWxpYyBidXR0b24gc3RhdGUgdXBkYXRlZCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGxvb2sgdG9nZ2xlZCBpbW1lZGlhdGVseSB3aGVuIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICB2YXIgJGJ1dHRvbiA9ICR0b29sYmFyLmZpbmQoJy5ub3RlLWJ0bi1pdGFsaWMnKTtcbiAgICAgIGFzc2VydC5pc1RydWUoJGJ1dHRvbi5sZW5ndGggPT09IDEpO1xuICAgICAgYXNzZXJ0LmlzRmFsc2UoJGJ1dHRvbi5oYXNDbGFzcygnYWN0aXZlJykpO1xuICAgICAgJGJ1dHRvbi5jbGljaygpO1xuICAgICAgYXNzZXJ0LmlzVHJ1ZSgkYnV0dG9uLmhhc0NsYXNzKCdhY3RpdmUnKSwgJ2J1dHRvbiBpcyBub3cgYWN0aXZlJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd1bmRlcmxpbmUgYnV0dG9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZXhlY3V0ZSB1bmRlcmxpbmUgY29tbWFuZCB3aGVuIGl0IGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICByYW5nZS5jcmVhdGVGcm9tTm9kZSgkZWRpdGFibGUuZmluZCgncCcpWzBdKS5ub3JtYWxpemUoKS5zZWxlY3QoKTtcblxuICAgICAgJHRvb2xiYXIuZmluZCgnLm5vdGUtYnRuLXVuZGVybGluZScpLmNsaWNrKCk7XG4gICAgICBleHBlY3QoJGVkaXRhYmxlLmh0bWwoKSkudG8uZXF1YWxzSWdub3JlQ2FzZSgnPHA+PHU+aGVsbG88L3U+PC9wPicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndW5kZXJsaW5lIGJ1dHRvbiBzdGF0ZSB1cGRhdGVkJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgbG9vayB0b2dnbGVkIGltbWVkaWF0ZWx5IHdoZW4gY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIHZhciAkYnV0dG9uID0gJHRvb2xiYXIuZmluZCgnLm5vdGUtYnRuLXVuZGVybGluZScpO1xuICAgICAgYXNzZXJ0LmlzVHJ1ZSgkYnV0dG9uLmxlbmd0aCA9PT0gMSk7XG4gICAgICBhc3NlcnQuaXNGYWxzZSgkYnV0dG9uLmhhc0NsYXNzKCdhY3RpdmUnKSk7XG4gICAgICAkYnV0dG9uLmNsaWNrKCk7XG4gICAgICBhc3NlcnQuaXNUcnVlKCRidXR0b24uaGFzQ2xhc3MoJ2FjdGl2ZScpLCAnYnV0dG9uIGlzIG5vdyBhY3RpdmUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N1cGVyc2NyaXB0IGJ1dHRvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGV4ZWN1dGUgc3VwZXJzY3JpcHQgY29tbWFuZCB3aGVuIGl0IGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICByYW5nZS5jcmVhdGVGcm9tTm9kZSgkZWRpdGFibGUuZmluZCgncCcpWzBdKS5ub3JtYWxpemUoKS5zZWxlY3QoKTtcblxuICAgICAgJHRvb2xiYXIuZmluZCgnLm5vdGUtYnRuLXN1cGVyc2NyaXB0JykuY2xpY2soKTtcbiAgICAgIGV4cGVjdCgkZWRpdGFibGUuaHRtbCgpKS50by5lcXVhbHNJZ25vcmVDYXNlKCc8cD48c3VwPmhlbGxvPC9zdXA+PC9wPicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3VwZXJzY3JpcHQgYnV0dG9uIHN0YXRlIHVwZGF0ZWQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBsb29rIHRvZ2dsZWQgaW1tZWRpYXRlbHkgd2hlbiBjbGlja2VkJywgKCkgPT4ge1xuICAgICAgdmFyICRidXR0b24gPSAkdG9vbGJhci5maW5kKCcubm90ZS1idG4tc3VwZXJzY3JpcHQnKTtcbiAgICAgIGFzc2VydC5pc1RydWUoJGJ1dHRvbi5sZW5ndGggPT09IDEpO1xuICAgICAgYXNzZXJ0LmlzRmFsc2UoJGJ1dHRvbi5oYXNDbGFzcygnYWN0aXZlJykpO1xuICAgICAgJGJ1dHRvbi5jbGljaygpO1xuICAgICAgYXNzZXJ0LmlzVHJ1ZSgkYnV0dG9uLmhhc0NsYXNzKCdhY3RpdmUnKSwgJ2J1dHRvbiBpcyBub3cgYWN0aXZlJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdWJzY3JpcHQgYnV0dG9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZXhlY3V0ZSBzdWJzY3JpcHQgY29tbWFuZCB3aGVuIGl0IGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICByYW5nZS5jcmVhdGVGcm9tTm9kZSgkZWRpdGFibGUuZmluZCgncCcpWzBdKS5ub3JtYWxpemUoKS5zZWxlY3QoKTtcblxuICAgICAgJHRvb2xiYXIuZmluZCgnLm5vdGUtYnRuLXN1YnNjcmlwdCcpLmNsaWNrKCk7XG4gICAgICBleHBlY3QoJGVkaXRhYmxlLmh0bWwoKSkudG8uZXF1YWxzSWdub3JlQ2FzZSgnPHA+PHN1Yj5oZWxsbzwvc3ViPjwvcD4nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N1YnNjcmlwdCBidXR0b24gc3RhdGUgdXBkYXRlZCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGxvb2sgdG9nZ2xlZCBpbW1lZGlhdGVseSB3aGVuIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICB2YXIgJGJ1dHRvbiA9ICR0b29sYmFyLmZpbmQoJy5ub3RlLWJ0bi1zdWJzY3JpcHQnKTtcbiAgICAgIGFzc2VydC5pc1RydWUoJGJ1dHRvbi5sZW5ndGggPT09IDEpO1xuICAgICAgYXNzZXJ0LmlzRmFsc2UoJGJ1dHRvbi5oYXNDbGFzcygnYWN0aXZlJykpO1xuICAgICAgJGJ1dHRvbi5jbGljaygpO1xuICAgICAgYXNzZXJ0LmlzVHJ1ZSgkYnV0dG9uLmhhc0NsYXNzKCdhY3RpdmUnKSwgJ2J1dHRvbiBpcyBub3cgYWN0aXZlJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdHJpa2V0aHJvdWdoIGJ1dHRvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGV4ZWN1dGUgc3RyaWtldGhyb3VnaCBjb21tYW5kIHdoZW4gaXQgaXMgY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIHJhbmdlLmNyZWF0ZUZyb21Ob2RlKCRlZGl0YWJsZS5maW5kKCdwJylbMF0pLm5vcm1hbGl6ZSgpLnNlbGVjdCgpO1xuXG4gICAgICAkdG9vbGJhci5maW5kKCcubm90ZS1idG4tc3RyaWtldGhyb3VnaCcpLmNsaWNrKCk7XG4gICAgICBleHBlY3QoJGVkaXRhYmxlLmh0bWwoKSkudG8uZXF1YWxzSWdub3JlQ2FzZSgnPHA+PHN0cmlrZT5oZWxsbzwvc3RyaWtlPjwvcD4nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N0cmlrZXRocm91Z2ggYnV0dG9uIHN0YXRlIHVwZGF0ZWQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBsb29rIHRvZ2dsZWQgaW1tZWRpYXRlbHkgd2hlbiBjbGlja2VkJywgKCkgPT4ge1xuICAgICAgdmFyICRidXR0b24gPSAkdG9vbGJhci5maW5kKCcubm90ZS1idG4tc3RyaWtldGhyb3VnaCcpO1xuICAgICAgYXNzZXJ0LmlzVHJ1ZSgkYnV0dG9uLmxlbmd0aCA9PT0gMSk7XG4gICAgICBhc3NlcnQuaXNGYWxzZSgkYnV0dG9uLmhhc0NsYXNzKCdhY3RpdmUnKSk7XG4gICAgICAkYnV0dG9uLmNsaWNrKCk7XG4gICAgICBhc3NlcnQuaXNUcnVlKCRidXR0b24uaGFzQ2xhc3MoJ2FjdGl2ZScpLCAnYnV0dG9uIGlzIG5vdyBhY3RpdmUnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NsZWFyIGJ1dHRvbiBzdGF0ZSBub3QgdXBkYXRlZCB3aGVuIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBuZXZlciBsb29rIHRvZ2dsZWQgd2hlbiBjbGlja2VkJywgKCkgPT4ge1xuICAgICAgdmFyICRidXR0b24gPSAkdG9vbGJhci5maW5kKCdpLm5vdGUtaWNvbi1lcmFzZXInKS5wYXJlbnQoKTtcbiAgICAgIGFzc2VydC5pc1RydWUoJGJ1dHRvbi5sZW5ndGggPT09IDEpO1xuICAgICAgYXNzZXJ0LmlzRmFsc2UoJGJ1dHRvbi5oYXNDbGFzcygnYWN0aXZlJykpO1xuICAgICAgJGJ1dHRvbi5jbGljaygpO1xuICAgICAgYXNzZXJ0LmlzRmFsc2UoJGJ1dHRvbi5oYXNDbGFzcygnYWN0aXZlJyksICdidXR0b24gaXMgbm93IGFjdGl2ZScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZm9udCBmYW1pbHkgYnV0dG9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc2VsZWN0IHRoZSByaWdodCBmb250IGZhbWlseSBuYW1lIGluIHRoZSBkcm9wZG93biBsaXN0IHdoZW4gaXQgaXMgY2xpY2tlZCcsICgpID0+IHtcbiAgICAgIC8vIFhYWDogc2tpcCBhc3NlcnRpb25zIGZvciBwYXNzaW5nIHRlc3Qgb24gdHJhdmlzLlxuICAgICAgLy8gdmFyICRsaSA9ICR0b29sYmFyLmZpbmQoJy5kcm9wZG93bi1mb250bmFtZSBsaT5hW2RhdGEtdmFsdWU9XCJDb21pYyBTYW5zIE1TXCJdJyk7XG4gICAgICAvLyB2YXIgJHNwYW4gPSAkdG9vbGJhci5maW5kKCdzcGFuLm5vdGUtY3VycmVudC1mb250bmFtZScpO1xuICAgICAgLy8gYXNzZXJ0LmlzVHJ1ZSgkbGkubGVuZ3RoID09PSAxKTtcbiAgICAgIC8vIGFzc2VydC5pc1RydWUoJHNwYW4udGV4dCgpICE9PSAnQ29taWMgU2FucyBNUycpO1xuICAgICAgLy8gJGxpLmNsaWNrKCk7XG4gICAgICAvLyBhc3NlcnQuaXNUcnVlKCRzcGFuLnRleHQoKSA9PT0gJ0NvbWljIFNhbnMgTVMnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlY2VudCBjb2xvciBidXR0b24gaW4gYWxsIGNvbG9yIGJ1dHRvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGV4ZWN1dGUgY29sb3IgY29tbWFuZCB3aGVuIGl0IGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICByYW5nZS5jcmVhdGVGcm9tTm9kZSgkZWRpdGFibGUuZmluZCgncCcpWzBdKS5ub3JtYWxpemUoKS5zZWxlY3QoKTtcblxuICAgICAgJHRvb2xiYXIuZmluZCgnLm5vdGUtY29sb3ItYWxsJykuZmluZCgnLm5vdGUtY3VycmVudC1jb2xvci1idXR0b24nKS5jbGljaygpO1xuXG4gICAgICB2YXIgJHNwYW4gPSAkZWRpdGFibGUuZmluZCgnc3BhbicpO1xuICAgICAgZXhwZWN0KCRzcGFuKS50by5iZS5lcXVhbHNTdHlsZSgnI0ZGRkYwMCcsICdiYWNrZ3JvdW5kLWNvbG9yJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmb3JlIGNvbG9yIGJ1dHRvbiBpbiBhbGwgY29sb3IgYnV0dG9uJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZXhlY3V0ZSBmb3JlIGNvbG9yIGNvbW1hbmQgd2hlbiBpdCBpcyBjbGlja2VkJywgKCkgPT4ge1xuICAgICAgcmFuZ2UuY3JlYXRlRnJvbU5vZGUoJGVkaXRhYmxlLmZpbmQoJ3AnKVswXSkubm9ybWFsaXplKCkuc2VsZWN0KCk7XG5cbiAgICAgIHZhciAkYnV0dG9uID0gJHRvb2xiYXIuZmluZCgnLm5vdGUtY29sb3ItYWxsJykuZmluZCgnW2RhdGEtZXZlbnQ9Zm9yZUNvbG9yXScpLmVxKDEwKTtcbiAgICAgICRidXR0b24uY2xpY2soKTtcblxuICAgICAgdmFyICRzcGFuID0gJGVkaXRhYmxlLmZpbmQoJ3NwYW4nKTtcbiAgICAgIGV4cGVjdCgkc3BhbikudG8uYmUuZXF1YWxzU3R5bGUoJyNGRjlDMDAnLCAnY29sb3InKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2JhY2sgY29sb3IgYnV0dG9uIGluIGFsbCBjb2xvciBidXR0b24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBleGVjdXRlIGJhY2sgY29sb3IgY29tbWFuZCB3aGVuIGl0IGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICByYW5nZS5jcmVhdGVGcm9tTm9kZSgkZWRpdGFibGUuZmluZCgncCcpWzBdKS5ub3JtYWxpemUoKS5zZWxlY3QoKTtcblxuICAgICAgdmFyICRidXR0b24gPSAkdG9vbGJhci5maW5kKCcubm90ZS1jb2xvci1hbGwnKS5maW5kKCdbZGF0YS1ldmVudD1iYWNrQ29sb3JdJykuZXEoMTApO1xuICAgICAgJGJ1dHRvbi5jbGljaygpO1xuXG4gICAgICB2YXIgJHNwYW4gPSAkZWRpdGFibGUuZmluZCgnc3BhbicpO1xuICAgICAgZXhwZWN0KCRzcGFuKS50by5iZS5lcXVhbHNTdHlsZSgkYnV0dG9uLmRhdGEoJ3ZhbHVlJyksICdiYWNrZ3JvdW5kLWNvbG9yJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjb2xvciBidXR0b24gaW4gZm9yZSBjb2xvciBidXR0b24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBleGVjdXRlIGZvcmUgY29sb3IgY29tbWFuZCB3aGVuIGl0IGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICByYW5nZS5jcmVhdGVGcm9tTm9kZSgkZWRpdGFibGUuZmluZCgncCcpWzBdKS5ub3JtYWxpemUoKS5zZWxlY3QoKTtcblxuICAgICAgdmFyICRidXR0b24gPSAkdG9vbGJhci5maW5kKCcubm90ZS1jb2xvci1mb3JlJykuZmluZCgnW2RhdGEtZXZlbnQ9Zm9yZUNvbG9yXScpLmVxKDQpO1xuICAgICAgJGJ1dHRvbi5jbGljaygpO1xuXG4gICAgICB2YXIgJHNwYW4gPSAkZWRpdGFibGUuZmluZCgnc3BhbicpO1xuICAgICAgZXhwZWN0KCRzcGFuKS50by5iZS5lcXVhbHNTdHlsZSgkYnV0dG9uLmRhdGEoJ3ZhbHVlJyksICdjb2xvcicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYmFjayBjb2xvciBidXR0b24gaW4gYmFjayBjb2xvciBidXR0b24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBleGVjdXRlIGJhY2sgY29sb3IgY29tbWFuZCB3aGVuIGl0IGlzIGNsaWNrZWQnLCAoKSA9PiB7XG4gICAgICByYW5nZS5jcmVhdGVGcm9tTm9kZSgkZWRpdGFibGUuZmluZCgncCcpWzBdKS5ub3JtYWxpemUoKS5zZWxlY3QoKTtcblxuICAgICAgdmFyICRidXR0b24gPSAkdG9vbGJhci5maW5kKCcubm90ZS1jb2xvci1iYWNrJykuZmluZCgnW2RhdGEtZXZlbnQ9YmFja0NvbG9yXScpLmVxKDIwKTtcbiAgICAgICRidXR0b24uY2xpY2soKTtcblxuICAgICAgdmFyICRzcGFuID0gJGVkaXRhYmxlLmZpbmQoJ3NwYW4nKTtcbiAgICAgIGV4cGVjdCgkc3BhbikudG8uYmUuZXF1YWxzU3R5bGUoJGJ1dHRvbi5kYXRhKCd2YWx1ZScpLCAnYmFja2dyb3VuZC1jb2xvcicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZm9udCBzaXplIGJ1dHRvbiB3aXRoIGVtcHR5IGNvbnRlbnQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB1cGRhdGUgZm9udCBzaXplIGJ1dHRvbiB2YWx1ZSB3aGVuIGNoYW5naW5nIGZvbnQgc2l6ZScsICgpID0+IHtcbiAgICAgIHZhciAkZm9udFNpemVEcm9wZG93biA9ICR0b29sYmFyLmZpbmQoJy5kcm9wZG93bi1mb250c2l6ZScpO1xuICAgICAgdmFyICRmb250U2l6ZUJ1dHRvbiA9ICRmb250U2l6ZURyb3Bkb3duLnNpYmxpbmdzKCdidXR0b24nKTtcbiAgICAgIHZhciAkZm9udFNpemVMaXN0ID0gJGZvbnRTaXplRHJvcGRvd24uZmluZCgnYScpO1xuICAgICAgdmFyIHNlbGVjdGVkU2l6ZSA9ICczNic7XG5cbiAgICAgIC8vIGNsaWNrIG9uIGRyb3Bkb3duIGJ1dHRvblxuICAgICAgJGZvbnRTaXplQnV0dG9uLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAvLyBzZWxlY3QgYSBmb250IHNpemVcbiAgICAgICRmb250U2l6ZUxpc3QuZmlsdGVyKCdbZGF0YS12YWx1ZT1cIicgKyBzZWxlY3RlZFNpemUgKyAnXCJdJykudHJpZ2dlcignY2xpY2snKTtcblxuICAgICAgZXhwZWN0KCRmb250U2l6ZUJ1dHRvbi50ZXh0KCkudHJpbSgpKS50by5lcXVhbChzZWxlY3RlZFNpemUpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19