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 | 1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
20×
20×
20×
20×
20×
20×
20×
20×
20×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
1×
| (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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnV0dG9ucy5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiQnV0dG9ucy5zcGVjLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7OztHQUlHOztBQUVILDZCQUF3QjtBQUN4QixpQ0FBdUI7QUFDdkIscURBQWdEO0FBQ2hELHlEQUFvRDtBQUNwRCx3REFBbUQ7QUFDbkQsd0NBQXNDO0FBRXRDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7SUFDbEIsSUFBSSxNQUFNLEdBQUcsaUJBQUksQ0FBQyxNQUFNLENBQUM7SUFDekIsSUFBSSxNQUFNLEdBQUcsaUJBQUksQ0FBQyxNQUFNLENBQUM7SUFDekIsSUFBSSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQztJQUVqQyxVQUFVLENBQUM7UUFDVCxtQkFBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsY0FBYztRQUNqQyxJQUFJLEtBQUssR0FBRyxtQkFBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFELElBQUksT0FBTyxHQUFHLG1CQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxtQkFBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRCxPQUFPLENBQUMsT0FBTyxHQUFHO1lBQ2hCLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzdCLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUN2RixDQUFDLE9BQU8sRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNuQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDOUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ25DLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLENBQUMsTUFBTSxFQUFFLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUM3QyxDQUFDO1FBQ0YsT0FBTyxHQUFHLElBQUksb0JBQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRXJCLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUN0QyxTQUFTLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFFeEMsZUFBZTtRQUNmLG1EQUFtRDtRQUNuRCxnREFBZ0Q7UUFDaEQsSUFBSSxnQkFBRyxDQUFDLElBQUksSUFBSSxnQkFBRyxDQUFDLE1BQU0sSUFBSSxnQkFBRyxDQUFDLE1BQU0sRUFBRTtZQUN4QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDYjtJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGFBQWEsRUFBRTtRQUN0QixFQUFFLENBQUMsZ0RBQWdELEVBQUU7WUFDbkQsa0JBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBRWxFLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQywyQkFBMkIsRUFBRTtRQUNwQyxFQUFFLENBQUMsOENBQThDLEVBQUU7WUFDakQsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUMzQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxlQUFlLEVBQUU7UUFDeEIsRUFBRSxDQUFDLGtEQUFrRCxFQUFFO1lBQ3JELGtCQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUVsRSxRQUFRLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDMUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsNkJBQTZCLEVBQUU7UUFDdEMsRUFBRSxDQUFDLDhDQUE4QyxFQUFFO1lBQ2pELElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDcEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDM0MsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsa0JBQWtCLEVBQUU7UUFDM0IsRUFBRSxDQUFDLHFEQUFxRCxFQUFFO1lBQ3hELGtCQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUVsRSxRQUFRLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDN0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZ0NBQWdDLEVBQUU7UUFDekMsRUFBRSxDQUFDLDhDQUE4QyxFQUFFO1lBQ2pELElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNuRCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDcEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDM0MsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsb0JBQW9CLEVBQUU7UUFDN0IsRUFBRSxDQUFDLHVEQUF1RCxFQUFFO1lBQzFELGtCQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUVsRSxRQUFRLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDL0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsa0NBQWtDLEVBQUU7UUFDM0MsRUFBRSxDQUFDLDhDQUE4QyxFQUFFO1lBQ2pELElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUNyRCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDcEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDM0MsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsa0JBQWtCLEVBQUU7UUFDM0IsRUFBRSxDQUFDLHFEQUFxRCxFQUFFO1lBQ3hELGtCQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUVsRSxRQUFRLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDN0MsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZ0NBQWdDLEVBQUU7UUFDekMsRUFBRSxDQUFDLDhDQUE4QyxFQUFFO1lBQ2pELElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNuRCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDcEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDM0MsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsc0JBQXNCLEVBQUU7UUFDL0IsRUFBRSxDQUFDLHlEQUF5RCxFQUFFO1lBQzVELGtCQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUVsRSxRQUFRLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ2hGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsb0NBQW9DLEVBQUU7UUFDN0MsRUFBRSxDQUFDLDhDQUE4QyxFQUFFO1lBQ2pELElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUN2RCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDcEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDM0MsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsNkNBQTZDLEVBQUU7UUFDdEQsRUFBRSxDQUFDLHdDQUF3QyxFQUFFO1lBQzNDLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMzRCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDcEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDM0MsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3JFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsb0JBQW9CLEVBQUU7UUFDN0IsRUFBRSxDQUFDLGtGQUFrRixFQUFFO1lBQ3JGLG1EQUFtRDtZQUNuRCxrRkFBa0Y7WUFDbEYsMkRBQTJEO1lBQzNELG1DQUFtQztZQUNuQyxtREFBbUQ7WUFDbkQsZUFBZTtZQUNmLG1EQUFtRDtRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHlDQUF5QyxFQUFFO1FBQ2xELEVBQUUsQ0FBQyxpREFBaUQsRUFBRTtZQUNwRCxrQkFBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFFbEUsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRTVFLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsdUNBQXVDLEVBQUU7UUFDaEQsRUFBRSxDQUFDLHNEQUFzRCxFQUFFO1lBQ3pELGtCQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUVsRSxJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JGLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUVoQixJQUFJLEtBQUssR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx1Q0FBdUMsRUFBRTtRQUNoRCxFQUFFLENBQUMsc0RBQXNELEVBQUU7WUFDekQsa0JBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBRWxFLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckYsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRWhCLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUM3RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1DQUFtQyxFQUFFO1FBQzVDLEVBQUUsQ0FBQyxzREFBc0QsRUFBRTtZQUN6RCxrQkFBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFFbEUsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFaEIsSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHdDQUF3QyxFQUFFO1FBQ2pELEVBQUUsQ0FBQyxzREFBc0QsRUFBRTtZQUN6RCxrQkFBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFFbEUsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0RixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFaEIsSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQzdFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMscUNBQXFDLEVBQUU7UUFDOUMsRUFBRSxDQUFDLDhEQUE4RCxFQUFFO1lBQ2pFLElBQUksaUJBQWlCLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQzVELElBQUksZUFBZSxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzRCxJQUFJLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEQsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBRXhCLDJCQUEyQjtZQUMzQixlQUFlLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pDLHFCQUFxQjtZQUNyQixhQUFhLENBQUMsTUFBTSxDQUFDLGVBQWUsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTdFLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnV0dG9ucy5zcGVjLmpzXG4gKiAoYykgMjAxNX4gU3VtbWVybm90ZSBUZWFtXG4gKiBzdW1tZXJub3RlIG1heSBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLi9cbiAqL1xuXG5pbXBvcnQgY2hhaSBmcm9tICdjaGFpJztcbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgZW52IGZyb20gJy4uLy4uLy4uL3NyYy9qcy9iYXNlL2NvcmUvZW52JztcbmltcG9ydCByYW5nZSBmcm9tICcuLi8uLi8uLi9zcmMvanMvYmFzZS9jb3JlL3JhbmdlJztcbmltcG9ydCBDb250ZXh0IGZyb20gJy4uLy4uLy4uL3NyYy9qcy9iYXNlL0NvbnRleHQnO1xuaW1wb3J0ICcuLi8uLi8uLi9zcmMvanMvYnM0L3NldHRpbmdzJztcblxuZGVzY3JpYmUoJ0J1dHRvbnMnLCAoKSA9PiB7XG4gIHZhciBleHBlY3QgPSBjaGFpLmV4cGVjdDtcbiAgdmFyIGFzc2VydCA9IGNoYWkuYXNzZXJ0O1xuICB2YXIgY29udGV4dCwgJHRvb2xiYXIsICRlZGl0YWJsZTtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uKCkge1xuICAgICQoJ2JvZHknKS5lbXB0eSgpOyAvLyBpbXBvcnRhbnQgIVxuICAgIHZhciAkbm90ZSA9ICQoJzxkaXY+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
|