all files / test/base/core/ range.spec.js

100% Statements 272/272
100% Branches 0/0
100% Functions 59/59
100% Lines 271/271
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 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337                                                                                                                                    
(function(global){global.wrappers['/Users/lqez/Dev/summernote/test/base/core/range.spec.js']=[function(require,module,exports,__dirname,__filename){ "use strict";
/**
 * range.spec.js
 * (c) 2013~ Alan Hong
 * summernote may be freely distributed under the MIT license./
 */
exports.__esModule = true;
var chai_1 = require("chai");
var chaidom_1 = require("../../chaidom");
var jquery_1 = require("jquery");
var dom_1 = require("../../../src/js/base/core/dom");
var range_1 = require("../../../src/js/base/core/range");
var expect = chai_1["default"].expect;
chai_1["default"].use(chaidom_1["default"]);
describe('base:core.range', function () {
    describe('nodes', function () {
        describe('1 depth', function () {
            var $para;
            before(function () {
                var $cont = jquery_1["default"]('<div class="note-editable"><p>para1</p><p>para2</p></div>');
                $para = $cont.find('p');
            });
            it('should return array of two paragraphs', function () {
                var rng = range_1["default"].create($para[0].firstChild, 0, $para[1].firstChild, 1);
                expect(rng.nodes(dom_1["default"].isPara, { includeAncestor: true })).to.have.length(2);
            });
            it('should return array of a paragraph', function () {
                var rng = range_1["default"].create($para[0].firstChild, 0, $para[0].firstChild, 0);
                expect(rng.nodes(dom_1["default"].isPara, { includeAncestor: true })).to.have.length(1);
            });
        });
        describe('multi depth', function () {
            it('should return array of a paragraph', function () {
                var $cont = jquery_1["default"]('<div class="note-editable"><p>p<b>ar</b>a1</p><p>para2</p></div>');
                var $b = $cont.find('b');
                var rng = range_1["default"].create($b[0].firstChild, 0, $b[0].firstChild, 0);
                expect(rng.nodes(dom_1["default"].isPara, { includeAncestor: true })).to.have.length(1);
            });
        });
        describe('on list, on heading', function () {
            it('should return array of list paragraphs', function () {
                var $cont = jquery_1["default"]('<div class="note-editable"><ul><li>para1</li><li>para2</li></ul></div>');
                var $li = $cont.find('li');
                var rng = range_1["default"].create($li[0].firstChild, 0, $li[1].firstChild, 1);
                expect(rng.nodes(dom_1["default"].isPara, { includeAncestor: true })).to.have.length(2);
            });
            it('should return array of list paragraphs', function () {
                var $cont = jquery_1["default"]('<div class="note-editable"><h1>heading1</h1><h2>heading2</h2></div>');
                var $h1 = $cont.find('h1');
                var $h2 = $cont.find('h2');
                var rng = range_1["default"].create($h1[0].firstChild, 0, $h2[0].firstChild, 1);
                expect(rng.nodes(dom_1["default"].isPara, { includeAncestor: true })).to.have.length(2);
            });
        });
    });
    describe('commonAncestor', function () {
        var $cont;
        before(function () {
            $cont = jquery_1["default"]('<div><span><b>b</b><u>u</u></span></div>');
        });
        it('should return <span> for <b>|b</b> and <u>u|</u>', function () {
            var $span = $cont.find('span');
            var $b = $cont.find('b');
            var $u = $cont.find('u');
            var rng = range_1["default"].create($b[0].firstChild, 0, $u[0].firstChild, 1);
            expect(rng.commonAncestor()).to.deep.equal($span[0]);
        });
        it('should return b(#textNode) for <b>|b|</b>', function () {
            var $b = $cont.find('b');
            var rng = range_1["default"].create($b[0].firstChild, 0, $b[0].firstChild, 1);
            expect(rng.commonAncestor()).to.deep.equal($b[0].firstChild);
        });
    });
    describe('expand', function () {
        it('should return <b>|b</b> ~ <u>u|</u> for <b>|b</b> with isAnchor', function () {
            var $cont = jquery_1["default"]('<div><a><b>b</b><u>u</u></a></div>');
            var $anchor = $cont.find('a');
            var $b = $cont.find('b');
            var rng = range_1["default"].create($b[0].firstChild, 0, $b[0].firstChild, 0).expand(dom_1["default"].isAnchor);
            expect(rng.sc).to.deep.equal($anchor[0]);
            expect(rng.so).to.equal(0);
            expect(rng.ec).to.deep.equal($anchor[0]);
            expect(rng.eo).to.equal(2);
        });
    });
    describe('collapse', function () {
        it('should return <u>u|</u> for <b>|b</b> ~ <u>u|</u>', function () {
            var $cont = jquery_1["default"]('<div><b>b</b><u>u</u></div>');
            var $b = $cont.find('b');
            var $u = $cont.find('u');
            var rng = range_1["default"].create($b[0].firstChild, 0, $u[0].firstChild, 1).collapse();
            expect(rng.sc).to.deep.equal($u[0].firstChild);
            expect(rng.so).to.equal(1);
            expect(rng.ec).to.deep.equal($u[0].firstChild);
            expect(rng.eo).to.equal(1);
        });
    });
    describe('normalize', function () {
        var $cont;
        before(function () {
            $cont = jquery_1["default"]('<div><p><b>b</b><u>u</u><s>s</s></p></div>');
        });
        it('should return <b>|b</b> ~ <u>u|</u> for |<b>b</b> ~ <u>u</u>|', function () {
            var $p = $cont.find('p');
            var $b = $cont.find('b');
            var $u = $cont.find('u');
            var rng = range_1["default"].create($p[0], 0, $p[0], 2).normalize();
            expect(rng.sc).to.deep.equal($b[0].firstChild);
            expect(rng.so).to.equal(0);
            expect(rng.ec).to.deep.equal($u[0].firstChild);
            expect(rng.eo).to.equal(1);
        });
        it('should return <b>b|</b><u>u</u> for <b>b</b>|<u>u</u>', function () {
            var $p = $cont.find('p');
            var $b = $cont.find('b');
            var rng = range_1["default"].create($p[0], 1, $p[0], 1).normalize();
            expect(rng.sc).to.deep.equal($b[0].firstChild);
            expect(rng.so).to.equal(1);
            expect(rng.ec).to.deep.equal($b[0].firstChild);
            expect(rng.eo).to.equal(1);
        });
        it('should return <b>b</b><u>|u|</u><s>s</s> for <b>b|</b><u>u</u><s>|s</s>', function () {
            var $b = $cont.find('b');
            var $u = $cont.find('u');
            var $s = $cont.find('s');
            var rng = range_1["default"].create($b[0].firstChild, 1, $s[0].firstChild, 0).normalize();
            expect(rng.sc).to.deep.equal($u[0].firstChild);
            expect(rng.so).to.equal(0);
            expect(rng.ec).to.deep.equal($u[0].firstChild);
            expect(rng.eo).to.equal(1);
        });
        it('should return <b>b|</b><u>u</u><s>s</s> for <b>b|</b><u>u</u><s>s</s>', function () {
            var $b = $cont.find('b');
            var rng = range_1["default"].create($b[0].firstChild, 1, $b[0].firstChild, 1).normalize();
            expect(rng.sc).to.deep.equal($b[0].firstChild);
            expect(rng.so).to.equal(1);
            expect(rng.ec).to.deep.equal($b[0].firstChild);
            expect(rng.eo).to.equal(1);
        });
    });
    describe('normalize (block mode)', function () {
        it('should return <p>text</p><p>|<br></p> for <p>text</p><p>|<br></p>', function () {
            var $cont = jquery_1["default"]('<div><p>text</p><p><br></p></div>');
            var $p = $cont.find('p');
            var rng = range_1["default"].create($p[1], 0, $p[1], 0).normalize();
            expect(rng.sc).to.deep.equal($p[1]);
            expect(rng.so).to.equal(0);
            expect(rng.ec).to.deep.equal($p[1]);
            expect(rng.eo).to.equal(0);
        });
        it('should return <p>text</p><p>|text</p> for <p>text</p><p>|text</p>', function () {
            var $cont = jquery_1["default"]('<div><p>text</p><p>text</p></div>');
            var $p = $cont.find('p');
            var rng = range_1["default"].create($p[1], 0, $p[1], 0).normalize();
            expect(rng.sc).to.deep.equal($p[1].firstChild);
            expect(rng.so).to.equal(0);
            expect(rng.ec).to.deep.equal($p[1].firstChild);
            expect(rng.eo).to.equal(0);
        });
        it('should return <p>|text</p><p>text|</p> for |<p>text</p><p>text</p>|', function () {
            var $cont = jquery_1["default"]('<div class="note-editable"><p>text</p><p>text</p></div>');
            var $p = $cont.find('p');
            var rng = range_1["default"].create($cont[0], 0, $cont[0], 2).normalize();
            expect(rng.sc).to.deep.equal($p[0].firstChild);
            expect(rng.so).to.equal(0);
            expect(rng.ec).to.deep.equal($p[1].firstChild);
            expect(rng.eo).to.equal(4);
        });
    });
    describe('normalize (void element)', function () {
        it('should return <p><img>|<b>bold</b></p> for <p><img>|<b>bold</b></p>', function () {
            var $cont = jquery_1["default"]('<div><p><img><b>bold</b></p></div>');
            var $p = $cont.find('p');
            var $b = $cont.find('b');
            var rng = range_1["default"].create($p[0], 1, $p[0], 1).normalize();
            expect(rng.sc).to.deep.equal($b[0].firstChild);
            expect(rng.so).to.equal(0);
            expect(rng.ec).to.deep.equal($b[0].firstChild);
            expect(rng.eo).to.equal(0);
        });
        it('should return <p><img>|text></p> for <p><img>|text></p>', function () {
            var $cont = jquery_1["default"]('<div><p><img>bold</p></div>');
            var $img = $cont.find('img');
            var text = $img[0].nextSibling;
            var rng = range_1["default"].create(text, 0, text, 0).normalize();
            expect(rng.sc).to.equal(text);
            expect(rng.so).to.equal(0);
            expect(rng.isCollapsed()).to["true"];
        });
    });
    describe('insertNode', function () {
        it('should split paragraph when inserting a block element', function () {
            var $cont = jquery_1["default"]('<div class="note-editable"><p><b>bold</b></p></div>');
            var $b = $cont.find('b');
            var $p2 = jquery_1["default"]('<p>p</p>');
            var rng = range_1["default"].create($b[0].firstChild, 2, $b[0].firstChild, 2);
            rng.insertNode($p2[0]);
            expect($cont.html()).to.equalsIgnoreCase('<p><b>bo</b></p><p>p</p><p><b>ld</b></p>');
        });
        it('should not split paragraph when inserting an inline element', function () {
            var $cont = jquery_1["default"]('<div class="note-editable"><p>text</p></div>');
            var $p = $cont.find('p');
            var $u = jquery_1["default"]('<u>u</u>');
            var rng = range_1["default"].create($p[0].firstChild, 2, $p[0].firstChild, 2);
            rng.insertNode($u[0]);
            expect($cont.html()).to.equalsIgnoreCase('<p>te<u>u</u>xt</p>');
        });
        it('should not split paragraph when inserting an inline element case 2', function () {
            var $cont = jquery_1["default"]('<div class="note-editable"><p><b>bold</b></p></div>');
            var $b = $cont.find('b');
            var $u = jquery_1["default"]('<u>u</u>');
            var rng = range_1["default"].create($b[0].firstChild, 2, $b[0].firstChild, 2);
            rng.insertNode($u[0]);
            expect($cont.html()).to.equalsIgnoreCase('<p><b>bo</b><u>u</u><b>ld</b></p>');
        });
    });
    describe('pasteHTML', function () {
        it('should not split a block element when inserting inline elements into it', function () {
            var $cont = jquery_1["default"]('<div class="note-editable"><p>text</p></div>');
            var $p = $cont.find('p');
            var markup = '<span>span</span><i>italic</i>';
            var rng = range_1["default"].create($p[0].firstChild, 2);
            rng.pasteHTML(markup);
            expect($cont.html()).to.equalsIgnoreCase('<p>te<span>span</span><i>italic</i>xt</p>');
        });
        it('should split an inline element when pasting inline elements into it', function () {
            var $cont = jquery_1["default"]('<div class="note-editable"><p><b>bold</b></p></div>');
            var $b = $cont.find('b');
            var markup = '<span>span</span><i>italic</i>';
            var rng = range_1["default"].create($b[0].firstChild, 2);
            rng.pasteHTML(markup);
            expect($cont.html()).to.equalsIgnoreCase('<p><b>bo</b><span>span</span><i>italic</i><b>ld</b></p>');
        });
        it('should split inline node when pasting an inline node and a block node into it', function () {
            var $cont = jquery_1["default"]('<div class="note-editable"><p><b>bold</b></p></div>');
            var $b = $cont.find('b');
            var markup = '<span>span</span><p><i>italic</i></p>';
            var rng = range_1["default"].create($b[0].firstChild, 2);
            rng.pasteHTML(markup);
            expect($cont.html()).to.equalsIgnoreCase('<p><b>bo</b><span>span</span></p><p><i>italic</i></p><p><b>ld</b></p>');
        });
    });
    describe('deleteContents', function () {
        var $cont, $b;
        beforeEach(function () {
            $cont = jquery_1["default"]('<div class="note-editable"><p><b>bold</b><u>u</u></p></div>');
            $b = $cont.find('b');
        });
        it('should remove text only for partial text', function () {
            var rng = range_1["default"].create($b[0].firstChild, 1, $b[0].firstChild, 3);
            rng.deleteContents();
            expect($cont.html()).to.equalsIgnoreCase('<p><b>bd</b><u>u</u></p>');
        });
        it('should remove text for entire text', function () {
            var rng = range_1["default"].create($b[0].firstChild, 0, $b[0].firstChild, 4);
            rng.deleteContents();
            expect($cont.html()).to.equalsIgnoreCase('<p><b></b><u>u</u></p>');
        });
    });
    describe('wrapBodyInlineWithPara', function () {
        it('should insert an empty paragraph when there is no contents', function () {
            var $cont = jquery_1["default"]('<div class="note-editable"></div>');
            var rng = range_1["default"].create($cont[0], 0);
            rng.wrapBodyInlineWithPara();
            expect($cont.html()).to.equalsIgnoreCase('<p><br></p>');
        });
        it('should wrap text with paragraph for text', function () {
            var $cont = jquery_1["default"]('<div class="note-editable">text</div>');
            var rng = range_1["default"].create($cont[0].firstChild, 2);
            rng.wrapBodyInlineWithPara();
            expect($cont.html()).to.equalsIgnoreCase('<p>text</p>');
        });
        it('should wrap an inline node with paragraph when selecting text in the inline node', function () {
            var $cont = jquery_1["default"]('<div class="note-editable"><b>bold</b></div>');
            var $b = $cont.find('b');
            var rng = range_1["default"].create($b[0].firstChild, 2);
            rng.wrapBodyInlineWithPara();
            expect($cont.html()).to.equalsIgnoreCase('<p><b>bold</b></p>');
        });
        it('should wrap inline nodes with paragraph when selecting text in the inline nodes', function () {
            var $cont = jquery_1["default"]('<div class="note-editable"><b>b</b><i>i</i></div>');
            var rng = range_1["default"].create($cont[0], 0);
            rng.wrapBodyInlineWithPara();
            expect($cont.html()).to.equalsIgnoreCase('<p><b>b</b><i>i</i></p>');
        });
        it('should wrap inline nodes with paragraph when selection some of text in the inline nodes #1', function () {
            var $cont = jquery_1["default"]('<div class="note-editable"><b>b</b><i>i</i></div>');
            var rng = range_1["default"].create($cont[0], 1);
            rng.wrapBodyInlineWithPara();
            expect($cont.html()).to.equalsIgnoreCase('<p><b>b</b><i>i</i></p>');
        });
        it('should wrap inline nodes with paragraph when selection some of text in the inline nodes #2', function () {
            var $cont = jquery_1["default"]('<div class="note-editable"><b>b</b><i>i</i></div>');
            var rng = range_1["default"].create($cont[0], 2);
            rng.wrapBodyInlineWithPara();
            expect($cont.html()).to.equalsIgnoreCase('<p><b>b</b><i>i</i></p>');
        });
    });
    describe('getWordRange', function () {
        var $cont;
        before(function () {
            $cont = jquery_1["default"]('<div class="note-editable">super simple wysiwyg editor</div>');
        });
        it('should return the range itself when there is no word before cursor', function () {
            var rng = range_1["default"].create($cont[0].firstChild, 0).getWordRange();
            expect(rng.sc).to.deep.equal($cont[0].firstChild);
            expect(rng.so).to.equal(0);
            expect(rng.ec).to.deep.equal($cont[0].firstChild);
            expect(rng.eo).to.equal(0);
        });
        it('should return expanded range when there is a word before cursor', function () {
            var rng = range_1["default"].create($cont[0].firstChild, 5).getWordRange();
            expect(rng.sc).to.deep.equal($cont[0].firstChild);
            expect(rng.so).to.equal(0);
            expect(rng.ec).to.deep.equal($cont[0].firstChild);
            expect(rng.eo).to.equal(5);
        });
        it('should return expanded range when there is a half word before cursor', function () {
            var rng = range_1["default"].create($cont[0].firstChild, 3).getWordRange();
            expect(rng.sc).to.deep.equal($cont[0].firstChild);
            expect(rng.so).to.equal(0);
            expect(rng.ec).to.deep.equal($cont[0].firstChild);
            expect(rng.eo).to.equal(3);
        });
        it('should return expanded range when there are words before cursor', function () {
            var rng = range_1["default"].create($cont[0].firstChild, 12).getWordRange();
            expect(rng.sc).to.deep.equal($cont[0].firstChild);
            expect(rng.so).to.equal(6);
            expect(rng.ec).to.deep.equal($cont[0].firstChild);
            expect(rng.eo).to.equal(12);
        });
    });
});
 
},'test/base/core/range.spec.js',{"chai":"/Users/lqez/Dev/summernote/node_modules/chai/index.js","../../chaidom":"/Users/lqez/Dev/summernote/test/chaidom.js","jquery":"/Users/lqez/Dev/summernote/node_modules/jquery/dist/jquery.js","../../../src/js/base/core/dom":"/Users/lqez/Dev/summernote/src/js/base/core/dom.js","../../../src/js/base/core/range":"/Users/lqez/Dev/summernote/src/js/base/core/range.js"}];})(this);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2Uuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJhbmdlLnNwZWMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7O0FBRUgsNkJBQXdCO0FBQ3hCLHlDQUFvQztBQUNwQyxpQ0FBdUI7QUFDdkIscURBQWdEO0FBQ2hELHlEQUFvRDtBQUVwRCxJQUFJLE1BQU0sR0FBRyxpQkFBSSxDQUFDLE1BQU0sQ0FBQztBQUN6QixpQkFBSSxDQUFDLEdBQUcsQ0FBQyxvQkFBTyxDQUFDLENBQUM7QUFFbEIsUUFBUSxDQUFDLGlCQUFpQixFQUFFO0lBQzFCLFFBQVEsQ0FBQyxPQUFPLEVBQUU7UUFDaEIsUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLEtBQUssQ0FBQztZQUNWLE1BQU0sQ0FBQztnQkFDTCxJQUFJLEtBQUssR0FBRyxtQkFBQyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7Z0JBQzNFLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLHVDQUF1QyxFQUFFO2dCQUMxQyxJQUFJLEdBQUcsR0FBRyxrQkFBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN2RSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxnQkFBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0UsQ0FBQyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUU7Z0JBQ3ZDLElBQUksR0FBRyxHQUFHLGtCQUFLLENBQUMsTUFBTSxD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QixJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFekIsSUFBSSxHQUFHLEdBQUcsa0JBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdkQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDL0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1REFBdUQsRUFBRTtZQUMxRCxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFekIsSUFBSSxHQUFHLEdBQUcsa0JBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdkQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDL0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5RUFBeUUsRUFBRTtZQUM1RSxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekIsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV6QixJQUFJLEdBQUcsR0FBRyxrQkFBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzdFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMvQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUVBQXVFLEVBQUU7WUFDMUUsSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV6QixJQUFJLEdBQUcsR0FBRyxrQkFBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzdFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMvQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFB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QUFDO1lBRTlELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsRCxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaUVBQWlFLEVBQUU7WUFDcEUsSUFBSSxHQUFHLEdBQUcsa0JBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUU5RCxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsRCxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHNFQUFzRSxFQUFFO1lBQ3pFLElBQUksR0FBRyxHQUFHLGtCQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFOUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDbEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxpRUFBaUUsRUFBRTtZQUNwRSxJQUFJLEdBQUcsR0FBRyxrQkFBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBRS9ELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsRCxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByYW5nZS5zcGVjLmpzXG4gKiAoYykgMjAxM34gQWxhbiBIb25nXG4gKiBzdW1tZXJub3RlIG1heSBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLi9cbiAqL1xuXG5pbXBvcnQgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCBjaGFpZG9tIGZyb20gJy4uLy4uL2NoYWlkb20nO1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBkb20gZnJvbSAnLi4vLi4vLi4vc3JjL2pzL2Jhc2UvY29yZS9kb20nO1xuaW1wb3J0IHJhbmdlIGZyb20gJy4uLy4uLy4uL3NyYy9qcy9iYXNlL2NvcmUvcmFuZ2UnO1xuXG52YXIgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5jaGFpLnVzZShjaGFpZG9tKTtcblxuZGVzY3JpYmUoJ2Jhc2U6Y29yZS5yYW5nZScsICgpID0+IHtcbiAgZGVzY3JpYmUoJ25vZGVzJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCcxIGRlcHRoJywgKCkgPT4ge1xuICAgICAgdmFyICRwYXJhO1xuICAgICAgYmVmb3JlKCgpID0+IHtcbiAgICAgICAgdmFyICRjb250ID0gJCgnPGRpdiBjbGFzcz1cIm5vdGUtZWRpdGFibGVcIj48cD5wYXJhMTwvcD48cD5wYXJhMjwvcD48L2Rpdj4nKTtcbiAgICAgICAgJHBhcmEgPSAkY29udC5maW5kKCdwJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYXJyYXkgb2YgdHdvIHBhcmFncmFwaHMnLCAoKSA9PiB7XG4gICAgICAgIHZhciBybmcgPSByYW5nZS5jcmVhdGUoJHBhcmFbMF0uZmlyc3RDaGlsZCwgMCwgJHBhcmFbMV0uZmlyc3RDaGlsZCwgMSk7XG4gICAgICAgIGV4cGVjdChybmcubm9kZXMoZG9tLmlzUGFyYSwgeyBpbmNsdWRlQW5jZXN0b3I6IHRydWUgfSkpLnRvLmhhdmUubGVuZ3RoKDIpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGFycmF5IG9mIGEgcGFyYWdyYXBoJywgKCkgPT4ge1xuICAgICAgICB2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCRwYXJhWzBdLmZpcnN0Q2hpbGQsIDAsICRwYXJhWzBdLmZpcnN0Q2hpbGQsIDApO1xuICAgICAgICBleHBlY3Qocm5nLm5vZGVzKGRvbS5pc1BhcmEsIHsgaW5jbHVkZUFuY2VzdG9yOiB0cnVlIH0pKS50by5oYXZlLmxlbmd0aCgxKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ211bHRpIGRlcHRoJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYXJyYXkgb2YgYSBwYXJhZ3JhcGgnLCAoKSA9PiB7XG4gICAgICAgIHZhciAkY29udCA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLWVkaXRhYmxlXCI+PHA+cDxiPmFyPC9iPmExPC9wPjxwPnBhcmEyPC9wPjwvZGl2PicpO1xuICAgICAgICB2YXIgJGIgPSAkY29udC5maW5kKCdiJyk7XG4gICAgICAgIHZhciBybmcgPSByYW5nZS5jcmVhdGUoJGJbMF0uZmlyc3RDaGlsZCwgMCwgJGJbMF0uZmlyc3RDaGlsZCwgMCk7XG5cbiAgICAgICAgZXhwZWN0KHJuZy5ub2Rlcyhkb20uaXNQYXJhLCB7IGluY2x1ZGVBbmNlc3RvcjogdHJ1ZSB9KSkudG8uaGF2ZS5sZW5ndGgoMSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvbiBsaXN0LCBvbiBoZWFkaW5nJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYXJyYXkgb2YgbGlzdCBwYXJhZ3JhcGhzJywgKCkgPT4ge1xuICAgICAgICB2YXIgJGNvbnQgPSAkKCc8ZGl2IGNsYXNzPVwibm90ZS1lZGl0YWJsZVwiPjx1bD48bGk+cGFyYTE8L2xpPjxsaT5wYXJhMjwvbGk+PC91bD48L2Rpdj4nKTtcbiAgICAgICAgdmFyICRsaSA9ICRjb250LmZpbmQoJ2xpJyk7XG4gICAgICAgIHZhciBybmcgPSByYW5nZS5jcmVhdGUoJGxpWzBdLmZpcnN0Q2hpbGQsIDAsICRsaVsxXS5maXJzdENoaWxkLCAxKTtcblxuICAgICAgICBleHBlY3Qocm5nLm5vZGVzKGRvbS5pc1BhcmEsIHsgaW5jbHVkZUFuY2VzdG9yOiB0cnVlIH0pKS50by5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJldHVybiBhcnJheSBvZiBsaXN0IHBhcmFncmFwaHMnLCAoKSA9PiB7XG4gICAgICAgIHZhciAkY29udCA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLWVkaXRhYmxlXCI+PGgxPmhlYWRpbmcxPC9oMT48aDI+aGVhZGluZzI8L2gyPjwvZGl2PicpO1xuICAgICAgICB2YXIgJGgxID0gJGNvbnQuZmluZCgnaDEnKTtcbiAgICAgICAgdmFyICRoMiA9ICRjb250LmZpbmQoJ2gyJyk7XG4gICAgICAgIHZhciBybmcgPSByYW5nZS5jcmVhdGUoJGgxWzBdLmZpcnN0Q2hpbGQsIDAsICRoMlswXS5maXJzdENoaWxkLCAxKTtcblxuICAgICAgICBleHBlY3Qocm5nLm5vZGVzKGRvbS5pc1BhcmEsIHsgaW5jbHVkZUFuY2VzdG9yOiB0cnVlIH0pKS50by5oYXZlLmxlbmd0aCgyKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29tbW9uQW5jZXN0b3InLCAoKSA9PiB7XG4gICAgdmFyICRjb250O1xuICAgIGJlZm9yZSgoKSA9PiB7XG4gICAgICAkY29udCA9ICQoJzxkaXY+PHNwYW4+PGI+YjwvYj48dT51PC91Pjwvc3Bhbj48L2Rpdj4nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIDxzcGFuPiBmb3IgPGI+fGI8L2I+IGFuZCA8dT51fDwvdT4nLCAoKSA9PiB7XG4gICAgICB2YXIgJHNwYW4gPSAkY29udC5maW5kKCdzcGFuJyk7XG4gICAgICB2YXIgJGIgPSAkY29udC5maW5kKCdiJyk7XG4gICAgICB2YXIgJHUgPSAkY29udC5maW5kKCd1Jyk7XG5cbiAgICAgIHZhciBybmcgPSByYW5nZS5jcmVhdGUoJGJbMF0uZmlyc3RDaGlsZCwgMCwgJHVbMF0uZmlyc3RDaGlsZCwgMSk7XG4gICAgICBleHBlY3Qocm5nLmNvbW1vbkFuY2VzdG9yKCkpLnRvLmRlZXAuZXF1YWwoJHNwYW5bMF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYigjdGV4dE5vZGUpIGZvciA8Yj58Ynw8L2I+JywgKCkgPT4ge1xuICAgICAgdmFyICRiID0gJGNvbnQuZmluZCgnYicpO1xuXG4gICAgICB2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCRiWzBdLmZpcnN0Q2hpbGQsIDAsICRiWzBdLmZpcnN0Q2hpbGQsIDEpO1xuICAgICAgZXhwZWN0KHJuZy5jb21tb25BbmNlc3RvcigpKS50by5kZWVwLmVxdWFsKCRiWzBdLmZpcnN0Q2hpbGQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZXhwYW5kJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIDxiPnxiPC9iPiB+IDx1PnV8PC91PiBmb3IgPGI+fGI8L2I+IHdpdGggaXNBbmNob3InLCAoKSA9PiB7XG4gICAgICB2YXIgJGNvbnQgPSAkKCc8ZGl2PjxhPjxiPmI8L2I+PHU+dTwvdT48L2E+PC9kaXY+Jyk7XG4gICAgICB2YXIgJGFuY2hvciA9ICRjb250LmZpbmQoJ2EnKTtcbiAgICAgIHZhciAkYiA9ICRjb250LmZpbmQoJ2InKTtcblxuICAgICAgdmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgkYlswXS5maXJzdENoaWxkLCAwLCAkYlswXS5maXJzdENoaWxkLCAwKS5leHBhbmQoZG9tLmlzQW5jaG9yKTtcbiAgICAgIGV4cGVjdChybmcuc2MpLnRvLmRlZXAuZXF1YWwoJGFuY2hvclswXSk7XG4gICAgICBleHBlY3Qocm5nLnNvKS50by5lcXVhbCgwKTtcbiAgICAgIGV4cGVjdChybmcuZWMpLnRvLmRlZXAuZXF1YWwoJGFuY2hvclswXSk7XG4gICAgICBleHBlY3Qocm5nLmVvKS50by5lcXVhbCgyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NvbGxhcHNlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIDx1PnV8PC91PiBmb3IgPGI+fGI8L2I+IH4gPHU+dXw8L3U+JywgKCkgPT4ge1xuICAgICAgdmFyICRjb250ID0gJCgnPGRpdj48Yj5iPC9iPjx1PnU8L3U+PC9kaXY+Jyk7XG4gICAgICB2YXIgJGIgPSAkY29udC5maW5kKCdiJyk7XG4gICAgICB2YXIgJHUgPSAkY29udC5maW5kKCd1Jyk7XG5cbiAgICAgIHZhciBybmcgPSByYW5nZS5jcmVhdGUoJGJbMF0uZmlyc3RDaGlsZCwgMCwgJHVbMF0uZmlyc3RDaGlsZCwgMSkuY29sbGFwc2UoKTtcbiAgICAgIGV4cGVjdChybmcuc2MpLnRvLmRlZXAuZXF1YWwoJHVbMF0uZmlyc3RDaGlsZCk7XG4gICAgICBleHBlY3Qocm5nLnNvKS50by5lcXVhbCgxKTtcbiAgICAgIGV4cGVjdChybmcuZWMpLnRvLmRlZXAuZXF1YWwoJHVbMF0uZmlyc3RDaGlsZCk7XG4gICAgICBleHBlY3Qocm5nLmVvKS50by5lcXVhbCgxKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ25vcm1hbGl6ZScsICgpID0+IHtcbiAgICB2YXIgJGNvbnQ7XG4gICAgYmVmb3JlKCgpID0+IHtcbiAgICAgICRjb250ID0gJCgnPGRpdj48cD48Yj5iPC9iPjx1PnU8L3U+PHM+czwvcz48L3A+PC9kaXY+Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiA8Yj58YjwvYj4gfiA8dT51fDwvdT4gZm9yIHw8Yj5iPC9iPiB+IDx1PnU8L3U+fCcsICgpID0+IHtcbiAgICAgIHZhciAkcCA9ICRjb250LmZpbmQoJ3AnKTtcbiAgICAgIHZhciAkYiA9ICRjb250LmZpbmQoJ2InKTtcbiAgICAgIHZhciAkdSA9ICRjb250LmZpbmQoJ3UnKTtcblxuICAgICAgdmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgkcFswXSwgMCwgJHBbMF0sIDIpLm5vcm1hbGl6ZSgpO1xuICAgICAgZXhwZWN0KHJuZy5zYykudG8uZGVlcC5lcXVhbCgkYlswXS5maXJzdENoaWxkKTtcbiAgICAgIGV4cGVjdChybmcuc28pLnRvLmVxdWFsKDApO1xuICAgICAgZXhwZWN0KHJuZy5lYykudG8uZGVlcC5lcXVhbCgkdVswXS5maXJzdENoaWxkKTtcbiAgICAgIGV4cGVjdChybmcuZW8pLnRvLmVxdWFsKDEpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gPGI+Ynw8L2I+PHU+dTwvdT4gZm9yIDxiPmI8L2I+fDx1PnU8L3U+JywgKCkgPT4ge1xuICAgICAgdmFyICRwID0gJGNvbnQuZmluZCgncCcpO1xuICAgICAgdmFyICRiID0gJGNvbnQuZmluZCgnYicpO1xuXG4gICAgICB2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCRwWzBdLCAxLCAkcFswXSwgMSkubm9ybWFsaXplKCk7XG4gICAgICBleHBlY3Qocm5nLnNjKS50by5kZWVwLmVxdWFsKCRiWzBdLmZpcnN0Q2hpbGQpO1xuICAgICAgZXhwZWN0KHJuZy5zbykudG8uZXF1YWwoMSk7XG4gICAgICBleHBlY3Qocm5nLmVjKS50by5kZWVwLmVxdWFsKCRiWzBdLmZpcnN0Q2hpbGQpO1xuICAgICAgZXhwZWN0KHJuZy5lbykudG8uZXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiA8Yj5iPC9iPjx1Pnx1fDwvdT48cz5zPC9zPiBmb3IgPGI+Ynw8L2I+PHU+dTwvdT48cz58czwvcz4nLCAoKSA9PiB7XG4gICAgICB2YXIgJGIgPSAkY29udC5maW5kKCdiJyk7XG4gICAgICB2YXIgJHUgPSAkY29udC5maW5kKCd1Jyk7XG4gICAgICB2YXIgJHMgPSAkY29udC5maW5kKCdzJyk7XG5cbiAgICAgIHZhciBybmcgPSByYW5nZS5jcmVhdGUoJGJbMF0uZmlyc3RDaGlsZCwgMSwgJHNbMF0uZmlyc3RDaGlsZCwgMCkubm9ybWFsaXplKCk7XG4gICAgICBleHBlY3Qocm5nLnNjKS50by5kZWVwLmVxdWFsKCR1WzBdLmZpcnN0Q2hpbGQpO1xuICAgICAgZXhwZWN0KHJuZy5zbykudG8uZXF1YWwoMCk7XG4gICAgICBleHBlY3Qocm5nLmVjKS50by5kZWVwLmVxdWFsKCR1WzBdLmZpcnN0Q2hpbGQpO1xuICAgICAgZXhwZWN0KHJuZy5lbykudG8uZXF1YWwoMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiA8Yj5ifDwvYj48dT51PC91PjxzPnM8L3M+IGZvciA8Yj5ifDwvYj48dT51PC91PjxzPnM8L3M+JywgKCkgPT4ge1xuICAgICAgdmFyICRiID0gJGNvbnQuZmluZCgnYicpO1xuXG4gICAgICB2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCRiWzBdLmZpcnN0Q2hpbGQsIDEsICRiWzBdLmZpcnN0Q2hpbGQsIDEpLm5vcm1hbGl6ZSgpO1xuICAgICAgZXhwZWN0KHJuZy5zYykudG8uZGVlcC5lcXVhbCgkYlswXS5maXJzdENoaWxkKTtcbiAgICAgIGV4cGVjdChybmcuc28pLnRvLmVxdWFsKDEpO1xuICAgICAgZXhwZWN0KHJuZy5lYykudG8uZGVlcC5lcXVhbCgkYlswXS5maXJzdENoaWxkKTtcbiAgICAgIGV4cGVjdChybmcuZW8pLnRvLmVxdWFsKDEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9ybWFsaXplIChibG9jayBtb2RlKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiA8cD50ZXh0PC9wPjxwPnw8YnI+PC9wPiBmb3IgPHA+dGV4dDwvcD48cD58PGJyPjwvcD4nLCAoKSA9PiB7XG4gICAgICB2YXIgJGNvbnQgPSAkKCc8ZGl2PjxwPnRleHQ8L3A+PHA+PGJyPjwvcD48L2Rpdj4nKTtcbiAgICAgIHZhciAkcCA9ICRjb250LmZpbmQoJ3AnKTtcblxuICAgICAgdmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgkcFsxXSwgMCwgJHBbMV0sIDApLm5vcm1hbGl6ZSgpO1xuICAgICAgZXhwZWN0KHJuZy5zYykudG8uZGVlcC5lcXVhbCgkcFsxXSk7XG4gICAgICBleHBlY3Qocm5nLnNvKS50by5lcXVhbCgwKTtcbiAgICAgIGV4cGVjdChybmcuZWMpLnRvLmRlZXAuZXF1YWwoJHBbMV0pO1xuICAgICAgZXhwZWN0KHJuZy5lbykudG8uZXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiA8cD50ZXh0PC9wPjxwPnx0ZXh0PC9wPiBmb3IgPHA+dGV4dDwvcD48cD58dGV4dDwvcD4nLCAoKSA9PiB7XG4gICAgICB2YXIgJGNvbnQgPSAkKCc8ZGl2PjxwPnRleHQ8L3A+PHA+dGV4dDwvcD48L2Rpdj4nKTtcbiAgICAgIHZhciAkcCA9ICRjb250LmZpbmQoJ3AnKTtcblxuICAgICAgdmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgkcFsxXSwgMCwgJHBbMV0sIDApLm5vcm1hbGl6ZSgpO1xuICAgICAgZXhwZWN0KHJuZy5zYykudG8uZGVlcC5lcXVhbCgkcFsxXS5maXJzdENoaWxkKTtcbiAgICAgIGV4cGVjdChybmcuc28pLnRvLmVxdWFsKDApO1xuICAgICAgZXhwZWN0KHJuZy5lYykudG8uZGVlcC5lcXVhbCgkcFsxXS5maXJzdENoaWxkKTtcbiAgICAgIGV4cGVjdChybmcuZW8pLnRvLmVxdWFsKDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gPHA+fHRleHQ8L3A+PHA+dGV4dHw8L3A+IGZvciB8PHA+dGV4dDwvcD48cD50ZXh0PC9wPnwnLCAoKSA9PiB7XG4gICAgICB2YXIgJGNvbnQgPSAkKCc8ZGl2IGNsYXNzPVwibm90ZS1lZGl0YWJsZVwiPjxwPnRleHQ8L3A+PHA+dGV4dDwvcD48L2Rpdj4nKTtcbiAgICAgIHZhciAkcCA9ICRjb250LmZpbmQoJ3AnKTtcblxuICAgICAgdmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgkY29udFswXSwgMCwgJGNvbnRbMF0sIDIpLm5vcm1hbGl6ZSgpO1xuICAgICAgZXhwZWN0KHJuZy5zYykudG8uZGVlcC5lcXVhbCgkcFswXS5maXJzdENoaWxkKTtcbiAgICAgIGV4cGVjdChybmcuc28pLnRvLmVxdWFsKDApO1xuICAgICAgZXhwZWN0KHJuZy5lYykudG8uZGVlcC5lcXVhbCgkcFsxXS5maXJzdENoaWxkKTtcbiAgICAgIGV4cGVjdChybmcuZW8pLnRvLmVxdWFsKDQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9ybWFsaXplICh2b2lkIGVsZW1lbnQpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIDxwPjxpbWc+fDxiPmJvbGQ8L2I+PC9wPiBmb3IgPHA+PGltZz58PGI+Ym9sZDwvYj48L3A+JywgKCkgPT4ge1xuICAgICAgdmFyICRjb250ID0gJCgnPGRpdj48cD48aW1nPjxiPmJvbGQ8L2I+PC9wPjwvZGl2PicpO1xuICAgICAgdmFyICRwID0gJGNvbnQuZmluZCgncCcpO1xuICAgICAgdmFyICRiID0gJGNvbnQuZmluZCgnYicpO1xuXG4gICAgICB2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCRwWzBdLCAxLCAkcFswXSwgMSkubm9ybWFsaXplKCk7XG4gICAgICBleHBlY3Qocm5nLnNjKS50by5kZWVwLmVxdWFsKCRiWzBdLmZpcnN0Q2hpbGQpO1xuICAgICAgZXhwZWN0KHJuZy5zbykudG8uZXF1YWwoMCk7XG4gICAgICBleHBlY3Qocm5nLmVjKS50by5kZWVwLmVxdWFsKCRiWzBdLmZpcnN0Q2hpbGQpO1xuICAgICAgZXhwZWN0KHJuZy5lbykudG8uZXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiA8cD48aW1nPnx0ZXh0PjwvcD4gZm9yIDxwPjxpbWc+fHRleHQ+PC9wPicsICgpID0+IHtcbiAgICAgIHZhciAkY29udCA9ICQoJzxkaXY+PHA+PGltZz5ib2xkPC9wPjwvZGl2PicpO1xuICAgICAgdmFyICRpbWcgPSAkY29udC5maW5kKCdpbWcnKTtcbiAgICAgIHZhciB0ZXh0ID0gJGltZ1swXS5uZXh0U2libGluZztcblxuICAgICAgdmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSh0ZXh0LCAwLCB0ZXh0LCAwKS5ub3JtYWxpemUoKTtcbiAgICAgIGV4cGVjdChybmcuc2MpLnRvLmVxdWFsKHRleHQpO1xuICAgICAgZXhwZWN0KHJuZy5zbykudG8uZXF1YWwoMCk7XG4gICAgICBleHBlY3Qocm5nLmlzQ29sbGFwc2VkKCkpLnRvLnRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbnNlcnROb2RlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc3BsaXQgcGFyYWdyYXBoIHdoZW4gaW5zZXJ0aW5nIGEgYmxvY2sgZWxlbWVudCcsICgpID0+IHtcbiAgICAgIHZhciAkY29udCA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLWVkaXRhYmxlXCI+PHA+PGI+Ym9sZDwvYj48L3A+PC9kaXY+Jyk7XG4gICAgICB2YXIgJGIgPSAkY29udC5maW5kKCdiJyk7XG4gICAgICB2YXIgJHAyID0gJCgnPHA+cDwvcD4nKTtcblxuICAgICAgdmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgkYlswXS5maXJzdENoaWxkLCAyLCAkYlswXS5maXJzdENoaWxkLCAyKTtcbiAgICAgIHJuZy5pbnNlcnROb2RlKCRwMlswXSk7XG5cbiAgICAgIGV4cGVjdCgkY29udC5odG1sKCkpLnRvLmVxdWFsc0lnbm9yZUNhc2UoJzxwPjxiPmJvPC9iPjwvcD48cD5wPC9wPjxwPjxiPmxkPC9iPjwvcD4nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHNwbGl0IHBhcmFncmFwaCB3aGVuIGluc2VydGluZyBhbiBpbmxpbmUgZWxlbWVudCcsICgpID0+IHtcbiAgICAgIHZhciAkY29udCA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLWVkaXRhYmxlXCI+PHA+dGV4dDwvcD48L2Rpdj4nKTtcbiAgICAgIHZhciAkcCA9ICRjb250LmZpbmQoJ3AnKTtcbiAgICAgIHZhciAkdSA9ICQoJzx1PnU8L3U+Jyk7XG5cbiAgICAgIHZhciBybmcgPSByYW5nZS5jcmVhdGUoJHBbMF0uZmlyc3RDaGlsZCwgMiwgJHBbMF0uZmlyc3RDaGlsZCwgMik7XG4gICAgICBybmcuaW5zZXJ0Tm9kZSgkdVswXSk7XG4gICAgICBleHBlY3QoJGNvbnQuaHRtbCgpKS50by5lcXVhbHNJZ25vcmVDYXNlKCc8cD50ZTx1PnU8L3U+eHQ8L3A+Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBzcGxpdCBwYXJhZ3JhcGggd2hlbiBpbnNlcnRpbmcgYW4gaW5saW5lIGVsZW1lbnQgY2FzZSAyJywgKCkgPT4ge1xuICAgICAgdmFyICRjb250ID0gJCgnPGRpdiBjbGFzcz1cIm5vdGUtZWRpdGFibGVcIj48cD48Yj5ib2xkPC9iPjwvcD48L2Rpdj4nKTtcbiAgICAgIHZhciAkYiA9ICRjb250LmZpbmQoJ2InKTtcbiAgICAgIHZhciAkdSA9ICQoJzx1PnU8L3U+Jyk7XG5cbiAgICAgIHZhciBybmcgPSByYW5nZS5jcmVhdGUoJGJbMF0uZmlyc3RDaGlsZCwgMiwgJGJbMF0uZmlyc3RDaGlsZCwgMik7XG4gICAgICBybmcuaW5zZXJ0Tm9kZSgkdVswXSk7XG4gICAgICBleHBlY3QoJGNvbnQuaHRtbCgpKS50by5lcXVhbHNJZ25vcmVDYXNlKCc8cD48Yj5ibzwvYj48dT51PC91PjxiPmxkPC9iPjwvcD4nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Bhc3RlSFRNTCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIG5vdCBzcGxpdCBhIGJsb2NrIGVsZW1lbnQgd2hlbiBpbnNlcnRpbmcgaW5saW5lIGVsZW1lbnRzIGludG8gaXQnLCAoKSA9PiB7XG4gICAgICB2YXIgJGNvbnQgPSAkKCc8ZGl2IGNsYXNzPVwibm90ZS1lZGl0YWJsZVwiPjxwPnRleHQ8L3A+PC9kaXY+Jyk7XG4gICAgICB2YXIgJHAgPSAkY29udC5maW5kKCdwJyk7XG4gICAgICB2YXIgbWFya3VwID0gJzxzcGFuPnNwYW48L3NwYW4+PGk+aXRhbGljPC9pPic7XG5cbiAgICAgIHZhciBybmcgPSByYW5nZS5jcmVhdGUoJHBbMF0uZmlyc3RDaGlsZCwgMik7XG4gICAgICBybmcucGFzdGVIVE1MKG1hcmt1cCk7XG5cbiAgICAgIGV4cGVjdCgkY29udC5odG1sKCkpLnRvLmVxdWFsc0lnbm9yZUNhc2UoJzxwPnRlPHNwYW4+c3Bhbjwvc3Bhbj48aT5pdGFsaWM8L2k+eHQ8L3A+Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNwbGl0IGFuIGlubGluZSBlbGVtZW50IHdoZW4gcGFzdGluZyBpbmxpbmUgZWxlbWVudHMgaW50byBpdCcsICgpID0+IHtcbiAgICAgIHZhciAkY29udCA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLWVkaXRhYmxlXCI+PHA+PGI+Ym9sZDwvYj48L3A+PC9kaXY+Jyk7XG4gICAgICB2YXIgJGIgPSAkY29udC5maW5kKCdiJyk7XG4gICAgICB2YXIgbWFya3VwID0gJzxzcGFuPnNwYW48L3NwYW4+PGk+aXRhbGljPC9pPic7XG5cbiAgICAgIHZhciBybmcgPSByYW5nZS5jcmVhdGUoJGJbMF0uZmlyc3RDaGlsZCwgMik7XG4gICAgICBybmcucGFzdGVIVE1MKG1hcmt1cCk7XG5cbiAgICAgIGV4cGVjdCgkY29udC5odG1sKCkpLnRvLmVxdWFsc0lnbm9yZUNhc2UoJzxwPjxiPmJvPC9iPjxzcGFuPnNwYW48L3NwYW4+PGk+aXRhbGljPC9pPjxiPmxkPC9iPjwvcD4nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3BsaXQgaW5saW5lIG5vZGUgd2hlbiBwYXN0aW5nIGFuIGlubGluZSBub2RlIGFuZCBhIGJsb2NrIG5vZGUgaW50byBpdCcsICgpID0+IHtcbiAgICAgIHZhciAkY29udCA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLWVkaXRhYmxlXCI+PHA+PGI+Ym9sZDwvYj48L3A+PC9kaXY+Jyk7XG4gICAgICB2YXIgJGIgPSAkY29udC5maW5kKCdiJyk7XG4gICAgICB2YXIgbWFya3VwID0gJzxzcGFuPnNwYW48L3NwYW4+PHA+PGk+aXRhbGljPC9pPjwvcD4nO1xuXG4gICAgICB2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCRiWzBdLmZpcnN0Q2hpbGQsIDIpO1xuICAgICAgcm5nLnBhc3RlSFRNTChtYXJrdXApO1xuXG4gICAgICBleHBlY3QoJGNvbnQuaHRtbCgpKS50by5lcXVhbHNJZ25vcmVDYXNlKCc8cD48Yj5ibzwvYj48c3Bhbj5zcGFuPC9zcGFuPjwvcD48cD48aT5pdGFsaWM8L2k+PC9wPjxwPjxiPmxkPC9iPjwvcD4nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlbGV0ZUNvbnRlbnRzJywgKCkgPT4ge1xuICAgIHZhciAkY29udCwgJGI7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICAkY29udCA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLWVkaXRhYmxlXCI+PHA+PGI+Ym9sZDwvYj48dT51PC91PjwvcD48L2Rpdj4nKTtcbiAgICAgICRiID0gJGNvbnQuZmluZCgnYicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgdGV4dCBvbmx5IGZvciBwYXJ0aWFsIHRleHQnLCAoKSA9PiB7XG4gICAgICB2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCRiWzBdLmZpcnN0Q2hpbGQsIDEsICRiWzBdLmZpcnN0Q2hpbGQsIDMpO1xuICAgICAgcm5nLmRlbGV0ZUNvbnRlbnRzKCk7XG5cbiAgICAgIGV4cGVjdCgkY29udC5odG1sKCkpLnRvLmVxdWFsc0lnbm9yZUNhc2UoJzxwPjxiPmJkPC9iPjx1PnU8L3U+PC9wPicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgdGV4dCBmb3IgZW50aXJlIHRleHQnLCAoKSA9PiB7XG4gICAgICB2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCRiWzBdLmZpcnN0Q2hpbGQsIDAsICRiWzBdLmZpcnN0Q2hpbGQsIDQpO1xuICAgICAgcm5nLmRlbGV0ZUNvbnRlbnRzKCk7XG5cbiAgICAgIGV4cGVjdCgkY29udC5odG1sKCkpLnRvLmVxdWFsc0lnbm9yZUNhc2UoJzxwPjxiPjwvYj48dT51PC91PjwvcD4nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dyYXBCb2R5SW5saW5lV2l0aFBhcmEnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBpbnNlcnQgYW4gZW1wdHkgcGFyYWdyYXBoIHdoZW4gdGhlcmUgaXMgbm8gY29udGVudHMnLCAoKSA9PiB7XG4gICAgICB2YXIgJGNvbnQgPSAkKCc8ZGl2IGNsYXNzPVwibm90ZS1lZGl0YWJsZVwiPjwvZGl2PicpO1xuXG4gICAgICB2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCRjb250WzBdLCAwKTtcbiAgICAgIHJuZy53cmFwQm9keUlubGluZVdpdGhQYXJhKCk7XG5cbiAgICAgIGV4cGVjdCgkY29udC5odG1sKCkpLnRvLmVxdWFsc0lnbm9yZUNhc2UoJzxwPjxicj48L3A+Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHdyYXAgdGV4dCB3aXRoIHBhcmFncmFwaCBmb3IgdGV4dCcsICgpID0+IHtcbiAgICAgIHZhciAkY29udCA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLWVkaXRhYmxlXCI+dGV4dDwvZGl2PicpO1xuXG4gICAgICB2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCRjb250WzBdLmZpcnN0Q2hpbGQsIDIpO1xuICAgICAgcm5nLndyYXBCb2R5SW5saW5lV2l0aFBhcmEoKTtcblxuICAgICAgZXhwZWN0KCRjb250Lmh0bWwoKSkudG8uZXF1YWxzSWdub3JlQ2FzZSgnPHA+dGV4dDwvcD4nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgd3JhcCBhbiBpbmxpbmUgbm9kZSB3aXRoIHBhcmFncmFwaCB3aGVuIHNlbGVjdGluZyB0ZXh0IGluIHRoZSBpbmxpbmUgbm9kZScsICgpID0+IHtcbiAgICAgIHZhciAkY29udCA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLWVkaXRhYmxlXCI+PGI+Ym9sZDwvYj48L2Rpdj4nKTtcbiAgICAgIHZhciAkYiA9ICRjb250LmZpbmQoJ2InKTtcblxuICAgICAgdmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgkYlswXS5maXJzdENoaWxkLCAyKTtcbiAgICAgIHJuZy53cmFwQm9keUlubGluZVdpdGhQYXJhKCk7XG5cbiAgICAgIGV4cGVjdCgkY29udC5odG1sKCkpLnRvLmVxdWFsc0lnbm9yZUNhc2UoJzxwPjxiPmJvbGQ8L2I+PC9wPicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB3cmFwIGlubGluZSBub2RlcyB3aXRoIHBhcmFncmFwaCB3aGVuIHNlbGVjdGluZyB0ZXh0IGluIHRoZSBpbmxpbmUgbm9kZXMnLCAoKSA9PiB7XG4gICAgICB2YXIgJGNvbnQgPSAkKCc8ZGl2IGNsYXNzPVwibm90ZS1lZGl0YWJsZVwiPjxiPmI8L2I+PGk+aTwvaT48L2Rpdj4nKTtcblxuICAgICAgdmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgkY29udFswXSwgMCk7XG4gICAgICBybmcud3JhcEJvZHlJbmxpbmVXaXRoUGFyYSgpO1xuXG4gICAgICBleHBlY3QoJGNvbnQuaHRtbCgpKS50by5lcXVhbHNJZ25vcmVDYXNlKCc8cD48Yj5iPC9iPjxpPmk8L2k+PC9wPicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB3cmFwIGlubGluZSBub2RlcyB3aXRoIHBhcmFncmFwaCB3aGVuIHNlbGVjdGlvbiBzb21lIG9mIHRleHQgaW4gdGhlIGlubGluZSBub2RlcyAjMScsICgpID0+IHtcbiAgICAgIHZhciAkY29udCA9ICQoJzxkaXYgY2xhc3M9XCJub3RlLWVkaXRhYmxlXCI+PGI+YjwvYj48aT5pPC9pPjwvZGl2PicpO1xuXG4gICAgICB2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCRjb250WzBdLCAxKTtcbiAgICAgIHJuZy53cmFwQm9keUlubGluZVdpdGhQYXJhKCk7XG5cbiAgICAgIGV4cGVjdCgkY29udC5odG1sKCkpLnRvLmVxdWFsc0lnbm9yZUNhc2UoJzxwPjxiPmI8L2I+PGk+aTwvaT48L3A+Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHdyYXAgaW5saW5lIG5vZGVzIHdpdGggcGFyYWdyYXBoIHdoZW4gc2VsZWN0aW9uIHNvbWUgb2YgdGV4dCBpbiB0aGUgaW5saW5lIG5vZGVzICMyJywgKCkgPT4ge1xuICAgICAgdmFyICRjb250ID0gJCgnPGRpdiBjbGFzcz1cIm5vdGUtZWRpdGFibGVcIj48Yj5iPC9iPjxpPmk8L2k+PC9kaXY+Jyk7XG5cbiAgICAgIHZhciBybmcgPSByYW5nZS5jcmVhdGUoJGNvbnRbMF0sIDIpO1xuICAgICAgcm5nLndyYXBCb2R5SW5saW5lV2l0aFBhcmEoKTtcblxuICAgICAgZXhwZWN0KCRjb250Lmh0bWwoKSkudG8uZXF1YWxzSWdub3JlQ2FzZSgnPHA+PGI+YjwvYj48aT5pPC9pPjwvcD4nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFdvcmRSYW5nZScsICgpID0+IHtcbiAgICB2YXIgJGNvbnQ7XG4gICAgYmVmb3JlKCgpID0+IHtcbiAgICAgICRjb250ID0gJCgnPGRpdiBjbGFzcz1cIm5vdGUtZWRpdGFibGVcIj5zdXBlciBzaW1wbGUgd3lzaXd5ZyBlZGl0b3I8L2Rpdj4nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSByYW5nZSBpdHNlbGYgd2hlbiB0aGVyZSBpcyBubyB3b3JkIGJlZm9yZSBjdXJzb3InLCAoKSA9PiB7XG4gICAgICB2YXIgcm5nID0gcmFuZ2UuY3JlYXRlKCRjb250WzBdLmZpcnN0Q2hpbGQsIDApLmdldFdvcmRSYW5nZSgpO1xuXG4gICAgICBleHBlY3Qocm5nLnNjKS50by5kZWVwLmVxdWFsKCRjb250WzBdLmZpcnN0Q2hpbGQpO1xuICAgICAgZXhwZWN0KHJuZy5zbykudG8uZXF1YWwoMCk7XG4gICAgICBleHBlY3Qocm5nLmVjKS50by5kZWVwLmVxdWFsKCRjb250WzBdLmZpcnN0Q2hpbGQpO1xuICAgICAgZXhwZWN0KHJuZy5lbykudG8uZXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBleHBhbmRlZCByYW5nZSB3aGVuIHRoZXJlIGlzIGEgd29yZCBiZWZvcmUgY3Vyc29yJywgKCkgPT4ge1xuICAgICAgdmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgkY29udFswXS5maXJzdENoaWxkLCA1KS5nZXRXb3JkUmFuZ2UoKTtcblxuICAgICAgZXhwZWN0KHJuZy5zYykudG8uZGVlcC5lcXVhbCgkY29udFswXS5maXJzdENoaWxkKTtcbiAgICAgIGV4cGVjdChybmcuc28pLnRvLmVxdWFsKDApO1xuICAgICAgZXhwZWN0KHJuZy5lYykudG8uZGVlcC5lcXVhbCgkY29udFswXS5maXJzdENoaWxkKTtcbiAgICAgIGV4cGVjdChybmcuZW8pLnRvLmVxdWFsKDUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZXhwYW5kZWQgcmFuZ2Ugd2hlbiB0aGVyZSBpcyBhIGhhbGYgd29yZCBiZWZvcmUgY3Vyc29yJywgKCkgPT4ge1xuICAgICAgdmFyIHJuZyA9IHJhbmdlLmNyZWF0ZSgkY29udFswXS5maXJzdENoaWxkLCAzKS5nZXRXb3JkUmFuZ2UoKTtcblxuICAgICAgZXhwZWN0KHJuZy5zYykudG8uZGVlcC5lcXVhbCgkY29udFswXS5maXJzdENoaWxkKTtcbiAgICAgIGV4cGVjdChybmcuc28pLnRvLmVxdWFsKDApO1xuICAgICAgZXhwZWN0KHJuZy5lYykudG8uZGVlcC5lcXVhbCgkY29udFswXS5maXJzdENoaWxkKTtcbiAgICAgIGV4cGVjdChybmcuZW8pLnRvLmVxdWFsKDMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZXhwYW5kZWQgcmFuZ2Ugd2hlbiB0aGVyZSBhcmUgd29yZHMgYmVmb3JlIGN1cnNvcicsICgpID0+IHtcbiAgICAgIHZhciBybmcgPSByYW5nZS5jcmVhdGUoJGNvbnRbMF0uZmlyc3RDaGlsZCwgMTIpLmdldFdvcmRSYW5nZSgpO1xuXG4gICAgICBleHBlY3Qocm5nLnNjKS50by5kZWVwLmVxdWFsKCRjb250WzBdLmZpcnN0Q2hpbGQpO1xuICAgICAgZXhwZWN0KHJuZy5zbykudG8uZXF1YWwoNik7XG4gICAgICBleHBlY3Qocm5nLmVjKS50by5kZWVwLmVxdWFsKCRjb250WzBdLmZpcnN0Q2hpbGQpO1xuICAgICAgZXhwZWN0KHJuZy5lbykudG8uZXF1YWwoMTIpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19