1 | (function (require, global) {
|
2 | require = (function (cache, modules, cx) {
|
3 | var loader = function (r) {
|
4 | if (!modules[r]) throw new Error(r + ' is not a module');
|
5 | return cache[r] ? cache[r].exports : ((cache[r] = {
|
6 | exports: {}
|
7 | }, cache[r].exports = modules[r].call(cx, require, cache[r], cache[r].exports)));
|
8 | };
|
9 | loader.modules = modules;
|
10 | return loader;
|
11 | })({}, {
|
12 | "entry.js": function (require, module, exports) {
|
13 | var chai, checkChildStructure, creator, elementSuffix, expect, i, j, len, len1, nonElementSuffix, ref, ref1, ref2, ref3, ref4, restartSandbox, sandbox;
|
14 | this.dimensions = require("simulate.coffee");
|
15 | this.Dom = this.DOM = window.quickdom;
|
16 | mocha.setup('tdd');
|
17 | mocha.slow(400);
|
18 | mocha.timeout(12000);
|
19 | if (!window.location.hostname) {
|
20 | mocha.bail();
|
21 | }
|
22 | chai = require("node_modules/chai/index.js");
|
23 | chai.use(require("node_modules/chai-style/sources/index.js"));
|
24 | chai.config.truncateThreshold = 1e3;
|
25 | ({expect} = chai);
|
26 | sandbox = null;
|
27 | restartSandbox = function () {
|
28 | if (sandbox) {
|
29 | sandbox.parentElement.removeChild(sandbox);
|
30 | }
|
31 | sandbox = document.createElement('div');
|
32 | sandbox.id = 'sandbox';
|
33 | sandbox.setAttribute('style', 'border:1px solid; padding:20px; box-sizing:border-box');
|
34 | return document.body.appendChild(sandbox);
|
35 | };
|
36 | checkChildStructure = function (main) {
|
37 | return function (...children) {
|
38 | var child, i, index, len;
|
39 | expect(main.children.length).to.equal(children.length);
|
40 | for ((index = i = 0, len = children.length); i < len; index = ++i) {
|
41 | child = children[index];
|
42 | expect(main.children[index]).to.equal(child);
|
43 | expect(child.el.parentNode).to.equal(main.el);
|
44 | expect(child.parent).to.equal(main);
|
45 | }
|
46 | };
|
47 | };
|
48 | suite("QuickDom", function () {
|
49 | setup(restartSandbox);
|
50 | test("Version Property", function () {
|
51 | var packageVersion;
|
52 | packageVersion = "1.0.89";
|
53 | return expect(Dom.version).to.equal(packageVersion);
|
54 | });
|
55 | suite("Element Creation", function () {
|
56 | test("Basic Creation", function () {
|
57 | var div;
|
58 | div = Dom('div');
|
59 | expect(typeof div).to.equal('object');
|
60 | expect(typeof div.el).to.equal('object');
|
61 | expect(div.el).to.be.instanceOf(window.HTMLDivElement);
|
62 | expect(div.parent).to.be.undefined;
|
63 | return expect(div.children.length).to.equal(0);
|
64 | });
|
65 | test("Shortcuts", function () {
|
66 | var i, len, type, types;
|
67 | expect(Dom.a().el.constructor).to.equal(Dom('a').el.constructor);
|
68 | expect(Dom.link().el.constructor).to.equal(Dom('a').el.constructor);
|
69 | expect(Dom.anchor().el.constructor).to.equal(Dom('a').el.constructor);
|
70 | expect(Dom.div().el.constructor).to.equal(Dom('div').el.constructor);
|
71 | expect(Dom.text().el.constructor).to.equal(Dom('text').el.constructor);
|
72 | expect(Dom.span().el.constructor).to.equal(Dom('span').el.constructor);
|
73 | expect(Dom.h4().el.constructor).to.equal(Dom('h4').el.constructor);
|
74 | expect(Dom.header().el.constructor).to.equal(Dom('header').el.constructor);
|
75 | expect(Dom.footer().el.constructor).to.equal(Dom('footer').el.constructor);
|
76 | expect(Dom.section().el.constructor).to.equal(Dom('section').el.constructor);
|
77 | expect(Dom.button().el.constructor).to.equal(Dom('button').el.constructor);
|
78 | expect(Dom.input().el.constructor).to.equal(Dom('input').el.constructor);
|
79 | types = ['a', 'div', 'text', 'span', 'h4', 'header', 'footer', 'section', 'button', 'input'];
|
80 | for ((i = 0, len = types.length); i < len; i++) {
|
81 | type = types[i];
|
82 | expect(Dom[type]().el.constructor.name).not.to.contain('Unknown');
|
83 | }
|
84 | });
|
85 | test("Basic options", function () {
|
86 | var A, B, C, D, E, F, G, H, I, J, obj;
|
87 | A = Dom.div({
|
88 | class: 'abc-123',
|
89 | props: {
|
90 | 'abc': 123,
|
91 | 'def': 456
|
92 | }
|
93 | });
|
94 | B = Dom.div({
|
95 | id: 'B',
|
96 | className: 'abc-123',
|
97 | attrs: {
|
98 | 'data-abc': 123,
|
99 | 'data-def': 456
|
100 | }
|
101 | });
|
102 | C = Dom.input({
|
103 | type: 'text',
|
104 | name: 'abc',
|
105 | value: 'hello'
|
106 | });
|
107 | D = Dom.input({
|
108 | type: 'checkbox',
|
109 | checked: true
|
110 | });
|
111 | E = Dom.option({
|
112 | name: 'abc',
|
113 | value: 'hello',
|
114 | selected: true
|
115 | });
|
116 | F = Dom.link({
|
117 | href: 'https://google.com/'
|
118 | });
|
119 | G = Dom.anchor({
|
120 | url: 'https://google.com/'
|
121 | });
|
122 | H = Dom.text('Some text');
|
123 | I = Dom.img({
|
124 | src: 'https://google.com/'
|
125 | });
|
126 | J = Dom.div({
|
127 | relatedInstance: obj = {
|
128 | a: 1
|
129 | }
|
130 | });
|
131 | expect(A.el.className).to.equal('abc-123');
|
132 | expect(A.el.abc).to.equal(123);
|
133 | expect(A.el.def).to.equal(456);
|
134 | expect(B.el.className).to.equal('abc-123');
|
135 | expect(B.el.id).to.equal('B');
|
136 | expect(B.el.getAttribute('data-abc')).to.equal('123');
|
137 | expect(B.el.getAttribute('data-def')).to.equal('456');
|
138 | if (B.el.dataset) {
|
139 | expect(B.el.dataset.abc).to.equal('123');
|
140 | }
|
141 | expect(C.el.type).to.equal('text');
|
142 | expect(C.el.name).to.equal('abc');
|
143 | expect(C.el.value).to.equal('hello');
|
144 | expect(D.el.checked).to.equal(true);
|
145 | expect(E.el.name).to.equal('abc');
|
146 | expect(E.el.selected).to.equal(true);
|
147 | expect(F.el.href).to.equal('https://google.com/');
|
148 | expect(G.el.href).to.equal('https://google.com/');
|
149 | expect(H.el.nodeType).to.equal(3);
|
150 | expect(H.el.textContent).to.equal('Some text');
|
151 | expect(I.el.src).to.equal('https://google.com/');
|
152 | expect(J.related).to.equal(obj);
|
153 | return expect(J.options.related).to.equal(obj);
|
154 | });
|
155 | test("Creation w/ children", function () {
|
156 | var A, B;
|
157 | A = Dom.div(null, 'Some text');
|
158 | B = Dom.div(null, Dom.span(), 'Some text', Dom.span());
|
159 | expect(A.el.childNodes.length).to.equal(1);
|
160 | expect(A.el.children.length).to.equal(0);
|
161 | expect(A.el.childNodes[0].nodeType).to.equal(3);
|
162 | expect(A.el.childNodes[0].textContent).to.equal('Some text');
|
163 | expect(A.children.length).to.equal(1);
|
164 | expect(B.el.childNodes.length).to.equal(3);
|
165 | expect(B.el.children.length).to.equal(2);
|
166 | expect(B.el.childNodes[0].nodeType).to.equal(1);
|
167 | expect(B.el.childNodes[0].nodeName.toLowerCase()).to.equal('span');
|
168 | expect(B.el.childNodes[1].nodeType).to.equal(3);
|
169 | expect(B.el.childNodes[1].textContent).to.equal('Some text');
|
170 | expect(B.el.childNodes[2].nodeType).to.equal(1);
|
171 | expect(B.el.childNodes[2].nodeName.toLowerCase()).to.equal('span');
|
172 | return expect(B.children.length).to.equal(3);
|
173 | });
|
174 | test("Array syntax", function () {
|
175 | var section;
|
176 | section = Dom(['section', {
|
177 | style: {
|
178 | display: 'inline'
|
179 | }
|
180 | }, ['div', null, 'childA'], ['span', null, ['strong', null, 'childB']], ['div', null, 'childC', ['span', null, 'childC_1'], ['span', null, 'childC_2']]]).appendTo(sandbox);
|
181 | expect(section).not.to.equal(void 0);
|
182 | expect(section.raw).to.have.style('display', 'inline');
|
183 | expect(section.children.length).to.equal(3);
|
184 | expect(section.children[0].children.length).to.equal(1);
|
185 | expect(section.children[1].children.length).to.equal(1);
|
186 | expect(section.children[2].children.length).to.equal(3);
|
187 | expect(section.children[2].children[1].children.length).to.equal(1);
|
188 | expect(section.children[2].children[2].children.length).to.equal(1);
|
189 | expect(section.children[0].text).to.equal('childA');
|
190 | expect(section.children[1].text).to.equal('childB');
|
191 | expect(section.children[2].text).to.equal('childCchildC_1childC_2');
|
192 | expect(section.children[2].children[1].text).to.equal('childC_1');
|
193 | return expect(section.children[2].children[2].text).to.equal('childC_2');
|
194 | });
|
195 | test("Existing Element", function () {
|
196 | var A, B, C, divRaw;
|
197 | divRaw = document.createElement('div');
|
198 | A = Dom(divRaw);
|
199 | B = Dom(divRaw);
|
200 | C = Dom(A);
|
201 | expect(A.el).to.equal(divRaw);
|
202 | expect(B.el).to.equal(divRaw);
|
203 | expect(C.el).to.equal(divRaw);
|
204 | expect(A).to.equal(B);
|
205 | expect(B).to.equal(C);
|
206 | return expect(C).to.equal(divRaw._quickElement);
|
207 | });
|
208 | test("Existing Element w/ Options", function () {
|
209 | var div, divRaw;
|
210 | divRaw = document.createElement('div');
|
211 | divRaw.id = 'A';
|
212 | div = Dom(divRaw, {
|
213 | id: 'B',
|
214 | class: 'abc-123'
|
215 | });
|
216 | expect(divRaw.id).to.equal('B');
|
217 | expect(divRaw.className).to.equal('abc-123');
|
218 | div = Dom(div, {
|
219 | id: 'C',
|
220 | class: 'def-456'
|
221 | });
|
222 | expect(divRaw.id).to.equal('C');
|
223 | return expect(divRaw.className).to.equal('def-456');
|
224 | });
|
225 | test("Existing Element from array-like objects", function () {
|
226 | var A, B, C, parent, rawA, rawB, rawC;
|
227 | rawA = document.createElement('div');
|
228 | rawB = document.createElement('div');
|
229 | rawC = document.createElement('div');
|
230 | parent = document.createElement('section');
|
231 | parent.appendChild(rawA);
|
232 | parent.appendChild(rawB);
|
233 | parent.appendChild(rawC);
|
234 | A = Dom([rawA, rawB, rawC]);
|
235 | B = Dom(parent.querySelectorAll('div'));
|
236 | C = Dom(B);
|
237 | expect(A.el).to.equal(rawA);
|
238 | expect(B.el).to.equal(rawA);
|
239 | expect(C.el).to.equal(rawA);
|
240 | expect(A).to.equal(B);
|
241 | expect(B).to.equal(C);
|
242 | return expect(C).to.equal(rawA._quickElement);
|
243 | });
|
244 | test("Document node", function () {
|
245 | var doc;
|
246 | doc = Dom(document);
|
247 | expect(doc).not.to.be.undefined;
|
248 | expect(doc.raw).to.equal(document);
|
249 | expect(doc.parent).to.equal(void 0);
|
250 | expect(doc.children.length).to.equal(1);
|
251 | expect(Dom(sandbox).parents).not.to.contain(doc);
|
252 | return expect(Dom(sandbox).parents).to.contain(doc.children[0]);
|
253 | });
|
254 | test("Window object", function () {
|
255 | var win;
|
256 | win = Dom(window);
|
257 | expect(win).not.to.be.undefined;
|
258 | expect(win.raw === window).to.be.true;
|
259 | expect(win.parent).to.equal(void 0);
|
260 | expect(win.children).to.equal(void 0);
|
261 | expect(win.append).to.equal(void 0);
|
262 | expect(win.html).to.equal(void 0);
|
263 | expect(win.style).to.equal(void 0);
|
264 | return expect(Dom(sandbox).parents).not.to.contain(win);
|
265 | });
|
266 | test("Creation w/ styling", function () {
|
267 | var computedStyle, div;
|
268 | div = Dom.div({
|
269 | style: {
|
270 | 'width': '10px',
|
271 | 'height': 15,
|
272 | 'lameo': '19px',
|
273 | 'background-color': 'blue',
|
274 | 'backgroundSize': 'cover'
|
275 | }
|
276 | });
|
277 | sandbox.appendChild(div.el);
|
278 | computedStyle = getComputedStyle(div.el);
|
279 | expect(div.style.lameo).to.equal(void 0);
|
280 | expect(computedStyle.lameo).to.equal(void 0);
|
281 | expect(computedStyle.width).to.equal('10px');
|
282 | expect(computedStyle.height).to.equal('15px');
|
283 | expect(computedStyle.backgroundColor).not.to.equal('');
|
284 | return expect(computedStyle.backgroundSize).to.equal('cover');
|
285 | });
|
286 | test("SVG elements can be created via a '*' in the element's type string", function () {
|
287 | var regDiv, svgBad, svgDiv, svgGood, svgPolyBad, svgPolyGood;
|
288 | svgBad = Dom('svg').el;
|
289 | svgGood = Dom('*svg').el;
|
290 | svgPolyBad = Dom('polyline').el;
|
291 | svgPolyGood = Dom('*polyline').el;
|
292 | svgDiv = Dom('*div').el;
|
293 | regDiv = Dom('div').el;
|
294 | expect(svgBad).to.be.instanceOf(HTMLUnknownElement);
|
295 | expect(svgPolyBad).to.be.instanceOf(HTMLUnknownElement);
|
296 | expect(svgGood).to.be.instanceOf(SVGSVGElement);
|
297 | expect(svgPolyGood).to.be.instanceOf(SVGPolylineElement);
|
298 | return expect(svgDiv.constructor).not.to.equal(regDiv.constructor);
|
299 | });
|
300 | test("QuickDom.html() accepts an html string which would be parsed and converted into a QuickBatch instance", function () {
|
301 | var htmlString;
|
302 | htmlString = "<div>firstChildText</div><span>secondChildText</span> textNode <strong>abc123</strong>";
|
303 | window.batch = Dom.html(htmlString);
|
304 | expect(typeof batch).to.equal('object');
|
305 | expect(batch.constructor.name).to.equal('QuickBatch');
|
306 | expect(batch.elements.length).to.equal(4);
|
307 | expect(batch.elements[0].type).to.equal('div');
|
308 | expect(batch.elements[1].type).to.equal('span');
|
309 | expect(batch.elements[2].type).to.equal('text');
|
310 | expect(batch.elements[3].type).to.equal('strong');
|
311 | expect(batch.elements[0].text).to.equal('firstChildText');
|
312 | expect(batch.elements[1].text).to.equal('secondChildText');
|
313 | expect(batch.elements[2].text).to.include('textNode');
|
314 | return expect(batch.elements[3].text).to.equal('abc123');
|
315 | });
|
316 | test("Method/Property aliases", function () {
|
317 | var div;
|
318 | div = Dom('div');
|
319 | expect(div.raw).to.equal(div.el);
|
320 | expect(div[0]).to.equal(div.el);
|
321 | expect(div.css).to.equal(div.style);
|
322 | expect(div.replaceWith).to.equal(div.replace);
|
323 | expect(div.removeListener).to.equal(div.off);
|
324 | return expect(div.removeListener('eventA'));
|
325 | });
|
326 | return test("user-defined methdods/getters/setters", function () {
|
327 | var divA, divB;
|
328 | divA = Dom.div();
|
329 | divB = Dom.div({
|
330 | methods: {
|
331 | scrollTop: {
|
332 | get: function () {
|
333 | return this.raw.scrollTop;
|
334 | }
|
335 | },
|
336 | weight: {
|
337 | get: function () {
|
338 | return this.raw.weight;
|
339 | }
|
340 | },
|
341 | value: {
|
342 | get: function () {
|
343 | return this.raw.value;
|
344 | },
|
345 | set: function (value) {
|
346 | return this.raw.value = value;
|
347 | }
|
348 | },
|
349 | name: true,
|
350 | bigIndex: function () {
|
351 | return this.index * 10;
|
352 | }
|
353 | }
|
354 | });
|
355 | sandbox.append(divA);
|
356 | sandbox.append(divB);
|
357 | divA.raw.value = divB.raw.value = 'abc';
|
358 | expect(typeof divA.scrollTop).to.equal('undefined');
|
359 | expect(typeof divB.scrollTop).to.equal('number');
|
360 | expect(typeof divA.value).to.equal('undefined');
|
361 | expect(typeof divB.value).to.equal('string');
|
362 | expect(typeof divA.name).to.equal('undefined');
|
363 | expect(typeof divB.name).to.equal('undefined');
|
364 | expect(typeof divA.bigIndex).to.equal('undefined');
|
365 | expect(typeof divB.bigIndex).to.equal('function');
|
366 | expect(divB.scrollTop).to.equal(divB.raw.scrollTop);
|
367 | divB.raw.weight = '1';
|
368 | expect(divB.weight).to.equal('1');
|
369 | divB.weight = '2';
|
370 | expect(divB.weight).to.equal('1');
|
371 | expect(divB.value).to.equal('abc');
|
372 | divB.value = '123';
|
373 | expect(divB.value).to.equal('123');
|
374 | return expect(divB.bigIndex()).to.equal(divB.index * 10);
|
375 | });
|
376 | });
|
377 | suite("Events", function () {
|
378 | test("Events can be listened to via the .on method", function () {
|
379 | var div, emitCountA, emitCountB;
|
380 | emitCountA = emitCountB = 0;
|
381 | div = Dom.div();
|
382 | div.on('myClick', function (event) {
|
383 | expect(typeof event).to.equal('object');
|
384 | expect(event.type).to.equal('myClick');
|
385 | return emitCountA++;
|
386 | });
|
387 | div.el.emitEvent('myClick');
|
388 | expect(emitCountA).to.equal(1);
|
389 | div.el.emitEvent('myClick');
|
390 | expect(emitCountA).to.equal(2);
|
391 | div.on('myClick', function (event) {
|
392 | return emitCountB++;
|
393 | });
|
394 | div.el.emitEvent('myClick');
|
395 | expect(emitCountB).to.equal(1);
|
396 | expect(emitCountA).to.equal(3);
|
397 | div.el.emitEvent('myClick');
|
398 | expect(emitCountB).to.equal(2);
|
399 | return expect(emitCountA).to.equal(4);
|
400 | });
|
401 | test("Events can be emitted via the .emit method", function () {
|
402 | var div, emitCountA, emitCountB;
|
403 | emitCountA = emitCountB = 0;
|
404 | div = Dom.div();
|
405 | div.on('myEvent', function () {
|
406 | return emitCountA++;
|
407 | });
|
408 | div.el.addEventListener('myEvent', function () {
|
409 | return emitCountB++;
|
410 | });
|
411 | expect(emitCountA).to.equal(0);
|
412 | expect(emitCountB).to.equal(0);
|
413 | div.emit('myEvent');
|
414 | expect(emitCountA).to.equal(1);
|
415 | expect(emitCountB).to.equal(1);
|
416 | div.el.emitEvent('myEvent');
|
417 | expect(emitCountA).to.equal(2);
|
418 | return expect(emitCountB).to.equal(2);
|
419 | });
|
420 | test("Event handlers can be manually invoked with a custom arg via the .emitPrivate method", function () {
|
421 | var arg, div, emitCountA, emitCountB;
|
422 | emitCountA = emitCountB = 0;
|
423 | arg = null;
|
424 | div = Dom.div();
|
425 | div.on('myEvent', function () {
|
426 | emitCountA++;
|
427 | return arg = arguments[0];
|
428 | });
|
429 | div.el.addEventListener('myEvent', function () {
|
430 | return emitCountB++;
|
431 | });
|
432 | expect(emitCountA).to.equal(0);
|
433 | expect(emitCountB).to.equal(0);
|
434 | expect(arg).to.equal(null);
|
435 | div.emitPrivate('myEvent');
|
436 | expect(emitCountA).to.equal(1);
|
437 | expect(emitCountB).to.equal(0);
|
438 | expect(arg).to.equal(void 0);
|
439 | div.emitPrivate('myEvent', 'abc123');
|
440 | expect(emitCountA).to.equal(2);
|
441 | expect(emitCountB).to.equal(0);
|
442 | expect(arg).to.equal('abc123');
|
443 | div.el.emitEvent('myEvent');
|
444 | expect(emitCountA).to.equal(3);
|
445 | expect(emitCountB).to.equal(1);
|
446 | expect(arg).not.to.equal('abc123');
|
447 | return expect(typeof arg).to.equal('object');
|
448 | });
|
449 | test("Booleans can be passed for the 2nd and 3rd args of .emit to control event.bubbles and event.cancelable", function () {
|
450 | var div, emitCountA, emitCountB, emitCountC;
|
451 | emitCountA = emitCountB = emitCountC = 0;
|
452 | div = Dom.div();
|
453 | div.on('eventA', function (event) {
|
454 | emitCountA++;
|
455 | expect(event.bubbles).to.be.true;
|
456 | return expect(event.cancelable).to.be.true;
|
457 | });
|
458 | div.on('eventB', function (event) {
|
459 | emitCountB++;
|
460 | expect(event.bubbles).to.be.false;
|
461 | return expect(event.cancelable).to.be.true;
|
462 | });
|
463 | div.on('eventC', function (event) {
|
464 | emitCountC++;
|
465 | expect(event.bubbles).to.be.false;
|
466 | return expect(event.cancelable).to.be.false;
|
467 | });
|
468 | div.emit('eventA');
|
469 | div.emit('eventB', false);
|
470 | div.emit('eventC', false, false);
|
471 | expect(emitCountA).to.equal(1);
|
472 | expect(emitCountB).to.equal(1);
|
473 | return expect(emitCountC).to.equal(1);
|
474 | });
|
475 | test("A data object can be passed as the 4th arg of .emit which will be extended onto the event object", function () {
|
476 | var div, event;
|
477 | div = DOM.div();
|
478 | event = null;
|
479 | div.on('mousedown', function (e) {
|
480 | return event = e;
|
481 | });
|
482 | expect(event).to.equal(null);
|
483 | div.emit('mousedown');
|
484 | expect(event.type).to.equal('mousedown');
|
485 | expect(event.custom).to.equal(void 0);
|
486 | div.emit('mousedown', null, null, {
|
487 | custom: 'custom',
|
488 | abc: 123
|
489 | });
|
490 | expect(event.type).to.equal('mousedown');
|
491 | expect(event.custom).to.equal('custom');
|
492 | expect(event.abc).to.equal(123);
|
493 | div.emit('mousedown', null, null, true);
|
494 | expect(event.type).to.equal('mousedown');
|
495 | return expect(event.custom).to.equal(void 0);
|
496 | });
|
497 | test("Event listeners can be removed via the .off method", function () {
|
498 | var div, emitCountA, emitCountB, emitCountC, emitCountD, eventCB;
|
499 | emitCountA = emitCountB = emitCountC = emitCountD = 0;
|
500 | div = Dom.div();
|
501 | div.on('myEvent', function () {
|
502 | return emitCountA++;
|
503 | });
|
504 | div.on('myEvent', eventCB = function () {
|
505 | return emitCountB++;
|
506 | });
|
507 | div.on('anotherEvent', function () {
|
508 | return emitCountC++;
|
509 | });
|
510 | div.el.addEventListener('myEvent', function () {
|
511 | return emitCountD++;
|
512 | });
|
513 | expect(emitCountA).to.equal(0);
|
514 | expect(emitCountB).to.equal(0);
|
515 | expect(emitCountC).to.equal(0);
|
516 | expect(emitCountD).to.equal(0);
|
517 | div.emit('myEvent');
|
518 | div.emit('anotherEvent');
|
519 | expect(emitCountA).to.equal(1);
|
520 | expect(emitCountB).to.equal(1);
|
521 | expect(emitCountC).to.equal(1);
|
522 | expect(emitCountD).to.equal(1);
|
523 | div.off('myEvent', eventCB);
|
524 | div.emit('myEvent');
|
525 | div.emit('anotherEvent');
|
526 | expect(emitCountA).to.equal(2);
|
527 | expect(emitCountB).to.equal(1);
|
528 | expect(emitCountC).to.equal(2);
|
529 | expect(emitCountD).to.equal(2);
|
530 | div.on('myEvent', function () {
|
531 | return emitCountB++;
|
532 | });
|
533 | div.off('myEvent');
|
534 | div.emit('myEvent');
|
535 | div.emit('anotherEvent');
|
536 | expect(emitCountA).to.equal(2);
|
537 | expect(emitCountB).to.equal(1);
|
538 | expect(emitCountC).to.equal(3);
|
539 | expect(emitCountD).to.equal(3);
|
540 | div.on('myEvent', function () {
|
541 | return emitCountA++;
|
542 | });
|
543 | div.on('myEvent', function () {
|
544 | return emitCountB++;
|
545 | });
|
546 | div.off();
|
547 | div.emit('myEvent');
|
548 | div.emit('anotherEvent');
|
549 | expect(emitCountA).to.equal(2);
|
550 | expect(emitCountB).to.equal(1);
|
551 | expect(emitCountC).to.equal(3);
|
552 | return expect(emitCountD).to.equal(4);
|
553 | });
|
554 | test("Events can be named via a '<event>.<name>' syntax which can be used to remove listeners later on without the original callbacks", function () {
|
555 | var attachListeners, div, emitCountA, emitCountB;
|
556 | emitCountA = emitCountB = 0;
|
557 | div = Dom.div().appendTo(sandbox);
|
558 | attachListeners = function () {
|
559 | div.on('myEvent.someName', function () {
|
560 | return emitCountA++;
|
561 | });
|
562 | return div.on('myEvent', function () {
|
563 | return emitCountB++;
|
564 | });
|
565 | };
|
566 | attachListeners();
|
567 | expect(emitCountA).to.equal(0);
|
568 | expect(emitCountB).to.equal(0);
|
569 | div.emit('myEvent');
|
570 | expect(emitCountA).to.equal(1);
|
571 | expect(emitCountB).to.equal(1);
|
572 | div.emit('myEvent.someName');
|
573 | expect(emitCountA).to.equal(1);
|
574 | expect(emitCountB).to.equal(1);
|
575 | div.off('myEvent.someOtherName');
|
576 | div.emit('myEvent');
|
577 | expect(emitCountA).to.equal(2);
|
578 | expect(emitCountB).to.equal(2);
|
579 | div.off('myEvent.someName');
|
580 | div.emit('myEvent');
|
581 | expect(emitCountA).to.equal(2);
|
582 | expect(emitCountB).to.equal(3);
|
583 | div.off('myEvent');
|
584 | attachListeners();
|
585 | div.emit('myEvent');
|
586 | expect(emitCountA).to.equal(3);
|
587 | expect(emitCountB).to.equal(4);
|
588 | div.off('myEvent');
|
589 | div.emit('myEvent');
|
590 | expect(emitCountA).to.equal(3);
|
591 | return expect(emitCountB).to.equal(4);
|
592 | });
|
593 | test("Multiple events can be registered/deregistered at once using whitespace separators", function () {
|
594 | var div, emitCount;
|
595 | emitCount = 0;
|
596 | div = Dom.div();
|
597 | div.on('one two three', function () {
|
598 | return emitCount++;
|
599 | });
|
600 | expect(emitCount).to.equal(0);
|
601 | div.emit('one');
|
602 | expect(emitCount).to.equal(1);
|
603 | div.emit('two');
|
604 | expect(emitCount).to.equal(2);
|
605 | div.emit('three');
|
606 | expect(emitCount).to.equal(3);
|
607 | div.off('one three');
|
608 | div.emit('one');
|
609 | expect(emitCount).to.equal(3);
|
610 | div.emit('two');
|
611 | expect(emitCount).to.equal(4);
|
612 | div.emit('three');
|
613 | expect(emitCount).to.equal(4);
|
614 | div.off();
|
615 | div.emit('one');
|
616 | div.emit('two');
|
617 | div.emit('three');
|
618 | div.on('one two three.someName', function () {
|
619 | return emitCount++;
|
620 | });
|
621 | div.on('one two three', function () {
|
622 | return emitCount++;
|
623 | });
|
624 | expect(emitCount).to.equal(4);
|
625 | div.emit('one');
|
626 | expect(emitCount).to.equal(6);
|
627 | div.emit('two');
|
628 | expect(emitCount).to.equal(8);
|
629 | div.emit('three');
|
630 | expect(emitCount).to.equal(10);
|
631 | div.off('two \tone.someName');
|
632 | div.emit('one');
|
633 | expect(emitCount).to.equal(11);
|
634 | div.emit('two');
|
635 | expect(emitCount).to.equal(12);
|
636 | div.emit('three');
|
637 | expect(emitCount).to.equal(14);
|
638 | div.off('one three');
|
639 | div.emit('one');
|
640 | expect(emitCount).to.equal(14);
|
641 | div.emit('two');
|
642 | expect(emitCount).to.equal(15);
|
643 | div.emit('three');
|
644 | return expect(emitCount).to.equal(15);
|
645 | });
|
646 | test("Events can be listened for once via the .once method", function () {
|
647 | var div, emitCountA, emitCountB;
|
648 | emitCountA = emitCountB = 0;
|
649 | div = Dom.div();
|
650 | div.once('myClick', function (event) {
|
651 | expect(typeof event).to.equal('object');
|
652 | return expect(event.type).to.equal('myClick');
|
653 | });
|
654 | div.on('myClick', function () {
|
655 | return emitCountA++;
|
656 | });
|
657 | div.once('myClick', function () {
|
658 | return emitCountB++;
|
659 | });
|
660 | expect(emitCountA).to.equal(0);
|
661 | expect(emitCountB).to.equal(0);
|
662 | div.el.emitEvent('myClick');
|
663 | expect(emitCountA).to.equal(1);
|
664 | expect(emitCountB).to.equal(1);
|
665 | div.el.emitEvent('myClick');
|
666 | expect(emitCountA).to.equal(2);
|
667 | expect(emitCountB).to.equal(1);
|
668 | div.once('myClick', function (event) {
|
669 | return emitCountB++;
|
670 | });
|
671 | div.el.emitEvent('myClick');
|
672 | expect(emitCountA).to.equal(3);
|
673 | expect(emitCountB).to.equal(2);
|
674 | div.el.emitEvent('myClick');
|
675 | expect(emitCountA).to.equal(4);
|
676 | return expect(emitCountB).to.equal(2);
|
677 | });
|
678 | test("Pre-defined event listeners can be passed in options.events", function () {
|
679 | var div, divB, emitContext, emitCount, listeners;
|
680 | emitCount = 0;
|
681 | emitContext = null;
|
682 | listeners = {
|
683 | 'one two three': function () {
|
684 | return emitCount++;
|
685 | },
|
686 | 'four': function () {
|
687 | return emitCount++;
|
688 | },
|
689 | 'five': function () {
|
690 | return emitContext = this;
|
691 | }
|
692 | };
|
693 | div = Dom.div({
|
694 | events: listeners
|
695 | });
|
696 | expect(emitCount).to.equal(0);
|
697 | div.emit('one');
|
698 | expect(emitCount).to.equal(1);
|
699 | div.emit('two');
|
700 | expect(emitCount).to.equal(2);
|
701 | div.emit('three');
|
702 | expect(emitCount).to.equal(3);
|
703 | div.emit('four');
|
704 | expect(emitCount).to.equal(4);
|
705 | div.off('one three');
|
706 | div.emit('one');
|
707 | expect(emitCount).to.equal(4);
|
708 | div.emit('two');
|
709 | expect(emitCount).to.equal(5);
|
710 | div.emit('three');
|
711 | expect(emitCount).to.equal(5);
|
712 | div.emit('five');
|
713 | expect(emitContext).to.equal(div);
|
714 | div.off();
|
715 | div.emit('one');
|
716 | div.emit('two');
|
717 | div.emit('three');
|
718 | div.emit('four');
|
719 | expect(emitCount).to.equal(5);
|
720 | divB = Dom.div({
|
721 | events: listeners
|
722 | });
|
723 | divB.emit('one');
|
724 | divB.emit('three');
|
725 | expect(emitCount).to.equal(7);
|
726 | expect(emitContext).to.equal(div);
|
727 | divB.emit('five');
|
728 | return expect(emitContext).to.equal(divB);
|
729 | });
|
730 | test("the inserted event will be privately emitted when the element is inserted into the DOM", function () {
|
731 | var div, invokeCount, masterParentB, parentA, parentB, parentC;
|
732 | invokeCount = 0;
|
733 | parentA = Dom.section();
|
734 | parentB = Dom.section();
|
735 | masterParentB = Dom.div();
|
736 | parentC = Dom.section().appendTo(sandbox);
|
737 | div = Dom.div();
|
738 | div.on('inserted', function (el) {
|
739 | expect(this).to.equal(div);
|
740 | expect(el).to.equal(div.parent);
|
741 | return expect(invokeCount++).to.equal(0);
|
742 | });
|
743 | expect(invokeCount).to.equal(0);
|
744 | div.appendTo(parentA);
|
745 | expect(invokeCount).to.equal(0);
|
746 | div.appendTo(parentB.appendTo(masterParentB));
|
747 | expect(invokeCount).to.equal(0);
|
748 | parentA.appendTo(sandbox);
|
749 | expect(invokeCount).to.equal(0);
|
750 | div.appendTo(parentC);
|
751 | expect(invokeCount).to.equal(1);
|
752 | div.detach();
|
753 | div.appendTo(parentB.appendTo(sandbox));
|
754 | expect(invokeCount).to.equal(1);
|
755 | expect(div.parent).to.equal(parentB);
|
756 | div.on('inserted', function () {
|
757 | return expect(invokeCount++).to.equal(1);
|
758 | });
|
759 | expect(invokeCount).to.equal(2);
|
760 | expect(div.parent).to.equal(parentB);
|
761 | div.appendTo(parentC);
|
762 | expect(invokeCount).to.equal(2);
|
763 | expect(div.parent).to.equal(parentC);
|
764 | div.detach();
|
765 | div.appendTo(parentA);
|
766 | div.on('inserted', function () {
|
767 | return invokeCount++;
|
768 | });
|
769 | expect(invokeCount).to.equal(3);
|
770 | div.detach();
|
771 | div.appendTo(parentB);
|
772 | return expect(invokeCount).to.equal(3);
|
773 | });
|
774 | return test("QuickElement.replace will trigger the inserted event", function () {
|
775 | var A, B, invokeCount, parent;
|
776 | invokeCount = 0;
|
777 | parent = Dom.section().appendTo(sandbox);
|
778 | A = Dom.div();
|
779 | B = Dom.div();
|
780 | B.on('inserted', function (el) {
|
781 | expect(this).to.equal(B);
|
782 | expect(el).to.equal(B.parent);
|
783 | return expect(invokeCount++).to.equal(0);
|
784 | });
|
785 | expect(invokeCount).to.equal(0);
|
786 | expect(A.parent).to.equal(void 0);
|
787 | expect(B.parent).to.equal(void 0);
|
788 | parent.append(A);
|
789 | expect(invokeCount).to.equal(0);
|
790 | expect(A.parent).to.equal(parent);
|
791 | expect(B.parent).to.equal(void 0);
|
792 | A.replace(B);
|
793 | expect(invokeCount).to.equal(1);
|
794 | expect(A.parent).to.equal(void 0);
|
795 | return expect(B.parent).to.equal(parent);
|
796 | });
|
797 | });
|
798 | suite("Style", function () {
|
799 | test("Styles can be set via the .style/.css method with args pair of [property, value]", function () {
|
800 | var computedStyle, div;
|
801 | div = Dom.div({
|
802 | style: {
|
803 | width: '15px'
|
804 | }
|
805 | }).appendTo(sandbox);
|
806 | computedStyle = getComputedStyle(div.el);
|
807 | expect(computedStyle.width).to.equal('15px');
|
808 | div.style('width', '25px');
|
809 | expect(div.el.style.width).to.equal('25px');
|
810 | expect(computedStyle.width).to.equal('25px');
|
811 | div.style('width', '5vh');
|
812 | expect(div.el.style.width).to.equal('5vh');
|
813 | return expect(computedStyle.width).to.contain('px');
|
814 | });
|
815 | test("Multiple Styles can be set via the .style/.css method by passing a style object", function () {
|
816 | var computedStyle, div;
|
817 | div = Dom.div({
|
818 | style: {
|
819 | width: '15px'
|
820 | }
|
821 | }).appendTo(sandbox);
|
822 | computedStyle = getComputedStyle(div.el);
|
823 | expect(computedStyle.width).to.equal('15px');
|
824 | expect(computedStyle.height).to.equal('0px');
|
825 | div.style({
|
826 | width: 25,
|
827 | height: '33'
|
828 | });
|
829 | expect(computedStyle.width).to.equal('25px');
|
830 | return expect(computedStyle.height).to.equal('33px');
|
831 | });
|
832 | test("Styles defined in the options object will be applied via classNames and not inline style", function () {
|
833 | var divA, divB;
|
834 | divA = Dom.div({
|
835 | style: {
|
836 | width: 15,
|
837 | height: 30
|
838 | }
|
839 | }).appendTo(sandbox);
|
840 | divB = Dom.div().appendTo(sandbox).style({
|
841 | width: 15,
|
842 | height: 30
|
843 | });
|
844 | expect(divA.raw).to.have.style('width', '15px');
|
845 | expect(divB.raw).to.have.style('width', '15px');
|
846 | expect(divA.raw).to.have.style('height', '30px');
|
847 | expect(divB.raw).to.have.style('height', '30px');
|
848 | expect(divA.raw.style.width).to.equal('');
|
849 | expect(divB.raw.style.width).to.equal('15px');
|
850 | expect(divA.raw.style.height).to.equal('');
|
851 | return expect(divB.raw.style.height).to.equal('30px');
|
852 | });
|
853 | test("If passed a property name without a value, the computed value for that property will be returned", function () {
|
854 | var computedStyle, div;
|
855 | div = Dom.div({
|
856 | style: {
|
857 | width: '15px'
|
858 | }
|
859 | }).appendTo(sandbox);
|
860 | computedStyle = getComputedStyle(div.el);
|
861 | expect(div.style('width')).to.equal('15px');
|
862 | expect(div.style('height')).to.equal('0px');
|
863 | div.style({
|
864 | width: null,
|
865 | height: 55
|
866 | });
|
867 | expect(div.style('width')).to.equal(computedStyle.width);
|
868 | expect(div.style('height')).to.equal('55px');
|
869 | div.style('width', '19vw');
|
870 | return expect(div.style('width')).to.contain('px');
|
871 | });
|
872 | test("Functions can be passed as values for properties in style objects which will be invoked with the element's options.relatedInstance as the only argument", function () {
|
873 | var anotherObj, applyWidth, div;
|
874 | div = Dom.div({
|
875 | rate: 25
|
876 | }).appendTo(sandbox);
|
877 | applyWidth = function (expectedInstance) {
|
878 | return div.style({
|
879 | width: function (instance) {
|
880 | expect(typeof instance).to.equal('object');
|
881 | expect(instance).to.equal(expectedInstance);
|
882 | return div.options.rate;
|
883 | }
|
884 | });
|
885 | };
|
886 | applyWidth(div);
|
887 | expect(div.options.rate).to.equal(25);
|
888 | expect(div.style('width')).to.equal('25px');
|
889 | div.options.rate = 250;
|
890 | div.related = anotherObj = {};
|
891 | applyWidth(anotherObj);
|
892 | expect(div.style('width')).to.equal('250px');
|
893 | div = Dom.div({
|
894 | style: {
|
895 | width: 30,
|
896 | height: (function () {
|
897 | return 50;
|
898 | }),
|
899 | fontSize: (function () {
|
900 | return 20;
|
901 | })
|
902 | }
|
903 | }).appendTo(sandbox);
|
904 | expect(div.raw).to.have.style('width', '30px');
|
905 | expect(div.raw).to.have.style('height', '50px');
|
906 | return expect(div.raw).to.have.style('fontSize', '20px');
|
907 | });
|
908 | test("A null value can be passed for a property in order to delete that style", function () {
|
909 | var div;
|
910 | div = Dom.div({
|
911 | style: {
|
912 | width: '15px',
|
913 | fontSize: function () {
|
914 | return 30;
|
915 | }
|
916 | }
|
917 | }).appendTo(sandbox);
|
918 | div.style('height', 20);
|
919 | expect(div.el).to.have.style('width', '15px');
|
920 | expect(div.el).to.have.style('height', '20px');
|
921 | expect(div.el.style.width).to.equal('');
|
922 | expect(div.el.style.height).to.equal('20px');
|
923 | div.style({
|
924 | width: null,
|
925 | height: 12
|
926 | });
|
927 | expect(div.el).not.to.have.style('width', '15px');
|
928 | expect(div.el).to.have.style('height', '12px');
|
929 | expect(['unset', 'inherit', 'initial'].some(function (s) {
|
930 | return s === div.el.style.width;
|
931 | })).to.be.true;
|
932 | expect(div.el.style.height).to.equal('12px');
|
933 | div.css('height', null);
|
934 | expect(div.el.style.height).to.equal('');
|
935 | expect(div.el.style.width).not.to.equal('');
|
936 | div.el.style.width = null;
|
937 | expect(div.el.style.width).to.equal('');
|
938 | expect(div.el).to.have.style('width', '15px');
|
939 | div.css('width', null);
|
940 | expect(div.el.style.width).not.to.equal('');
|
941 | expect(div.el).not.to.have.style('width', '15px');
|
942 | div.style('height', function () {
|
943 | return 30;
|
944 | });
|
945 | expect(div.el.style.height).to.equal('30px');
|
946 | div.style('height', function () {
|
947 | return null;
|
948 | });
|
949 | expect(div.el.style.height).to.equal('');
|
950 | expect(div.el.style.fontSize).to.equal('30px');
|
951 | div.style('fontSize', null);
|
952 | return expect(div.el.style.fontSize).to.equal('');
|
953 | });
|
954 | test(".styleSafe() can be used to obtain the value for a given property even for non-inserted elements or elements with options.styleAfterInsert", function () {
|
955 | var divA, divB, heightA, heightB, prop, style, text;
|
956 | style = {
|
957 | width: '8px',
|
958 | height: '9px',
|
959 | zIndex: function (field) {
|
960 | return field.options.theIndex;
|
961 | },
|
962 | $happy: {
|
963 | width: '18px',
|
964 | zIndex: function (field) {
|
965 | return field.options.theIndex * 2;
|
966 | }
|
967 | },
|
968 | $relaxed: {
|
969 | height: '100%'
|
970 | }
|
971 | };
|
972 | divA = Dom.div({
|
973 | style,
|
974 | theIndex: '12'
|
975 | });
|
976 | divB = Dom.div({
|
977 | style,
|
978 | theIndex: '29',
|
979 | styleAfterInsert: true
|
980 | });
|
981 | divA.style({
|
982 | fontSize: 10,
|
983 | position: 'relative'
|
984 | });
|
985 | divB.style({
|
986 | fontSize: 10,
|
987 | position: 'relative'
|
988 | });
|
989 | prop = function (el, target) {
|
990 | return {
|
991 | computed: el.style(target),
|
992 | inline: el.raw.style[target],
|
993 | safe: '' + el.styleSafe(target)
|
994 | };
|
995 | };
|
996 | expect(prop(divA, 'fontSize')).to.eql({
|
997 | computed: '',
|
998 | inline: '10px',
|
999 | safe: '10px'
|
1000 | });
|
1001 | expect(prop(divB, 'fontSize')).to.eql({
|
1002 | computed: '',
|
1003 | inline: '10px',
|
1004 | safe: '10px'
|
1005 | });
|
1006 | expect(prop(divA, 'width')).to.eql({
|
1007 | computed: '',
|
1008 | inline: '',
|
1009 | safe: '8px'
|
1010 | });
|
1011 | expect(prop(divB, 'width')).to.eql({
|
1012 | computed: '',
|
1013 | inline: '',
|
1014 | safe: '8px'
|
1015 | });
|
1016 | expect(prop(divA, 'height')).to.eql({
|
1017 | computed: '',
|
1018 | inline: '',
|
1019 | safe: '9px'
|
1020 | });
|
1021 | expect(prop(divB, 'height')).to.eql({
|
1022 | computed: '',
|
1023 | inline: '',
|
1024 | safe: '9px'
|
1025 | });
|
1026 | expect(prop(divA, 'zIndex')).to.eql({
|
1027 | computed: '',
|
1028 | inline: '12',
|
1029 | safe: '12'
|
1030 | });
|
1031 | expect(prop(divB, 'zIndex')).to.eql({
|
1032 | computed: '',
|
1033 | inline: '',
|
1034 | safe: '29'
|
1035 | });
|
1036 | divA.state('happy', true);
|
1037 | divB.state('happy', true);
|
1038 | expect(prop(divA, 'width')).to.eql({
|
1039 | computed: '',
|
1040 | inline: '',
|
1041 | safe: '18px'
|
1042 | });
|
1043 | expect(prop(divB, 'width')).to.eql({
|
1044 | computed: '',
|
1045 | inline: '',
|
1046 | safe: '18px'
|
1047 | });
|
1048 | expect(prop(divA, 'zIndex')).to.eql({
|
1049 | computed: '',
|
1050 | inline: '24',
|
1051 | safe: '24'
|
1052 | });
|
1053 | expect(prop(divB, 'zIndex')).to.eql({
|
1054 | computed: '',
|
1055 | inline: '',
|
1056 | safe: '58'
|
1057 | });
|
1058 | divA.state('relaxed', true);
|
1059 | divB.state('relaxed', true);
|
1060 | expect(prop(divA, 'height')).to.eql({
|
1061 | computed: '',
|
1062 | inline: '',
|
1063 | safe: '100%'
|
1064 | });
|
1065 | expect(prop(divB, 'height')).to.eql({
|
1066 | computed: '',
|
1067 | inline: '',
|
1068 | safe: '100%'
|
1069 | });
|
1070 | divA.appendTo(sandbox);
|
1071 | divB.appendTo(sandbox);
|
1072 | heightA = getComputedStyle(divA.raw).height;
|
1073 | heightB = getComputedStyle(divB.raw).height;
|
1074 | expect(prop(divA, 'zIndex')).to.eql({
|
1075 | computed: '24',
|
1076 | inline: '24',
|
1077 | safe: '24'
|
1078 | });
|
1079 | expect(prop(divB, 'zIndex')).to.eql({
|
1080 | computed: '58',
|
1081 | inline: '58',
|
1082 | safe: '58'
|
1083 | });
|
1084 | expect(prop(divA, 'height')).to.eql({
|
1085 | computed: heightA,
|
1086 | inline: '',
|
1087 | safe: heightA
|
1088 | });
|
1089 | expect(prop(divB, 'height')).to.eql({
|
1090 | computed: heightB,
|
1091 | inline: '',
|
1092 | safe: heightB
|
1093 | });
|
1094 | expect(divA.styleSafe('height')).to.equal(heightA);
|
1095 | expect(divA.styleSafe('height', true)).to.equal('100%');
|
1096 | expect(divB.styleSafe('height')).to.equal(heightB);
|
1097 | expect(divB.styleSafe('height', true)).to.equal('100%');
|
1098 | divB.appendTo(sandbox);
|
1099 | expect(divB.style('height')).not.to.equal('');
|
1100 | expect(divB.style('height')).not.to.equal('100%');
|
1101 | expect(divB.style('height')).to.contain('px');
|
1102 | expect(divB.styleSafe('height')).to.equal(divB.style('height'));
|
1103 | expect(divB.styleSafe('height', true)).not.to.equal(divB.style('height'));
|
1104 | expect(divB.styleSafe('height', true)).to.equal('100%');
|
1105 | expect(divB.styleSafe('margin', true)).to.equal('');
|
1106 | expect(divB.style('width')).to.equal('18px');
|
1107 | expect(divA.styleSafe('fakeProp')).to.equal(divA);
|
1108 | expect(divA.styleSafe(123)).to.equal(divA);
|
1109 | text = Dom.text('abc123').appendTo(divA);
|
1110 | expect(text.styleSafe('fakeProp')).to.equal(void 0);
|
1111 | return expect(text.styleSafe(123)).to.equal(void 0);
|
1112 | });
|
1113 | test(".styleSafe() will work with instances with no given base styles", function () {
|
1114 | var divA, divB;
|
1115 | divA = Dom.div();
|
1116 | divB = Dom(document.createElement('div'));
|
1117 | expect(function () {
|
1118 | divA.styleSafe('height');
|
1119 | return divB.styleSafe('height');
|
1120 | }).not.to.throw();
|
1121 | expect(divA.styleSafe('height')).to.equal('');
|
1122 | return expect(divB.styleSafe('height')).to.equal('');
|
1123 | });
|
1124 | test(".styleParsed() is a shorthand for parseFloat(.styleSafe())", function () {
|
1125 | var divA, divB, style;
|
1126 | style = {
|
1127 | width: '8px',
|
1128 | height: '9px',
|
1129 | $happy: {
|
1130 | width: '18px'
|
1131 | },
|
1132 | $relaxed: {
|
1133 | height: '100%'
|
1134 | }
|
1135 | };
|
1136 | divA = Dom.div({
|
1137 | style
|
1138 | });
|
1139 | divB = Dom.div({
|
1140 | style,
|
1141 | styleAfterInsert: true
|
1142 | });
|
1143 | expect(divA.style('width')).to.equal('');
|
1144 | expect(divA.styleSafe('width')).to.equal('8px');
|
1145 | expect(divA.styleParsed('width')).to.equal(parseFloat(divA.styleSafe('width')));
|
1146 | expect(divA.style('height')).to.equal('');
|
1147 | expect(divA.styleSafe('height')).to.equal('9px');
|
1148 | expect(divA.styleParsed('height')).to.equal(parseFloat(divA.styleSafe('height')));
|
1149 | expect(divB.style('width')).to.equal('');
|
1150 | expect(divB.styleSafe('width')).to.equal('8px');
|
1151 | expect(divB.styleParsed('width')).to.equal(parseFloat(divB.styleSafe('width')));
|
1152 | divA.state('happy', true);
|
1153 | divB.state('happy', true);
|
1154 | expect(divA.style('width')).to.equal('');
|
1155 | expect(divA.styleSafe('width')).to.equal('18px');
|
1156 | expect(divA.styleParsed('width')).to.equal(parseFloat(divA.styleSafe('width')));
|
1157 | expect(divA.style('height')).to.equal('');
|
1158 | expect(divA.styleSafe('height')).to.equal('9px');
|
1159 | expect(divA.styleParsed('height')).to.equal(parseFloat(divA.styleSafe('height')));
|
1160 | expect(divB.style('width')).to.equal('');
|
1161 | expect(divB.styleSafe('width')).to.equal('18px');
|
1162 | expect(divB.styleParsed('width')).to.equal(parseFloat(divB.styleSafe('width')));
|
1163 | divA.state('relaxed', true);
|
1164 | divB.state('relaxed', true);
|
1165 | expect(divA.style('width')).to.equal('');
|
1166 | expect(divA.styleSafe('width')).to.equal('18px');
|
1167 | expect(divA.styleParsed('width')).to.equal(parseFloat(divA.styleSafe('width')));
|
1168 | expect(divA.style('height')).to.equal('');
|
1169 | expect(divA.styleSafe('height')).to.equal('100%');
|
1170 | expect(divA.styleParsed('height')).to.equal(parseFloat(divA.styleSafe('height')));
|
1171 | expect(divB.style('width')).to.equal('');
|
1172 | expect(divB.styleSafe('width')).to.equal('18px');
|
1173 | expect(divB.styleParsed('width')).to.equal(parseFloat(divB.styleSafe('width')));
|
1174 | divA.appendTo(sandbox);
|
1175 | divB.appendTo(sandbox);
|
1176 | divA.state('relaxed', false);
|
1177 | divB.state('relaxed', false);
|
1178 | expect(divA.style('width')).to.equal('18px');
|
1179 | expect(divA.styleSafe('width')).to.equal('18px');
|
1180 | expect(divA.styleParsed('width')).to.equal(parseFloat(divA.styleSafe('width')));
|
1181 | expect(divA.style('height')).to.equal('9px');
|
1182 | expect(divA.styleSafe('height')).to.equal('9px');
|
1183 | expect(divA.styleParsed('height')).to.equal(parseFloat(divA.styleSafe('height')));
|
1184 | expect(divB.style('width')).to.equal('18px');
|
1185 | expect(divB.styleSafe('width')).to.equal('18px');
|
1186 | return expect(divB.styleParsed('width')).to.equal(parseFloat(divB.styleSafe('width')));
|
1187 | });
|
1188 | test(".recalcStyle() re-applies all function-value styles", function () {
|
1189 | var count, div;
|
1190 | count = {
|
1191 | A: 0,
|
1192 | B: 0,
|
1193 | C: 0,
|
1194 | D: 0,
|
1195 | E: 0,
|
1196 | F: 0,
|
1197 | G: 0
|
1198 | };
|
1199 | div = Dom.div({
|
1200 | style: {
|
1201 | width: function () {
|
1202 | return ++count.A;
|
1203 | },
|
1204 | opacity: 1,
|
1205 | height: function () {
|
1206 | return ++count.B;
|
1207 | },
|
1208 | fontSize: function () {
|
1209 | return ++count.C;
|
1210 | },
|
1211 | $happy: {
|
1212 | opacity: 0.5,
|
1213 | fontSize: function () {
|
1214 | return ++count.D;
|
1215 | }
|
1216 | },
|
1217 | $relaxed: {
|
1218 | height: function () {
|
1219 | return ++count.E;
|
1220 | },
|
1221 | fontSize: function () {
|
1222 | return ++count.F;
|
1223 | },
|
1224 | $funny: {
|
1225 | width: function () {
|
1226 | return ++count.G;
|
1227 | }
|
1228 | }
|
1229 | }
|
1230 | }
|
1231 | });
|
1232 | expect(count).to.eql({
|
1233 | A: 1,
|
1234 | B: 1,
|
1235 | C: 1,
|
1236 | D: 0,
|
1237 | E: 0,
|
1238 | F: 0,
|
1239 | G: 0
|
1240 | });
|
1241 | div.recalcStyle();
|
1242 | expect(count).to.eql({
|
1243 | A: 2,
|
1244 | B: 2,
|
1245 | C: 2,
|
1246 | D: 0,
|
1247 | E: 0,
|
1248 | F: 0,
|
1249 | G: 0
|
1250 | });
|
1251 | div.state('happy', true);
|
1252 | expect(count).to.eql({
|
1253 | A: 2,
|
1254 | B: 2,
|
1255 | C: 2,
|
1256 | D: 1,
|
1257 | E: 0,
|
1258 | F: 0,
|
1259 | G: 0
|
1260 | });
|
1261 | div.recalcStyle();
|
1262 | expect(count).to.eql({
|
1263 | A: 3,
|
1264 | B: 3,
|
1265 | C: 2,
|
1266 | D: 2,
|
1267 | E: 0,
|
1268 | F: 0,
|
1269 | G: 0
|
1270 | });
|
1271 | div.state('relaxed', true);
|
1272 | expect(count).to.eql({
|
1273 | A: 3,
|
1274 | B: 3,
|
1275 | C: 2,
|
1276 | D: 2,
|
1277 | E: 1,
|
1278 | F: 1,
|
1279 | G: 0
|
1280 | });
|
1281 | div.recalcStyle();
|
1282 | expect(count).to.eql({
|
1283 | A: 4,
|
1284 | B: 3,
|
1285 | C: 2,
|
1286 | D: 2,
|
1287 | E: 2,
|
1288 | F: 2,
|
1289 | G: 0
|
1290 | });
|
1291 | div.state('funny', true);
|
1292 | expect(count).to.eql({
|
1293 | A: 4,
|
1294 | B: 3,
|
1295 | C: 2,
|
1296 | D: 2,
|
1297 | E: 2,
|
1298 | F: 2,
|
1299 | G: 1
|
1300 | });
|
1301 | div.recalcStyle();
|
1302 | expect(count).to.eql({
|
1303 | A: 4,
|
1304 | B: 3,
|
1305 | C: 2,
|
1306 | D: 2,
|
1307 | E: 3,
|
1308 | F: 3,
|
1309 | G: 2
|
1310 | });
|
1311 | div.state('funny', false);
|
1312 | expect(count).to.eql({
|
1313 | A: 5,
|
1314 | B: 3,
|
1315 | C: 2,
|
1316 | D: 2,
|
1317 | E: 3,
|
1318 | F: 3,
|
1319 | G: 2
|
1320 | });
|
1321 | div.recalcStyle();
|
1322 | return expect(count).to.eql({
|
1323 | A: 6,
|
1324 | B: 3,
|
1325 | C: 2,
|
1326 | D: 2,
|
1327 | E: 4,
|
1328 | F: 4,
|
1329 | G: 2
|
1330 | });
|
1331 | });
|
1332 | test(".recalcStyle() accepts a single argument to indicate if to recalc style on children", function () {
|
1333 | var count, div, wrapper, wrapperCount;
|
1334 | count = {
|
1335 | A: 0,
|
1336 | B: 0,
|
1337 | C: 0,
|
1338 | D: 0,
|
1339 | E: 0,
|
1340 | F: 0,
|
1341 | G: 0
|
1342 | };
|
1343 | wrapperCount = 0;
|
1344 | wrapper = Dom.div({
|
1345 | style: {
|
1346 | width: function () {
|
1347 | return ++wrapperCount;
|
1348 | }
|
1349 | }
|
1350 | });
|
1351 | div = Dom.div({
|
1352 | style: {
|
1353 | width: function () {
|
1354 | return ++count.A;
|
1355 | },
|
1356 | opacity: 1,
|
1357 | height: function () {
|
1358 | return ++count.B;
|
1359 | },
|
1360 | fontSize: function () {
|
1361 | return ++count.C;
|
1362 | },
|
1363 | $happy: {
|
1364 | opacity: 0.5,
|
1365 | fontSize: function () {
|
1366 | return ++count.D;
|
1367 | }
|
1368 | },
|
1369 | $relaxed: {
|
1370 | height: function () {
|
1371 | return ++count.E;
|
1372 | },
|
1373 | fontSize: function () {
|
1374 | return ++count.F;
|
1375 | },
|
1376 | $funny: {
|
1377 | width: function () {
|
1378 | return ++count.G;
|
1379 | }
|
1380 | }
|
1381 | }
|
1382 | }
|
1383 | });
|
1384 | div.appendTo(wrapper);
|
1385 | expect(wrapperCount).to.equal(1);
|
1386 | expect(count).to.eql({
|
1387 | A: 1,
|
1388 | B: 1,
|
1389 | C: 1,
|
1390 | D: 0,
|
1391 | E: 0,
|
1392 | F: 0,
|
1393 | G: 0
|
1394 | });
|
1395 | wrapper.recalcStyle();
|
1396 | expect(wrapperCount).to.equal(2);
|
1397 | expect(count).to.eql({
|
1398 | A: 1,
|
1399 | B: 1,
|
1400 | C: 1,
|
1401 | D: 0,
|
1402 | E: 0,
|
1403 | F: 0,
|
1404 | G: 0
|
1405 | });
|
1406 | wrapper.recalcStyle(true);
|
1407 | expect(wrapperCount).to.equal(3);
|
1408 | expect(count).to.eql({
|
1409 | A: 2,
|
1410 | B: 2,
|
1411 | C: 2,
|
1412 | D: 0,
|
1413 | E: 0,
|
1414 | F: 0,
|
1415 | G: 0
|
1416 | });
|
1417 | div.state('happy', true);
|
1418 | expect(count).to.eql({
|
1419 | A: 2,
|
1420 | B: 2,
|
1421 | C: 2,
|
1422 | D: 1,
|
1423 | E: 0,
|
1424 | F: 0,
|
1425 | G: 0
|
1426 | });
|
1427 | wrapper.recalcStyle();
|
1428 | expect(wrapperCount).to.equal(4);
|
1429 | expect(count).to.eql({
|
1430 | A: 2,
|
1431 | B: 2,
|
1432 | C: 2,
|
1433 | D: 1,
|
1434 | E: 0,
|
1435 | F: 0,
|
1436 | G: 0
|
1437 | });
|
1438 | wrapper.recalcStyle(1);
|
1439 | expect(wrapperCount).to.equal(5);
|
1440 | return expect(count).to.eql({
|
1441 | A: 3,
|
1442 | B: 3,
|
1443 | C: 2,
|
1444 | D: 2,
|
1445 | E: 0,
|
1446 | F: 0,
|
1447 | G: 0
|
1448 | });
|
1449 | });
|
1450 | test("If options.recalcOnResize is set, .recalcStyle() will be invoked on each resize event", function () {
|
1451 | var count;
|
1452 | count = {
|
1453 | A: 0,
|
1454 | B: 0,
|
1455 | C: 0,
|
1456 | D: 0
|
1457 | };
|
1458 | Dom.div({
|
1459 | style: {
|
1460 | width: function () {
|
1461 | return ++count.A;
|
1462 | },
|
1463 | opacity: 1,
|
1464 | height: function () {
|
1465 | return ++count.B;
|
1466 | }
|
1467 | }
|
1468 | });
|
1469 | Dom.div({
|
1470 | recalcOnResize: true,
|
1471 | style: {
|
1472 | width: function () {
|
1473 | return ++count.C;
|
1474 | },
|
1475 | opacity: 1,
|
1476 | height: function () {
|
1477 | return ++count.D;
|
1478 | }
|
1479 | }
|
1480 | });
|
1481 | expect(count).to.eql({
|
1482 | A: 1,
|
1483 | B: 1,
|
1484 | C: 1,
|
1485 | D: 1
|
1486 | });
|
1487 | Dom(window).emit('resize');
|
1488 | expect(count).to.eql({
|
1489 | A: 1,
|
1490 | B: 1,
|
1491 | C: 2,
|
1492 | D: 2
|
1493 | });
|
1494 | Dom(window).emit('resize');
|
1495 | return expect(count).to.eql({
|
1496 | A: 1,
|
1497 | B: 1,
|
1498 | C: 3,
|
1499 | D: 3
|
1500 | });
|
1501 | });
|
1502 | test("If options.forceStyle is set, all registered styles will have the '!important' flag set", function () {
|
1503 | var divA, divB, style;
|
1504 | style = DOM.style({
|
1505 | props: {
|
1506 | innerHTML: ".theDiv {width:50px}"
|
1507 | }
|
1508 | });
|
1509 | divA = DOM.div({
|
1510 | className: 'theDiv',
|
1511 | style: {
|
1512 | width: 100,
|
1513 | height: 100
|
1514 | }
|
1515 | }).appendTo(sandbox);
|
1516 | divB = DOM.div({
|
1517 | className: 'theDiv',
|
1518 | style: {
|
1519 | width: 100,
|
1520 | height: 100
|
1521 | },
|
1522 | forceStyle: true
|
1523 | }).appendTo(sandbox);
|
1524 | expect(divA.style('width')).to.equal('100px');
|
1525 | expect(divB.style('width')).to.equal('100px');
|
1526 | style.appendTo(document.head);
|
1527 | expect(divA.style('width')).to.equal('50px');
|
1528 | expect(divB.style('width')).to.equal('100px');
|
1529 | expect(divA.attr('style') === '' || divA.attr('style') === null).to.be.true;
|
1530 | expect(divB.attr('style') === '' || divB.attr('style') === null).to.be.true;
|
1531 | divA.style('width', function () {
|
1532 | return 75;
|
1533 | });
|
1534 | divB.style('width', function () {
|
1535 | return 75;
|
1536 | });
|
1537 | divA.style('height', 85);
|
1538 | divB.style('height', 85);
|
1539 | expect(divA.attr('style')).not.to.equal('');
|
1540 | expect(divB.attr('style')).not.to.equal('');
|
1541 | expect(divA.attr('style')).not.to.include('75px !important');
|
1542 | expect(divB.attr('style')).to.include('75px !important');
|
1543 | expect(divA.attr('style')).not.to.include('85px !important');
|
1544 | expect(divB.attr('style')).to.include('85px !important');
|
1545 | expect(divA.style('width')).to.equal('75px');
|
1546 | expect(divB.style('width')).to.equal('75px');
|
1547 | return style.remove();
|
1548 | });
|
1549 | test(".show()/.hide() will toggle the element's visibility", function () {
|
1550 | var div;
|
1551 | div = Dom.div().appendTo(sandbox);
|
1552 | expect(div.style('display')).to.equal('block');
|
1553 | div.hide();
|
1554 | expect(div.style('display')).to.equal('none');
|
1555 | div.show();
|
1556 | expect(div.style('display')).to.equal('block');
|
1557 | div.show();
|
1558 | return expect(div.style('display')).to.equal('block');
|
1559 | });
|
1560 | test(".show() will set the element's display style to the provided argument, or to the value provided in the style object", function () {
|
1561 | var div;
|
1562 | div = Dom.div({
|
1563 | style: {
|
1564 | display: 'inline'
|
1565 | }
|
1566 | }).appendTo(sandbox);
|
1567 | expect(div.style('display')).to.equal('inline');
|
1568 | div.hide();
|
1569 | expect(div.style('display')).to.equal('none');
|
1570 | div.show();
|
1571 | expect(div.style('display')).to.equal('inline');
|
1572 | div.hide();
|
1573 | div.show('inline-block');
|
1574 | return expect(div.style('display')).to.equal('inline-block');
|
1575 | });
|
1576 | return test("SVG elements", function () {
|
1577 | var svg;
|
1578 | svg = Dom(['*svg', {
|
1579 | style: {
|
1580 | display: 'block',
|
1581 | width: 10,
|
1582 | height: 10,
|
1583 | $happy: {
|
1584 | width: 20,
|
1585 | height: 20
|
1586 | }
|
1587 | }
|
1588 | }]).appendTo(sandbox);
|
1589 | expect(svg.style('width')).to.equal('10px');
|
1590 | expect(svg.style('height')).to.equal('10px');
|
1591 | svg.state('happy', true);
|
1592 | expect(svg.style('width')).to.equal('20px');
|
1593 | return expect(svg.style('height')).to.equal('20px');
|
1594 | });
|
1595 | });
|
1596 | suite("State", function () {
|
1597 | test("States can be polled for a value by passing only the target state's name to .state & can be toggled on/off by passing a second argument", function () {
|
1598 | var div;
|
1599 | div = Dom.div();
|
1600 | expect(div.state('funny')).to.be.false;
|
1601 | div.state('funny', true);
|
1602 | expect(div.state('funny')).to.be.true;
|
1603 | div.state('happy', true);
|
1604 | div.state('relaxed', true);
|
1605 | expect(div.state('funny')).to.be.true;
|
1606 | expect(div.state('happy')).to.be.true;
|
1607 | expect(div.state('relaxed')).to.be.true;
|
1608 | div.state('funny', false);
|
1609 | expect(div.state('funny')).to.be.false;
|
1610 | expect(div.state('happy')).to.be.true;
|
1611 | expect(div.state('relaxed')).to.be.true;
|
1612 | div.state('$funny', true);
|
1613 | div.state('$base', true);
|
1614 | expect(div.state('funny')).to.be.true;
|
1615 | return expect(div.state('base')).to.be.false;
|
1616 | });
|
1617 | test("A key:value pair object can be passed to toggle state for multiple states at once", function () {
|
1618 | var div;
|
1619 | div = Dom.div();
|
1620 | expect(div.state('a')).to.equal(false);
|
1621 | expect(div.state('b')).to.equal(false);
|
1622 | expect(div.state('c')).to.equal(false);
|
1623 | div.state({
|
1624 | a: true,
|
1625 | b: 1
|
1626 | });
|
1627 | expect(div.state('a')).to.equal(true);
|
1628 | expect(div.state('b')).to.equal(true);
|
1629 | expect(div.state('c')).to.equal(false);
|
1630 | div.state({
|
1631 | b: false,
|
1632 | c: 'y'
|
1633 | });
|
1634 | expect(div.state('a')).to.equal(true);
|
1635 | expect(div.state('b')).to.equal(false);
|
1636 | return expect(div.state('c')).to.equal(true);
|
1637 | });
|
1638 | test(".state() without arguments should return an array of active states", function () {
|
1639 | var el;
|
1640 | el = DOM.div();
|
1641 | expect(el.state()).to.eql([]);
|
1642 | el.state('happy', true);
|
1643 | el.state('relaxed', true);
|
1644 | expect(el.state()).to.eql(['happy', 'relaxed']);
|
1645 | el.state('happy', false);
|
1646 | expect(el.state()).to.eql(['relaxed']);
|
1647 | el.state('happy', true);
|
1648 | return expect(el.state()).to.eql(['relaxed', 'happy']);
|
1649 | });
|
1650 | test("All states can be cleared/toggled off via .resetState", function () {
|
1651 | var div;
|
1652 | div = Dom.div();
|
1653 | div.state('funny', true);
|
1654 | div.state('happy', true);
|
1655 | div.state('relaxed', true);
|
1656 | expect(div.state('funny')).to.be.true;
|
1657 | expect(div.state('happy')).to.be.true;
|
1658 | expect(div.state('relaxed')).to.be.true;
|
1659 | div.resetState();
|
1660 | expect(div.state('funny')).to.be.false;
|
1661 | expect(div.state('happy')).to.be.false;
|
1662 | return expect(div.state('relaxed')).to.be.false;
|
1663 | });
|
1664 | test("A state can be toggled on/off via .toggleState", function () {
|
1665 | var div;
|
1666 | div = DOM.div();
|
1667 | expect(div.state('happy')).to.equal(false);
|
1668 | div.toggleState('happy');
|
1669 | expect(div.state('happy')).to.equal(true);
|
1670 | div.toggleState('happy');
|
1671 | expect(div.state('happy')).to.equal(false);
|
1672 | div.toggleState('happy');
|
1673 | return expect(div.state('happy')).to.equal(true);
|
1674 | });
|
1675 | test("Styles can be passed under specific states using a '$' prefix before the state name", function () {
|
1676 | var computedStyle, div;
|
1677 | div = Dom.div({
|
1678 | style: {
|
1679 | $base: {
|
1680 | width: '15px',
|
1681 | height: '15px'
|
1682 | },
|
1683 | $happy: {
|
1684 | width: '25px',
|
1685 | marginTop: '20px'
|
1686 | },
|
1687 | $relaxed: {
|
1688 | width: '35px',
|
1689 | marginLeft: '12px'
|
1690 | }
|
1691 | }
|
1692 | });
|
1693 | div.appendTo(sandbox);
|
1694 | computedStyle = getComputedStyle(div.el);
|
1695 | expect(computedStyle.width).to.equal('15px');
|
1696 | expect(computedStyle.height).to.equal('15px');
|
1697 | expect(computedStyle.marginTop).to.equal('0px');
|
1698 | expect(computedStyle.marginLeft).to.equal('0px');
|
1699 | div.state('happy', true);
|
1700 | expect(computedStyle.width).to.equal('25px');
|
1701 | expect(computedStyle.height).to.equal('15px');
|
1702 | expect(computedStyle.marginTop).to.equal('20px');
|
1703 | expect(computedStyle.marginLeft).to.equal('0px');
|
1704 | div.state('happy', false);
|
1705 | expect(computedStyle.width).to.equal('15px');
|
1706 | expect(computedStyle.height).to.equal('15px');
|
1707 | expect(computedStyle.marginTop).to.equal('0px');
|
1708 | expect(computedStyle.marginLeft).to.equal('0px');
|
1709 | div.state('happy', true);
|
1710 | div.state('relaxed', true);
|
1711 | expect(computedStyle.width).to.equal('35px');
|
1712 | expect(computedStyle.height).to.equal('15px');
|
1713 | expect(computedStyle.marginTop).to.equal('20px');
|
1714 | expect(computedStyle.marginLeft).to.equal('12px');
|
1715 | div.state('happy', false);
|
1716 | expect(computedStyle.width).to.equal('35px');
|
1717 | expect(computedStyle.height).to.equal('15px');
|
1718 | expect(computedStyle.marginTop).to.equal('0px');
|
1719 | return expect(computedStyle.marginLeft).to.equal('12px');
|
1720 | });
|
1721 | test("A state:eventName (or state:eventOpts) map can be passed set for options.stateTriggers", function () {
|
1722 | var computedStyle, div;
|
1723 | div = Dom.div({
|
1724 | stateTriggers: {
|
1725 | happy: {
|
1726 | on: 'becameHappy',
|
1727 | off: 'becameSad'
|
1728 | },
|
1729 | relaxed: 'isRelaxed'
|
1730 | },
|
1731 | style: {
|
1732 | $base: {
|
1733 | width: '15px'
|
1734 | },
|
1735 | $happy: {
|
1736 | width: '25px'
|
1737 | },
|
1738 | $relaxed: {
|
1739 | width: '35px'
|
1740 | }
|
1741 | }
|
1742 | }).appendTo(sandbox);
|
1743 | computedStyle = getComputedStyle(div.el);
|
1744 | expect(div.state('happy')).to.be.false;
|
1745 | expect(div.state('relaxed')).to.be.false;
|
1746 | expect(computedStyle.width).to.equal('15px');
|
1747 | div.emit('becameHappy');
|
1748 | expect(div.state('happy')).to.be.true;
|
1749 | expect(div.state('relaxed')).to.be.false;
|
1750 | expect(computedStyle.width).to.equal('25px');
|
1751 | div.emit('isRelaxed');
|
1752 | expect(div.state('happy')).to.be.true;
|
1753 | expect(div.state('relaxed')).to.be.true;
|
1754 | expect(computedStyle.width).to.equal('35px');
|
1755 | div.emit('becameSad');
|
1756 | expect(div.state('happy')).to.be.false;
|
1757 | expect(div.state('relaxed')).to.be.true;
|
1758 | expect(computedStyle.width).to.equal('35px');
|
1759 | div.state('relaxed', false);
|
1760 | return expect(computedStyle.width).to.equal('15px');
|
1761 | });
|
1762 | test("options.stateTriggers won't be attached if they aren't being used in style object", function () {
|
1763 | var divA, divB;
|
1764 | divA = Dom.div({
|
1765 | style: {
|
1766 | $hover: {
|
1767 | display: 'block'
|
1768 | }
|
1769 | }
|
1770 | });
|
1771 | divB = Dom.div({
|
1772 | style: {
|
1773 | $focus: {
|
1774 | display: 'block'
|
1775 | }
|
1776 | }
|
1777 | });
|
1778 | expect(divA.state('hover')).to.equal(false);
|
1779 | expect(divB.state('hover')).to.equal(false);
|
1780 | divA.el.emitEvent('mouseenter');
|
1781 | divB.el.emitEvent('mouseenter');
|
1782 | expect(divA.state('hover')).to.equal(true);
|
1783 | expect(divB.state('hover')).to.equal(false);
|
1784 | divA.el.emitEvent('mouseleave');
|
1785 | divB.el.emitEvent('mouseleave');
|
1786 | expect(divA.state('hover')).to.equal(false);
|
1787 | expect(divB.state('hover')).to.equal(false);
|
1788 | divA.el.emitEvent('focus');
|
1789 | divB.el.emitEvent('focus');
|
1790 | expect(divA.state('focus')).to.equal(false);
|
1791 | expect(divB.state('focus')).to.equal(true);
|
1792 | divA.el.emitEvent('blur');
|
1793 | divB.el.emitEvent('blur');
|
1794 | expect(divA.state('focus')).to.equal(false);
|
1795 | return expect(divB.state('focus')).to.equal(false);
|
1796 | });
|
1797 | test("options.stateTriggers can be forced to be attached even if they aren't being used in style object via ._attachStateEvents(true)", function () {
|
1798 | var attachStateEvents, divA, divB;
|
1799 | attachStateEvents = Dom.div()._attachStateEvents ? '_attachStateEvents' : '_ae';
|
1800 | divA = Dom.div({
|
1801 | style: {
|
1802 | $hover: {
|
1803 | display: 'block'
|
1804 | }
|
1805 | }
|
1806 | });
|
1807 | divB = Dom.div({
|
1808 | style: {
|
1809 | $focus: {
|
1810 | display: 'block'
|
1811 | }
|
1812 | }
|
1813 | });
|
1814 | divA[attachStateEvents](true);
|
1815 | divB[attachStateEvents](true);
|
1816 | expect(divA.state('hover')).to.equal(false);
|
1817 | expect(divB.state('hover')).to.equal(false);
|
1818 | divA.el.emitEvent('mouseenter');
|
1819 | divB.el.emitEvent('mouseenter');
|
1820 | expect(divA.state('hover')).to.equal(true);
|
1821 | expect(divB.state('hover')).to.equal(true);
|
1822 | divA.el.emitEvent('mouseleave');
|
1823 | divB.el.emitEvent('mouseleave');
|
1824 | expect(divA.state('hover')).to.equal(false);
|
1825 | expect(divB.state('hover')).to.equal(false);
|
1826 | divA.el.emitEvent('focus');
|
1827 | divB.el.emitEvent('focus');
|
1828 | expect(divA.state('focus')).to.equal(true);
|
1829 | expect(divB.state('focus')).to.equal(true);
|
1830 | divA.el.emitEvent('blur');
|
1831 | divB.el.emitEvent('blur');
|
1832 | expect(divA.state('focus')).to.equal(false);
|
1833 | return expect(divB.state('focus')).to.equal(false);
|
1834 | });
|
1835 | test("The hover and focus states will be listened for and toggled by default by their appropriate events", function () {
|
1836 | var div;
|
1837 | div = Dom.div({
|
1838 | style: {
|
1839 | $base: {
|
1840 | width: '15px',
|
1841 | height: '15px',
|
1842 | backgroundColor: 'rgb(45, 45, 45)'
|
1843 | },
|
1844 | $hover: {
|
1845 | width: '25px',
|
1846 | marginTop: '20px',
|
1847 | backgroundColor: 'rgb(155, 155, 155)'
|
1848 | },
|
1849 | $focus: {
|
1850 | width: '35px',
|
1851 | backgroundColor: 'rgb(200, 200, 200)'
|
1852 | }
|
1853 | }
|
1854 | });
|
1855 | div.appendTo(sandbox);
|
1856 | expect(div.el).to.have.style('width', '15px');
|
1857 | expect(div.el).to.have.style('height', '15px');
|
1858 | expect(div.el).to.have.style('marginTop', '0px');
|
1859 | expect(div.el).to.have.style('backgroundColor', 'rgb(45, 45, 45)');
|
1860 | expect(div.el.style.marginTop).to.equal('');
|
1861 | div.emit('mouseenter');
|
1862 | expect(div.el).to.have.style('width', '25px');
|
1863 | expect(div.el).to.have.style('height', '15px');
|
1864 | expect(div.el).to.have.style('marginTop', '20px');
|
1865 | expect(div.el).to.have.style('backgroundColor', 'rgb(155, 155, 155)');
|
1866 | expect(div.el.style.marginTop).to.equal('');
|
1867 | div.emit('mouseleave');
|
1868 | expect(div.el).to.have.style('width', '15px');
|
1869 | expect(div.el).to.have.style('height', '15px');
|
1870 | expect(div.el).to.have.style('marginTop', '0px');
|
1871 | expect(div.el).to.have.style('backgroundColor', 'rgb(45, 45, 45)');
|
1872 | expect(div.el.style.marginTop).to.equal('');
|
1873 | div.emit('mouseenter');
|
1874 | div.emit('focus');
|
1875 | expect(div.el).to.have.style('width', '35px');
|
1876 | expect(div.el).to.have.style('height', '15px');
|
1877 | expect(div.el).to.have.style('marginTop', '20px');
|
1878 | expect(div.el).to.have.style('backgroundColor', 'rgb(200, 200, 200)');
|
1879 | expect(div.el.style.marginTop).to.equal('');
|
1880 | div.emit('mouseleave');
|
1881 | expect(div.el).to.have.style('width', '35px');
|
1882 | expect(div.el).to.have.style('height', '15px');
|
1883 | expect(div.el).to.have.style('marginTop', '0px');
|
1884 | expect(div.el).to.have.style('backgroundColor', 'rgb(200, 200, 200)');
|
1885 | return expect(div.el.style.marginTop).to.equal('');
|
1886 | });
|
1887 | test("If not passed a style map under the 'base' state, all non-state properties on the style object will be considered as 'base' state properties", function () {
|
1888 | var computedStyle, div;
|
1889 | div = Dom.div({
|
1890 | style: {
|
1891 | width: '15px',
|
1892 | height: '20px',
|
1893 | $hover: {
|
1894 | width: '25px',
|
1895 | height: '30px'
|
1896 | }
|
1897 | }
|
1898 | });
|
1899 | div.appendTo(sandbox);
|
1900 | computedStyle = getComputedStyle(div.el);
|
1901 | expect(computedStyle.width).to.equal('15px');
|
1902 | expect(computedStyle.height).to.equal('20px');
|
1903 | div.emit('mouseenter');
|
1904 | expect(computedStyle.width).to.equal('25px');
|
1905 | expect(computedStyle.height).to.equal('30px');
|
1906 | div.emit('mouseleave');
|
1907 | expect(computedStyle.width).to.equal('15px');
|
1908 | return expect(computedStyle.height).to.equal('20px');
|
1909 | });
|
1910 | test("State-specific styles will be removed upon state turn off or restored to the base value", function () {
|
1911 | var computedStyle, div;
|
1912 | div = Dom.div({
|
1913 | style: {
|
1914 | width: '15px',
|
1915 | $hover: {
|
1916 | width: '25px',
|
1917 | height: '30px'
|
1918 | }
|
1919 | }
|
1920 | });
|
1921 | div.appendTo(sandbox);
|
1922 | computedStyle = getComputedStyle(div.el);
|
1923 | expect(div.el).to.have.style('width', '15px');
|
1924 | expect(div.el).to.have.style('height', '0px');
|
1925 | expect(div.el.style.height).to.equal('');
|
1926 | div.emit('mouseenter');
|
1927 | expect(div.el).to.have.style('width', '25px');
|
1928 | expect(div.el).to.have.style('height', '30px');
|
1929 | expect(div.el.style.height).to.equal('');
|
1930 | div.emit('mouseleave');
|
1931 | expect(div.el).to.have.style('width', '15px');
|
1932 | expect(div.el).to.have.style('height', '0px');
|
1933 | return expect(div.el.style.height).to.equal('');
|
1934 | });
|
1935 | test("Higher order state styles will have a higher precedence than the 'base' style to be used as replacments for pending-removal state-styles", function () {
|
1936 | var computedStyle, div;
|
1937 | div = Dom.div({
|
1938 | style: {
|
1939 | width: '15px',
|
1940 | $hover: {
|
1941 | width: '25px',
|
1942 | height: '30px'
|
1943 | },
|
1944 | $focus: {
|
1945 | height: '45px'
|
1946 | }
|
1947 | }
|
1948 | });
|
1949 | div.appendTo(sandbox);
|
1950 | computedStyle = getComputedStyle(div.el);
|
1951 | expect(computedStyle.width).to.equal('15px');
|
1952 | expect(computedStyle.height).to.equal('0px');
|
1953 | div.emit('mouseenter');
|
1954 | expect(computedStyle.width).to.equal('25px');
|
1955 | expect(computedStyle.height).to.equal('30px');
|
1956 | div.emit('focus');
|
1957 | expect(computedStyle.width).to.equal('25px');
|
1958 | expect(computedStyle.height).to.equal('45px');
|
1959 | div.emit('mouseleave');
|
1960 | expect(computedStyle.width).to.equal('15px');
|
1961 | expect(computedStyle.height).to.equal('45px');
|
1962 | div.emit('blur');
|
1963 | div.emit('focus');
|
1964 | div.emit('mouseenter');
|
1965 | expect(computedStyle.width).to.equal('25px');
|
1966 | expect(computedStyle.height).to.equal('45px');
|
1967 | div.emit('blur');
|
1968 | expect(computedStyle.width).to.equal('25px');
|
1969 | return expect(computedStyle.height).to.equal('30px');
|
1970 | });
|
1971 | test("State toggles will be passed to children elements unless options.passStateToChildren is off", function () {
|
1972 | var A, B, C, Main;
|
1973 | Main = Dom.div();
|
1974 | A = Dom.div().appendTo(Main);
|
1975 | B = Dom.div().appendTo(A);
|
1976 | C = Dom.div({
|
1977 | passStateToChildren: false
|
1978 | }).appendTo(A);
|
1979 | expect(Main.state('happy')).to.be.false;
|
1980 | expect(A.state('happy')).to.be.false;
|
1981 | expect(B.state('happy')).to.be.false;
|
1982 | expect(C.state('happy')).to.be.false;
|
1983 | Main.state('happy', true);
|
1984 | expect(Main.state('happy')).to.be.true;
|
1985 | expect(A.state('happy')).to.be.true;
|
1986 | expect(B.state('happy')).to.be.true;
|
1987 | expect(C.state('happy')).to.be.true;
|
1988 | Main.options.passStateToChildren = false;
|
1989 | Main.state('happy', false);
|
1990 | expect(Main.state('happy')).to.be.false;
|
1991 | expect(A.state('happy')).to.be.true;
|
1992 | expect(B.state('happy')).to.be.true;
|
1993 | expect(C.state('happy')).to.be.true;
|
1994 | Main.state('happy', true);
|
1995 | Main.options.passStateToChildren = true;
|
1996 | A.options.passStateToChildren = false;
|
1997 | Main.state('happy', false);
|
1998 | expect(Main.state('happy')).to.be.false;
|
1999 | expect(A.state('happy')).to.be.false;
|
2000 | expect(B.state('happy')).to.be.true;
|
2001 | return expect(C.state('happy')).to.be.true;
|
2002 | });
|
2003 | test("State styles can be nested to trigger when all states are toggled on", function () {
|
2004 | var div;
|
2005 | div = Dom.div({
|
2006 | style: {
|
2007 | $base: {
|
2008 | width: '12px',
|
2009 | height: '12px',
|
2010 | fontSize: '10px'
|
2011 | },
|
2012 | $funny: {
|
2013 | fontSize: '15px',
|
2014 | height: '15px'
|
2015 | },
|
2016 | $happy: {
|
2017 | width: '14px',
|
2018 | fontSize: '14px',
|
2019 | $relaxed: {
|
2020 | height: '11px',
|
2021 | fontSize: '17px',
|
2022 | $funny: {
|
2023 | width: '10px',
|
2024 | height: '14px'
|
2025 | }
|
2026 | }
|
2027 | },
|
2028 | $relaxed: {
|
2029 | width: '17px'
|
2030 | }
|
2031 | }
|
2032 | });
|
2033 | div.appendTo(sandbox);
|
2034 | expect(div.style('width')).to.equal('12px');
|
2035 | expect(div.style('height')).to.equal('12px');
|
2036 | expect(div.style('fontSize')).to.equal('10px');
|
2037 | div.state('funny', true);
|
2038 | expect(div.style('width')).to.equal('12px');
|
2039 | expect(div.style('height')).to.equal('15px');
|
2040 | expect(div.style('fontSize')).to.equal('15px');
|
2041 | div.state('funny', false);
|
2042 | expect(div.style('width')).to.equal('12px');
|
2043 | expect(div.style('height')).to.equal('12px');
|
2044 | expect(div.style('fontSize')).to.equal('10px');
|
2045 | div.state('happy', true);
|
2046 | expect(div.style('width')).to.equal('14px');
|
2047 | expect(div.style('height')).to.equal('12px');
|
2048 | expect(div.style('fontSize')).to.equal('14px');
|
2049 | div.state('relaxed', true);
|
2050 | expect(div.style('width')).to.equal('17px');
|
2051 | expect(div.style('height')).to.equal('11px');
|
2052 | expect(div.style('fontSize')).to.equal('17px');
|
2053 | div.state('happy', false);
|
2054 | expect(div.style('width')).to.equal('17px');
|
2055 | expect(div.style('height')).to.equal('12px');
|
2056 | expect(div.style('fontSize')).to.equal('10px');
|
2057 | div.state('happy', true);
|
2058 | expect(div.style('width')).to.equal('17px');
|
2059 | expect(div.style('height')).to.equal('11px');
|
2060 | expect(div.style('fontSize')).to.equal('17px');
|
2061 | div.state('funny', true);
|
2062 | expect(div.style('width')).to.equal('10px');
|
2063 | expect(div.style('height')).to.equal('14px');
|
2064 | expect(div.style('fontSize')).to.equal('17px');
|
2065 | div.state('happy', false);
|
2066 | expect(div.style('width')).to.equal('17px');
|
2067 | expect(div.style('height')).to.equal('15px');
|
2068 | return expect(div.style('fontSize')).to.equal('15px');
|
2069 | });
|
2070 | test("QuickElement.rect should contain an updated version of the element's ClientRect", function () {
|
2071 | var div, rectA, rectB, rectC;
|
2072 | div = Dom.div().appendTo(sandbox);
|
2073 | rectA = div.rect;
|
2074 | rectB = div.rect;
|
2075 | expect(rectA).to.be.instanceOf(ClientRect);
|
2076 | expect(rectB).to.be.instanceOf(ClientRect);
|
2077 | expect(rectA).to.eql(rectB);
|
2078 | div.style('width', '7px');
|
2079 | rectC = div.rect;
|
2080 | expect(rectC).to.be.instanceOf(ClientRect);
|
2081 | expect(rectA).to.eql(rectB);
|
2082 | expect(rectA).not.to.eql(rectC);
|
2083 | expect(rectA.width).not.to.equal(7);
|
2084 | expect(rectB.width).not.to.equal(7);
|
2085 | return expect(rectC.width).to.equal(7);
|
2086 | });
|
2087 | test("QuickElement.width should return the updated version of an element's computed width", function () {
|
2088 | var div, parent;
|
2089 | parent = Dom.div().appendTo(sandbox);
|
2090 | div = Dom.div().appendTo(parent);
|
2091 | parent.style({
|
2092 | width: '1000px'
|
2093 | });
|
2094 | div.style({
|
2095 | width: '50%'
|
2096 | });
|
2097 | expect(div.width).to.equal(500);
|
2098 | div.style({
|
2099 | width: '10%'
|
2100 | });
|
2101 | expect(div.width).to.equal(100);
|
2102 | div.style({
|
2103 | width: '97px'
|
2104 | });
|
2105 | return expect(div.width).to.equal(97);
|
2106 | });
|
2107 | test("QuickElement.height should return the updated version of an element's computed height", function () {
|
2108 | var div, parent;
|
2109 | parent = Dom.div().appendTo(sandbox);
|
2110 | div = Dom.div().appendTo(parent);
|
2111 | parent.style({
|
2112 | height: '1000px'
|
2113 | });
|
2114 | div.style({
|
2115 | height: '50%'
|
2116 | });
|
2117 | expect(div.height).to.equal(500);
|
2118 | div.style({
|
2119 | height: '10%'
|
2120 | });
|
2121 | expect(div.height).to.equal(100);
|
2122 | div.style({
|
2123 | height: '97px'
|
2124 | });
|
2125 | return expect(div.height).to.equal(97);
|
2126 | });
|
2127 | test("QuickElement.width/.height setters are shortcuts for .style() setters", function () {
|
2128 | var div, parent;
|
2129 | parent = Dom.div().appendTo(sandbox);
|
2130 | div = Dom.div().appendTo(parent);
|
2131 | parent.style({
|
2132 | width: '1000px',
|
2133 | height: '1000px'
|
2134 | });
|
2135 | div.style({
|
2136 | width: '50%',
|
2137 | height: '50%'
|
2138 | });
|
2139 | div.width = div.height = '50%';
|
2140 | expect(div.width).to.equal(500);
|
2141 | expect(div.height).to.equal(500);
|
2142 | div.width = div.height = '10%';
|
2143 | expect(div.width).to.equal(100);
|
2144 | expect(div.height).to.equal(100);
|
2145 | div.width = div.height = '97px';
|
2146 | expect(div.width).to.equal(97);
|
2147 | return expect(div.height).to.equal(97);
|
2148 | });
|
2149 | test("QuickElement.orientation should return the updated version of an element's computed orientation", function () {
|
2150 | var div, parent;
|
2151 | parent = Dom.div().appendTo(sandbox);
|
2152 | div = Dom.div().appendTo(parent);
|
2153 | div.style({
|
2154 | width: 500,
|
2155 | height: 400
|
2156 | });
|
2157 | expect(div.orientation).to.equal('landscape');
|
2158 | div.style({
|
2159 | width: 550,
|
2160 | height: 600
|
2161 | });
|
2162 | expect(div.orientation).to.equal('portrait');
|
2163 | div.style({
|
2164 | width: 600,
|
2165 | height: 600
|
2166 | });
|
2167 | expect(div.orientation).to.equal('portrait');
|
2168 | div.style({
|
2169 | width: 601,
|
2170 | height: 600
|
2171 | });
|
2172 | return expect(div.orientation).to.equal('landscape');
|
2173 | });
|
2174 | test("QuickElement.aspectRatio should return the updated version of an element's computed aspect-ratio", function () {
|
2175 | var div, parent;
|
2176 | parent = Dom.div().appendTo(sandbox);
|
2177 | div = Dom.div().appendTo(parent);
|
2178 | div.style({
|
2179 | width: 500,
|
2180 | height: 400
|
2181 | });
|
2182 | expect(div.aspectRatio).to.equal(1.25);
|
2183 | div.style({
|
2184 | width: 540,
|
2185 | height: 600
|
2186 | });
|
2187 | expect(div.aspectRatio).to.equal(0.9);
|
2188 | div.style({
|
2189 | width: 600,
|
2190 | height: 600
|
2191 | });
|
2192 | expect(div.aspectRatio).to.equal(1);
|
2193 | div.style({
|
2194 | width: 300,
|
2195 | height: 900
|
2196 | });
|
2197 | return expect(div.aspectRatio).to.equal(0.33333333333333333333333333);
|
2198 | });
|
2199 | test("If options.styleAfterInsert is passed, function styles will be applied only after the element is inserted into the DOM", function () {
|
2200 | var className, divA, divB, divC, divReg, parentOpacityGetter;
|
2201 | parentOpacityGetter = function () {
|
2202 | if (this.parent) {
|
2203 | return this.parent.style('opacity');
|
2204 | } else {
|
2205 | return '0.5';
|
2206 | }
|
2207 | };
|
2208 | divReg = Dom.div({
|
2209 | style: {
|
2210 | height: '19px',
|
2211 | opacity: parentOpacityGetter
|
2212 | }
|
2213 | });
|
2214 | divA = Dom.div({
|
2215 | style: {
|
2216 | height: '19px',
|
2217 | opacity: parentOpacityGetter
|
2218 | },
|
2219 | styleAfterInsert: true
|
2220 | });
|
2221 | divB = Dom.div({
|
2222 | style: {
|
2223 | height: '19px',
|
2224 | opacity: parentOpacityGetter
|
2225 | },
|
2226 | styleAfterInsert: true
|
2227 | });
|
2228 | divC = Dom.div({
|
2229 | style: {
|
2230 | height: '19px',
|
2231 | opacity: parentOpacityGetter
|
2232 | },
|
2233 | styleAfterInsert: true
|
2234 | });
|
2235 | className = divReg.raw.className || 'no className';
|
2236 | expect(divReg.raw.className).to.equal(className);
|
2237 | expect(divA.raw.className).to.equal(className);
|
2238 | expect(divB.raw.className).to.equal(className);
|
2239 | expect(divC.raw.className).to.equal(className);
|
2240 | expect(divReg.el.style.opacity).to.equal('0.5');
|
2241 | expect(divA.el.style.opacity).to.equal('');
|
2242 | expect(divB.el.style.opacity).to.equal('');
|
2243 | expect(divC.el.style.opacity).to.equal('');
|
2244 | divA.appendTo(sandbox);
|
2245 | expect(divA.el.style.opacity).to.equal('1');
|
2246 | expect(divB.el.style.opacity).to.equal('');
|
2247 | expect(divC.el.style.opacity).to.equal('');
|
2248 | divB.insertBefore(sandbox);
|
2249 | expect(divA.el.style.opacity).to.equal('1');
|
2250 | expect(divB.el.style.opacity).to.equal('1');
|
2251 | expect(divC.el.style.opacity).to.equal('');
|
2252 | sandbox.appendChild(divC.el);
|
2253 | expect(divA.el.style.opacity).to.equal('1');
|
2254 | expect(divB.el.style.opacity).to.equal('1');
|
2255 | expect(divC.el.style.opacity).to.equal('');
|
2256 | divC.parent;
|
2257 | expect(divA.el.style.opacity).to.equal('1');
|
2258 | expect(divB.el.style.opacity).to.equal('1');
|
2259 | expect(divC.el.style.opacity).to.equal('1');
|
2260 | return divC.appendTo(sandbox);
|
2261 | });
|
2262 | test("Any styles applied by states before the element has been inserted into the DOM and when options.styleAfterInsert is on will be re-applied after insert", function () {
|
2263 | var divA, divReg;
|
2264 | divReg = Dom.div({
|
2265 | style: {
|
2266 | $base: {
|
2267 | height: function () {
|
2268 | return '19px';
|
2269 | }
|
2270 | },
|
2271 | $funny: {
|
2272 | height: function () {
|
2273 | return '29px';
|
2274 | }
|
2275 | },
|
2276 | $happy: {
|
2277 | height: function () {
|
2278 | return '39px';
|
2279 | }
|
2280 | }
|
2281 | }
|
2282 | });
|
2283 | divA = Dom.div({
|
2284 | style: {
|
2285 | $base: {
|
2286 | height: function () {
|
2287 | return '19px';
|
2288 | }
|
2289 | },
|
2290 | $funny: {
|
2291 | height: function () {
|
2292 | return '29px';
|
2293 | }
|
2294 | },
|
2295 | $happy: {
|
2296 | height: function () {
|
2297 | return '39px';
|
2298 | }
|
2299 | }
|
2300 | },
|
2301 | styleAfterInsert: true
|
2302 | });
|
2303 | expect(divReg.el.style.height).to.equal('19px');
|
2304 | expect(divA.el.style.height).to.equal('');
|
2305 | divReg.state('funny', true);
|
2306 | divA.state('funny', true);
|
2307 | expect(divReg.el.style.height).to.equal('29px');
|
2308 | expect(divA.el.style.height).to.equal('');
|
2309 | divReg.state('happy', true);
|
2310 | divA.state('happy', true);
|
2311 | expect(divReg.el.style.height).to.equal('39px');
|
2312 | expect(divA.el.style.height).to.equal('');
|
2313 | divReg.appendTo(sandbox);
|
2314 | divA.appendTo(sandbox);
|
2315 | expect(divReg.el.style.height).to.equal('39px');
|
2316 | return expect(divA.el.style.height).to.equal('39px');
|
2317 | });
|
2318 | test("If an element with options.styleAfterInsert is appended into a detached element, styles will be applied only after the parent is appended to the DOM", function () {
|
2319 | var detachedParent, divA, divReg;
|
2320 | detachedParent = Dom.div();
|
2321 | divReg = Dom.div({
|
2322 | style: {
|
2323 | height: (function () {
|
2324 | return '19px';
|
2325 | }),
|
2326 | $happy: {
|
2327 | $relaxed: {
|
2328 | width: function () {
|
2329 | return '31px';
|
2330 | }
|
2331 | }
|
2332 | }
|
2333 | }
|
2334 | });
|
2335 | divA = Dom.div({
|
2336 | style: {
|
2337 | height: (function () {
|
2338 | return '19px';
|
2339 | }),
|
2340 | $happy: {
|
2341 | $relaxed: {
|
2342 | width: function () {
|
2343 | return '31px';
|
2344 | }
|
2345 | }
|
2346 | }
|
2347 | },
|
2348 | styleAfterInsert: true
|
2349 | });
|
2350 | divReg.state('happy', true);
|
2351 | divReg.state('relaxed', true);
|
2352 | divA.state('happy', true);
|
2353 | divA.state('relaxed', true);
|
2354 | divA.state('relaxed', true);
|
2355 | divA.style('visibility', 'hidden');
|
2356 | expect(divReg.el.style.height).to.equal('19px');
|
2357 | expect(divReg.el.style.width).to.equal('31px');
|
2358 | expect(divA.el.style.height).to.equal('');
|
2359 | expect(divA.el.style.width).to.equal('');
|
2360 | expect(divA.el.style.visibility).to.equal('hidden');
|
2361 | divA.appendTo(detachedParent);
|
2362 | expect(divA.el.style.height).to.equal('');
|
2363 | expect(divA.el.style.width).to.equal('');
|
2364 | expect(divA.el.style.visibility).to.equal('hidden');
|
2365 | detachedParent.appendTo(sandbox);
|
2366 | expect(divA.el.style.height).to.equal('19px');
|
2367 | expect(divA.el.style.width).to.equal('31px');
|
2368 | return expect(divA.el.style.visibility).to.equal('hidden');
|
2369 | });
|
2370 | test("QuickElement.pipeState can be used to redirect all state toggles to the provided target element", function () {
|
2371 | var childA, childB, divA, divB, parentA, parentB;
|
2372 | parentA = Dom.div();
|
2373 | parentB = Dom.div({
|
2374 | passStateToChildren: false
|
2375 | });
|
2376 | divA = Dom.div(null).appendTo(parentA);
|
2377 | divB = Dom.div(null).appendTo(parentB);
|
2378 | childA = Dom.span().appendTo(divA);
|
2379 | childB = Dom.span().appendTo(divB);
|
2380 | divA.pipeState();
|
2381 | divA.state('1', true);
|
2382 | expect(parentA.state('1')).to.equal(false);
|
2383 | expect(divA.state('1')).to.equal(true);
|
2384 | expect(childA.state('1')).to.equal(true);
|
2385 | divA.pipeState(parentA);
|
2386 | divA.state('2', true);
|
2387 | expect(parentA.state('2')).to.equal(true);
|
2388 | expect(divA.state('2')).to.equal(true);
|
2389 | expect(childA.state('2')).to.equal(true);
|
2390 | divA.pipeState(false);
|
2391 | divA.state('2.5', true);
|
2392 | expect(parentA.state('2.5')).to.equal(false);
|
2393 | expect(divA.state('2.5')).to.equal(true);
|
2394 | expect(childA.state('2.5')).to.equal(true);
|
2395 | divB.pipeState(true);
|
2396 | divB.state('3', true);
|
2397 | expect(parentB.state('3')).to.equal(false);
|
2398 | expect(divB.state('3')).to.equal(true);
|
2399 | expect(childB.state('3')).to.equal(true);
|
2400 | divB.pipeState(parentB);
|
2401 | divB.state('4', true);
|
2402 | expect(parentB.state('4')).to.equal(true);
|
2403 | expect(divB.state('4')).to.equal(false);
|
2404 | expect(childB.state('4')).to.equal(false);
|
2405 | divA.pipeState(parentB);
|
2406 | divA.state('5', true);
|
2407 | expect(parentA.state('5')).to.equal(false);
|
2408 | expect(parentB.state('5')).to.equal(true);
|
2409 | expect(divA.state('5')).to.equal(false);
|
2410 | expect(divB.state('5')).to.equal(false);
|
2411 | expect(childA.state('5')).to.equal(false);
|
2412 | expect(childB.state('5')).to.equal(false);
|
2413 | divA.pipeState(false);
|
2414 | divB.pipeState(parentA);
|
2415 | divB.state('6', true);
|
2416 | expect(parentA.state('6')).to.equal(true);
|
2417 | expect(parentB.state('6')).to.equal(false);
|
2418 | expect(divA.state('6')).to.equal(true);
|
2419 | expect(divB.state('6')).to.equal(false);
|
2420 | expect(childA.state('6')).to.equal(true);
|
2421 | return expect(childB.state('6')).to.equal(false);
|
2422 | });
|
2423 | test("States can be marked as unpassable to avoid passing to children by including them in options.unpassableStates", function () {
|
2424 | var div, spanA, spanB, subSpan;
|
2425 | div = Dom.div({
|
2426 | unpassableStates: ['B', 'D']
|
2427 | });
|
2428 | spanA = Dom.span().appendTo(div);
|
2429 | spanB = Dom.span().appendTo(div);
|
2430 | subSpan = Dom.span().appendTo(spanB);
|
2431 | expect(div.state('A')).to.equal(false);
|
2432 | expect(spanA.state('A')).to.equal(false);
|
2433 | expect(spanB.state('A')).to.equal(false);
|
2434 | expect(subSpan.state('A')).to.equal(false);
|
2435 | div.state('A', true);
|
2436 | expect(div.state('A')).to.equal(true);
|
2437 | expect(spanA.state('A')).to.equal(true);
|
2438 | expect(spanB.state('A')).to.equal(true);
|
2439 | expect(subSpan.state('A')).to.equal(true);
|
2440 | div.state('B', true);
|
2441 | expect(div.state('B')).to.equal(true);
|
2442 | expect(spanA.state('B')).to.equal(false);
|
2443 | expect(spanB.state('B')).to.equal(false);
|
2444 | expect(subSpan.state('B')).to.equal(false);
|
2445 | div.state('C', true);
|
2446 | expect(div.state('C')).to.equal(true);
|
2447 | expect(spanA.state('C')).to.equal(true);
|
2448 | expect(spanB.state('C')).to.equal(true);
|
2449 | expect(subSpan.state('C')).to.equal(true);
|
2450 | div.state('D', true);
|
2451 | expect(div.state('D')).to.equal(true);
|
2452 | expect(spanA.state('D')).to.equal(false);
|
2453 | expect(spanB.state('D')).to.equal(false);
|
2454 | expect(subSpan.state('D')).to.equal(false);
|
2455 | spanB.state('D', true);
|
2456 | expect(spanB.state('D')).to.equal(true);
|
2457 | expect(subSpan.state('D')).to.equal(true);
|
2458 | div.state('D', false);
|
2459 | expect(div.state('D')).to.equal(false);
|
2460 | expect(spanB.state('D')).to.equal(true);
|
2461 | return expect(subSpan.state('D')).to.equal(true);
|
2462 | });
|
2463 | test("When .state() receives a truthy value as the third argument the event will bubble up to parents instead of cascade to children", function () {
|
2464 | var childA, childB, parentA, parentB, subChildA, subChildB, subParentA, subParentB;
|
2465 | parentA = Dom.section(null, subParentA = Dom.div(null, childA = Dom.div(null, subChildA = Dom.div())));
|
2466 | parentB = Dom.section(null, subParentB = Dom.div(null, childB = Dom.div(null, subChildB = Dom.div())));
|
2467 | expect(parentA.state('happy')).to.equal(false);
|
2468 | expect(parentB.state('happy')).to.equal(false);
|
2469 | expect(subParentA.state('happy')).to.equal(false);
|
2470 | expect(subParentB.state('happy')).to.equal(false);
|
2471 | expect(childA.state('happy')).to.equal(false);
|
2472 | expect(childB.state('happy')).to.equal(false);
|
2473 | expect(subChildA.state('happy')).to.equal(false);
|
2474 | expect(subChildB.state('happy')).to.equal(false);
|
2475 | childA.state('happy', true, true);
|
2476 | childB.state('happy', true);
|
2477 | expect(parentA.state('happy')).to.equal(true);
|
2478 | expect(parentB.state('happy')).to.equal(false);
|
2479 | expect(subParentA.state('happy')).to.equal(true);
|
2480 | expect(subParentB.state('happy')).to.equal(false);
|
2481 | expect(childA.state('happy')).to.equal(true);
|
2482 | expect(childB.state('happy')).to.equal(true);
|
2483 | expect(subChildA.state('happy')).to.equal(false);
|
2484 | expect(subChildB.state('happy')).to.equal(true);
|
2485 | childA.state('relaxed', true, null);
|
2486 | childB.state('relaxed', true, 'on');
|
2487 | expect(parentA.state('relaxed')).to.equal(false);
|
2488 | expect(parentB.state('relaxed')).to.equal(true);
|
2489 | expect(subParentA.state('relaxed')).to.equal(false);
|
2490 | expect(subParentB.state('relaxed')).to.equal(true);
|
2491 | expect(childA.state('relaxed')).to.equal(true);
|
2492 | expect(childB.state('relaxed')).to.equal(true);
|
2493 | expect(subChildA.state('relaxed')).to.equal(true);
|
2494 | return expect(subChildB.state('relaxed')).to.equal(false);
|
2495 | });
|
2496 | test("options.stateTriggers config objects can specify a 'force' property which will make them get attached even if they aren't used", function () {
|
2497 | var divA, divB;
|
2498 | divA = Dom.div({
|
2499 | stateTriggers: {
|
2500 | 'happy': {
|
2501 | on: 'happyON',
|
2502 | off: 'happyOFF',
|
2503 | force: true
|
2504 | }
|
2505 | }
|
2506 | });
|
2507 | divB = Dom.div({
|
2508 | stateTriggers: {
|
2509 | 'happy': {
|
2510 | on: 'happyON',
|
2511 | off: 'happyOFF'
|
2512 | }
|
2513 | }
|
2514 | });
|
2515 | expect(divA.state('happy')).to.equal(false);
|
2516 | expect(divB.state('happy')).to.equal(false);
|
2517 | divA.raw.emitEvent('happyON');
|
2518 | divB.raw.emitEvent('happyON');
|
2519 | expect(divA.state('happy')).to.equal(true);
|
2520 | expect(divB.state('happy')).to.equal(false);
|
2521 | divB.state('happy', true);
|
2522 | divA.raw.emitEvent('happyOFF');
|
2523 | divB.raw.emitEvent('happyOFF');
|
2524 | expect(divA.state('happy')).to.equal(false);
|
2525 | return expect(divB.state('happy')).to.equal(true);
|
2526 | });
|
2527 | test("options.stateTriggers config objects can specify a 'bubbles' property which will cause the state to bubble to parents instead of cascade to children", function () {
|
2528 | var childA, childB, parentA, parentB, subChildA, subChildB, subParentA, subParentB;
|
2529 | parentA = Dom.section(null, subParentA = Dom.div(null, childA = Dom.div({
|
2530 | stateTriggers: {
|
2531 | 'happy': {
|
2532 | on: 'happyON',
|
2533 | off: 'happyOFF',
|
2534 | bubbles: true,
|
2535 | force: true
|
2536 | }
|
2537 | }
|
2538 | }, subChildA = Dom.div())));
|
2539 | parentB = Dom.section(null, subParentB = Dom.div(null, childB = Dom.div({
|
2540 | stateTriggers: {
|
2541 | 'happy': {
|
2542 | on: 'happyON',
|
2543 | off: 'happyOFF',
|
2544 | force: true
|
2545 | }
|
2546 | }
|
2547 | }, subChildB = Dom.div())));
|
2548 | expect(parentA.state('happy')).to.equal(false);
|
2549 | expect(parentB.state('happy')).to.equal(false);
|
2550 | expect(subParentA.state('happy')).to.equal(false);
|
2551 | expect(subParentB.state('happy')).to.equal(false);
|
2552 | expect(childA.state('happy')).to.equal(false);
|
2553 | expect(childB.state('happy')).to.equal(false);
|
2554 | expect(subChildA.state('happy')).to.equal(false);
|
2555 | expect(subChildB.state('happy')).to.equal(false);
|
2556 | childA.raw.emitEvent('happyON');
|
2557 | childB.raw.emitEvent('happyON');
|
2558 | expect(parentA.state('happy')).to.equal(true);
|
2559 | expect(parentB.state('happy')).to.equal(false);
|
2560 | expect(subParentA.state('happy')).to.equal(true);
|
2561 | expect(subParentB.state('happy')).to.equal(false);
|
2562 | expect(childA.state('happy')).to.equal(true);
|
2563 | expect(childB.state('happy')).to.equal(true);
|
2564 | expect(subChildA.state('happy')).to.equal(false);
|
2565 | expect(subChildB.state('happy')).to.equal(true);
|
2566 | childA.raw.emitEvent('happyOFF');
|
2567 | childB.raw.emitEvent('happyOFF');
|
2568 | expect(parentA.state('happy')).to.equal(false);
|
2569 | expect(parentB.state('happy')).to.equal(false);
|
2570 | expect(subParentA.state('happy')).to.equal(false);
|
2571 | expect(subParentB.state('happy')).to.equal(false);
|
2572 | expect(childA.state('happy')).to.equal(false);
|
2573 | expect(childB.state('happy')).to.equal(false);
|
2574 | expect(subChildA.state('happy')).to.equal(false);
|
2575 | return expect(subChildB.state('happy')).to.equal(false);
|
2576 | });
|
2577 | test("wrappers created for existing elements should attempt to resolve if its inserted into the DOM on init", function () {
|
2578 | var divA, divA_, divB, divB_;
|
2579 | divA_ = document.createElement('div');
|
2580 | divB_ = document.createElement('div');
|
2581 | sandbox.appendChild(divB_);
|
2582 | divA = Dom(divA_);
|
2583 | divB = Dom(divB_);
|
2584 | divA_.style.height = '100px';
|
2585 | divB_.style.height = '100px';
|
2586 | expect(typeof divA.height).to.equal('number');
|
2587 | expect(typeof divB.height).to.equal('number');
|
2588 | expect(isNaN(divA.height)).to.be.true;
|
2589 | expect(isNaN(divB.height)).to.be.false;
|
2590 | return expect(divA.styleSafe('height')).to.equal('100px');
|
2591 | });
|
2592 | test("state-based text", function () {
|
2593 | var divA, divB, divC;
|
2594 | divA = Dom(['div', null, ['text', {
|
2595 | text: {
|
2596 | $base: 'abc123',
|
2597 | $happy: 'Happy',
|
2598 | $relaxed: 'Relaxed'
|
2599 | }
|
2600 | }]]);
|
2601 | divB = Dom(['div', null, ['text', {
|
2602 | text: {
|
2603 | $happy: 'Happy',
|
2604 | $relaxed: 'Relaxed',
|
2605 | '$relaxed+funny': 'Funny & Relaxed'
|
2606 | }
|
2607 | }]]);
|
2608 | divC = Dom.div({
|
2609 | text: {
|
2610 | $base: 'def456',
|
2611 | $happy: 'ghi789'
|
2612 | }
|
2613 | });
|
2614 | expect(divA.text).to.equal('abc123');
|
2615 | expect(divB.text).to.equal('');
|
2616 | expect(divC.text).to.equal('def456');
|
2617 | divA.state('happy', true);
|
2618 | divB.state('happy', true);
|
2619 | divC.state('happy', true);
|
2620 | expect(divA.text).to.equal('Happy');
|
2621 | expect(divB.text).to.equal('Happy');
|
2622 | expect(divC.text).to.equal('ghi789');
|
2623 | divA.state('happy', false);
|
2624 | divB.state('happy', false);
|
2625 | divC.state('happy', false);
|
2626 | expect(divA.text).to.equal('abc123');
|
2627 | expect(divB.text).to.equal('');
|
2628 | expect(divC.text).to.equal('def456');
|
2629 | divA.state('relaxed', true);
|
2630 | divB.state('relaxed', true);
|
2631 | expect(divA.text).to.equal('Relaxed');
|
2632 | expect(divB.text).to.equal('Relaxed');
|
2633 | divA.state('happy', true);
|
2634 | divB.state('happy', true);
|
2635 | expect(divA.text).to.equal('Relaxed');
|
2636 | expect(divB.text).to.equal('Relaxed');
|
2637 | divA.state('relaxed', false);
|
2638 | divB.state('relaxed', false);
|
2639 | expect(divA.text).to.equal('Happy');
|
2640 | expect(divB.text).to.equal('Happy');
|
2641 | divB.state('relaxed', true);
|
2642 | divB.state('funny', true);
|
2643 | expect(divB.text).to.equal('Relaxed');
|
2644 | divB.state('relaxed+funny', true);
|
2645 | return expect(divB.text).to.equal('Funny & Relaxed');
|
2646 | });
|
2647 | test("state changes will emit a private stateChange:<state> event", function () {
|
2648 | var div, results;
|
2649 | results = [];
|
2650 | div = Dom.div({
|
2651 | style: {
|
2652 | color: 'white',
|
2653 | opacity: 1,
|
2654 | $happy: {
|
2655 | color: 'black'
|
2656 | }
|
2657 | }
|
2658 | });
|
2659 | div.state('any', true);
|
2660 | div.on('stateChange:happy', function (state) {
|
2661 | return results.push(['happy', state]);
|
2662 | });
|
2663 | div.on('stateChange:relaxed', function (state) {
|
2664 | return results.push(['relaxed', state]);
|
2665 | });
|
2666 | div.on('stateChange:arbitrary', function (state) {
|
2667 | return results.push(['arbitrary', state]);
|
2668 | });
|
2669 | expect(results).to.deep.equal([]);
|
2670 | div.state('happy', true);
|
2671 | expect(results).to.deep.equal([['happy', true]]);
|
2672 | div.state('happy', false);
|
2673 | expect(results).to.deep.equal([['happy', true], ['happy', false]]);
|
2674 | div.state('happy', true);
|
2675 | expect(results).to.deep.equal([['happy', true], ['happy', false], ['happy', true]]);
|
2676 | div.state('happy', true);
|
2677 | expect(results).to.deep.equal([['happy', true], ['happy', false], ['happy', true]]);
|
2678 | div.state('another', true);
|
2679 | expect(results).to.deep.equal([['happy', true], ['happy', false], ['happy', true]]);
|
2680 | div.state('relaxed', true);
|
2681 | expect(results).to.deep.equal([['happy', true], ['happy', false], ['happy', true], ['relaxed', true]]);
|
2682 | div.state('arbitrary', true);
|
2683 | expect(results).to.deep.equal([['happy', true], ['happy', false], ['happy', true], ['relaxed', true], ['arbitrary', true]]);
|
2684 | div.state('relaxed', true);
|
2685 | return expect(results).to.deep.equal([['happy', true], ['happy', false], ['happy', true], ['relaxed', true], ['arbitrary', true]]);
|
2686 | });
|
2687 | test("state-based styles can be updated via QuickElement.updateStateStyles", function () {
|
2688 | var div, getStyles;
|
2689 | div = Dom.div({
|
2690 | style: {
|
2691 | width: 5,
|
2692 | height: 5,
|
2693 | marginTop: 5,
|
2694 | $happy: {
|
2695 | marginTop: 10
|
2696 | },
|
2697 | $relaxed: {
|
2698 | marginTop: 20,
|
2699 | width: 20,
|
2700 | $happy: {
|
2701 | height: 40,
|
2702 | marginTop: 40
|
2703 | }
|
2704 | },
|
2705 | $somethingElse: {
|
2706 | width: 60,
|
2707 | marginTop: 60
|
2708 | }
|
2709 | }
|
2710 | }).appendTo(sandbox);
|
2711 | getStyles = function () {
|
2712 | return {
|
2713 | width: div.style('width'),
|
2714 | height: div.style('height'),
|
2715 | marginTop: div.style('marginTop')
|
2716 | };
|
2717 | };
|
2718 | expect(getStyles()).to.eql({
|
2719 | width: '5px',
|
2720 | height: '5px',
|
2721 | marginTop: '5px'
|
2722 | });
|
2723 | div.state('happy', true);
|
2724 | expect(getStyles()).to.eql({
|
2725 | width: '5px',
|
2726 | height: '5px',
|
2727 | marginTop: '10px'
|
2728 | });
|
2729 | div.updateStateStyles({
|
2730 | width: 7,
|
2731 | height: 8,
|
2732 | $happy: {
|
2733 | marginTop: 12,
|
2734 | height: 12
|
2735 | }
|
2736 | });
|
2737 | expect(getStyles()).to.eql({
|
2738 | width: '7px',
|
2739 | height: '12px',
|
2740 | marginTop: '12px'
|
2741 | });
|
2742 | div.state('happy', false);
|
2743 | expect(getStyles()).to.eql({
|
2744 | width: '7px',
|
2745 | height: '8px',
|
2746 | marginTop: '5px'
|
2747 | });
|
2748 | div.state('happy', true);
|
2749 | expect(getStyles()).to.eql({
|
2750 | width: '7px',
|
2751 | height: '12px',
|
2752 | marginTop: '12px'
|
2753 | });
|
2754 | div.state('happy', false);
|
2755 | div.updateStateStyles({
|
2756 | $base: {
|
2757 | width: 2,
|
2758 | height: 9
|
2759 | },
|
2760 | $relaxed: {
|
2761 | height: 20,
|
2762 | $happy: {
|
2763 | width: 40,
|
2764 | marginTop: function () {
|
2765 | return 45;
|
2766 | }
|
2767 | }
|
2768 | }
|
2769 | });
|
2770 | expect(getStyles()).to.eql({
|
2771 | width: '2px',
|
2772 | height: '9px',
|
2773 | marginTop: '5px'
|
2774 | });
|
2775 | div.state('relaxed', true);
|
2776 | expect(getStyles()).to.eql({
|
2777 | width: '20px',
|
2778 | height: '20px',
|
2779 | marginTop: '20px'
|
2780 | });
|
2781 | div.state('happy', true);
|
2782 | expect(getStyles()).to.eql({
|
2783 | width: '40px',
|
2784 | height: '40px',
|
2785 | marginTop: '45px'
|
2786 | });
|
2787 | div.state({
|
2788 | happy: false,
|
2789 | relaxed: false
|
2790 | });
|
2791 | div.el.style.marginTop = null;
|
2792 | expect(getStyles()).to.eql({
|
2793 | width: '2px',
|
2794 | height: '9px',
|
2795 | marginTop: '5px'
|
2796 | });
|
2797 | div.state('somethingElse', true);
|
2798 | return expect(getStyles()).to.eql({
|
2799 | width: '60px',
|
2800 | height: '9px',
|
2801 | marginTop: '60px'
|
2802 | });
|
2803 | });
|
2804 | return test("default states to apply to an element upon creation can be specified via options.state mapping", function () {
|
2805 | var el1, el2, el3;
|
2806 | el1 = DOM.div();
|
2807 | el2 = DOM.div({
|
2808 | state: {
|
2809 | happy: true,
|
2810 | relaxed: false
|
2811 | }
|
2812 | });
|
2813 | el3 = DOM.div({
|
2814 | state: {
|
2815 | relaxed: true
|
2816 | }
|
2817 | });
|
2818 | expect(el1.state('happy')).to.equal(false);
|
2819 | expect(el1.state('relaxed')).to.equal(false);
|
2820 | expect(el2.state('happy')).to.equal(true);
|
2821 | expect(el2.state('relaxed')).to.equal(false);
|
2822 | expect(el3.state('happy')).to.equal(false);
|
2823 | return expect(el3.state('relaxed')).to.equal(true);
|
2824 | });
|
2825 | });
|
2826 | suite("Media Queries", function () {
|
2827 | suiteTeardown(function () {
|
2828 | var ref;
|
2829 | if ((ref = Object.getOwnPropertyDescriptor(window, 'innerWidth')) != null ? ref.configurable : void 0) {
|
2830 | return dimensions.restore();
|
2831 | }
|
2832 | });
|
2833 | suiteSetup(function () {
|
2834 | var ref;
|
2835 | if (!((ref = Object.getOwnPropertyDescriptor(window, 'innerWidth')) != null ? ref.configurable : void 0)) {
|
2836 | return this.skip();
|
2837 | }
|
2838 | });
|
2839 | teardown(function () {
|
2840 | var i, level, results1;
|
2841 | results1 = [];
|
2842 | for (level = i = 0; i <= 3; level = ++i) {
|
2843 | results1.push(Dom.CSS.clearRegistered(level));
|
2844 | }
|
2845 | return results1;
|
2846 | });
|
2847 | test("Window dimensions", function () {
|
2848 | var div;
|
2849 | dimensions.simulate(1000, 1000);
|
2850 | div = Dom.div({
|
2851 | style: {
|
2852 | position: 'relative',
|
2853 | zIndex: 2,
|
2854 | width: '300px',
|
2855 | height: '300px',
|
2856 | fontSize: '30px',
|
2857 | lineHeight: '30px',
|
2858 | '@window(orientation:landscape)': {
|
2859 | marginTop: 6
|
2860 | },
|
2861 | '@window(orientation:portrait)': {
|
2862 | marginTop: 7
|
2863 | },
|
2864 | '@window(max-width:800)': {
|
2865 | zIndex: 3,
|
2866 | width: '280px'
|
2867 | },
|
2868 | '@window(max-width:700, max-height:1000)': {
|
2869 | zIndex: 4,
|
2870 | width: '250px',
|
2871 | height: '250px'
|
2872 | },
|
2873 | '@window(max-height:1000)': {
|
2874 | fontSize: '25px'
|
2875 | },
|
2876 | '@window(min-width:900px)': {
|
2877 | fontSize: '23px'
|
2878 | },
|
2879 | '@window(aspect-ratio:0.5)': {
|
2880 | fontSize: '21px',
|
2881 | lineHeight: '12px'
|
2882 | },
|
2883 | '@window(min-height:1200)': {
|
2884 | fontSize: '20px'
|
2885 | }
|
2886 | }
|
2887 | });
|
2888 | div.appendTo(sandbox);
|
2889 | expect(div.style('zIndex')).to.equal('2');
|
2890 | expect(div.style('width')).to.equal('300px');
|
2891 | expect(div.style('height')).to.equal('300px');
|
2892 | expect(div.style('fontSize')).to.equal('23px');
|
2893 | expect(div.style('marginTop')).to.equal('7px');
|
2894 | dimensions.simulate(900);
|
2895 | expect(div.style('fontSize')).to.equal('23px');
|
2896 | dimensions.simulate(899);
|
2897 | expect(div.style('fontSize')).to.equal('25px');
|
2898 | dimensions.simulate(899, 1100);
|
2899 | expect(div.style('fontSize')).to.equal('30px');
|
2900 | dimensions.simulate(950);
|
2901 | expect(div.style('fontSize')).to.equal('23px');
|
2902 | dimensions.simulate(950, 1900);
|
2903 | expect(div.style('fontSize')).to.equal('20px');
|
2904 | expect(div.style('lineHeight')).to.equal('12px');
|
2905 | dimensions.simulate(950, 1899);
|
2906 | expect(div.style('fontSize')).to.equal('20px');
|
2907 | expect(div.style('lineHeight')).to.equal('30px');
|
2908 | dimensions.simulate(790);
|
2909 | expect(div.style('zIndex')).to.equal('3');
|
2910 | expect(div.style('width')).to.equal('280px');
|
2911 | dimensions.simulate(810);
|
2912 | expect(div.style('zIndex')).to.equal('2');
|
2913 | expect(div.style('width')).to.equal('300px');
|
2914 | dimensions.simulate(791);
|
2915 | expect(div.style('zIndex')).to.equal('3');
|
2916 | expect(div.style('width')).to.equal('280px');
|
2917 | dimensions.simulate(701, 900);
|
2918 | expect(div.style('zIndex')).to.equal('3');
|
2919 | expect(div.style('width')).to.equal('280px');
|
2920 | expect(div.style('height')).to.equal('300px');
|
2921 | dimensions.simulate(700, 900);
|
2922 | expect(div.style('zIndex')).to.equal('4');
|
2923 | expect(div.style('width')).to.equal('250px');
|
2924 | expect(div.style('height')).to.equal('250px');
|
2925 | dimensions.simulate(700, 1001);
|
2926 | expect(div.style('zIndex')).to.equal('3');
|
2927 | expect(div.style('width')).to.equal('280px');
|
2928 | expect(div.style('height')).to.equal('300px');
|
2929 | dimensions.simulate(700, 1000);
|
2930 | expect(div.style('zIndex')).to.equal('4');
|
2931 | expect(div.style('width')).to.equal('250px');
|
2932 | expect(div.style('height')).to.equal('250px');
|
2933 | expect(div.style('marginTop')).to.equal('7px');
|
2934 | dimensions.simulate(1100, 1000);
|
2935 | expect(div.style('marginTop')).to.equal('6px');
|
2936 | dimensions.simulate(1100, 1101);
|
2937 | return expect(div.style('marginTop')).to.equal('7px');
|
2938 | });
|
2939 | test("Self dimensions/styles", function () {
|
2940 | var div, parent, simulateParent;
|
2941 | parent = Dom.div().appendTo(sandbox);
|
2942 | simulateParent = function (width, height) {
|
2943 | if (width) {
|
2944 | parent.style('width', width);
|
2945 | }
|
2946 | if (height) {
|
2947 | parent.style('height', height);
|
2948 | }
|
2949 | return dimensions.simulate();
|
2950 | };
|
2951 | div = Dom.div({
|
2952 | style: {
|
2953 | position: 'relative',
|
2954 | zIndex: 2,
|
2955 | top: '30px',
|
2956 | width: '100%',
|
2957 | height: '100%',
|
2958 | fontSize: '30px',
|
2959 | lineHeight: '30px',
|
2960 | '@self(orientation:landscape)': {
|
2961 | marginTop: 6
|
2962 | },
|
2963 | '@self(orientation:portrait)': {
|
2964 | marginTop: 7
|
2965 | },
|
2966 | '@self(position:relative)': {
|
2967 | top: '20px'
|
2968 | },
|
2969 | '@self(max-width:350)': {
|
2970 | zIndex: 3,
|
2971 | fontSize: '33px'
|
2972 | },
|
2973 | '@self(max-width:500, min-height:400)': {
|
2974 | zIndex: 4,
|
2975 | fontSize: '27px',
|
2976 | lineHeight: '37px'
|
2977 | },
|
2978 | '@self(zIndex:4)': {
|
2979 | lineHeight: '15px'
|
2980 | },
|
2981 | '@self(min-zIndex:6)': {
|
2982 | opacity: '0'
|
2983 | },
|
2984 | '@self(max-fontSize:20)': {
|
2985 | lineHeight: '19px'
|
2986 | },
|
2987 | '@self(min-width:600px)': {
|
2988 | fontSize: '19px'
|
2989 | },
|
2990 | '@self(aspect-ratio:2.25)': {
|
2991 | fontSize: '22px',
|
2992 | lineHeight: '12px'
|
2993 | },
|
2994 | '@self(min-height:700)': {
|
2995 | fontSize: '40px'
|
2996 | }
|
2997 | }
|
2998 | });
|
2999 | simulateParent(400, 300);
|
3000 | div.appendTo(parent);
|
3001 | expect(div.style('zIndex')).to.equal('2');
|
3002 | expect(div.style('width')).to.equal('400px');
|
3003 | expect(div.style('height')).to.equal('300px');
|
3004 | expect(div.style('fontSize')).to.equal('30px');
|
3005 | expect(div.style('lineHeight')).to.equal('30px');
|
3006 | expect(div.style('marginTop')).to.equal('6px');
|
3007 | expect(div.style('top')).to.equal('20px');
|
3008 | simulateParent(349, 420);
|
3009 | expect(div.style('zIndex')).to.equal('4');
|
3010 | expect(div.style('fontSize')).to.equal('27px');
|
3011 | expect(div.style('lineHeight')).to.equal('15px');
|
3012 | simulateParent(349, 399);
|
3013 | expect(div.style('zIndex')).to.equal('3');
|
3014 | expect(div.style('fontSize')).to.equal('33px');
|
3015 | simulateParent(349, 401);
|
3016 | expect(div.style('zIndex')).to.equal('4');
|
3017 | expect(div.style('fontSize')).to.equal('27px');
|
3018 | expect(div.style('lineHeight')).to.equal('15px');
|
3019 | expect(div.style('opacity')).to.equal('1');
|
3020 | div.style('zIndex', 5);
|
3021 | dimensions.simulate();
|
3022 | expect(div.style('opacity')).to.equal('1');
|
3023 | expect(div.style('lineHeight')).to.equal('37px');
|
3024 | div.style('zIndex', 17);
|
3025 | expect(div.style('opacity')).to.equal('1');
|
3026 | dimensions.simulate();
|
3027 | expect(div.style('opacity')).to.equal('0');
|
3028 | simulateParent(900);
|
3029 | expect(div.style('fontSize')).to.equal('19px');
|
3030 | expect(div.style('lineHeight')).to.equal('30px');
|
3031 | simulateParent(900);
|
3032 | expect(div.style('lineHeight')).to.equal('19px');
|
3033 | simulateParent(900, 400);
|
3034 | expect(div.style('fontSize')).to.equal('22px');
|
3035 | expect(div.style('lineHeight')).to.equal('12px');
|
3036 | simulateParent(2025, 900);
|
3037 | expect(div.style('fontSize')).to.equal('40px');
|
3038 | expect(div.style('lineHeight')).to.equal('12px');
|
3039 | expect(div.style('marginTop')).to.equal('6px');
|
3040 | simulateParent(2025, 2026);
|
3041 | return expect(div.style('marginTop')).to.equal('7px');
|
3042 | });
|
3043 | test("Parent dimensions/styles", function () {
|
3044 | var div, parent, simulateParent;
|
3045 | parent = Dom.div({
|
3046 | style: {
|
3047 | position: 'absolute'
|
3048 | }
|
3049 | }).appendTo(sandbox);
|
3050 | simulateParent = function (width, height) {
|
3051 | if (width) {
|
3052 | parent.style('width', width);
|
3053 | }
|
3054 | if (height) {
|
3055 | parent.style('height', height);
|
3056 | }
|
3057 | return dimensions.simulate();
|
3058 | };
|
3059 | div = Dom.div({
|
3060 | style: {
|
3061 | position: 'relative',
|
3062 | zIndex: 2,
|
3063 | top: '30px',
|
3064 | width: '400px',
|
3065 | height: '300px',
|
3066 | fontSize: '30px',
|
3067 | lineHeight: '30px',
|
3068 | '@parent(orientation:landscape)': {
|
3069 | marginBottom: 6
|
3070 | },
|
3071 | '@parent(orientation:portrait)': {
|
3072 | marginBottom: 7
|
3073 | },
|
3074 | '@parent(position:relative)': {
|
3075 | top: '21px'
|
3076 | },
|
3077 | '@parent(max-width:350)': {
|
3078 | zIndex: 3,
|
3079 | fontSize: '34px'
|
3080 | },
|
3081 | '@parent(max-width:500, min-height:400)': {
|
3082 | zIndex: 4,
|
3083 | fontSize: '27px',
|
3084 | lineHeight: '37px'
|
3085 | },
|
3086 | '@parent(zIndex:7)': {
|
3087 | lineHeight: '16px'
|
3088 | }
|
3089 | }
|
3090 | });
|
3091 | simulateParent(400, 300);
|
3092 | div.appendTo(parent);
|
3093 | expect(div.style('zIndex')).to.equal('2');
|
3094 | expect(div.style('width')).to.equal('400px');
|
3095 | expect(div.style('height')).to.equal('300px');
|
3096 | expect(div.style('fontSize')).to.equal('30px');
|
3097 | expect(div.style('lineHeight')).to.equal('30px');
|
3098 | expect(div.style('marginBottom')).to.equal('6px');
|
3099 | expect(div.style('top')).to.equal('30px');
|
3100 | parent.style('position', 'relative');
|
3101 | expect(div.style('top')).to.equal('30px');
|
3102 | simulateParent();
|
3103 | expect(div.style('top')).to.equal('21px');
|
3104 | simulateParent(349, 420);
|
3105 | expect(div.style('zIndex')).to.equal('4');
|
3106 | expect(div.style('fontSize')).to.equal('27px');
|
3107 | expect(div.style('lineHeight')).to.equal('37px');
|
3108 | simulateParent(349, 399);
|
3109 | expect(div.style('zIndex')).to.equal('3');
|
3110 | expect(div.style('fontSize')).to.equal('34px');
|
3111 | parent.style('zIndex', '7');
|
3112 | simulateParent(349, 401);
|
3113 | expect(div.style('zIndex')).to.equal('4');
|
3114 | expect(div.style('fontSize')).to.equal('27px');
|
3115 | expect(div.style('lineHeight')).to.equal('16px');
|
3116 | return expect(div.style('opacity')).to.equal('1');
|
3117 | });
|
3118 | test("Parent Ref dimensions/styles", function () {
|
3119 | var div, parent;
|
3120 | parent = Dom.div({
|
3121 | ref: 'abc'
|
3122 | }, Dom.div({
|
3123 | id: 'def'
|
3124 | }, Dom.div({
|
3125 | ref: 'ghi'
|
3126 | }))).appendTo(sandbox);
|
3127 | div = Dom.div({
|
3128 | style: {
|
3129 | position: 'relative',
|
3130 | zIndex: 2,
|
3131 | top: '30px',
|
3132 | width: '400px',
|
3133 | height: '300px',
|
3134 | fontSize: '30px',
|
3135 | lineHeight: '30px',
|
3136 | '@#abc(orientation:landscape)': {
|
3137 | fontWeight: 600
|
3138 | },
|
3139 | '@#abc(orientation:portrait)': {
|
3140 | fontWeight: 500
|
3141 | },
|
3142 | '@#def(position:relative)': {
|
3143 | top: '20px'
|
3144 | },
|
3145 | '@#def(max-width:350)': {
|
3146 | zIndex: 3,
|
3147 | fontSize: '33px'
|
3148 | },
|
3149 | '@#ghi(max-width:500, min-height:400)': {
|
3150 | zIndex: 4,
|
3151 | fontSize: '27px',
|
3152 | lineHeight: '37px'
|
3153 | },
|
3154 | '@#abc(zIndex:7)': {
|
3155 | lineHeight: '15px'
|
3156 | }
|
3157 | }
|
3158 | });
|
3159 | parent.style({
|
3160 | width: 400,
|
3161 | height: 300
|
3162 | });
|
3163 | parent.child.def.style({
|
3164 | width: 400,
|
3165 | height: 300
|
3166 | });
|
3167 | parent.child.ghi.style({
|
3168 | width: 400,
|
3169 | height: 300
|
3170 | });
|
3171 | div.appendTo(parent.child.ghi);
|
3172 | expect(div.style('zIndex')).to.equal('2');
|
3173 | expect(div.style('width')).to.equal('400px');
|
3174 | expect(div.style('height')).to.equal('300px');
|
3175 | expect(div.style('fontSize')).to.equal('30px');
|
3176 | expect(div.style('lineHeight')).to.equal('30px');
|
3177 | expect(div.style('fontWeight')).to.equal('600');
|
3178 | expect(div.style('top')).to.equal('30px');
|
3179 | parent.style({
|
3180 | width: 400,
|
3181 | height: 900,
|
3182 | position: 'relative'
|
3183 | });
|
3184 | dimensions.simulate();
|
3185 | expect(div.style('fontWeight')).to.equal('500');
|
3186 | expect(div.style('top')).to.equal('30px');
|
3187 | parent.child.def.style({
|
3188 | position: 'relative'
|
3189 | });
|
3190 | expect(div.style('top')).to.equal('30px');
|
3191 | dimensions.simulate();
|
3192 | expect(div.style('top')).to.equal('20px');
|
3193 | parent.child.def.style({
|
3194 | width: 349,
|
3195 | height: 420
|
3196 | });
|
3197 | dimensions.simulate();
|
3198 | expect(div.style('zIndex')).to.equal('3');
|
3199 | expect(div.style('fontSize')).to.equal('33px');
|
3200 | parent.child.ghi.style({
|
3201 | width: 450,
|
3202 | height: 420
|
3203 | });
|
3204 | dimensions.simulate();
|
3205 | expect(div.style('zIndex')).to.equal('4');
|
3206 | expect(div.style('fontSize')).to.equal('27px');
|
3207 | expect(div.style('lineHeight')).to.equal('37px');
|
3208 | parent.style({
|
3209 | zIndex: 7
|
3210 | });
|
3211 | dimensions.simulate();
|
3212 | expect(div.style('zIndex')).to.equal('4');
|
3213 | expect(div.style('fontSize')).to.equal('27px');
|
3214 | expect(div.style('lineHeight')).to.equal('15px');
|
3215 | return expect(div.style('opacity')).to.equal('1');
|
3216 | });
|
3217 | return test("Nested media queries", function () {
|
3218 | var div;
|
3219 | dimensions.simulate(1000, 900);
|
3220 | div = Dom.div({
|
3221 | style: {
|
3222 | zIndex: 2,
|
3223 | $happy: {
|
3224 | marginRight: 5,
|
3225 | '@window(orientation:landscape)': {
|
3226 | marginRight: 6
|
3227 | }
|
3228 | },
|
3229 | '@window(orientation:portrait)': {
|
3230 | $relaxed: {
|
3231 | marginRight: 7
|
3232 | }
|
3233 | }
|
3234 | }
|
3235 | });
|
3236 | div.appendTo(sandbox);
|
3237 | expect(div.style('marginRight')).to.equal('0px');
|
3238 | div.state('happy', true);
|
3239 | expect(div.style('marginRight')).to.equal('6px');
|
3240 | dimensions.simulate(900, 1000);
|
3241 | expect(div.style('marginRight')).to.equal('5px');
|
3242 | dimensions.simulate(1000, 900);
|
3243 | expect(div.style('marginRight')).to.equal('6px');
|
3244 | div.state('relaxed', true);
|
3245 | expect(div.style('marginRight')).to.equal('6px');
|
3246 | dimensions.simulate(900, 1000);
|
3247 | expect(div.style('marginRight')).to.equal('7px');
|
3248 | dimensions.simulate(1000, 900);
|
3249 | return expect(div.style('marginRight')).to.equal('6px');
|
3250 | });
|
3251 | });
|
3252 | suite("Traversal", function () {
|
3253 | test("Children", function () {
|
3254 | var comment, div, div$, spanA, spanB, text;
|
3255 | div = Dom.div(null, Dom.div(), 'Some Text');
|
3256 | expect(div.children.length).to.equal(2);
|
3257 | expect(div.elementChildren.length).to.equal(1);
|
3258 | expect(div.el.childNodes.length).to.equal(2);
|
3259 | div.append(Dom.span());
|
3260 | expect(div.children.length).to.equal(3);
|
3261 | expect(div.elementChildren.length).to.equal(2);
|
3262 | expect(div.el.childNodes.length).to.equal(3);
|
3263 | div.el.appendChild(document.createElement('div'));
|
3264 | expect(div.children.length).to.equal(4);
|
3265 | expect(div.elementChildren.length).to.equal(3);
|
3266 | expect(div.el.childNodes.length).to.equal(4);
|
3267 | div = document.createElement('div');
|
3268 | spanA = document.createElement('span');
|
3269 | spanB = document.createElement('span');
|
3270 | text = document.createTextNode('someTextNode');
|
3271 | comment = document.createComment('someCommentNode');
|
3272 | div.appendChild(spanA);
|
3273 | div.appendChild(comment);
|
3274 | div.appendChild(spanB);
|
3275 | div.appendChild(text);
|
3276 | expect(div.childNodes.length).to.equal(4);
|
3277 | expect(div.children.length).to.equal(2);
|
3278 | div$ = Dom(div);
|
3279 | expect(div$.children.length).to.equal(3);
|
3280 | expect(div$.elementChildren.length).to.equal(2);
|
3281 | expect(div$.children[0].raw).to.equal(spanA);
|
3282 | expect(div$.children[1].raw).to.equal(spanB);
|
3283 | return expect(div$.children[2].raw).to.equal(text);
|
3284 | });
|
3285 | test("Parent", function () {
|
3286 | var A, B, C;
|
3287 | A = Dom.div(null, Dom.div(), 'Some Text');
|
3288 | B = Dom.div();
|
3289 | C = Dom.div();
|
3290 | expect(A.parent).to.equal(void 0);
|
3291 | expect(A.children[0].parent).to.equal(A);
|
3292 | expect(A.children[0].el.parentNode).to.equal(A.el);
|
3293 | B.append(A);
|
3294 | expect(A.parent).to.equal(B);
|
3295 | expect(A.children[0].parent).to.equal(A);
|
3296 | expect(A.children[0].el.parentNode).to.equal(A.el);
|
3297 | expect(B.children.length).to.equal(1);
|
3298 | expect(B.children[0]).to.equal(A);
|
3299 | C.append(A);
|
3300 | expect(A.parent).to.equal(C);
|
3301 | expect(A.children[0].parent).to.equal(A);
|
3302 | expect(A.children[0].el.parentNode).to.equal(A.el);
|
3303 | expect(B.children.length).to.equal(0);
|
3304 | return expect(C.children[0]).to.equal(A);
|
3305 | });
|
3306 | test("Parents", function () {
|
3307 | var A, B, C;
|
3308 | A = Dom.div().appendTo(sandbox);
|
3309 | B = Dom.div().appendTo(A);
|
3310 | C = Dom.div().appendTo(B);
|
3311 | expect(A.parent.el).to.equal(sandbox);
|
3312 | expect(B.parent).to.equal(A);
|
3313 | expect(C.parent).to.equal(B);
|
3314 | expect(A.parents.length).to.equal(B.parents.length - 1);
|
3315 | expect(B.parents.length).to.equal(C.parents.length - 1);
|
3316 | expect(B.parents[0]).to.equal(A);
|
3317 | expect(C.parents[0]).to.equal(B);
|
3318 | expect(C.parents.length).to.equal(5);
|
3319 | return expect(C.parents.slice(-1)[0].el).to.equal(document.documentElement);
|
3320 | });
|
3321 | suite("Parent Matching", function () {
|
3322 | teardown(function () {
|
3323 | return this.els.A.detach();
|
3324 | });
|
3325 | suiteSetup(function () {
|
3326 | var A, B, C, D;
|
3327 | A = Dom.section({
|
3328 | ref: 'A'
|
3329 | });
|
3330 | B = Dom.div({
|
3331 | ref: 'B'
|
3332 | }).appendTo(A);
|
3333 | C = Dom.div({
|
3334 | ref: 'C'
|
3335 | }).appendTo(B);
|
3336 | D = Dom.span({
|
3337 | ref: 'D'
|
3338 | }).appendTo(C);
|
3339 | return this.els = {
|
3340 | A,
|
3341 | B,
|
3342 | C,
|
3343 | D
|
3344 | };
|
3345 | });
|
3346 | test("function filter", function () {
|
3347 | var A, B, C, D;
|
3348 | ({A, B, C, D} = this.els);
|
3349 | expect(D.parents).to.eql([C, B, A]);
|
3350 | expect(D.parentMatching(null)).to.equal(void 0);
|
3351 | expect(D.parentMatching(B)).to.equal(void 0);
|
3352 | expect(D.parentMatching(function () {
|
3353 | return false;
|
3354 | })).to.equal(void 0);
|
3355 | expect(D.parentMatching(function (el) {
|
3356 | return el === B;
|
3357 | })).to.equal(B);
|
3358 | expect(D.parentMatching(function (el) {
|
3359 | return el === A;
|
3360 | })).to.equal(A);
|
3361 | expect(D.parentMatching(function (el) {
|
3362 | return el === C;
|
3363 | })).to.equal(C);
|
3364 | A.appendTo(sandbox);
|
3365 | return expect(D.parentMatching(function (el) {
|
3366 | return el.raw === document.documentElement;
|
3367 | })).to.equal(Dom(document.documentElement));
|
3368 | });
|
3369 | return test("ref filter", function () {
|
3370 | var A, B, C, D;
|
3371 | ({A, B, C, D} = this.els);
|
3372 | expect(D.parents).to.eql([C, B, A]);
|
3373 | expect(D.parentMatching('badRef')).to.equal(void 0);
|
3374 | expect(D.parentMatching('B')).to.equal(B);
|
3375 | expect(D.parentMatching('A')).to.equal(A);
|
3376 | return expect(D.parentMatching('C')).to.equal(C);
|
3377 | });
|
3378 | });
|
3379 | suite("Parents Until", function () {
|
3380 | suiteSetup(function () {
|
3381 | var A, B, C, D;
|
3382 | A = Dom.section({
|
3383 | ref: 'A'
|
3384 | });
|
3385 | B = Dom.div({
|
3386 | ref: 'B'
|
3387 | }).appendTo(A);
|
3388 | C = Dom.div({
|
3389 | ref: 'C'
|
3390 | }).appendTo(B);
|
3391 | D = Dom.span({
|
3392 | ref: 'D'
|
3393 | }).appendTo(C);
|
3394 | return this.els = {
|
3395 | A,
|
3396 | B,
|
3397 | C,
|
3398 | D
|
3399 | };
|
3400 | });
|
3401 | test("function filter", function () {
|
3402 | var A, B, C, D;
|
3403 | ({A, B, C, D} = this.els);
|
3404 | expect(D.parents).to.eql([C, B, A]);
|
3405 | expect(D.parentsUntil(null)).to.eql([C, B, A]);
|
3406 | expect(D.parentsUntil()).to.eql([C, B, A]);
|
3407 | expect(D.parentsUntil(function (el) {
|
3408 | return el === A;
|
3409 | })).to.eql([C, B]);
|
3410 | expect(D.parentsUntil(function (el) {
|
3411 | return el === B;
|
3412 | })).to.eql([C]);
|
3413 | return expect(D.parentsUntil(function (el) {
|
3414 | return false;
|
3415 | })).to.eql([C, B, A]);
|
3416 | });
|
3417 | return test("ref filter", function () {
|
3418 | var A, B, C, D;
|
3419 | ({A, B, C, D} = this.els);
|
3420 | expect(D.parentsUntil('A')).to.eql([C, B]);
|
3421 | expect(D.parentsUntil('B')).to.eql([C]);
|
3422 | return expect(D.parentsUntil('badRef')).to.eql([C, B, A]);
|
3423 | });
|
3424 | });
|
3425 | test("Next", function () {
|
3426 | var A, B, C, D, E, div;
|
3427 | div = Dom.div(null, A = Dom.div(), B = Dom.div(), C = Dom.div(), D = Dom.div(), E = Dom.div());
|
3428 | expect(A.next).to.equal(B);
|
3429 | expect(C.next).to.equal(D);
|
3430 | expect(E.next).to.equal(void 0);
|
3431 | return expect(B.nextAll).to.eql([C, D, E]);
|
3432 | });
|
3433 | test("Next Element", function () {
|
3434 | var A, B, C, D, E, div;
|
3435 | div = Dom.div(null, A = Dom.div(), B = Dom.text(), C = Dom.div(), D = Dom.text(), E = Dom.div());
|
3436 | expect(A.next).to.equal(B);
|
3437 | expect(A.nextEl).to.equal(C);
|
3438 | expect(B.nextEl).to.equal(C);
|
3439 | expect(C.nextEl).to.equal(E);
|
3440 | expect(E.nextEl).to.equal(void 0);
|
3441 | return expect(A.nextElAll).to.eql([C, E]);
|
3442 | });
|
3443 | test("Prev", function () {
|
3444 | var A, B, C, D, E, div;
|
3445 | div = Dom.div(null, A = Dom.div(), B = Dom.div(), C = Dom.div(), D = Dom.div(), E = Dom.div());
|
3446 | expect(E.prev).to.equal(D);
|
3447 | expect(C.prev).to.equal(B);
|
3448 | expect(A.prev).to.equal(void 0);
|
3449 | return expect(D.prevAll).to.eql([C, B, A]);
|
3450 | });
|
3451 | test("Prev Element", function () {
|
3452 | var A, B, C, D, E, div;
|
3453 | div = Dom.div(null, A = Dom.div(), B = Dom.text(), C = Dom.div(), D = Dom.text(), E = Dom.div());
|
3454 | expect(E.prev).to.equal(D);
|
3455 | expect(E.prevEl).to.equal(C);
|
3456 | expect(D.prevEl).to.equal(C);
|
3457 | expect(C.prevEl).to.equal(A);
|
3458 | expect(A.prevEl).to.equal(void 0);
|
3459 | return expect(E.prevElAll).to.eql([C, A]);
|
3460 | });
|
3461 | test("Siblings", function () {
|
3462 | var A, B, C, D, E, div;
|
3463 | div = Dom.div(null, A = Dom.div(), B = Dom.text(), C = Dom.div(), D = Dom.text(), E = Dom.div());
|
3464 | expect(C.siblings).to.eql(C.prevAll.reverse().concat(C.nextAll));
|
3465 | expect(C.siblings).to.eql([A, B, D, E]);
|
3466 | expect(C.elementSiblings).to.eql([A, E]);
|
3467 | return expect(B.elementSiblings).to.eql([A, C, E]);
|
3468 | });
|
3469 | test("First/Last Child", function () {
|
3470 | var divA, divB, divBA, divBB, divC, main;
|
3471 | main = DOM.div({
|
3472 | id: 'main'
|
3473 | });
|
3474 | divA = DOM.div({
|
3475 | id: 'divA'
|
3476 | }).appendTo(main);
|
3477 | divB = DOM.div({
|
3478 | id: 'divB'
|
3479 | }).appendTo(main);
|
3480 | divC = DOM.div({
|
3481 | id: 'divC'
|
3482 | }).appendTo(main);
|
3483 | divBA = DOM.div({
|
3484 | id: 'divBA'
|
3485 | }).appendTo(divB);
|
3486 | divBB = DOM.div({
|
3487 | id: 'divBB'
|
3488 | }).appendTo(divB);
|
3489 | expect(main.firstChild).to.equal(divA);
|
3490 | expect(main.lastChild).to.equal(divC);
|
3491 | expect(divA.firstChild).to.equal(void 0);
|
3492 | expect(divA.lastChild).to.equal(void 0);
|
3493 | expect(divB.firstChild).to.equal(divBA);
|
3494 | return expect(divB.lastChild).to.equal(divBB);
|
3495 | });
|
3496 | test("Child (by ref)", function () {
|
3497 | var divA, divB, divC, newChild, newChildChild, newParent, sandBox;
|
3498 | divA = Dom.div({
|
3499 | id: 'divA'
|
3500 | }, Dom.div({
|
3501 | id: 'childA'
|
3502 | }, Dom.span({
|
3503 | ref: 'childA_1'
|
3504 | }), Dom.div({
|
3505 | ref: 'childA_2',
|
3506 | id: 'childA_2'
|
3507 | })), Dom.div({}, Dom.span({
|
3508 | ref: 'childB_1'
|
3509 | }), Dom.text({
|
3510 | id: 'childB_2'
|
3511 | }, 'The Text')));
|
3512 | divB = Dom.template(['div', {
|
3513 | id: 'divB'
|
3514 | }, ['div', {
|
3515 | id: 'childA',
|
3516 | style: {
|
3517 | color: 'pink'
|
3518 | }
|
3519 | }, ['span', {
|
3520 | ref: 'childA_1'
|
3521 | }], ['div', {
|
3522 | ref: 'childA_3',
|
3523 | id: 'childA_2'
|
3524 | }]], ['div', null, ['span', {
|
3525 | ref: 'childB_1'
|
3526 | }]]]).spawn();
|
3527 | divC = Dom.template(['div', {
|
3528 | ref: 'divC'
|
3529 | }, ['div', {
|
3530 | ref: 'childA'
|
3531 | }, ['div', {
|
3532 | ref: 'divB'
|
3533 | }], ['div', {
|
3534 | ref: 'divC'
|
3535 | }]], ['div', {
|
3536 | ref: 'childB'
|
3537 | }, ['div', {
|
3538 | ref: 'divB'
|
3539 | }], ['div', {
|
3540 | ref: 'divC'
|
3541 | }], ['div', {
|
3542 | ref: 'divD'
|
3543 | }, ['div', {
|
3544 | ref: 'childB'
|
3545 | }]]]]).spawn();
|
3546 | expect(divA.child.childA).to.equal(divA.children[0]);
|
3547 | expect(divA.child.childA_1).to.equal(divA.children[0].children[0]);
|
3548 | expect(divA.child.childA_2).to.equal(divA.children[0].children[1]);
|
3549 | expect(divA.child.childA_3).to.equal(void 0);
|
3550 | expect(divA.child.childB).to.equal(void 0);
|
3551 | expect(divA.child.childB_1).to.equal(divA.children[1].children[0]);
|
3552 | expect(divA.child.childB_2).to.equal(divA.children[1].children[1]);
|
3553 | expect(divA.child.childB_2.type).to.equal('text');
|
3554 | expect(divB.child.childA).to.equal(divB.children[0]);
|
3555 | expect(divB.child.childA_1).to.equal(divB.children[0].children[0]);
|
3556 | expect(divB.child.childA_2).to.equal(divB.children[0].children[1]);
|
3557 | expect(divB.child.childA_3).to.equal(void 0);
|
3558 | expect(divB.child.childB).to.equal(void 0);
|
3559 | expect(divB.child.childB_1).to.equal(divB.children[1].children[0]);
|
3560 | expect(divB.child.childB_2).to.equal(divB.children[1].children[1]);
|
3561 | expect(divB.child.childA.style('color')).to.equal('');
|
3562 | expect(divB.child.childA.styleSafe('color')).not.to.equal('');
|
3563 | expect(divB.child.childA.styleSafe('color').length >= 4).to.be.true;
|
3564 | expect(divA.child.childA.raw.getAttribute('id')).to.equal('childA');
|
3565 | expect(divA.child.childA.raw.getAttribute('data-ref')).to.equal('childA');
|
3566 | expect(divA.child.childA_1.raw.getAttribute('id')).to.equal(null);
|
3567 | expect(divA.child.childA_1.raw.getAttribute('data-ref')).to.equal('childA_1');
|
3568 | expect(divA.child.childA_2.raw.getAttribute('id')).to.equal('childA_2');
|
3569 | expect(divA.child.childA_2.raw.getAttribute('data-ref')).to.equal('childA_2');
|
3570 | expect(divC.child.childA).to.equal(divC.children[0]);
|
3571 | expect(divC.child.childB).to.equal(divC.children[1]);
|
3572 | expect(divC.child.divB).to.equal(divC.children[0].children[0]);
|
3573 | expect(divC.child.divC).to.equal(divC);
|
3574 | expect(divC.child.divD).to.equal(divC.children[1].children[2]);
|
3575 | expect(divC.children[0].child.divB).to.equal(divC.children[0].children[0]);
|
3576 | expect(divC.children[0].child.divC).to.equal(divC.children[0].children[1]);
|
3577 | expect(divC.children[1].child.divB).to.equal(divC.children[1].children[0]);
|
3578 | expect(divC.children[1].child.divC).to.equal(divC.children[1].children[1]);
|
3579 | expect(divC.children[1].child.divD).to.equal(divC.children[1].children[2]);
|
3580 | expect(divC.children[1].child.childB).to.equal(divC.children[1]);
|
3581 | sandBox = Dom(sandbox);
|
3582 | expect(sandBox.child.childA).to.equal(void 0);
|
3583 | expect(sandBox.child.childB_2).to.equal(void 0);
|
3584 | expect(sandBox.child.divA).to.equal(void 0);
|
3585 | sandBox.append(divA);
|
3586 | expect(sandBox.child.childA).to.equal(void 0);
|
3587 | expect(sandBox.child.childB_2).to.equal(void 0);
|
3588 | expect(sandBox.child.divA).to.equal(void 0);
|
3589 | expect(sandBox.childf.divA).to.equal(divA);
|
3590 | expect(sandBox.child.childA).to.equal(divA.children[0]);
|
3591 | expect(sandBox.child.childB_2).to.equal(divA.children[1].children[1]);
|
3592 | expect(sandBox.child.divA).to.equal(divA);
|
3593 | newChild = Dom.div({
|
3594 | ref: 'newChild'
|
3595 | });
|
3596 | newChildChild = Dom.div({
|
3597 | ref: 'newChildChild'
|
3598 | });
|
3599 | expect(newChild.child.newChildChild).to.equal(void 0);
|
3600 | expect(newChildChild.child.newChildChild).to.equal(newChildChild);
|
3601 | expect(Object.keys(newChildChild.child).length).to.equal(1);
|
3602 | newChildChild.appendTo(newChild);
|
3603 | expect(newChild.child.newChildChild).to.equal(void 0);
|
3604 | expect(newChild.childf.newChildChild).to.equal(newChildChild);
|
3605 | expect(newChild.child.newChildChild).to.equal(newChildChild);
|
3606 | expect(Object.keys(newChildChild.child).length).to.equal(1);
|
3607 | newParent = Dom.div({
|
3608 | ref: 'newParent'
|
3609 | });
|
3610 | newChild.appendTo(newParent);
|
3611 | return expect(newParent.child.newChildChild).to.equal(newChildChild);
|
3612 | });
|
3613 | test("Index", function () {
|
3614 | var childA, childB, childC, childD, childE, childF, section;
|
3615 | section = Dom.section(null, childA = Dom.div(), childB = Dom.div(), childC = Dom.span(), childD = Dom.text(), childE = Dom.span(), childF = Dom.div());
|
3616 | expect(childB.index).to.equal(1);
|
3617 | expect(childD.index).to.equal(3);
|
3618 | expect(childF.index).to.equal(5);
|
3619 | childC.detach();
|
3620 | expect(childB.index).to.equal(1);
|
3621 | expect(childD.index).to.equal(2);
|
3622 | expect(childF.index).to.equal(4);
|
3623 | return expect(childC.index).to.equal(null);
|
3624 | });
|
3625 | test("Index (by type)", function () {
|
3626 | var childA, childB, childC, childD, childE, childF, childG, section;
|
3627 | section = Dom.section(null, childA = Dom.div(), childB = Dom.div(), childC = Dom.span(), childD = Dom.text(), childE = Dom.span(), childF = Dom.text(), childG = Dom.div());
|
3628 | expect(childB.indexType).to.equal(1);
|
3629 | expect(childD.indexType).to.equal(0);
|
3630 | expect(childF.indexType).to.equal(1);
|
3631 | expect(childG.indexType).to.equal(2);
|
3632 | childC.detach();
|
3633 | expect(childB.indexType).to.equal(1);
|
3634 | expect(childD.indexType).to.equal(0);
|
3635 | expect(childF.indexType).to.equal(1);
|
3636 | expect(childG.indexType).to.equal(2);
|
3637 | childA.detach();
|
3638 | expect(childB.indexType).to.equal(0);
|
3639 | expect(childD.indexType).to.equal(0);
|
3640 | expect(childF.indexType).to.equal(1);
|
3641 | expect(childG.indexType).to.equal(1);
|
3642 | expect(childA.indexType).to.equal(null);
|
3643 | return expect(childC.indexType).to.equal(null);
|
3644 | });
|
3645 | test("Index (by ref)", function () {
|
3646 | var childA, childB, childC, childD, childE, childF, childG, section;
|
3647 | section = Dom.section(null, childA = Dom.div({
|
3648 | ref: 'abc'
|
3649 | }), childB = Dom.div({
|
3650 | ref: 'abc'
|
3651 | }), childC = Dom.span({
|
3652 | ref: 'def'
|
3653 | }), childD = Dom.text({
|
3654 | ref: 'abc'
|
3655 | }), childE = Dom.span({
|
3656 | ref: 'abc'
|
3657 | }), childF = Dom.text({
|
3658 | ref: 'def'
|
3659 | }), childG = Dom.div({
|
3660 | ref: 'abc'
|
3661 | }));
|
3662 | expect(childB.indexRef).to.equal(1);
|
3663 | expect(childD.indexRef).to.equal(2);
|
3664 | expect(childF.indexRef).to.equal(1);
|
3665 | expect(childG.indexRef).to.equal(4);
|
3666 | childC.detach();
|
3667 | expect(childB.indexRef).to.equal(1);
|
3668 | expect(childD.indexRef).to.equal(2);
|
3669 | expect(childF.indexRef).to.equal(0);
|
3670 | expect(childG.indexRef).to.equal(4);
|
3671 | childA.detach();
|
3672 | expect(childB.indexRef).to.equal(0);
|
3673 | expect(childD.indexRef).to.equal(1);
|
3674 | expect(childF.indexRef).to.equal(0);
|
3675 | expect(childG.indexRef).to.equal(3);
|
3676 | expect(childA.indexRef).to.equal(null);
|
3677 | return expect(childC.indexRef).to.equal(null);
|
3678 | });
|
3679 | test("Query", function () {
|
3680 | var div, sandBox;
|
3681 | div = Dom.template(['div', {
|
3682 | class: 'div-one',
|
3683 | attrs: {
|
3684 | name: 'abc123'
|
3685 | }
|
3686 | }, ['div', {
|
3687 | class: 'childA',
|
3688 | style: {
|
3689 | color: 'pink'
|
3690 | }
|
3691 | }, ['span', {
|
3692 | class: 'childA_1'
|
3693 | }], ['div', {
|
3694 | class: 'childA_1'
|
3695 | }], ['span', {
|
3696 | class: 'childA_1'
|
3697 | }], ['div', {
|
3698 | class: 'childA_2'
|
3699 | }]], ['div', {
|
3700 | className: 'childB'
|
3701 | }, ['span', {
|
3702 | class: 'childB_1'
|
3703 | }]], ['section', {
|
3704 | className: 'childB'
|
3705 | }, ['span', {
|
3706 | class: 'childB_1'
|
3707 | }]]]).spawn().appendTo(sandBox = Dom(sandbox));
|
3708 | expect(div.query('.childA')).to.equal(div.children[0]);
|
3709 | expect(div.query('.childB')).to.equal(div.children[1]);
|
3710 | expect(div.query('.childB_1')).to.equal(div.children[1].children[0]);
|
3711 | expect(div.query('.childA_1')).to.equal(div.children[0].children[0]);
|
3712 | expect(div.query('.childA_2')).to.equal(div.children[0].children[3]);
|
3713 | expect(sandBox.query('.div-one')).to.equal(div);
|
3714 | expect(sandBox.query('.childB_1')).to.equal(div.children[1].children[0]);
|
3715 | expect(sandBox.query('div[name="abc123"]')).to.equal(div);
|
3716 | return expect(sandBox.query('span[name="abc123"]')).to.equal(void 0);
|
3717 | });
|
3718 | test("QueryAll", function () {
|
3719 | var div, sandBox;
|
3720 | div = Dom.template(['div', {
|
3721 | class: 'div-one',
|
3722 | attrs: {
|
3723 | name: 'abc123'
|
3724 | }
|
3725 | }, ['div', {
|
3726 | class: 'childA',
|
3727 | style: {
|
3728 | color: 'pink'
|
3729 | }
|
3730 | }, ['span', {
|
3731 | class: 'childA_1'
|
3732 | }], ['div', {
|
3733 | class: 'childA_1'
|
3734 | }], ['span', {
|
3735 | class: 'childA_1'
|
3736 | }], ['div', {
|
3737 | class: 'childA_2'
|
3738 | }]], ['div', {
|
3739 | className: 'childB'
|
3740 | }, ['span', {
|
3741 | class: 'childB_1'
|
3742 | }]], ['section', {
|
3743 | className: 'childB'
|
3744 | }, ['span', {
|
3745 | class: 'childB_1'
|
3746 | }]]]).spawn().appendTo(sandBox = Dom(sandbox));
|
3747 | expect(div.queryAll('.childA').elements).to.eql([div.children[0]]);
|
3748 | expect(div.queryAll('.childB').elements).to.eql([div.children[1], div.children[2]]);
|
3749 | expect(div.queryAll('.childB_1').elements).to.eql([div.children[1].children[0], div.children[2].children[0]]);
|
3750 | expect(div.queryAll('.childA_1').elements).to.eql([div.children[0].children[0], div.children[0].children[1], div.children[0].children[2]]);
|
3751 | expect(div.queryAll('.childA_2').elements).to.eql([div.children[0].children[3]]);
|
3752 | expect(sandBox.queryAll('.div-one').elements).to.eql([div]);
|
3753 | expect(sandBox.queryAll('.childB_1').elements).to.eql([div.children[1].children[0], div.children[2].children[0]]);
|
3754 | expect(sandBox.queryAll('div[name="abc123"]').elements).to.eql([div]);
|
3755 | expect(sandBox.queryAll('span[name="abc123"]').elements).to.eql([]);
|
3756 | expect(div.text).to.equal('');
|
3757 | expect(sandBox.queryAll('.childB_1').text('abc123').elements).to.eql([div.children[1].children[0], div.children[2].children[0]]);
|
3758 | return expect(div.text).to.equal('abc123abc123');
|
3759 | });
|
3760 | return test("Query/QueryAll shortcuts", function () {
|
3761 | var allA, allB, el, i, index, len;
|
3762 | expect(Dom.query('head')).to.equal(Dom(document).query('head'));
|
3763 | expect(Dom.query('body')).to.equal(Dom(document).query('body'));
|
3764 | allA = Dom.queryAll('section').elements;
|
3765 | allB = Dom(document).queryAll('section').elements;
|
3766 | expect(allA.length).to.equal(allB.length);
|
3767 | for ((index = i = 0, len = allA.length); i < len; index = ++i) {
|
3768 | el = allA[index];
|
3769 | expect(allA[index]).to.equal(allB[index]);
|
3770 | }
|
3771 | });
|
3772 | });
|
3773 | suite("Manipulation", function () {
|
3774 | test(".append()", function () {
|
3775 | var A, B, C, D, MainA, MainB;
|
3776 | A = Dom.div();
|
3777 | B = Dom.div();
|
3778 | C = Dom.text();
|
3779 | D = Dom.div();
|
3780 | MainA = Dom.div(null, A, B, C, D);
|
3781 | MainB = Dom.div();
|
3782 | checkChildStructure(MainA)(A, B, C, D);
|
3783 | checkChildStructure(MainB)();
|
3784 | MainB.append(A);
|
3785 | checkChildStructure(MainA)(B, C, D);
|
3786 | checkChildStructure(MainB)(A);
|
3787 | C.appendTo(MainB);
|
3788 | checkChildStructure(MainA)(B, D);
|
3789 | return checkChildStructure(MainB)(A, C);
|
3790 | });
|
3791 | test(".prepend()", function () {
|
3792 | var A, B, C, D, MainA, MainB;
|
3793 | A = Dom.div();
|
3794 | B = Dom.div();
|
3795 | C = Dom.text();
|
3796 | D = Dom.div();
|
3797 | MainA = Dom.div(null, A, B, C, D);
|
3798 | MainB = Dom.div();
|
3799 | checkChildStructure(MainA)(A, B, C, D);
|
3800 | checkChildStructure(MainB)();
|
3801 | MainB.prepend(A);
|
3802 | checkChildStructure(MainA)(B, C, D);
|
3803 | checkChildStructure(MainB)(A);
|
3804 | C.prependTo(MainB);
|
3805 | checkChildStructure(MainA)(B, D);
|
3806 | return checkChildStructure(MainB)(C, A);
|
3807 | });
|
3808 | test(".after()", function () {
|
3809 | var A, B, C, D, MainA, MainB;
|
3810 | A = Dom.div();
|
3811 | B = Dom.div();
|
3812 | C = Dom.text();
|
3813 | D = Dom.div();
|
3814 | MainA = Dom.div(null, A, B, C, D);
|
3815 | MainB = Dom.div();
|
3816 | checkChildStructure(MainA)(A, B, C, D);
|
3817 | checkChildStructure(MainB)();
|
3818 | MainB.append(B);
|
3819 | B.after(A);
|
3820 | checkChildStructure(MainA)(C, D);
|
3821 | checkChildStructure(MainB)(B, A);
|
3822 | C.insertAfter(B);
|
3823 | checkChildStructure(MainA)(D);
|
3824 | return checkChildStructure(MainB)(B, C, A);
|
3825 | });
|
3826 | test(".before()", function () {
|
3827 | var A, B, C, D, MainA, MainB;
|
3828 | A = Dom.div();
|
3829 | B = Dom.div();
|
3830 | C = Dom.text();
|
3831 | D = Dom.div();
|
3832 | MainA = Dom.div(null, A, B, C, D);
|
3833 | MainB = Dom.div();
|
3834 | checkChildStructure(MainA)(A, B, C, D);
|
3835 | checkChildStructure(MainB)();
|
3836 | MainB.append(B);
|
3837 | B.before(A);
|
3838 | checkChildStructure(MainA)(C, D);
|
3839 | checkChildStructure(MainB)(A, B);
|
3840 | C.insertBefore(B);
|
3841 | checkChildStructure(MainA)(D);
|
3842 | return checkChildStructure(MainB)(A, C, B);
|
3843 | });
|
3844 | test(".detach()", function () {
|
3845 | var div, emitCount;
|
3846 | emitCount = 0;
|
3847 | div = Dom.div(null, 'Inner Text Here');
|
3848 | div.on('beep', function () {
|
3849 | return emitCount++;
|
3850 | });
|
3851 | div.state('happy', true);
|
3852 | div.state('relaxed', true);
|
3853 | expect(div.parent).not.to.exist;
|
3854 | expect(emitCount).to.equal(0);
|
3855 | expect(div.state('happy')).to.be.true;
|
3856 | expect(div.state('relaxed')).to.be.true;
|
3857 | div.appendTo(sandbox);
|
3858 | div.emit('beep');
|
3859 | expect(sandbox.children.length).to.equal(1);
|
3860 | expect(div.parent.el).to.equal(sandbox);
|
3861 | expect(emitCount).to.equal(1);
|
3862 | expect(div.state('happy')).to.be.true;
|
3863 | expect(div.state('relaxed')).to.be.true;
|
3864 | div.detach();
|
3865 | div.emit('beep');
|
3866 | expect(sandbox.children.length).to.equal(0);
|
3867 | expect(div.parent).not.to.exist;
|
3868 | expect(emitCount).to.equal(2);
|
3869 | expect(div.state('happy')).to.be.true;
|
3870 | return expect(div.state('relaxed')).to.be.true;
|
3871 | });
|
3872 | test(".remove()", function () {
|
3873 | var div, emitCount;
|
3874 | emitCount = 0;
|
3875 | div = Dom.div(null, 'Inner Text Here');
|
3876 | div.on('beep', function () {
|
3877 | return emitCount++;
|
3878 | });
|
3879 | div.state('happy', true);
|
3880 | div.state('relaxed', true);
|
3881 | expect(div.parent).not.to.exist;
|
3882 | expect(emitCount).to.equal(0);
|
3883 | expect(div.state('happy')).to.be.true;
|
3884 | expect(div.state('relaxed')).to.be.true;
|
3885 | div.appendTo(sandbox);
|
3886 | div.emit('beep');
|
3887 | expect(sandbox.children.length).to.equal(1);
|
3888 | expect(div.parent.el).to.equal(sandbox);
|
3889 | expect(emitCount).to.equal(1);
|
3890 | expect(div.state('happy')).to.be.true;
|
3891 | expect(div.state('relaxed')).to.be.true;
|
3892 | div.remove();
|
3893 | div.emit('beep');
|
3894 | expect(sandbox.children.length).to.equal(0);
|
3895 | expect(div.parent).not.to.exist;
|
3896 | expect(emitCount).to.equal(1);
|
3897 | expect(div.state('happy')).to.be.false;
|
3898 | return expect(div.state('relaxed')).to.be.false;
|
3899 | });
|
3900 | test(".empty()", function () {
|
3901 | var A, B, Main;
|
3902 | Main = Dom.div();
|
3903 | A = Dom.div().appendTo(Main);
|
3904 | B = Dom.div().appendTo(Main);
|
3905 | A.state('happy', true);
|
3906 | B.state('happy', true);
|
3907 | checkChildStructure(Main)(A, B);
|
3908 | expect(A.state('happy')).to.be.true;
|
3909 | expect(B.state('happy')).to.be.true;
|
3910 | Main.empty();
|
3911 | checkChildStructure(Main)();
|
3912 | expect(A.parent).to.equal(void 0);
|
3913 | expect(B.parent).to.equal(void 0);
|
3914 | expect(A.state('happy')).to.be.true;
|
3915 | return expect(B.state('happy')).to.be.true;
|
3916 | });
|
3917 | test(".wrap()", function () {
|
3918 | var A, B, C, Main, wrapA, wrapB, wrapC;
|
3919 | Main = Dom.div();
|
3920 | A = Dom.div().appendTo(Main);
|
3921 | B = Dom.div().appendTo(Main);
|
3922 | C = Dom.div();
|
3923 | wrapA = Dom.section();
|
3924 | wrapB = Dom.section();
|
3925 | wrapC = Dom.section();
|
3926 | A.state('happy', true);
|
3927 | B.state('happy', true);
|
3928 | C.state('happy', true);
|
3929 | wrapA.state('relaxed', true);
|
3930 | wrapB.state('relaxed', true);
|
3931 | wrapC.state('relaxed', true);
|
3932 | checkChildStructure(Main)(A, B);
|
3933 | A.wrap(wrapA);
|
3934 | checkChildStructure(Main)(wrapA, B);
|
3935 | checkChildStructure(wrapA)(A);
|
3936 | B.wrap(wrapB);
|
3937 | checkChildStructure(Main)(wrapA, wrapB);
|
3938 | checkChildStructure(wrapA)(A);
|
3939 | checkChildStructure(wrapB)(B);
|
3940 | B.wrap(wrapA);
|
3941 | checkChildStructure(Main)(wrapA, wrapB);
|
3942 | checkChildStructure(wrapA)(A, B);
|
3943 | checkChildStructure(wrapB)();
|
3944 | wrapC.appendTo(wrapB);
|
3945 | C.wrap(wrapC);
|
3946 | C.wrap();
|
3947 | checkChildStructure(Main)(wrapA, wrapB);
|
3948 | checkChildStructure(wrapA)(A, B);
|
3949 | checkChildStructure(wrapB)(wrapC);
|
3950 | checkChildStructure(wrapC)(C);
|
3951 | C.wrap(C);
|
3952 | checkChildStructure(Main)(wrapA, wrapB);
|
3953 | checkChildStructure(wrapA)(A, B);
|
3954 | checkChildStructure(wrapB)(wrapC);
|
3955 | checkChildStructure(wrapC)(C);
|
3956 | expect(A.state('happy')).to.be.true;
|
3957 | expect(B.state('happy')).to.be.true;
|
3958 | expect(C.state('happy')).to.be.true;
|
3959 | expect(wrapA.state('relaxed')).to.be.true;
|
3960 | expect(wrapB.state('relaxed')).to.be.true;
|
3961 | return expect(wrapC.state('relaxed')).to.be.true;
|
3962 | });
|
3963 | test(".unwrap()", function () {
|
3964 | var A, B, C, D, E, Main;
|
3965 | Main = Dom.div();
|
3966 | A = Dom.div().prependTo(Main);
|
3967 | B = Dom.div().appendTo(A);
|
3968 | C = Dom.div().appendTo(A);
|
3969 | D = Dom.div().appendTo(C);
|
3970 | E = Dom.div().appendTo(D);
|
3971 | A.state('happy', true);
|
3972 | B.state('happy', true);
|
3973 | C.state('happy', true);
|
3974 | D.state('happy', true);
|
3975 | E.state('happy', true);
|
3976 | checkChildStructure(Main)(A);
|
3977 | checkChildStructure(A)(B, C);
|
3978 | checkChildStructure(B)();
|
3979 | checkChildStructure(C)(D);
|
3980 | checkChildStructure(D)(E);
|
3981 | E.unwrap();
|
3982 | checkChildStructure(Main)(A);
|
3983 | checkChildStructure(A)(B, C);
|
3984 | checkChildStructure(B)();
|
3985 | checkChildStructure(C)(E);
|
3986 | checkChildStructure(D)();
|
3987 | B.unwrap();
|
3988 | checkChildStructure(Main)(B, C);
|
3989 | checkChildStructure(A)();
|
3990 | checkChildStructure(B)();
|
3991 | checkChildStructure(C)(E);
|
3992 | checkChildStructure(D)();
|
3993 | E.unwrap();
|
3994 | checkChildStructure(Main)(B, E);
|
3995 | checkChildStructure(A)();
|
3996 | checkChildStructure(B)();
|
3997 | checkChildStructure(C)();
|
3998 | checkChildStructure(D)();
|
3999 | A.insertAfter(B);
|
4000 | C.appendTo(A);
|
4001 | D.appendTo(A);
|
4002 | checkChildStructure(Main)(B, A, E);
|
4003 | checkChildStructure(A)(C, D);
|
4004 | checkChildStructure(B)();
|
4005 | checkChildStructure(C)();
|
4006 | checkChildStructure(D)();
|
4007 | D.unwrap();
|
4008 | checkChildStructure(Main)(B, C, D, E);
|
4009 | checkChildStructure(A)();
|
4010 | checkChildStructure(B)();
|
4011 | checkChildStructure(C)();
|
4012 | return checkChildStructure(D)();
|
4013 | });
|
4014 | test(".replace()", function () {
|
4015 | var A, B, C, D, E, Main;
|
4016 | Main = Dom.div();
|
4017 | A = Dom.div().appendTo(Main);
|
4018 | B = Dom.div().appendTo(Main);
|
4019 | C = Dom.div().appendTo(A);
|
4020 | D = Dom.div().appendTo(A);
|
4021 | E = Dom.div().appendTo(D);
|
4022 | A.replace();
|
4023 | E.replace();
|
4024 | checkChildStructure(Main)(A, B);
|
4025 | checkChildStructure(A)(C, D);
|
4026 | checkChildStructure(B)();
|
4027 | checkChildStructure(C)();
|
4028 | checkChildStructure(D)(E);
|
4029 | C.replace(E).appendTo(B);
|
4030 | checkChildStructure(Main)(A, B);
|
4031 | checkChildStructure(A)(E, D);
|
4032 | checkChildStructure(B)(C);
|
4033 | checkChildStructure(C)();
|
4034 | checkChildStructure(D)();
|
4035 | D.replace(E);
|
4036 | checkChildStructure(Main)(A, B);
|
4037 | checkChildStructure(A)(E);
|
4038 | checkChildStructure(B)(C);
|
4039 | checkChildStructure(C)();
|
4040 | checkChildStructure(D)();
|
4041 | B.replace(C);
|
4042 | checkChildStructure(Main)(A, C);
|
4043 | checkChildStructure(A)(E);
|
4044 | checkChildStructure(B)();
|
4045 | checkChildStructure(C)();
|
4046 | checkChildStructure(D)();
|
4047 | A.replace(D);
|
4048 | checkChildStructure(Main)(D, C);
|
4049 | checkChildStructure(A)(E);
|
4050 | checkChildStructure(B)();
|
4051 | checkChildStructure(C)();
|
4052 | checkChildStructure(D)();
|
4053 | B.replace(D);
|
4054 | checkChildStructure(Main)(C);
|
4055 | checkChildStructure(A)(E);
|
4056 | checkChildStructure(B)();
|
4057 | checkChildStructure(C)();
|
4058 | return checkChildStructure(D)();
|
4059 | });
|
4060 | test(".clone()", function () {
|
4061 | var A, B, childA, childB, emitCount, opts, sandBox;
|
4062 | emitCount = 0;
|
4063 | sandBox = Dom(sandbox);
|
4064 | opts = {
|
4065 | style: {
|
4066 | $base: {
|
4067 | width: '34px'
|
4068 | },
|
4069 | $happy: {
|
4070 | height: '99px'
|
4071 | },
|
4072 | $relaxed: {
|
4073 | opacity: '0.5'
|
4074 | }
|
4075 | }
|
4076 | };
|
4077 | A = Dom.div(opts, 'Some Inner Text').appendTo(sandbox);
|
4078 | A.state('happy', true);
|
4079 | A.on('privateEvent', function () {
|
4080 | return emitCount++;
|
4081 | });
|
4082 | childA = Dom.div().appendTo(A);
|
4083 | childB = Dom.span().appendTo(A);
|
4084 | B = A.clone();
|
4085 | A.state('relaxed', true);
|
4086 | A.emit('privateEvent');
|
4087 | expect(emitCount).to.equal(1);
|
4088 | expect(A.parent).to.equal(sandBox);
|
4089 | expect(A.css('width')).to.equal('34px');
|
4090 | expect(A.css('height')).to.equal('99px');
|
4091 | expect(A.css('opacity')).to.equal('0.5');
|
4092 | expect(A.siblings.length).to.equal(0);
|
4093 | expect(A.children.length).to.equal(3);
|
4094 | expect(A.children[0].el.textContent).to.equal('Some Inner Text');
|
4095 | expect(A.children[1]).to.equal(childA);
|
4096 | expect(A.children[2]).to.equal(childB);
|
4097 | expect(B).not.to.equal(A);
|
4098 | expect(B.parent).to.equal(void 0);
|
4099 | sandBox.append(B);
|
4100 | expect(B.parent).to.equal(sandBox);
|
4101 | expect(B.css('width')).to.equal('34px');
|
4102 | expect(B.css('height')).to.equal('99px');
|
4103 | expect(B.css('opacity')).to.equal('1');
|
4104 | expect(B.siblings.length).to.equal(1);
|
4105 | expect(B.children.length).to.equal(3);
|
4106 | expect(B.children[0].el.textContent).to.equal('Some Inner Text');
|
4107 | expect(B.children[0]).not.to.equal(A.children[0]);
|
4108 | expect(B.children[1]).not.to.equal(childA);
|
4109 | expect(B.children[2]).not.to.equal(childB);
|
4110 | expect(B.state('happy')).to.be.true;
|
4111 | expect(B.state('relaxed')).to.be.false;
|
4112 | expect(emitCount).to.equal(1);
|
4113 | B.emit('privateEvent');
|
4114 | expect(emitCount).to.equal(2);
|
4115 | A.off();
|
4116 | A.emit('privateEvent');
|
4117 | expect(emitCount).to.equal(2);
|
4118 | B.emit('privateEvent');
|
4119 | return expect(emitCount).to.equal(3);
|
4120 | });
|
4121 | test(".prop() - element property getter/setter", function () {
|
4122 | var div;
|
4123 | div = Dom.div();
|
4124 | expect(div.prop('myProp')).to.equal(void 0);
|
4125 | expect(div.prop('myProp', 192)).to.equal(div);
|
4126 | expect(div.prop('myProp')).to.equal(192);
|
4127 | expect(div.prop('myProp', '192')).to.equal(div);
|
4128 | expect(div.prop('myProp')).to.equal('192');
|
4129 | expect(div.prop('anotherProp', [1, 2, 3])).to.equal(div);
|
4130 | expect(div.prop('anotherProp')).to.eql([1, 2, 3]);
|
4131 | expect(div.el.myProp).to.equal('192');
|
4132 | expect(div.el.anotherProp).to.eql([1, 2, 3]);
|
4133 | div.el.lastProp = 9999;
|
4134 | expect(div.el.lastProp).to.equal(9999);
|
4135 | expect(div.prop('lastProp')).to.equal(9999);
|
4136 | expect(Object.keys(div.el)).not.to.contain('promiseIsLast');
|
4137 | div.prop('promiseIsLast', 'over9k');
|
4138 | expect(Object.keys(div.el)).to.contain('promiseIsLast');
|
4139 | div.prop('promiseIsLast', void 0);
|
4140 | expect(Object.keys(div.el)).to.contain('promiseIsLast');
|
4141 | div.prop('promiseIsLast', null);
|
4142 | expect(Object.keys(div.el)).to.contain('promiseIsLast');
|
4143 | div.prop({
|
4144 | abc: 123,
|
4145 | def: 456
|
4146 | });
|
4147 | expect(div.el.abc).to.equal(123);
|
4148 | return expect(div.el.def).to.equal(456);
|
4149 | });
|
4150 | test(".attr() - element attribute getter/setter", function () {
|
4151 | var div;
|
4152 | div = Dom.div();
|
4153 | expect(div.attr('myAttr')).to.equal(null);
|
4154 | expect(div.attr('myAttr', 192)).to.equal(div);
|
4155 | expect(div.attr('myAttr')).to.equal('192');
|
4156 | expect(div.attr('myAttr', '192')).to.equal(div);
|
4157 | expect(div.attr('myAttr')).to.equal('192');
|
4158 | expect(div.attr('anotherAttr', [1, 2, 3])).to.equal(div);
|
4159 | expect(div.attr('anotherAttr')).to.equal('1,2,3');
|
4160 | expect(div.el.getAttribute('myAttr')).to.equal('192');
|
4161 | expect(div.el.getAttribute('anotherAttr')).to.eql('1,2,3');
|
4162 | div.el.setAttribute('lastAttr', 9999);
|
4163 | expect(div.el.getAttribute('lastAttr')).to.equal('9999');
|
4164 | expect(div.attr('lastAttr')).to.equal('9999');
|
4165 | expect(div.el.getAttribute('promiseIsLast')).to.equal(null);
|
4166 | div.attr('promiseIsLast', 'over9k');
|
4167 | expect(div.el.getAttribute('promiseIsLast')).to.equal('over9k');
|
4168 | div.attr('promiseIsLast');
|
4169 | expect(div.el.getAttribute('promiseIsLast')).to.equal('over9k');
|
4170 | div.attr('promiseIsLast', null);
|
4171 | expect(div.el.getAttribute('promiseIsLast')).to.equal(null);
|
4172 | div.attr({
|
4173 | abc: 123,
|
4174 | def: 456
|
4175 | });
|
4176 | expect(div.el.getAttribute('abc')).to.equal('123');
|
4177 | expect(div.el.getAttribute('def')).to.equal('456');
|
4178 | div.attr({
|
4179 | abc: 123,
|
4180 | def: null
|
4181 | });
|
4182 | expect(div.el.getAttribute('abc')).to.equal('123');
|
4183 | return expect(div.el.getAttribute('def')).to.equal(null);
|
4184 | });
|
4185 | test(".html - innerHTML getter/setter", function () {
|
4186 | var div;
|
4187 | div = Dom.div(null, Dom.div(), 'Some text', Dom.span(), Dom.div());
|
4188 | expect(div.children.length).to.equal(4);
|
4189 | expect(div.html).to.equal(div.el.innerHTML);
|
4190 | expect(div.children.length).to.equal(4);
|
4191 | div.html = '<section ID="test"></section>';
|
4192 | expect(div.html).to.equal('<section id="test"></section>');
|
4193 | expect(div.children.length).to.equal(1);
|
4194 | expect(div.children[0].el.id).to.equal('test');
|
4195 | return expect(div.children[0].el.nodeName.toLowerCase()).to.equal('section');
|
4196 | });
|
4197 | test(".text - textContent getter/setter", function () {
|
4198 | var div;
|
4199 | div = Dom.div(null, 'Some text', Dom.span(null, 'Inner Text'));
|
4200 | expect(div.children.length).to.equal(2);
|
4201 | expect(div.text).to.equal(div.el.textContent);
|
4202 | expect(div.text).to.equal('Some textInner Text');
|
4203 | expect(div.children.length).to.equal(2);
|
4204 | div.text = 'newText';
|
4205 | expect(div.text).to.equal('newText');
|
4206 | expect(div.el.textContent).to.equal('newText');
|
4207 | expect(div.children.length).to.equal(1);
|
4208 | return expect(div.children[0].el.nodeType).to.equal(3);
|
4209 | });
|
4210 | test(".addClass", function () {
|
4211 | var div;
|
4212 | div = Dom.div({
|
4213 | class: 'some-selector anotherSelector .period annoying-_-selector '
|
4214 | });
|
4215 | expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector ');
|
4216 | div.addClass('new-selector');
|
4217 | expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector new-selector');
|
4218 | div.addClass('new-selector');
|
4219 | expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector new-selector');
|
4220 | div.raw.className = div.raw.className.replace('new-selector', ' ');
|
4221 | expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector ');
|
4222 | div.addClass('new-selector');
|
4223 | expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector new-selector');
|
4224 | div.addClass('.period');
|
4225 | expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector new-selector');
|
4226 | div.addClass('period');
|
4227 | return expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector new-selector period');
|
4228 | });
|
4229 | test(".removeClass", function () {
|
4230 | var div;
|
4231 | div = Dom.div({
|
4232 | class: 'some-selector anotherSelector .period annoying-_-selector '
|
4233 | });
|
4234 | expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector ');
|
4235 | div.addClass('new-selector');
|
4236 | expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector new-selector');
|
4237 | div.removeClass('new-selector');
|
4238 | expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector');
|
4239 | div.removeClass('new-selector');
|
4240 | expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector');
|
4241 | div.removeClass('some-selector');
|
4242 | expect(div.raw.className).to.equal('anotherSelector .period annoying-_-selector');
|
4243 | div.removeClass('period');
|
4244 | expect(div.raw.className).to.equal('anotherSelector .period annoying-_-selector');
|
4245 | div.removeClass('.period');
|
4246 | return expect(div.raw.className).to.equal('anotherSelector annoying-_-selector');
|
4247 | });
|
4248 | test(".toggleClass", function () {
|
4249 | var div;
|
4250 | div = Dom.div({
|
4251 | class: 'some-selector anotherSelector .period annoying-_-selector '
|
4252 | });
|
4253 | expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector ');
|
4254 | div.toggleClass('new-selector');
|
4255 | expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector new-selector');
|
4256 | div.toggleClass('new-selector');
|
4257 | expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector');
|
4258 | div.toggleClass('new-selector');
|
4259 | expect(div.raw.className).to.equal('some-selector anotherSelector .period annoying-_-selector new-selector');
|
4260 | div.toggleClass('new-selector');
|
4261 | div.toggleClass('some-selector');
|
4262 | expect(div.raw.className).to.equal('anotherSelector .period annoying-_-selector');
|
4263 | div.toggleClass('some-selector');
|
4264 | expect(div.raw.className).to.equal('anotherSelector .period annoying-_-selector some-selector');
|
4265 | div.toggleClass('period');
|
4266 | expect(div.raw.className).to.equal('anotherSelector .period annoying-_-selector some-selector period');
|
4267 | div.toggleClass('.period');
|
4268 | expect(div.raw.className).to.equal('anotherSelector annoying-_-selector some-selector period');
|
4269 | div.toggleClass('annoying-_-selector');
|
4270 | return expect(div.raw.className).to.equal('anotherSelector some-selector period');
|
4271 | });
|
4272 | test(".setRef", function () {
|
4273 | var el;
|
4274 | el = DOM.div({
|
4275 | ref: 'name1'
|
4276 | });
|
4277 | expect(el.ref).to.equal('name1');
|
4278 | expect(el.options.ref).to.equal('name1');
|
4279 | expect(el.attr('data-ref')).to.equal('name1');
|
4280 | el.setRef('name2');
|
4281 | expect(el.ref).to.equal('name2');
|
4282 | expect(el.options.ref).to.equal('name2');
|
4283 | return expect(el.attr('data-ref')).to.equal('name2');
|
4284 | });
|
4285 | return test("Appending/prepending elements to a text node should do nothing", function () {
|
4286 | var div, text;
|
4287 | text = Dom.text('abc123');
|
4288 | expect(text.text).to.equal('abc123');
|
4289 | expect(text.raw.childNodes.length).to.equal(0);
|
4290 | text.append(Dom.text('def'));
|
4291 | expect(text.text).to.equal('abc123');
|
4292 | expect(text.raw.childNodes.length).to.equal(0);
|
4293 | text.prepend(Dom.div(null, 'def'));
|
4294 | expect(text.text).to.equal('abc123');
|
4295 | expect(text.raw.childNodes.length).to.equal(0);
|
4296 | div = Dom.div(null, '456');
|
4297 | div.appendTo(text);
|
4298 | expect(text.text).to.equal('abc123');
|
4299 | expect(text.raw.childNodes.length).to.equal(0);
|
4300 | return expect(div.parent).to.equal(void 0);
|
4301 | });
|
4302 | });
|
4303 | suite("Batch", function () {
|
4304 | test("Dom.batch() takes an iterable containing an array of elements or QuickDom elements and reveals the QuickElement API which will be applied for each element", function () {
|
4305 | var A, B, C, div, sandBox;
|
4306 | sandBox = Dom(sandbox);
|
4307 | div = Dom.div();
|
4308 | A = Dom.div().appendTo(div);
|
4309 | B = Dom.section().appendTo(div);
|
4310 | C = Dom.div().appendTo(div);
|
4311 | checkChildStructure(sandBox)();
|
4312 | checkChildStructure(div)(A, B, C);
|
4313 | Dom.batch([A, B, C]).appendTo(sandBox).style('opacity', 0.5).css({
|
4314 | height: 30,
|
4315 | backgroundColor: 'pink'
|
4316 | }).append('Some Inner Text');
|
4317 | checkChildStructure(sandBox)(A, B, C);
|
4318 | checkChildStructure(div)();
|
4319 | expect(getComputedStyle(A.el).opacity).to.equal('0.5');
|
4320 | expect(getComputedStyle(C.el).opacity).to.equal('0.5');
|
4321 | expect(getComputedStyle(B.el).height).to.equal('30px');
|
4322 | expect(A.children.length).to.equal(1);
|
4323 | expect(B.children.length).to.equal(1);
|
4324 | expect(C.children.length).to.equal(1);
|
4325 | return expect(B.children[0].el.textContent).to.equal('Some Inner Text');
|
4326 | });
|
4327 | test("If a truthy value is passed as the 2nd arg of Dom.batch(), an array will be returned for the first method invoked containing the result for each element provided", function () {
|
4328 | var A, B, C, batch1, batch2, sandBox;
|
4329 | sandBox = Dom(sandbox);
|
4330 | A = Dom.div().appendTo(sandBox);
|
4331 | B = Dom.section().appendTo(sandBox);
|
4332 | C = Dom.div().appendTo(sandBox);
|
4333 | batch1 = Dom.batch([A, B, C]);
|
4334 | batch2 = Dom.batch([A, B, C], true);
|
4335 | expect(batch1.style('width')).to.equal(batch1);
|
4336 | expect(batch1.style('width', 47)).to.equal(batch1);
|
4337 | expect(batch2.style('width')).to.eql(['47px', '47px', '47px']);
|
4338 | expect(batch2.style('width', 33)).to.eql([A, B, C]);
|
4339 | return expect(batch2.style('width')).to.eql(['33px', '33px', '33px']);
|
4340 | });
|
4341 | test("If the .return() method is invoked on the batch instance, it will return the result set from the last method invocation", function () {
|
4342 | var A, B, C, div, result, sandBox;
|
4343 | sandBox = Dom(sandbox);
|
4344 | div = Dom.div();
|
4345 | A = Dom.div().appendTo(div);
|
4346 | B = Dom.section().appendTo(div);
|
4347 | C = Dom.div().appendTo(div);
|
4348 | result = Dom.batch([A, B, C]).appendTo(sandBox).style('opacity', 0.5).css({
|
4349 | height: 30,
|
4350 | backgroundColor: 'pink'
|
4351 | }).append('Some Inner Text').style('opacity').return();
|
4352 | expect(result).to.eql(['0.5', '0.5', '0.5']);
|
4353 | return expect(Dom.batch([A, B, C]).css('width', '38px').css('width').return()).to.eql(['38px', '38px', '38px']);
|
4354 | });
|
4355 | test("If the .return() method is invoked with a truthy argument, it will cause the next method invocation to return the results of the invocation for each element provided", function () {
|
4356 | var A, B, C, div, result, sandBox;
|
4357 | sandBox = Dom(sandbox);
|
4358 | div = Dom.div();
|
4359 | A = Dom.div().appendTo(div);
|
4360 | B = Dom.section().appendTo(div);
|
4361 | C = Dom.div().appendTo(div);
|
4362 | result = Dom.batch([A, B, C]).appendTo(sandBox).style('opacity', 0.5).css({
|
4363 | height: 30,
|
4364 | backgroundColor: 'pink'
|
4365 | }).append('Some Inner Text').return(true).style('opacity');
|
4366 | expect(result).to.eql(['0.5', '0.5', '0.5']);
|
4367 | return expect(Dom.batch([A, B, C]).css('width', '38px').css('height', '28px').return(true).css('width')).to.eql(['38px', '38px', '38px']);
|
4368 | });
|
4369 | test("Invoking the .reverse() method on the batch instance will reverse the elements array in the batch and thus the execution order", function () {
|
4370 | var A, B, C, arr;
|
4371 | A = Dom.div(null, 'AAA').appendTo(sandbox);
|
4372 | B = Dom.div(null, 'BBB').appendTo(sandbox);
|
4373 | C = Dom.div(null, 'CCC').appendTo(sandbox);
|
4374 | arr = [A, B, C];
|
4375 | expect(Dom.batch(arr).elements).not.to.equal(arr);
|
4376 | expect(Dom.batch(arr).elements).to.eql([A, B, C]);
|
4377 | expect(Dom.batch(arr).reverse().elements).to.eql([C, B, A]);
|
4378 | expect(Dom.batch(arr, 1).text()).to.eql(['AAA', 'BBB', 'CCC']);
|
4379 | expect(Dom.batch(arr, 1).reverse().text()).to.eql(['CCC', 'BBB', 'AAA']);
|
4380 | expect(Dom.batch(arr, 1).reverse().text()).to.eql(['CCC', 'BBB', 'AAA']);
|
4381 | return expect(Dom.batch(arr, 1).reverse().reverse().text()).to.eql(['AAA', 'BBB', 'CCC']);
|
4382 | });
|
4383 | return test("Batch.text/.html are methods instead of getters/setters", function () {
|
4384 | var batch, divA, divB;
|
4385 | divA = Dom.div(null, 'The divA');
|
4386 | divB = Dom.div(null, 'The divB');
|
4387 | batch = Dom.batch([divA, divB], true);
|
4388 | expect(batch.html()).to.eql(['The divA', 'The divB']);
|
4389 | expect(batch.text()).to.eql(['The divA', 'The divB']);
|
4390 | batch.html('<span>The div</span>');
|
4391 | expect(batch.html()).to.eql(['<span>The div</span>', '<span>The div</span>']);
|
4392 | expect(batch.text()).to.eql(['The div', 'The div']);
|
4393 | batch.text('THE DIV');
|
4394 | expect(batch.html()).to.eql(['THE DIV', 'THE DIV']);
|
4395 | return expect(batch.text()).to.eql(['THE DIV', 'THE DIV']);
|
4396 | });
|
4397 | });
|
4398 | suite("Templates", function () {
|
4399 | test("A reusable template can be generated via QuickDom.template()", function () {
|
4400 | var template;
|
4401 | template = Dom.template(['span', {
|
4402 | id: 'theSpan'
|
4403 | }]);
|
4404 | expect(typeof template).to.equal('object');
|
4405 | expect(template.type).to.equal('span');
|
4406 | expect(template.options).to.eql({
|
4407 | id: 'theSpan'
|
4408 | });
|
4409 | return expect(template.children).to.eql([]);
|
4410 | });
|
4411 | test("Templates can be turned into QuickDom instances via template.spawn() or by passing as arg to QuickDom", function () {
|
4412 | var spawnA, spawnB, template;
|
4413 | template = Dom.template(['div', {
|
4414 | className: 'some-div'
|
4415 | }, 'Some Inner Text']);
|
4416 | spawnA = template.spawn();
|
4417 | spawnA.state('happy', true);
|
4418 | spawnB = Dom(template);
|
4419 | expect(spawnA.el).to.be.instanceOf(HTMLDivElement);
|
4420 | expect(spawnB.el).to.be.instanceOf(HTMLDivElement);
|
4421 | expect(spawnA).not.to.equal(spawnB);
|
4422 | expect(spawnA.el).not.to.equal(spawnB.el);
|
4423 | expect(spawnA.state('happy')).to.be.true;
|
4424 | expect(spawnB.state('happy')).to.be.false;
|
4425 | expect(spawnA.el.textContent).to.equal('Some Inner Text');
|
4426 | expect(spawnB.el.textContent).to.equal('Some Inner Text');
|
4427 | return expect(spawnA.el.className).to.equal('some-div');
|
4428 | });
|
4429 | test("Templates can be created from QuickElement instances", function () {
|
4430 | var section, sectionTemplate, templateSpawn;
|
4431 | section = Dom.section({
|
4432 | className: 'singleSection'
|
4433 | }, 'Some Inner Text');
|
4434 | section.state('happy', true);
|
4435 | sectionTemplate = section.toTemplate();
|
4436 | templateSpawn = sectionTemplate.spawn();
|
4437 | expect(sectionTemplate).not.to.equal(section);
|
4438 | expect(templateSpawn.el).not.to.equal(section.el);
|
4439 | expect(templateSpawn.el.className).to.equal('singleSection');
|
4440 | expect(templateSpawn.text).to.equal('Some Inner Text');
|
4441 | expect(section.state('happy')).to.be.true;
|
4442 | return expect(templateSpawn.state('happy')).to.be.false;
|
4443 | });
|
4444 | test("Templates can be created from DOM Elements", function () {
|
4445 | var sectionEl, sectionTemplate, templateSpawn;
|
4446 | sectionEl = document.createElement('section');
|
4447 | sectionEl.className = 'singleSection';
|
4448 | sectionEl.appendChild(document.createTextNode('Some Inner Text'));
|
4449 | sectionTemplate = Dom.template(sectionEl);
|
4450 | templateSpawn = sectionTemplate.spawn();
|
4451 | expect(templateSpawn.el).not.to.equal(sectionEl);
|
4452 | expect(templateSpawn.el.className).to.equal('singleSection');
|
4453 | return expect(templateSpawn.text).to.equal('Some Inner Text');
|
4454 | });
|
4455 | test("Templates can be extended via template.extend", function () {
|
4456 | var spawn, spawnA, spawnB, spawnC, template, templateCopyA, templateCopyB, templateCopyC;
|
4457 | template = Dom.template(['div', {
|
4458 | className: 'some-div'
|
4459 | }, 'Some Inner Text']);
|
4460 | templateCopyA = template.extend({
|
4461 | type: 'span',
|
4462 | options: {
|
4463 | className: 'some-span'
|
4464 | },
|
4465 | children: []
|
4466 | });
|
4467 | templateCopyB = template.extend({
|
4468 | options: {
|
4469 | id: 'theMainDiv'
|
4470 | },
|
4471 | children: ['The Other Inner Text']
|
4472 | });
|
4473 | templateCopyC = template.extend(['section', {
|
4474 | className: 'some-section'
|
4475 | }, ['div', null, 'Very '], ['div', null, ['span', {
|
4476 | style: {
|
4477 | fontWeight: 500
|
4478 | }
|
4479 | }, 'Nested '], 'Inner Text']]);
|
4480 | expect(templateCopyA).not.to.equal(template);
|
4481 | expect(templateCopyB).not.to.equal(template);
|
4482 | spawn = template.spawn();
|
4483 | spawnA = templateCopyA.spawn();
|
4484 | spawnB = templateCopyB.spawn();
|
4485 | spawnC = templateCopyC.spawn();
|
4486 | expect(spawn.el.nodeName.toLowerCase()).to.equal('div');
|
4487 | expect(spawn.el.className).to.equal('some-div');
|
4488 | expect(spawn.el.id).to.equal('');
|
4489 | expect(spawn.text).to.equal('Some Inner Text');
|
4490 | expect(spawnA.el.nodeName.toLowerCase()).to.equal('span');
|
4491 | expect(spawnA.el.className).to.equal('some-span');
|
4492 | expect(spawnA.el.id).to.equal('');
|
4493 | expect(spawnA.text).to.equal('Some Inner Text');
|
4494 | expect(spawnB.el.nodeName.toLowerCase()).to.equal('div');
|
4495 | expect(spawnB.el.className).to.equal('some-div');
|
4496 | expect(spawnB.el.id).to.equal('theMainDiv');
|
4497 | expect(spawnB.text).to.equal('The Other Inner Text');
|
4498 | expect(spawnC.el.nodeName.toLowerCase()).to.equal('section');
|
4499 | expect(spawnC.el.className).to.equal('some-section');
|
4500 | expect(spawnC.el.id).to.equal('');
|
4501 | return expect(spawnC.text).to.equal('Very Nested Inner Text');
|
4502 | });
|
4503 | test("Templates can be spawned via extended config by passing a new config object to template.spawn()", function () {
|
4504 | var spawnA, spawnB, spawnRaw, template;
|
4505 | template = Dom.template(['div', {
|
4506 | className: 'some-div'
|
4507 | }, 'Some Inner Text', ['strong', {
|
4508 | className: 'highlighted',
|
4509 | style: {
|
4510 | opacity: 0.9
|
4511 | }
|
4512 | }, ' - Bolded Text']]);
|
4513 | spawnRaw = template.spawn().appendTo(sandbox);
|
4514 | spawnA = template.spawn({
|
4515 | type: 'section',
|
4516 | options: {
|
4517 | className: 'some-section',
|
4518 | style: {
|
4519 | opacity: 0.7
|
4520 | }
|
4521 | }
|
4522 | }).appendTo(sandbox);
|
4523 | spawnB = template.spawn({
|
4524 | options: {
|
4525 | className: 'main-div',
|
4526 | id: 'theMainDiv',
|
4527 | style: {
|
4528 | opacity: 0.5
|
4529 | }
|
4530 | },
|
4531 | children: [{
|
4532 | type: 'span',
|
4533 | children: [{
|
4534 | type: 'text',
|
4535 | options: {
|
4536 | text: 'Main Inner Text'
|
4537 | }
|
4538 | }]
|
4539 | }, {
|
4540 | type: 'b',
|
4541 | options: {
|
4542 | className: 'super-highlighted',
|
4543 | style: {
|
4544 | opacity: '0.2'
|
4545 | }
|
4546 | },
|
4547 | children: [{
|
4548 | options: {
|
4549 | text: ' - Very Bolded Text'
|
4550 | }
|
4551 | }]
|
4552 | }, {
|
4553 | type: 'text',
|
4554 | options: {
|
4555 | text: ' + Other Text'
|
4556 | }
|
4557 | }]
|
4558 | }).appendTo(sandbox);
|
4559 | expect(spawnRaw.el.nodeName.toLowerCase()).to.equal('div');
|
4560 | expect(spawnRaw.el.className).to.equal('some-div');
|
4561 | expect(spawnRaw.el.id).to.equal('');
|
4562 | expect(spawnRaw.text).to.equal('Some Inner Text - Bolded Text');
|
4563 | expect(spawnRaw.el).to.have.style('opacity', '1');
|
4564 | expect(spawnRaw.el.childNodes.length).to.equal(2);
|
4565 | expect(spawnRaw.el.childNodes[0].nodeName).to.equal('#text');
|
4566 | expect(spawnRaw.el.childNodes[1].nodeName.toLowerCase()).to.equal('strong');
|
4567 | expect(spawnRaw.el.childNodes[1].className).to.include('highlighted');
|
4568 | expect(spawnRaw.el.childNodes[1]).to.have.style('opacity', '0.9');
|
4569 | expect(spawnA.el.nodeName.toLowerCase()).to.equal('section');
|
4570 | expect(spawnA.el.className).to.include('some-section');
|
4571 | expect(spawnA.el.id).to.equal('');
|
4572 | expect(spawnA.text).to.equal('Some Inner Text - Bolded Text');
|
4573 | expect(spawnA.el).to.have.style('opacity', '0.7');
|
4574 | expect(spawnA.el.childNodes.length).to.equal(2);
|
4575 | expect(spawnA.el.childNodes[0].nodeName).to.equal('#text');
|
4576 | expect(spawnA.el.childNodes[1].nodeName.toLowerCase()).to.equal('strong');
|
4577 | expect(spawnA.el.childNodes[1].className).to.include('highlighted');
|
4578 | expect(spawnA.el.childNodes[1]).to.have.style('opacity', '0.9');
|
4579 | expect(spawnB.el.nodeName.toLowerCase()).to.equal('div');
|
4580 | expect(spawnB.el.className).to.include('main-div');
|
4581 | expect(spawnB.el.id).to.equal('theMainDiv');
|
4582 | expect(spawnB.text).to.equal('Main Inner Text - Very Bolded Text + Other Text');
|
4583 | expect(spawnB.el).to.have.style('opacity', '0.5');
|
4584 | expect(spawnB.el.childNodes.length).to.equal(3);
|
4585 | expect(spawnB.el.childNodes[0].nodeName.toLowerCase()).to.equal('span');
|
4586 | expect(spawnB.el.childNodes[0].childNodes.length).to.equal(1);
|
4587 | expect(spawnB.el.childNodes[1].nodeName.toLowerCase()).to.equal('b');
|
4588 | expect(spawnB.el.childNodes[1].className).to.include('super-highlighted');
|
4589 | return expect(spawnB.el.childNodes[1]).to.have.style('opacity', '0.2');
|
4590 | });
|
4591 | test("Template.extend/spawn() can accept a template tree array", function () {
|
4592 | var cloneA, cloneB, cloneC, spawn, template;
|
4593 | template = Dom.template(['div', {
|
4594 | style: {
|
4595 | 'opacity': 0.5
|
4596 | }
|
4597 | }, ['span', null, 'text of span'], ['div', null, 'text of div']]);
|
4598 | cloneA = template.extend(['section', {
|
4599 | style: {
|
4600 | 'opacity': 0.8
|
4601 | }
|
4602 | }]);
|
4603 | cloneB = template.extend(['span', null, ['div']]);
|
4604 | cloneC = template.extend(['section', {
|
4605 | className: 'the-section',
|
4606 | style: {
|
4607 | color: 'blue'
|
4608 | }
|
4609 | }, ['section', null, 'text of subsection'], 'just a text node']);
|
4610 | spawn = template.spawn(['span', {
|
4611 | style: {
|
4612 | 'width': 190,
|
4613 | 'opacity': 0.4
|
4614 | }
|
4615 | }, 'so nice']).appendTo(sandbox);
|
4616 | expect(template.type).to.equal('div');
|
4617 | expect(template.options).to.eql({
|
4618 | style: {
|
4619 | 'opacity': 0.5
|
4620 | }
|
4621 | });
|
4622 | expect(template.children.length).to.equal(2);
|
4623 | expect(template.children[0].type).to.equal('span');
|
4624 | expect(template.children[0].children.length).to.equal(1);
|
4625 | expect(template.children[0].children[0].options.text).to.equal('text of span');
|
4626 | expect(template.children[1].type).to.equal('div');
|
4627 | expect(template.children[1].children.length).to.equal(1);
|
4628 | expect(template.children[1].children[0].options.text).to.equal('text of div');
|
4629 | expect(cloneA.type).to.equal('section');
|
4630 | expect(cloneA.options).to.eql({
|
4631 | style: {
|
4632 | 'opacity': 0.8
|
4633 | }
|
4634 | });
|
4635 | expect(cloneA.children.length).to.equal(2);
|
4636 | expect(cloneA.children[0].type).to.equal('span');
|
4637 | expect(cloneA.children[0].children.length).to.equal(1);
|
4638 | expect(cloneA.children[0].children[0].options.text).to.equal('text of span');
|
4639 | expect(cloneA.children[1].type).to.equal('div');
|
4640 | expect(cloneA.children[1].children.length).to.equal(1);
|
4641 | expect(cloneA.children[1].children[0].options.text).to.equal('text of div');
|
4642 | expect(cloneB.type).to.equal('span');
|
4643 | expect(cloneB.options).to.eql({
|
4644 | style: {
|
4645 | 'opacity': 0.5
|
4646 | }
|
4647 | });
|
4648 | expect(cloneB.children.length).to.equal(2);
|
4649 | expect(cloneB.children[0].type).to.equal('div');
|
4650 | expect(cloneB.children[0].children.length).to.equal(1);
|
4651 | expect(cloneB.children[0].children[0].options.text).to.equal('text of span');
|
4652 | expect(cloneB.children[1].type).to.equal('div');
|
4653 | expect(cloneB.children[1].children.length).to.equal(1);
|
4654 | expect(cloneB.children[1].children[0].options.text).to.equal('text of div');
|
4655 | expect(cloneC.type).to.equal('section');
|
4656 | expect(cloneC.options).to.eql({
|
4657 | className: 'the-section',
|
4658 | style: {
|
4659 | 'opacity': 0.5,
|
4660 | 'color': 'blue'
|
4661 | }
|
4662 | });
|
4663 | expect(cloneC.children.length).to.equal(2);
|
4664 | expect(cloneC.children[0].type).to.equal('section');
|
4665 | expect(cloneC.children[0].children.length).to.equal(1);
|
4666 | expect(cloneC.children[0].children[0].options.text).to.equal('text of subsection');
|
4667 | expect(cloneC.children[1].type).to.equal('text');
|
4668 | expect(cloneC.children[1].options.text).to.equal('just a text node');
|
4669 | spawn.style('display', 'block');
|
4670 | expect(spawn.el.nodeName.toLowerCase()).to.equal('span');
|
4671 | expect(spawn.el).to.have.style('opacity', '0.4');
|
4672 | expect(spawn.el).to.have.style('width', '190px');
|
4673 | expect(spawn.el.childNodes.length).to.equal(2);
|
4674 | expect(spawn.el.childNodes[0].nodeType).to.equal(3);
|
4675 | expect(spawn.el.childNodes[0].textContent).to.equal('so nice');
|
4676 | expect(spawn.el.childNodes[1].nodeName.toLowerCase()).to.equal('div');
|
4677 | return expect(spawn.el.childNodes[1].textContent).to.equal('text of div');
|
4678 | });
|
4679 | test("Template.extend/spawn() can accept other template instances as children which will replace existing children", function () {
|
4680 | var childA, childB, childC, spawnedA, spawnedB, spawnedC, template, templateCopy;
|
4681 | template = Dom.template(['div', null, ['span', {
|
4682 | style: {
|
4683 | opacity: 0.5
|
4684 | }
|
4685 | }], 'original text']);
|
4686 | childA = Dom.template(['div', {
|
4687 | style: {
|
4688 | fontFamily: 'pink'
|
4689 | }
|
4690 | }]);
|
4691 | childB = Dom.template('replaced text');
|
4692 | childC = Dom.template(['section']);
|
4693 | templateCopy = template.extend(['span', {
|
4694 | style: {
|
4695 | fontSize: '77px'
|
4696 | }
|
4697 | }, childA, childB, childC]);
|
4698 | spawnedA = template.spawn().appendTo(sandbox);
|
4699 | spawnedB = templateCopy.spawn().appendTo(sandbox);
|
4700 | spawnedC = template.spawn(['span', {
|
4701 | style: {
|
4702 | fontSize: '77px'
|
4703 | }
|
4704 | }, childA, childB, childC]).appendTo(sandbox);
|
4705 | expect(spawnedA.type).to.equal('div');
|
4706 | expect(spawnedA.children.length).to.equal(2);
|
4707 | expect(spawnedA.children[0].type).to.equal('span');
|
4708 | expect(spawnedA.children[0].raw).to.have.style('opacity', '0.5');
|
4709 | expect(spawnedA.children[0].raw).to.have.style('fontFamily', '');
|
4710 | expect(spawnedA.children[1].type).to.equal('text');
|
4711 | expect(spawnedA.text).to.equal('original text');
|
4712 | expect(spawnedB.type).to.equal('span');
|
4713 | expect(spawnedB.children.length).to.equal(3);
|
4714 | expect(spawnedB.children[0].type).to.equal('div');
|
4715 | expect(spawnedB.children[0].raw).to.have.style('opacity', '');
|
4716 | expect(spawnedB.children[0].raw).to.have.style('fontFamily', 'pink');
|
4717 | expect(spawnedB.children[1].type).to.equal('text');
|
4718 | expect(spawnedB.text).to.equal('replaced text');
|
4719 | expect(spawnedB.children[2].type).to.equal('section');
|
4720 | expect(spawnedB.raw).to.have.style('fontSize', '77px');
|
4721 | expect(spawnedC.type).to.equal('span');
|
4722 | expect(spawnedC.children.length).to.equal(3);
|
4723 | expect(spawnedC.children[0].type).to.equal('div');
|
4724 | expect(spawnedC.children[0].raw).to.have.style('opacity', '');
|
4725 | expect(spawnedC.children[0].raw).to.have.style('fontFamily', 'pink');
|
4726 | expect(spawnedC.children[1].type).to.equal('text');
|
4727 | expect(spawnedC.text).to.equal('replaced text');
|
4728 | expect(spawnedC.children[2].type).to.equal('section');
|
4729 | return expect(spawnedC.raw).to.have.style('fontSize', '77px');
|
4730 | });
|
4731 | test("Template.extend/spawn() will consider the passed object as the options object if it doesn't contain template-related props", function () {
|
4732 | var template;
|
4733 | template = DOM.template(['div', {
|
4734 | defaults: {
|
4735 | text: 'default'
|
4736 | },
|
4737 | computers: {
|
4738 | text: function (text) {
|
4739 | return this.text = text;
|
4740 | }
|
4741 | }
|
4742 | }, ['span', {
|
4743 | ref: 'theSpan'
|
4744 | }]]);
|
4745 | expect(template.options.style).to.equal(void 0);
|
4746 | expect(template.options.label).to.equal(void 0);
|
4747 | expect(template.extend({
|
4748 | options: {
|
4749 | label: 'abc123'
|
4750 | }
|
4751 | }).options.label).to.equal('abc123');
|
4752 | expect(template.extend({
|
4753 | label: 'def456'
|
4754 | }).options.label).to.equal('def456');
|
4755 | expect(template.extend({
|
4756 | style: 'def456'
|
4757 | }).options.style).to.equal('def456');
|
4758 | expect(template.extend({
|
4759 | style: 'def456',
|
4760 | type: 'section'
|
4761 | }).options.style).to.equal(void 0);
|
4762 | expect(template.extend({
|
4763 | children: {
|
4764 | theSpan: {
|
4765 | style: 'ghi789'
|
4766 | }
|
4767 | }
|
4768 | }).child.theSpan.options.style).to.equal('ghi789');
|
4769 | expect(template.extend({
|
4770 | children: [{
|
4771 | defaults: 'ghi789'
|
4772 | }]
|
4773 | }).child.theSpan.options.defaults).to.equal('ghi789');
|
4774 | expect(template.spawn({
|
4775 | children: {
|
4776 | theSpan: {
|
4777 | className: 'GHI789'
|
4778 | }
|
4779 | }
|
4780 | }).child.theSpan.raw.className).to.equal('GHI789');
|
4781 | expect(template.spawn().text).to.equal('default');
|
4782 | return expect(template.spawn({
|
4783 | defaults: {
|
4784 | text: 'diff'
|
4785 | }
|
4786 | }).text).to.equal('diff');
|
4787 | });
|
4788 | test("Templates can have other templates as their children", function () {
|
4789 | var headerTemplate, headerTemplateClone, section, sectionTemplate;
|
4790 | headerTemplate = Dom.template(['header', {
|
4791 | style: {
|
4792 | 'height': '200px'
|
4793 | }
|
4794 | }, ['span', {
|
4795 | style: {
|
4796 | 'textAlign': 'center'
|
4797 | }
|
4798 | }, 'This is bolded text'], ' while this is not']);
|
4799 | headerTemplateClone = Dom.template(headerTemplate);
|
4800 | sectionTemplate = Dom.template(['section', null, headerTemplate]);
|
4801 | section = sectionTemplate.spawn().appendTo(sandbox);
|
4802 | expect(headerTemplateClone).to.equal(headerTemplate);
|
4803 | expect(sectionTemplate.children.length).to.equal(1);
|
4804 | expect(sectionTemplate.children[0]).to.equal(headerTemplate);
|
4805 | expect(sectionTemplate.children[0].children.length).to.equal(2);
|
4806 | expect(section.children.length).to.equal(1);
|
4807 | expect(section.children[0].type).to.equal('header');
|
4808 | expect(section.children[0].children.length).to.equal(2);
|
4809 | expect(section.text).to.equal('This is bolded text while this is not');
|
4810 | return expect(section.children[0].children[0].style('textAlign')).to.equal('center');
|
4811 | });
|
4812 | test("A global options object can be passed as the 2nd arg to template.extend/spawn() which will be applied to all templates, spawns, & their children", function () {
|
4813 | var dynamicHeightStyle, headerTemplate, obj, section, sectionTemplate;
|
4814 | obj = {
|
4815 | myHeight: '150px'
|
4816 | };
|
4817 | obj.obj = obj;
|
4818 | dynamicHeightStyle = {
|
4819 | 'height': function (related) {
|
4820 | expect(related).to.equal(obj);
|
4821 | return related.myHeight;
|
4822 | }
|
4823 | };
|
4824 | headerTemplate = Dom.template(['header', {
|
4825 | style: {
|
4826 | 'width': '23px'
|
4827 | }
|
4828 | }, ['div', {
|
4829 | style: {
|
4830 | 'width': '23px'
|
4831 | }
|
4832 | }, 'This is bolded text'], ' while this is not']);
|
4833 | sectionTemplate = Dom.template(['section', {
|
4834 | style: {
|
4835 | 'width': '23px'
|
4836 | }
|
4837 | }, headerTemplate]);
|
4838 | section = sectionTemplate.spawn({
|
4839 | options: {
|
4840 | related: window
|
4841 | }
|
4842 | }, {
|
4843 | related: obj,
|
4844 | style: dynamicHeightStyle
|
4845 | }).appendTo(sandbox);
|
4846 | expect(section.raw.style.height).to.equal('150px');
|
4847 | expect(section.children[0].raw.style.height).to.equal('150px');
|
4848 | expect(section.children[0].children[0].raw.style.height).to.equal('150px');
|
4849 | expect(section.raw.style.width).to.equal('');
|
4850 | expect(section.children[0].raw.style.width).to.equal('');
|
4851 | expect(section.children[0].children[0].raw.style.width).to.equal('');
|
4852 | expect(section.children.length).to.equal(1);
|
4853 | expect(section.children[0].type).to.equal('header');
|
4854 | expect(section.children[0].children.length).to.equal(2);
|
4855 | return expect(section.text).to.equal('This is bolded text while this is not');
|
4856 | });
|
4857 | test("Template children can be navigated by ref using the .child property", function () {
|
4858 | var rendered, template;
|
4859 | template = Dom.template(['div', {
|
4860 | id: 'divA'
|
4861 | }, ['div', {
|
4862 | id: 'childA'
|
4863 | }, ['span', {
|
4864 | ref: 'childA_1'
|
4865 | }], ['div', {
|
4866 | ref: 'childA_2',
|
4867 | id: 'childA_2'
|
4868 | }]], ['div', null, ['span', {
|
4869 | ref: 'childB_1'
|
4870 | }], ['text', {
|
4871 | id: 'childB_2',
|
4872 | text: 'The Text'
|
4873 | }]]]);
|
4874 | expect(typeof template.child).to.equal('object');
|
4875 | expect(Object.keys(template.child).length).to.equal(6);
|
4876 | expect(template.child.divA).to.equal(template);
|
4877 | expect(template.child.childA.type).to.equal('div');
|
4878 | expect(template.child.childA).to.equal(template.children[0]);
|
4879 | expect(template.child.childA_1).to.equal(template.children[0].children[0]);
|
4880 | expect(template.child.childA_2).to.equal(template.children[0].children[1]);
|
4881 | expect(template.child.childB_1).to.equal(template.children[1].children[0]);
|
4882 | expect(template.child.childB_2).to.equal(template.children[1].children[1]);
|
4883 | rendered = template.spawn();
|
4884 | expect(rendered.child.childB_2).to.equal(rendered.children[1].children[1]);
|
4885 | return expect(rendered.text).to.equal('The Text');
|
4886 | });
|
4887 | test("Template's children can be extend/spawned with a {ref:newChild} map instead of a positional array", function () {
|
4888 | var rendered, templateCopy, templateCopy2, templateMain;
|
4889 | templateMain = Dom.template(['div', {
|
4890 | id: 'divA'
|
4891 | }, ['div', {
|
4892 | id: 'childA'
|
4893 | }, ['span', {
|
4894 | ref: 'childA_1'
|
4895 | }], ['div', {
|
4896 | ref: 'childA_2',
|
4897 | id: 'childA_2'
|
4898 | }]], ['div', null, ['span', {
|
4899 | ref: 'childB_1'
|
4900 | }], ['text', {
|
4901 | id: 'childB_2',
|
4902 | text: 'The Text'
|
4903 | }]]]);
|
4904 | templateCopy = templateMain.extend(['section', null, {
|
4905 | childA: {
|
4906 | type: 'form',
|
4907 | options: {
|
4908 | style: {
|
4909 | display: 'inline-block'
|
4910 | }
|
4911 | }
|
4912 | },
|
4913 | childA_2: ['a', {
|
4914 | id: 'CHILDa_2',
|
4915 | href: 'http://google.com'
|
4916 | }, ['text', {
|
4917 | ref: 'childA_2_1',
|
4918 | text: 'New Text'
|
4919 | }]],
|
4920 | childC: ['div', {
|
4921 | ref: 'childD'
|
4922 | }]
|
4923 | }], {
|
4924 | value: 'theValue'
|
4925 | });
|
4926 | templateCopy2 = templateMain.extend({
|
4927 | children: {
|
4928 | childA: {
|
4929 | children: {
|
4930 | newChild: ['div']
|
4931 | }
|
4932 | },
|
4933 | childA_2: ['a', {
|
4934 | id: 'CHILDa_2',
|
4935 | href: 'http://google.com'
|
4936 | }, ['text', {
|
4937 | ref: 'childA_2_1',
|
4938 | text: 'New Text'
|
4939 | }]],
|
4940 | childC: ['div', {
|
4941 | ref: 'childD'
|
4942 | }]
|
4943 | }
|
4944 | });
|
4945 | expect(typeof templateCopy.child.childA_2_1).not.to.equal('undefined');
|
4946 | expect(Object.keys(templateMain.child).length).to.equal(6);
|
4947 | expect(Object.keys(templateCopy.child).length).to.equal(8);
|
4948 | expect(templateCopy.children.length).to.equal(3);
|
4949 | expect(templateCopy.child.divA).to.equal(templateCopy);
|
4950 | expect(templateCopy.child.childA).to.equal(templateCopy.children[0]);
|
4951 | expect(templateCopy.child.childA.type).to.equal('form');
|
4952 | expect(templateCopy.child.childA_1).to.equal(templateCopy.children[0].children[0]);
|
4953 | expect(templateCopy.child.childA_2).to.equal(void 0);
|
4954 | expect(templateCopy.child.CHILDa_2).to.equal(templateCopy.children[0].children[1]);
|
4955 | expect(templateCopy.child.childA_2_1).to.equal(templateCopy.children[0].children[1].children[0]);
|
4956 | expect(templateCopy.child.childA_2_1.options.text).to.equal('New Text');
|
4957 | expect(templateCopy.child.childB_1).to.equal(templateCopy.children[1].children[0]);
|
4958 | expect(templateCopy.child.childB_2).to.equal(templateCopy.children[1].children[1]);
|
4959 | expect(templateCopy.child.childC).to.equal(void 0);
|
4960 | expect(templateCopy.child.childD).to.equal(templateCopy.children[2]);
|
4961 | rendered = templateCopy.spawn().appendTo(sandbox);
|
4962 | expect(Object.keys(rendered.child).length).to.equal(8);
|
4963 | expect(rendered.child.childB_2).to.equal(rendered.children[1].children[1]);
|
4964 | expect(rendered.child.childA.raw).to.have.style('display', 'inline-block');
|
4965 | expect(rendered.child.CHILDa_2.prop('href')).to.contain('http://google.com');
|
4966 | expect(rendered.child.childB_1.prop('value')).to.equal('theValue');
|
4967 | return expect(rendered.child.childD.attr('data-ref')).to.equal('childD');
|
4968 | });
|
4969 | test("Templates can be passed as replacement/new children in {ref:newChild} extension maps", function () {
|
4970 | var childA, childB, childC, templateCopy, templateMain;
|
4971 | childA = Dom.template(['div', {
|
4972 | id: 'childA'
|
4973 | }, ['span', {
|
4974 | ref: 'childA_1'
|
4975 | }], ['div', {
|
4976 | ref: 'childA_2',
|
4977 | id: 'childA_2'
|
4978 | }]]);
|
4979 | childB = Dom.template(['div', {
|
4980 | ref: 'childB'
|
4981 | }, ['span', {
|
4982 | ref: 'childB_1'
|
4983 | }], ['text', {
|
4984 | id: 'childB_2',
|
4985 | text: 'The Text'
|
4986 | }]]);
|
4987 | childC = Dom.template(['div', {
|
4988 | id: 'childC'
|
4989 | }, ['span', {
|
4990 | ref: 'childC_1'
|
4991 | }], ['text', {
|
4992 | id: 'childC_2',
|
4993 | text: 'The Text'
|
4994 | }]]);
|
4995 | templateMain = Dom.template(['div', {
|
4996 | id: 'divA'
|
4997 | }, childA, childB]);
|
4998 | templateCopy = templateMain.extend(['section', null, {
|
4999 | childA: {
|
5000 | type: 'form'
|
5001 | },
|
5002 | childB: childB.extend({
|
5003 | ref: 'ChildB'
|
5004 | }),
|
5005 | childC: childC.extend({
|
5006 | ref: 'ChildC'
|
5007 | })
|
5008 | }], {
|
5009 | value: 'theValue'
|
5010 | });
|
5011 | expect(Object.keys(templateMain.child).length).to.equal(7);
|
5012 | expect(Object.keys(templateCopy.child).length).to.equal(10);
|
5013 | expect(templateMain.children.length).to.equal(2);
|
5014 | expect(templateCopy.children.length).to.equal(3);
|
5015 | expect(templateCopy.child.divA).to.equal(templateCopy);
|
5016 | expect(templateCopy.child.childA).to.equal(templateCopy.children[0]);
|
5017 | expect(templateCopy.child.childA.type).to.equal('form');
|
5018 | expect(templateCopy.child.childA.children.length).to.equal(2);
|
5019 | expect(templateCopy.child.ChildB).to.equal(templateCopy.children[1]);
|
5020 | expect(templateCopy.child.childB_1).to.equal(templateCopy.children[1].children[0]);
|
5021 | expect(templateCopy.child.childB_2).to.equal(templateCopy.children[1].children[1]);
|
5022 | expect(templateMain.child.childC).to.equal(void 0);
|
5023 | expect(templateCopy.child.childC).to.equal(void 0);
|
5024 | expect(templateCopy.child.ChildC).to.equal(templateCopy.children[2]);
|
5025 | expect(Object.keys(templateMain.spawn().child).length).to.equal(7);
|
5026 | return expect(Object.keys(templateCopy.spawn().child).length).to.equal(10);
|
5027 | });
|
5028 | test("ref-children maps shouldn't be modified by the template extender", function () {
|
5029 | var config, spawnA, spawnB, spawnC, spawnD, templateA, templateB, templateC, templateD;
|
5030 | config = {
|
5031 | children: {
|
5032 | childA_1: {
|
5033 | type: 'div',
|
5034 | options: {
|
5035 | style: {
|
5036 | display: 'none'
|
5037 | }
|
5038 | }
|
5039 | }
|
5040 | }
|
5041 | };
|
5042 | templateA = Dom.template(['div', {
|
5043 | ref: 'divA'
|
5044 | }, ['div', {
|
5045 | ref: 'childA'
|
5046 | }, ['span', {
|
5047 | ref: 'childA_1'
|
5048 | }]]]);
|
5049 | templateA.child.childA_1;
|
5050 | templateB = templateA.extend();
|
5051 | templateC = templateA.extend(config);
|
5052 | templateD = templateA.extend(config);
|
5053 | spawnA = templateA.spawn().appendTo(sandbox);
|
5054 | spawnB = templateB.spawn().appendTo(sandbox);
|
5055 | spawnC = templateC.spawn().appendTo(sandbox);
|
5056 | spawnD = templateD.spawn().appendTo(sandbox);
|
5057 | expect(spawnA.child.childA_1.type).to.equal('span');
|
5058 | expect(spawnA.child.childA_1.style('display')).to.equal('inline');
|
5059 | expect(spawnB.child.childA_1.type).to.equal('span');
|
5060 | expect(spawnB.child.childA_1.style('display')).to.equal('inline');
|
5061 | expect(spawnC.child.childA_1.type).to.equal('div');
|
5062 | expect(spawnC.child.childA_1.style('display')).to.equal('none');
|
5063 | expect(spawnD.child.childA_1.type).to.equal('div');
|
5064 | return expect(spawnD.child.childA_1.style('display')).to.equal('none');
|
5065 | });
|
5066 | test("Null values in ref-children map will remove the child from the template", function () {
|
5067 | var templateCopy, templateMain;
|
5068 | templateMain = Dom.template(['div', {
|
5069 | id: 'divA'
|
5070 | }, ['div', {
|
5071 | id: 'childA'
|
5072 | }, ['span', {
|
5073 | ref: 'childA_1'
|
5074 | }], ['div', {
|
5075 | ref: 'childA_2',
|
5076 | id: 'childA_2'
|
5077 | }]], ['div', {
|
5078 | ref: 'childB'
|
5079 | }, ['span', {
|
5080 | ref: 'childB_1'
|
5081 | }], ['text', {
|
5082 | id: 'childB_2',
|
5083 | text: 'The Text'
|
5084 | }]], ['div', {
|
5085 | id: 'childC'
|
5086 | }, ['span', {
|
5087 | ref: 'childC_1'
|
5088 | }], ['text', {
|
5089 | id: 'childC_2',
|
5090 | text: 'The Text'
|
5091 | }]]]);
|
5092 | templateCopy = templateMain.extend(['section', null, {
|
5093 | childA: {
|
5094 | type: 'form',
|
5095 | options: {
|
5096 | style: {
|
5097 | display: 'inline-block'
|
5098 | }
|
5099 | }
|
5100 | },
|
5101 | childA_1: null,
|
5102 | childA_2: ['a', {
|
5103 | id: 'CHILDa_2',
|
5104 | href: 'http://google.com'
|
5105 | }, ['text', {
|
5106 | ref: 'childA_2_1',
|
5107 | text: 'New Text'
|
5108 | }]],
|
5109 | childB_1: null,
|
5110 | childC: null
|
5111 | }]);
|
5112 | expect(typeof templateCopy.child.childA_2_1).not.to.equal('undefined');
|
5113 | expect(Object.keys(templateMain.child).length).to.equal(10);
|
5114 | expect(Object.keys(templateCopy.child).length).to.equal(6);
|
5115 | expect(templateCopy.children.length).to.equal(2);
|
5116 | expect(templateCopy.child.divA).to.equal(templateCopy);
|
5117 | expect(templateCopy.child.childA).to.equal(templateCopy.children[0]);
|
5118 | expect(templateCopy.child.childA.type).to.equal('form');
|
5119 | expect(templateCopy.child.childA.children.length).to.equal(1);
|
5120 | expect(templateMain.child.childA_1).to.equal(templateMain.child.childA_1);
|
5121 | expect(templateCopy.child.childA_1).to.equal(void 0);
|
5122 | expect(templateCopy.child.childA_2).to.equal(void 0);
|
5123 | expect(templateCopy.child.CHILDa_2).to.equal(templateCopy.children[0].children[0]);
|
5124 | expect(templateCopy.child.childA_2_1).to.equal(templateCopy.children[0].children[0].children[0]);
|
5125 | expect(templateCopy.child.childA_2_1.options.text).to.equal('New Text');
|
5126 | expect(templateCopy.child.childB_1).to.equal(void 0);
|
5127 | expect(templateCopy.child.childB_2).to.equal(templateCopy.children[1].children[0]);
|
5128 | expect(templateMain.child.childB_1).to.equal(templateMain.children[1].children[0]);
|
5129 | expect(templateMain.child.childB_2).to.equal(templateMain.children[1].children[1]);
|
5130 | expect(templateMain.child.childC).to.equal(templateMain.children[2]);
|
5131 | return expect(templateCopy.child.childC).to.equal(void 0);
|
5132 | });
|
5133 | test("Null values in options object will delete keys during template extension", function () {
|
5134 | var spawnA, spawnB, templateA, templateB;
|
5135 | templateA = Dom.template(['div', {
|
5136 | ref: 'theDiv',
|
5137 | computers: {
|
5138 | valueA: function () {
|
5139 | return 1;
|
5140 | },
|
5141 | valueB: function () {
|
5142 | return 2;
|
5143 | }
|
5144 | },
|
5145 | style: {
|
5146 | position: 'relative',
|
5147 | width: 100,
|
5148 | height: 100,
|
5149 | $active: {
|
5150 | width: 200,
|
5151 | height: 200
|
5152 | }
|
5153 | }
|
5154 | }]);
|
5155 | templateB = templateA.extend({
|
5156 | options: {
|
5157 | ref: null,
|
5158 | computers: {
|
5159 | valueA: null,
|
5160 | valueB: function () {
|
5161 | return 3;
|
5162 | }
|
5163 | },
|
5164 | style: {
|
5165 | height: null,
|
5166 | opacity: 1,
|
5167 | $active: {
|
5168 | width: null
|
5169 | }
|
5170 | }
|
5171 | }
|
5172 | });
|
5173 | spawnA = templateA.spawn();
|
5174 | spawnB = templateB.spawn();
|
5175 | expect(spawnA.ref).to.equal('theDiv');
|
5176 | expect(spawnB.ref).to.equal(void 0);
|
5177 | expect(typeof spawnA.options.computers.valueA).to.equal('function');
|
5178 | expect(typeof spawnB.options.computers.valueA).to.equal('undefined');
|
5179 | expect(typeof spawnA.options.computers.valueB).to.equal('function');
|
5180 | expect(typeof spawnB.options.computers.valueB).to.equal('function');
|
5181 | expect(spawnA.options.computers.valueB()).to.equal(2);
|
5182 | expect(spawnB.options.computers.valueB()).to.equal(3);
|
5183 | expect(spawnA.options.style.position).to.equal('relative');
|
5184 | expect(spawnB.options.style.position).to.equal('relative');
|
5185 | expect(spawnA.options.style.width).to.equal(100);
|
5186 | expect(spawnB.options.style.width).to.equal(100);
|
5187 | expect(spawnA.options.style.height).to.equal(100);
|
5188 | expect(spawnB.options.style.height).to.equal(void 0);
|
5189 | expect(spawnA.options.style.opacity).to.equal(void 0);
|
5190 | expect(spawnB.options.style.opacity).to.equal(1);
|
5191 | expect(spawnA.options.style.$active.width).to.equal(200);
|
5192 | expect(spawnB.options.style.$active.width).to.equal(void 0);
|
5193 | expect(spawnA.options.style.$active.height).to.equal(200);
|
5194 | return expect(spawnB.options.style.$active.height).to.equal(200);
|
5195 | });
|
5196 | test("When spawning elements the options object passed to the spawns should be a clone of the template's options", function () {
|
5197 | var spawnA, spawnB, templateA, templateB;
|
5198 | templateA = Dom.template(['div', {
|
5199 | style: {
|
5200 | display: 'block'
|
5201 | }
|
5202 | }]);
|
5203 | templateB = Dom.template(['div', {
|
5204 | style: {
|
5205 | display: 'block'
|
5206 | }
|
5207 | }]);
|
5208 | spawnA = templateA.spawn({
|
5209 | ref: 'a'
|
5210 | });
|
5211 | spawnB = templateA.spawn();
|
5212 | expect(spawnA.options).not.to.equal(templateA.options);
|
5213 | expect(spawnA.options.style).not.to.equal(templateA.options.style);
|
5214 | expect(templateA.options.style.$base).to.equal(void 0);
|
5215 | expect(spawnB.options).not.to.equal(templateB.options);
|
5216 | expect(spawnB.options.style).not.to.equal(templateB.options.style);
|
5217 | return expect(templateB.options.style.$base).to.equal(void 0);
|
5218 | });
|
5219 | test("Templates will be spawned when appended to DOM elements", function () {
|
5220 | var div, template;
|
5221 | template = Dom.template(['span', {
|
5222 | ref: 'theSpan'
|
5223 | }, 'someText']);
|
5224 | div = Dom.div(null, 'label: ');
|
5225 | expect(div.children.length).to.equal(1);
|
5226 | expect(div.text).to.equal('label: ');
|
5227 | div.append(template);
|
5228 | expect(div.children.length).to.equal(2);
|
5229 | expect(div.text).to.equal('label: someText');
|
5230 | div.prepend(template);
|
5231 | expect(div.children.length).to.equal(3);
|
5232 | return expect(div.text).to.equal('someTextlabel: someText');
|
5233 | });
|
5234 | return suite("Data computers", function () {
|
5235 | test("Templates accept options.computers fn map which will be invoked with provided options.data upon spawning", function () {
|
5236 | var receivedData, template;
|
5237 | receivedData = null;
|
5238 | template = Dom.template(['div', {
|
5239 | computers: {
|
5240 | 'someLabel': function (data) {
|
5241 | return receivedData = data || 'nothing';
|
5242 | }
|
5243 | }
|
5244 | }]);
|
5245 | expect(receivedData).to.equal(null);
|
5246 | template.spawn();
|
5247 | expect(receivedData).to.equal(null);
|
5248 | template.spawn({
|
5249 | data: {
|
5250 | 'someLabel': 'works'
|
5251 | }
|
5252 | });
|
5253 | return expect(receivedData).to.equal('works');
|
5254 | });
|
5255 | test("Computers will be have the spawned QuickElement instance as their context", function () {
|
5256 | var context, instance, template;
|
5257 | context = null;
|
5258 | template = Dom.template(['div', {
|
5259 | computers: {
|
5260 | 'someLabel': function (data) {
|
5261 | return context = this;
|
5262 | }
|
5263 | }
|
5264 | }]);
|
5265 | expect(context).to.equal(null);
|
5266 | template.spawn();
|
5267 | expect(context).to.equal(null);
|
5268 | instance = template.spawn({
|
5269 | data: {
|
5270 | 'someLabel': void 0
|
5271 | }
|
5272 | });
|
5273 | return expect(context).to.equal(instance);
|
5274 | });
|
5275 | test("Values specified in options.defaults will be used if not specified in options.data upon spawning", function () {
|
5276 | var instance, results, template;
|
5277 | results = {};
|
5278 | template = Dom.template(['div', {
|
5279 | computers: {
|
5280 | 'first': function (data) {
|
5281 | return results.first = data.toLowerCase();
|
5282 | },
|
5283 | 'second': function (data) {
|
5284 | return results.second = data.toLowerCase();
|
5285 | },
|
5286 | 'third': function (data) {
|
5287 | return results.third = data.toLowerCase();
|
5288 | }
|
5289 | },
|
5290 | defaults: {
|
5291 | 'first': 'firstValue here',
|
5292 | 'third': 'thirdValue here'
|
5293 | }
|
5294 | }]);
|
5295 | expect(results).to.deep.equal({});
|
5296 | template.spawn();
|
5297 | expect(results).to.deep.equal({
|
5298 | first: 'firstvalue here',
|
5299 | third: 'thirdvalue here'
|
5300 | });
|
5301 | instance = template.spawn({
|
5302 | data: {
|
5303 | 'third': 'customvalue here'
|
5304 | }
|
5305 | });
|
5306 | return expect(results).to.deep.equal({
|
5307 | first: 'firstvalue here',
|
5308 | third: 'customvalue here'
|
5309 | });
|
5310 | });
|
5311 | test("Values can be of any type", function () {
|
5312 | var instance, results, template;
|
5313 | results = {};
|
5314 | template = Dom.template(['div', {
|
5315 | computers: {
|
5316 | 'first': function (data) {
|
5317 | return results.first = data;
|
5318 | },
|
5319 | 'second': function (data) {
|
5320 | return results.second = data;
|
5321 | },
|
5322 | 'third': function (data) {
|
5323 | return results.third = data;
|
5324 | },
|
5325 | 'fourth': function (data) {
|
5326 | return results.fourth = data;
|
5327 | },
|
5328 | 'fifth': function (data) {
|
5329 | return results.fifth = data;
|
5330 | },
|
5331 | 'sixth': function (data) {
|
5332 | return results.sixth = data;
|
5333 | }
|
5334 | },
|
5335 | defaults: {
|
5336 | 'first': ['abc', '123'],
|
5337 | 'third': {
|
5338 | a: 1,
|
5339 | b: 12
|
5340 | },
|
5341 | 'sixth': 999
|
5342 | }
|
5343 | }]);
|
5344 | instance = template.spawn({
|
5345 | data: {
|
5346 | 'second': null,
|
5347 | 'fourth': 19,
|
5348 | 'fifth': false,
|
5349 | 'sixth': void 0
|
5350 | }
|
5351 | });
|
5352 | expect(results).to.deep.equal({
|
5353 | first: ['abc', '123'],
|
5354 | second: null,
|
5355 | third: {
|
5356 | a: 1,
|
5357 | b: 12
|
5358 | },
|
5359 | fourth: 19,
|
5360 | fifth: false,
|
5361 | sixth: void 0
|
5362 | });
|
5363 | return expect(Object.keys(results).length).to.equal(6);
|
5364 | });
|
5365 | test("Values in options.data that do not have a matching computer will be skipped", function () {
|
5366 | var instance, results, template;
|
5367 | results = {};
|
5368 | template = Dom.template(['div', {
|
5369 | computers: {
|
5370 | 'first': function (data) {
|
5371 | return results.first = data;
|
5372 | },
|
5373 | 'second': function (data) {
|
5374 | return results.second = data;
|
5375 | },
|
5376 | 'third': function (data) {
|
5377 | return results.third = data;
|
5378 | }
|
5379 | }
|
5380 | }]);
|
5381 | instance = template.spawn({
|
5382 | data: {
|
5383 | 'first': 'first value',
|
5384 | 'second': 'second value',
|
5385 | 'third': 'third value',
|
5386 | 'fourth': 'fourth value'
|
5387 | }
|
5388 | });
|
5389 | expect(results).to.deep.equal({
|
5390 | 'first': 'first value',
|
5391 | 'second': 'second value',
|
5392 | 'third': 'third value'
|
5393 | });
|
5394 | return expect(Object.keys(results).length).to.equal(3);
|
5395 | });
|
5396 | test("Computers in template children will receive the parent's options.data", function () {
|
5397 | var instance, results, template;
|
5398 | results = {
|
5399 | parent: {},
|
5400 | childA: {},
|
5401 | childB: {},
|
5402 | childC: {}
|
5403 | };
|
5404 | template = Dom.template(['div', {
|
5405 | computers: {
|
5406 | 'first': function (data) {
|
5407 | return results.parent.first = data;
|
5408 | },
|
5409 | 'second': function (data) {
|
5410 | return results.parent.second = data;
|
5411 | },
|
5412 | 'third': function (data) {
|
5413 | return results.parent.third = data;
|
5414 | }
|
5415 | }
|
5416 | }, ['div', {
|
5417 | computers: {
|
5418 | 'first': function (data) {
|
5419 | return results.childA.first = data;
|
5420 | },
|
5421 | 'second': function (data) {
|
5422 | return results.childA.second = data;
|
5423 | },
|
5424 | 'third': function (data) {
|
5425 | return results.childA.third = data;
|
5426 | }
|
5427 | }
|
5428 | }], ['div', null, ['div', {
|
5429 | computers: {
|
5430 | 'first': function (data) {
|
5431 | return results.childB.first = data;
|
5432 | },
|
5433 | 'fourth': function (data) {
|
5434 | return results.childB.fourth = data;
|
5435 | }
|
5436 | }
|
5437 | }], ['div', {
|
5438 | computers: {
|
5439 | 'first': function (data) {
|
5440 | return results.childC.first = data;
|
5441 | },
|
5442 | 'sixth': function (data) {
|
5443 | return results.childC.sixth = data;
|
5444 | }
|
5445 | }
|
5446 | }]]]);
|
5447 | instance = template.spawn({
|
5448 | data: {
|
5449 | 'first': 'first value',
|
5450 | 'second': 'second value',
|
5451 | 'third': 'third value',
|
5452 | 'fourth': 'fourth value'
|
5453 | }
|
5454 | });
|
5455 | expect(results.parent).to.deep.equal({
|
5456 | 'first': 'first value',
|
5457 | 'second': 'second value',
|
5458 | 'third': 'third value'
|
5459 | });
|
5460 | expect(results.childA).to.deep.equal({
|
5461 | 'first': 'first value',
|
5462 | 'second': 'second value',
|
5463 | 'third': 'third value'
|
5464 | });
|
5465 | expect(results.childB).to.deep.equal({
|
5466 | 'first': 'first value',
|
5467 | 'fourth': 'fourth value'
|
5468 | });
|
5469 | return expect(results.childC).to.deep.equal({
|
5470 | 'first': 'first value'
|
5471 | });
|
5472 | });
|
5473 | test("Parent defaults will not be passed to children", function () {
|
5474 | var instance, results, template;
|
5475 | results = {
|
5476 | parent: {},
|
5477 | child: {}
|
5478 | };
|
5479 | template = Dom.template(['div', {
|
5480 | computers: {
|
5481 | 'first': function (data) {
|
5482 | return results.parent.first = data;
|
5483 | },
|
5484 | 'second': function (data) {
|
5485 | return results.parent.second = data;
|
5486 | },
|
5487 | 'third': function (data) {
|
5488 | return results.parent.third = data;
|
5489 | }
|
5490 | },
|
5491 | defaults: {
|
5492 | 'second': 'second value',
|
5493 | 'fourth': 'fourth value'
|
5494 | }
|
5495 | }, ['div', {
|
5496 | computers: {
|
5497 | 'first': function (data) {
|
5498 | return results.child.first = data;
|
5499 | },
|
5500 | 'second': function (data) {
|
5501 | return results.child.second = data;
|
5502 | },
|
5503 | 'third': function (data) {
|
5504 | return results.child.third = data;
|
5505 | },
|
5506 | 'fourth': function (data) {
|
5507 | return results.child.fourth = data;
|
5508 | }
|
5509 | },
|
5510 | defaults: {
|
5511 | 'first': 'first value'
|
5512 | }
|
5513 | }]]);
|
5514 | instance = template.spawn({
|
5515 | data: {
|
5516 | 'third': 'third value'
|
5517 | }
|
5518 | });
|
5519 | expect(results.parent).to.deep.equal({
|
5520 | 'second': 'second value',
|
5521 | 'third': 'third value'
|
5522 | });
|
5523 | return expect(results.child).to.deep.equal({
|
5524 | 'first': 'first value',
|
5525 | 'third': 'third value'
|
5526 | });
|
5527 | });
|
5528 | test("Defaults should only be applied once", function () {
|
5529 | var count, template;
|
5530 | count = {
|
5531 | parent: 0,
|
5532 | child: 0,
|
5533 | childChild: 0
|
5534 | };
|
5535 | template = Dom.template(['div', {
|
5536 | ref: 'parent',
|
5537 | computers: {
|
5538 | 'first': function (data) {
|
5539 | return count.parent++;
|
5540 | }
|
5541 | },
|
5542 | defaults: {
|
5543 | 'first': 'first value'
|
5544 | }
|
5545 | }, ['div', {
|
5546 | ref: 'child',
|
5547 | computers: {
|
5548 | 'first': function (data) {
|
5549 | return count.parent++;
|
5550 | },
|
5551 | 'second': function (data) {
|
5552 | return count.child++;
|
5553 | }
|
5554 | },
|
5555 | defaults: {
|
5556 | 'second': 'second value'
|
5557 | }
|
5558 | }, ['div', {
|
5559 | ref: 'child',
|
5560 | computers: {
|
5561 | 'fourth': function (data) {
|
5562 | return count.childChild++;
|
5563 | }
|
5564 | },
|
5565 | defaults: {
|
5566 | 'fourth': 'fourth value'
|
5567 | }
|
5568 | }]]]);
|
5569 | template.spawn({
|
5570 | data: {
|
5571 | 'third': 'third value'
|
5572 | }
|
5573 | });
|
5574 | expect(count).to.eql({
|
5575 | parent: 1,
|
5576 | child: 1,
|
5577 | childChild: 1
|
5578 | });
|
5579 | template.spawn();
|
5580 | return expect(count).to.eql({
|
5581 | parent: 2,
|
5582 | child: 2,
|
5583 | childChild: 2
|
5584 | });
|
5585 | });
|
5586 | test("Data/defaults should be applied even when parent doesn't have computers", function () {
|
5587 | var count, template;
|
5588 | count = 0;
|
5589 | template = Dom.template(['div', null, ['section', null, ['div', {
|
5590 | computers: {
|
5591 | 'first': function (data) {
|
5592 | return count++;
|
5593 | }
|
5594 | },
|
5595 | defaults: {
|
5596 | 'first': 'first value'
|
5597 | }
|
5598 | }]]]);
|
5599 | template.spawn({
|
5600 | data: {
|
5601 | 'first': 'second value'
|
5602 | }
|
5603 | });
|
5604 | expect(count).to.equal(1);
|
5605 | template.spawn();
|
5606 | return expect(count).to.equal(2);
|
5607 | });
|
5608 | test("Data can be re-applied via .applyData(data)", function () {
|
5609 | var count, instance, results, template;
|
5610 | results = {};
|
5611 | count = {
|
5612 | a: 0,
|
5613 | b: 0,
|
5614 | c: 0,
|
5615 | d: 0,
|
5616 | e: 0,
|
5617 | f: 0
|
5618 | };
|
5619 | template = Dom.template(['div', {
|
5620 | computers: {
|
5621 | 'a': function (data) {
|
5622 | results.a = data;
|
5623 | return count.a++;
|
5624 | },
|
5625 | 'b': function (data) {
|
5626 | results.b = data;
|
5627 | return count.b++;
|
5628 | },
|
5629 | 'c': function (data) {
|
5630 | results.c = data;
|
5631 | return count.c++;
|
5632 | },
|
5633 | 'd': function (data) {
|
5634 | results.d = data;
|
5635 | return count.d++;
|
5636 | },
|
5637 | 'e': function (data) {
|
5638 | results.e = data;
|
5639 | return count.e++;
|
5640 | },
|
5641 | 'f': function (data) {
|
5642 | results.f = data;
|
5643 | return count.f++;
|
5644 | }
|
5645 | },
|
5646 | defaults: {
|
5647 | 'a': 1,
|
5648 | 'c': 3,
|
5649 | 'f': 6
|
5650 | }
|
5651 | }]);
|
5652 | instance = template.spawn({
|
5653 | data: {
|
5654 | b: 2,
|
5655 | d: 4,
|
5656 | e: 5,
|
5657 | f: 6
|
5658 | }
|
5659 | });
|
5660 | expect(results).to.deep.equal({
|
5661 | a: 1,
|
5662 | b: 2,
|
5663 | c: 3,
|
5664 | d: 4,
|
5665 | e: 5,
|
5666 | f: 6
|
5667 | });
|
5668 | expect(count).to.deep.equal({
|
5669 | a: 1,
|
5670 | b: 1,
|
5671 | c: 1,
|
5672 | d: 1,
|
5673 | e: 1,
|
5674 | f: 1
|
5675 | });
|
5676 | instance.applyData({
|
5677 | a: 11,
|
5678 | b: 22,
|
5679 | d: 44,
|
5680 | e: 55
|
5681 | });
|
5682 | expect(results).to.deep.equal({
|
5683 | a: 11,
|
5684 | b: 22,
|
5685 | c: 3,
|
5686 | d: 44,
|
5687 | e: 55,
|
5688 | f: 6
|
5689 | });
|
5690 | return expect(count).to.deep.equal({
|
5691 | a: 2,
|
5692 | b: 2,
|
5693 | c: 2,
|
5694 | d: 2,
|
5695 | e: 2,
|
5696 | f: 2
|
5697 | });
|
5698 | });
|
5699 | test("The '_init' computer will be run by default on template spawn regardless of data", function () {
|
5700 | var count, template;
|
5701 | count = {};
|
5702 | template = Dom.template(['div', {
|
5703 | ref: 'divA',
|
5704 | computers: {
|
5705 | _init: function () {
|
5706 | var name1;
|
5707 | if (count[name1 = this.ref] == null) {
|
5708 | count[name1] = 0;
|
5709 | }
|
5710 | return count[this.ref]++;
|
5711 | }
|
5712 | }
|
5713 | }, ['div', {
|
5714 | ref: 'divB',
|
5715 | data: {
|
5716 | first: '1'
|
5717 | },
|
5718 | computers: {
|
5719 | _init: function () {
|
5720 | var name1;
|
5721 | if (count[name1 = this.ref] == null) {
|
5722 | count[name1] = 0;
|
5723 | }
|
5724 | return count[this.ref]++;
|
5725 | }
|
5726 | }
|
5727 | }], ['div', {
|
5728 | ref: 'divC'
|
5729 | }, ['div', {
|
5730 | ref: 'divD'
|
5731 | }, ['div', {
|
5732 | ref: 'divE',
|
5733 | computers: {
|
5734 | _init: function () {
|
5735 | var name1;
|
5736 | if (count[name1 = this.ref] == null) {
|
5737 | count[name1] = 0;
|
5738 | }
|
5739 | return count[this.ref]++;
|
5740 | }
|
5741 | }
|
5742 | }]]]]);
|
5743 | expect(count).to.eql({});
|
5744 | template.spawn();
|
5745 | expect(count).to.eql({
|
5746 | divA: 1,
|
5747 | divB: 1,
|
5748 | divE: 1
|
5749 | });
|
5750 | template.spawn();
|
5751 | expect(count).to.eql({
|
5752 | divA: 2,
|
5753 | divB: 2,
|
5754 | divE: 2
|
5755 | });
|
5756 | template.child.divB.spawn({
|
5757 | data: {
|
5758 | second: '2'
|
5759 | }
|
5760 | });
|
5761 | expect(count).to.eql({
|
5762 | divA: 2,
|
5763 | divB: 3,
|
5764 | divE: 2
|
5765 | });
|
5766 | template.child.divC.spawn();
|
5767 | expect(count).to.eql({
|
5768 | divA: 2,
|
5769 | divB: 3,
|
5770 | divE: 3
|
5771 | });
|
5772 | template.child.divC.spawn();
|
5773 | return expect(count).to.eql({
|
5774 | divA: 2,
|
5775 | divB: 3,
|
5776 | divE: 4
|
5777 | });
|
5778 | });
|
5779 | test("The '_init' computer will be passed all of the data the template spawn receives", function () {
|
5780 | var expected, result, template;
|
5781 | result = {
|
5782 | divA: {},
|
5783 | divB: {}
|
5784 | };
|
5785 | template = Dom.template(['div', {
|
5786 | ref: 'divA',
|
5787 | computers: {
|
5788 | href: function (href) {
|
5789 | return result[this.ref].href = href;
|
5790 | },
|
5791 | name: function (name) {
|
5792 | return result[this.ref].name = name;
|
5793 | },
|
5794 | _init: function () {
|
5795 | return result[this.ref]._init = arguments[0];
|
5796 | }
|
5797 | }
|
5798 | }, ['div', {
|
5799 | ref: 'divProxy'
|
5800 | }, ['div', {
|
5801 | ref: 'divB',
|
5802 | defaults: {
|
5803 | first: '1'
|
5804 | },
|
5805 | computers: {
|
5806 | href: function (href) {
|
5807 | return result[this.ref].href = href;
|
5808 | },
|
5809 | name: function (name) {
|
5810 | return result[this.ref].name = name;
|
5811 | },
|
5812 | _init: function () {
|
5813 | return result[this.ref]._init = arguments[0];
|
5814 | }
|
5815 | }
|
5816 | }]]]);
|
5817 | expected = {
|
5818 | href: 'abc',
|
5819 | name: '123',
|
5820 | _init: {
|
5821 | href: 'abc',
|
5822 | name: '123',
|
5823 | value: 'def',
|
5824 | size: '456'
|
5825 | }
|
5826 | };
|
5827 | expect(result).to.eql({
|
5828 | divA: {},
|
5829 | divB: {}
|
5830 | });
|
5831 | template.spawn({
|
5832 | data: {
|
5833 | href: 'abc',
|
5834 | name: '123',
|
5835 | value: 'def',
|
5836 | size: '456'
|
5837 | }
|
5838 | });
|
5839 | expect(result).to.eql({
|
5840 | divA: expected,
|
5841 | divB: expected
|
5842 | });
|
5843 | delete result.divA;
|
5844 | ({
|
5845 | divB: null
|
5846 | });
|
5847 | template.child.divB.spawn({
|
5848 | data: {
|
5849 | href: 'abc',
|
5850 | name: '123',
|
5851 | value: 'def',
|
5852 | size: '456'
|
5853 | }
|
5854 | });
|
5855 | return expect(result).to.eql({
|
5856 | divB: expected
|
5857 | });
|
5858 | });
|
5859 | test("Data can be specified via options object", function () {
|
5860 | var receivedData, template, templateCopy;
|
5861 | receivedData = null;
|
5862 | template = Dom.template(['div', {
|
5863 | computers: {
|
5864 | 'someLabel': function (data) {
|
5865 | return receivedData = data || 'nothing';
|
5866 | }
|
5867 | }
|
5868 | }]);
|
5869 | templateCopy = template.extend({
|
5870 | options: {
|
5871 | data: {
|
5872 | 'someLabel': 'works'
|
5873 | }
|
5874 | }
|
5875 | });
|
5876 | template.spawn();
|
5877 | expect(receivedData).to.equal(null);
|
5878 | templateCopy.spawn();
|
5879 | expect(receivedData).to.equal('works');
|
5880 | template.spawn({
|
5881 | options: {
|
5882 | data: {
|
5883 | 'someLabel': 'also works'
|
5884 | }
|
5885 | }
|
5886 | });
|
5887 | return expect(receivedData).to.equal('also works');
|
5888 | });
|
5889 | test("Data specified in children's options object will be merged with the parent's data", function () {
|
5890 | var receivedData, template, templateCopy;
|
5891 | receivedData = {
|
5892 | abc: null,
|
5893 | def: null
|
5894 | };
|
5895 | template = Dom.template(['div', null, ['span', {
|
5896 | data: {
|
5897 | abc: 123
|
5898 | },
|
5899 | computers: {
|
5900 | 'abc': function (data) {
|
5901 | return receivedData.abc = data || 'nothing';
|
5902 | },
|
5903 | 'def': function (data) {
|
5904 | return receivedData.def = data || 'nothing';
|
5905 | }
|
5906 | }
|
5907 | }]]);
|
5908 | templateCopy = template.extend({
|
5909 | options: {
|
5910 | data: {
|
5911 | def: 456
|
5912 | }
|
5913 | }
|
5914 | });
|
5915 | template.spawn();
|
5916 | expect(receivedData).to.eql({
|
5917 | abc: 123,
|
5918 | def: null
|
5919 | });
|
5920 | receivedData = {
|
5921 | abc: null,
|
5922 | def: null
|
5923 | };
|
5924 | templateCopy.spawn();
|
5925 | expect(receivedData).to.eql({
|
5926 | abc: 123,
|
5927 | def: 456
|
5928 | });
|
5929 | receivedData = {
|
5930 | abc: null,
|
5931 | def: null
|
5932 | };
|
5933 | template.spawn({
|
5934 | options: {
|
5935 | data: {
|
5936 | def: 789
|
5937 | }
|
5938 | }
|
5939 | });
|
5940 | expect(receivedData).to.eql({
|
5941 | abc: 123,
|
5942 | def: 789
|
5943 | });
|
5944 | receivedData = {
|
5945 | abc: null,
|
5946 | def: null
|
5947 | };
|
5948 | template.spawn({
|
5949 | options: {
|
5950 | data: {
|
5951 | abc: 789
|
5952 | }
|
5953 | }
|
5954 | });
|
5955 | return expect(receivedData).to.eql({
|
5956 | abc: 789,
|
5957 | def: null
|
5958 | });
|
5959 | });
|
5960 | test("Data won't be passed to children if options.passDataToChildren is false", function () {
|
5961 | var el1, el2, receivedData, template1, template2;
|
5962 | receivedData = {
|
5963 | parent: null,
|
5964 | child: null
|
5965 | };
|
5966 | template1 = DOM.template(['div', {
|
5967 | computers: {
|
5968 | abc: function (data) {
|
5969 | return receivedData.parent = data;
|
5970 | }
|
5971 | }
|
5972 | }, ['span', {
|
5973 | computers: {
|
5974 | abc: function (data) {
|
5975 | return receivedData.child = data;
|
5976 | }
|
5977 | }
|
5978 | }]]);
|
5979 | template2 = template1.extend({
|
5980 | passDataToChildren: false
|
5981 | });
|
5982 | expect(receivedData).to.eql({
|
5983 | parent: null,
|
5984 | child: null
|
5985 | });
|
5986 | el1 = template1.spawn({
|
5987 | data: {
|
5988 | abc: 123
|
5989 | }
|
5990 | });
|
5991 | expect(receivedData).to.eql({
|
5992 | parent: 123,
|
5993 | child: 123
|
5994 | });
|
5995 | receivedData = {
|
5996 | parent: null,
|
5997 | child: null
|
5998 | };
|
5999 | el2 = template2.spawn({
|
6000 | data: {
|
6001 | abc: 123
|
6002 | }
|
6003 | });
|
6004 | expect(receivedData).to.eql({
|
6005 | parent: 123,
|
6006 | child: null
|
6007 | });
|
6008 | receivedData = {
|
6009 | parent: null,
|
6010 | child: null
|
6011 | };
|
6012 | el1.applyData({
|
6013 | abc: 456
|
6014 | });
|
6015 | expect(receivedData).to.eql({
|
6016 | parent: 456,
|
6017 | child: 456
|
6018 | });
|
6019 | receivedData = {
|
6020 | parent: null,
|
6021 | child: null
|
6022 | };
|
6023 | el2.applyData({
|
6024 | abc: 456
|
6025 | });
|
6026 | expect(receivedData).to.eql({
|
6027 | parent: 456,
|
6028 | child: null
|
6029 | });
|
6030 | el2.lastChild.applyData({
|
6031 | abc: 789
|
6032 | });
|
6033 | return expect(receivedData).to.eql({
|
6034 | parent: 456,
|
6035 | child: 789
|
6036 | });
|
6037 | });
|
6038 | test("Data should be invoked for parents after invoked children", function () {
|
6039 | var computers, el, history, template;
|
6040 | history = [];
|
6041 | computers = {
|
6042 | _init: function () {
|
6043 | return history.push(this.ref);
|
6044 | },
|
6045 | abc: function () {
|
6046 | return history.push(this.ref);
|
6047 | }
|
6048 | };
|
6049 | template = DOM.template(['div', {
|
6050 | computers,
|
6051 | id: 'parent'
|
6052 | }, ['div', {
|
6053 | computers,
|
6054 | id: 'child1'
|
6055 | }, ['div', {
|
6056 | computers,
|
6057 | id: 'child2'
|
6058 | }]], ['div', {
|
6059 | computers,
|
6060 | id: 'child3'
|
6061 | }]]);
|
6062 | expect(history).to.eql([]);
|
6063 | el = template.spawn();
|
6064 | expect(history).to.eql(['child2', 'child1', 'child3', 'parent']);
|
6065 | history.length = 0;
|
6066 | el.applyData({
|
6067 | abc: 123
|
6068 | });
|
6069 | return expect(history).to.eql(['child2', 'child1', 'child3', 'parent']);
|
6070 | });
|
6071 | return test("Computers will be invoked only one time per element if options.invokeComputersOnce is on", function () {
|
6072 | var computers, el, history, template;
|
6073 | history = [];
|
6074 | computers = {
|
6075 | abc: function () {
|
6076 | return history.push(this.ref);
|
6077 | }
|
6078 | };
|
6079 | template = DOM.template(['div', {
|
6080 | computers,
|
6081 | id: 'parent',
|
6082 | invokeComputersOnce: true
|
6083 | }, ['div', {
|
6084 | computers,
|
6085 | id: 'child1'
|
6086 | }, ['div', {
|
6087 | computers,
|
6088 | id: 'child2',
|
6089 | invokeComputersOnce: true
|
6090 | }]], ['div', {
|
6091 | computers,
|
6092 | id: 'child3'
|
6093 | }]]);
|
6094 | expect(history).to.eql([]);
|
6095 | el = template.spawn({
|
6096 | data: {
|
6097 | abc: 123
|
6098 | }
|
6099 | });
|
6100 | expect(history).to.eql(['child2', 'child1', 'child3', 'parent']);
|
6101 | history.length = 0;
|
6102 | el.applyData({
|
6103 | abc: 123
|
6104 | });
|
6105 | expect(history).to.eql(['child1', 'child3']);
|
6106 | history.length = 0;
|
6107 | el.applyData({
|
6108 | abc: 456
|
6109 | });
|
6110 | return expect(history).to.eql(['child1', 'child3']);
|
6111 | });
|
6112 | });
|
6113 | });
|
6114 | return suite("Misc", function () {
|
6115 | test("QuickDom.isTemplate", function () {
|
6116 | expect(Dom.isTemplate(Dom.template(['div']))).to.be.true;
|
6117 | expect(Dom.isTemplate(Dom.div())).to.be.false;
|
6118 | expect(Dom.isTemplate(Dom.div()[0])).to.be.false;
|
6119 | expect(Dom.isTemplate({})).to.be.false;
|
6120 | expect(Dom.isTemplate('string')).to.be.false;
|
6121 | expect(Dom.isTemplate(5)).to.be.false;
|
6122 | expect(Dom.isTemplate(false)).to.be.false;
|
6123 | return expect(Dom.isTemplate(true)).to.be.false;
|
6124 | });
|
6125 | test("QuickDom.isQuickEl", function () {
|
6126 | expect(Dom.isQuickEl(Dom.template(['div']))).to.be.false;
|
6127 | expect(Dom.isQuickEl(Dom.div())).to.be.true;
|
6128 | expect(Dom.isQuickEl(Dom.text())).to.be.true;
|
6129 | expect(Dom.isQuickEl(Dom.div()[0])).to.be.false;
|
6130 | expect(Dom.isQuickEl({})).to.be.false;
|
6131 | expect(Dom.isQuickEl('string')).to.be.false;
|
6132 | expect(Dom.isQuickEl(5)).to.be.false;
|
6133 | expect(Dom.isQuickEl(false)).to.be.false;
|
6134 | return expect(Dom.isQuickEl(true)).to.be.false;
|
6135 | });
|
6136 | test("QuickDom.isEl", function () {
|
6137 | expect(Dom.isEl(Dom.template(['div']))).to.be.false;
|
6138 | expect(Dom.isEl(Dom.div())).to.be.false;
|
6139 | expect(Dom.isEl(Dom.text())).to.be.false;
|
6140 | expect(Dom.isEl(Dom.div()[0])).to.be.true;
|
6141 | expect(Dom.isEl(Dom.text()[0])).to.be.false;
|
6142 | expect(Dom.isEl({})).to.be.false;
|
6143 | expect(Dom.isEl('string')).to.be.false;
|
6144 | expect(Dom.isEl(5)).to.be.false;
|
6145 | expect(Dom.isEl(false)).to.be.false;
|
6146 | return expect(Dom.isEl(true)).to.be.false;
|
6147 | });
|
6148 | test("Stringification", function () {
|
6149 | var section, sectionCopy;
|
6150 | section = Dom(['section', {
|
6151 | id: 'theSection',
|
6152 | className: 'theSectionClass',
|
6153 | style: {
|
6154 | 'position': 'relative',
|
6155 | 'opacity': 0.5,
|
6156 | 'fontSize': function () {
|
6157 | return '29px';
|
6158 | },
|
6159 | $happy: {
|
6160 | fontSize: '11px',
|
6161 | $relaxed: {
|
6162 | fontSize: '8px'
|
6163 | }
|
6164 | }
|
6165 | }
|
6166 | }, ['div', {
|
6167 | id: 'childA',
|
6168 | style: {
|
6169 | position: 'relative'
|
6170 | }
|
6171 | }, 'childA-innertext'], 'section-innertext', ['span', {
|
6172 | id: 'childB',
|
6173 | ref: 'childB-ref!',
|
6174 | style: {
|
6175 | position: 'absolute'
|
6176 | }
|
6177 | }, 'childB-innertext', ['text', {
|
6178 | text: 'childB-innertext 2'
|
6179 | }], ['a', {
|
6180 | url: 'https://google.com'
|
6181 | }]]]).appendTo(sandbox);
|
6182 | window.stringified = JSON.stringify(section, null, 2);
|
6183 | sectionCopy = Dom(JSON.parse(stringified)).appendTo(sandbox);
|
6184 | expect(sectionCopy.type).to.equal(section.type);
|
6185 | expect(sectionCopy.ref).to.equal(section.ref);
|
6186 | expect(sectionCopy.el.id).to.equal(section.el.id);
|
6187 | expect(sectionCopy.el.className).to.equal(section.el.className);
|
6188 | expect(sectionCopy.style('position')).to.equal(section.style('position'));
|
6189 | expect(sectionCopy.style('opacity')).to.equal(section.style('opacity'));
|
6190 | expect(sectionCopy.style('fontSize')).not.to.equal(section.style('fontSize'));
|
6191 | section.style('fontSize', null);
|
6192 | section.state('happy', true);
|
6193 | sectionCopy.state('happy', true);
|
6194 | expect(sectionCopy.style('fontSize')).to.equal(section.style('fontSize'));
|
6195 | section.state('relaxed', true);
|
6196 | sectionCopy.state('relaxed', true);
|
6197 | expect(sectionCopy.style('fontSize')).to.equal(section.style('fontSize'));
|
6198 | expect(sectionCopy.children.length).to.equal(section.children.length);
|
6199 | expect(Object.keys(sectionCopy.child).length).to.equal(Object.keys(section.child).length);
|
6200 | expect(sectionCopy.text).to.equal(section.text);
|
6201 | expect(sectionCopy.html).to.equal(section.html);
|
6202 | expect(sectionCopy.children[0].style('position')).to.equal(section.children[0].style('position'));
|
6203 | expect(sectionCopy.children[2].style('position')).to.equal(section.children[2].style('position'));
|
6204 | return expect(sectionCopy.children[2].ref).to.equal(section.children[2].ref);
|
6205 | });
|
6206 | test("Chaining", function () {
|
6207 | var chainResult, div, head;
|
6208 | div = Dom.div();
|
6209 | chainResult = div.state('abc', true).resetState().style().css('width', 12).attr('test', 123).prop('anotherTest', 123).updateStateStyles({
|
6210 | height: 50
|
6211 | }).updateStateTexts({
|
6212 | $base: 'abc'
|
6213 | }).append().appendTo().prepend().prependTo().before().after().insertBefore().insertAfter().detach().wrap(Dom.section()).unwrap().wrap(Dom.header()).replace().appendTo(sandbox).wrap(head = Dom.header()).on('abc', function () {}).emit('abc').off('abc').off();
|
6214 | expect(chainResult).to.equal(div);
|
6215 | expect(sandbox.children[0]).to.equal(head.el);
|
6216 | expect(div.parent).to.equal(head);
|
6217 | return expect(div.css('width')).to.equal('12px');
|
6218 | });
|
6219 | return test("Invalid Arguments", function () {
|
6220 | var cb, div, emitCount, text;
|
6221 | text = Dom.text('someText', {
|
6222 | lostOpts: true
|
6223 | });
|
6224 | div = Dom.div({
|
6225 | lostOpts: true
|
6226 | });
|
6227 | expect(Dom()).to.equal(void 0);
|
6228 | expect(Dom(null)).to.equal(void 0);
|
6229 | expect(Dom({})).to.equal(void 0);
|
6230 | expect(div.updateOptions()).to.equal(div);
|
6231 | expect(text.options.lostOpts).to.equal(void 0);
|
6232 | expect(div.options.lostOpts).to.equal(true);
|
6233 | expect(div.on()).to.equal(div);
|
6234 | expect(div.on('abc')).to.equal(div);
|
6235 | expect(div.on('abc', {})).to.equal(div);
|
6236 | expect(div.once('abc')).to.equal(div);
|
6237 | expect(div.off('somethingFake')).to.equal(div);
|
6238 | emitCount = 0;
|
6239 | div.on('something', cb = function () {
|
6240 | return emitCount++;
|
6241 | });
|
6242 | expect(div.emit('')).to.equal(div);
|
6243 | expect(div.emit()).to.equal(div);
|
6244 | expect(div.emitPrivate('none')).to.equal(div);
|
6245 | expect(div.emitPrivate('')).to.equal(div);
|
6246 | expect(div.emitPrivate()).to.equal(div);
|
6247 | expect(emitCount).to.equal(0);
|
6248 | expect(div.emit('something')).to.equal(div);
|
6249 | expect(emitCount).to.equal(1);
|
6250 | expect(div.off('something', function () {})).to.equal(div);
|
6251 | expect(div.emit('something')).to.equal(div);
|
6252 | expect(emitCount).to.equal(2);
|
6253 | div.css(null, '129');
|
6254 | expect(div.el.style.null).to.equal(void 0);
|
6255 | expect(div.state()).to.eql([]);
|
6256 | expect(div.state(null, true)).to.equal(void 0);
|
6257 | expect(div.state(123, true)).to.equal(void 0);
|
6258 | expect(div.state('base', true)).to.equal(div);
|
6259 | expect(div.state('base')).to.be.false;
|
6260 | expect(div.state('$whatevs', true)).to.equal(div);
|
6261 | expect(div.state('whatevs')).to.be.true;
|
6262 | expect(div.state('another')).to.be.false;
|
6263 | expect(div.state('another', true)).to.equal(div);
|
6264 | expect(div.state('another')).to.be.true;
|
6265 | expect(div.state('another', void 0)).to.equal(div);
|
6266 | expect(div.state('another')).to.be.false;
|
6267 | expect(div.updateStateStyles({
|
6268 | $base: {
|
6269 | width: 1
|
6270 | }
|
6271 | })).to.equal(div);
|
6272 | expect(div.updateStateStyles(null)).to.equal(div);
|
6273 | expect(div.updateStateTexts({
|
6274 | $base: 'abc'
|
6275 | })).to.equal(div);
|
6276 | expect(div.updateStateTexts(null)).to.equal(div);
|
6277 | div.appendTo(Dom(sandbox));
|
6278 | expect(div.parent).to.equal(Dom(sandbox));
|
6279 | div.append(true);
|
6280 | expect(div.children.length).to.equal(0);
|
6281 | div.appendTo(document);
|
6282 | expect(div.parent).to.equal(Dom(sandbox));
|
6283 | div.prepend(true);
|
6284 | expect(div.children.length).to.equal(0);
|
6285 | div.prependTo(true);
|
6286 | expect(div.parent).to.equal(Dom(sandbox));
|
6287 | div.after(true);
|
6288 | expect(div.children.length).to.equal(0);
|
6289 | div.insertAfter(123);
|
6290 | expect(div.parent).to.equal(Dom(sandbox));
|
6291 | div.before(true);
|
6292 | expect(div.children.length).to.equal(0);
|
6293 | div.insertBefore(123);
|
6294 | expect(div.parent).to.equal(Dom(sandbox));
|
6295 | div.wrap(123);
|
6296 | expect(div.parent).to.equal(Dom(sandbox));
|
6297 | div.replace(123);
|
6298 | expect(div.parent).to.equal(Dom(sandbox));
|
6299 | div.detach();
|
6300 | expect(div.parent).to.equal(void 0);
|
6301 | div.unwrap();
|
6302 | expect(div.parent).to.equal(void 0);
|
6303 | expect(Dom(sandbox).children.length).to.equal(0);
|
6304 | div.appendTo(Dom(sandbox));
|
6305 | expect(Dom(sandbox).children.length).to.equal(1);
|
6306 | if (Dom(sandbox)._removeChild) {
|
6307 | Dom(sandbox)._removeChild(text);
|
6308 | Dom(sandbox)._removeChild(Dom.div());
|
6309 | expect(Dom(sandbox).children.length).to.equal(1);
|
6310 | }
|
6311 | expect(function () {
|
6312 | return Dom.batch();
|
6313 | }).to.throw();
|
6314 | expect(function () {
|
6315 | return Dom.batch({});
|
6316 | }).to.throw();
|
6317 | expect(function () {
|
6318 | return Dom.batch(5432);
|
6319 | }).to.throw();
|
6320 | expect(function () {
|
6321 | return Dom.batch([]);
|
6322 | }).to.throw();
|
6323 | expect(function () {
|
6324 | return Dom.batch([12]).append(Dom.div());
|
6325 | }).to.throw();
|
6326 | expect(function () {
|
6327 | return Dom.batch([12]);
|
6328 | }).not.to.throw();
|
6329 | expect(function () {
|
6330 | return Dom.template();
|
6331 | }).to.throw();
|
6332 | expect(function () {
|
6333 | return Dom.template(null);
|
6334 | }).to.throw();
|
6335 | expect(function () {
|
6336 | return Dom.template({});
|
6337 | }).to.throw();
|
6338 | expect(function () {
|
6339 | return Dom.template([8482, {
|
6340 | className: 't'
|
6341 | }]);
|
6342 | }).to.throw();
|
6343 | expect(function () {
|
6344 | return Dom.template(['div', 'someString']);
|
6345 | }).to.throw();
|
6346 | expect(function () {
|
6347 | return Dom.template(['div', null, 'Some Inner Text']);
|
6348 | }).not.to.throw();
|
6349 | expect(function () {
|
6350 | return Dom.div({
|
6351 | style: {
|
6352 | opacity: 0.5,
|
6353 | '@abc(max-width:390)': {
|
6354 | opacity: 1
|
6355 | }
|
6356 | }
|
6357 | }).appendTo(sandbox);
|
6358 | }).not.to.throw();
|
6359 | return expect(function () {
|
6360 | div = Dom.div();
|
6361 | div.pipeState(div);
|
6362 | div.state('happy', true);
|
6363 | return expect(div.state('happy')).to.equal(true);
|
6364 | }).not.to.throw();
|
6365 | });
|
6366 | });
|
6367 | });
|
6368 | HTMLElement.prototype.onEvent = function (eventName, callback) {
|
6369 | if (this.addEventListener) {
|
6370 | return this.addEventListener(eventName, callback);
|
6371 | } else {
|
6372 | return this.attachEvent(`on${eventName}`, callback);
|
6373 | }
|
6374 | };
|
6375 | HTMLElement.prototype.removeEvent = function (eventName, callback) {
|
6376 | if (this.removeEventListener) {
|
6377 | return this.removeEventListener(eventName, callback);
|
6378 | } else {
|
6379 | return this.detachEvent(`on${eventName}`, callback);
|
6380 | }
|
6381 | };
|
6382 | HTMLElement.prototype.emitEvent = function (eventName) {
|
6383 | var event;
|
6384 | event = document.createEvent('Event');
|
6385 | event.initEvent(eventName, true, false);
|
6386 | return this.dispatchEvent(event);
|
6387 | };
|
6388 | if (HTMLElement.name !== 'HTMLElement') {
|
6389 | HTMLElement.name = 'HTMLElement';
|
6390 | Text.name = 'Text';
|
6391 | nonElementSuffix = ['OptionsCollection', 'FormControlsCollection', 'Document', 'Collection', 'AllCollection'];
|
6392 | elementSuffix = ["Video", "Unknown", "UList", "Track", "Title", "TextArea", "Template", "TableSection", "TableRow", "Table", "TableCol", "TableCell", "TableCaption", "Style", "Span", "Source", "Slot", "Shadow", "Select", "Script", "Quote", "Progress", "Pre", "Picture", "Param", "Paragraph", "Output", "Option", "OptGroup", "Object", "OList", "Mod", "Meter", "Meta", "Menu", "Media", "Marquee", "Map", "Link", "Legend", "Label", "LI", "Input", "Image", "IFrame", "Html", "Heading", "Head", "HR", "FrameSet", "Frame", "Form", "Font", "FieldSet", "Embed", "Div", "Directory", "Dialog", "Details", "DataList", "DList", "Content", "Canvas", "Button", "Body", "Base", "BR", "Audio", "Area", "Anchor"];
|
6393 | for ((i = 0, len = nonElementSuffix.length); i < len; i++) {
|
6394 | creator = nonElementSuffix[i];
|
6395 | if ((ref = window[`HTML${creator}`]) != null) {
|
6396 | ref.name = `HTML${creator}`;
|
6397 | }
|
6398 | }
|
6399 | for ((j = 0, len1 = elementSuffix.length); j < len1; j++) {
|
6400 | creator = elementSuffix[j];
|
6401 | if ((ref1 = window[`HTML${creator}Element`]) != null) {
|
6402 | ref1.name = `HTML${creator}Element`;
|
6403 | }
|
6404 | }
|
6405 | if ((ref2 = window.SVGElement) != null) {
|
6406 | ref2.name = 'SVGElement';
|
6407 | }
|
6408 | if ((ref3 = window.SVGSVGElement) != null) {
|
6409 | ref3.name = 'SVGSVGElement';
|
6410 | }
|
6411 | if ((ref4 = window.SVGPolylineElement) != null) {
|
6412 | ref4.name = 'SVGPolylineElement';
|
6413 | }
|
6414 | }
|
6415 | if (window.ClientRect == null) {
|
6416 | window.ClientRect = DOMRect;
|
6417 | }
|
6418 | return module.exports;
|
6419 | },
|
6420 | "simulate.coffee": function (require, module, exports) {
|
6421 | var origDescriptors;
|
6422 | origDescriptors = {
|
6423 | 'innerWidth': Object.getOwnPropertyDescriptor(window, 'innerWidth'),
|
6424 | 'innerHeight': Object.getOwnPropertyDescriptor(window, 'innerHeight')
|
6425 | };
|
6426 | module.exports = new (function () {
|
6427 | var current, getReal, overwrite, overwritten;
|
6428 | overwritten = false;
|
6429 | current = {
|
6430 | width: window.innerWidth,
|
6431 | height: window.innerHeight
|
6432 | };
|
6433 | getReal = function (dimension) {
|
6434 | dimension = 'inner' + dimension.replace(/\b./, function (letter) {
|
6435 | return letter.toUpperCase();
|
6436 | });
|
6437 | return origDescriptors[dimension].get.call(window);
|
6438 | };
|
6439 | overwrite = function () {
|
6440 | if (!overwritten) {
|
6441 | overwritten = true;
|
6442 | Object.defineProperty(window, 'innerWidth', {
|
6443 | configurable: true,
|
6444 | get: function () {
|
6445 | return current.width;
|
6446 | },
|
6447 | set: function (newValue) {
|
6448 | return current.width = newValue;
|
6449 | }
|
6450 | });
|
6451 | return Object.defineProperty(window, 'innerHeight', {
|
6452 | configurable: true,
|
6453 | get: function () {
|
6454 | return current.height;
|
6455 | },
|
6456 | set: function (newValue) {
|
6457 | return current.height = newValue;
|
6458 | }
|
6459 | });
|
6460 | }
|
6461 | };
|
6462 | this.simulate = function (width, height) {
|
6463 | var event;
|
6464 | if (width) {
|
6465 | current.width = width;
|
6466 | }
|
6467 | if (height) {
|
6468 | current.height = height;
|
6469 | }
|
6470 | overwrite();
|
6471 | event = document.createEvent('Event');
|
6472 | event.initEvent('resize', true, false);
|
6473 | return window.dispatchEvent(event);
|
6474 | };
|
6475 | this.restore = function () {
|
6476 | Object.defineProperty(window, 'innerWidth', origDescriptors.innerWidth);
|
6477 | return Object.defineProperty(window, 'innerHeight', origDescriptors.innerHeight);
|
6478 | };
|
6479 | return this;
|
6480 | })();
|
6481 | return module.exports;
|
6482 | },
|
6483 | "node_modules/chai/index.js": function (require, module, exports) {
|
6484 | module.exports = require("node_modules/chai/lib/chai.js");
|
6485 | return module.exports;
|
6486 | },
|
6487 | "node_modules/chai-style/sources/index.js": function (require, module, exports) {
|
6488 | module.exports = chaiStyle;
|
6489 | function chaiStyle(chai, utils) {
|
6490 | const {Assertion} = chai;
|
6491 | const {flag} = utils;
|
6492 | let sampleDiv, sampleStyle, sampleIframe;
|
6493 | Assertion.addMethod('style', function (property, value = '') {
|
6494 | const element = flag(this, 'object');
|
6495 | const style = window.getComputedStyle(element);
|
6496 | value = value.trim();
|
6497 | const isNonColors = style[property] === 'rgba(0, 0, 0, 0)' || style[property] === 'transparent';
|
6498 | const propertyValue = isNonColors ? '' : style[property];
|
6499 | const assertion = value ? compareCSSValue(propertyValue, value) : Boolean(propertyValue);
|
6500 | const elementTag = element.tagName.toLowerCase();
|
6501 | const throwMessage = `expect ${elementTag} to have {${property}: ${value}}, is receiving {${property}: ${propertyValue}}`;
|
6502 | const throwMessageNegative = `expect ${elementTag} to not have {${property}: ${value}}, is receiving {${property}: ${propertyValue}}`;
|
6503 | this.assert(assertion, throwMessage, throwMessageNegative, value);
|
6504 | function compareCSSValue(computed, expected) {
|
6505 | const propertyHifenCase = property.replace(/[A-Z]/g, match => '-' + match.toLowerCase());
|
6506 | if (!sampleDiv) {
|
6507 | sampleIframe = document.createElement('iframe');
|
6508 | sampleDiv = document.createElement('div');
|
6509 | sampleStyle = window.getComputedStyle(sampleDiv);
|
6510 | sampleIframe.appendChild(sampleDiv);
|
6511 | document.body.appendChild(sampleIframe);
|
6512 | }
|
6513 | sampleDiv.style.fontSize = style.fontSize;
|
6514 | sampleDiv.style.setProperty(propertyHifenCase, expected, 'important');
|
6515 | const value = sampleStyle[property];
|
6516 | const hasAutoValue = value.includes('auto');
|
6517 | const reg = new RegExp(escapeRegExp(value).replace(/auto/g, '(\\d+(.\\d+)?px|auto)'));
|
6518 | sampleDiv.style.fontSize = null;
|
6519 | sampleDiv.style[propertyHifenCase] = null;
|
6520 | return hasAutoValue ? reg.test(computed) : computed === value;
|
6521 | }
|
6522 | });
|
6523 | }
|
6524 | function escapeRegExp(value) {
|
6525 | return String(value).replace(/[\\^$*+?.()|[\]{}]/g, '\\$&');
|
6526 | }
|
6527 | return module.exports;
|
6528 | },
|
6529 | "node_modules/chai/lib/chai.js": function (require, module, exports) {
|
6530 | var used = [];
|
6531 | exports.version = '4.1.2';
|
6532 | exports.AssertionError = require("node_modules/assertion-error/index.js");
|
6533 | var util = require("node_modules/chai/lib/chai/utils/index.js");
|
6534 | exports.use = function (fn) {
|
6535 | if (!~used.indexOf(fn)) {
|
6536 | fn(exports, util);
|
6537 | used.push(fn);
|
6538 | }
|
6539 | return exports;
|
6540 | };
|
6541 | exports.util = util;
|
6542 | var config = require("node_modules/chai/lib/chai/config.js");
|
6543 | exports.config = config;
|
6544 | var assertion = require("node_modules/chai/lib/chai/assertion.js");
|
6545 | exports.use(assertion);
|
6546 | var core = require("node_modules/chai/lib/chai/core/assertions.js");
|
6547 | exports.use(core);
|
6548 | var expect = require("node_modules/chai/lib/chai/interface/expect.js");
|
6549 | exports.use(expect);
|
6550 | var should = require("node_modules/chai/lib/chai/interface/should.js");
|
6551 | exports.use(should);
|
6552 | var assert = require("node_modules/chai/lib/chai/interface/assert.js");
|
6553 | exports.use(assert);
|
6554 | return module.exports;
|
6555 | },
|
6556 | "node_modules/assertion-error/index.js": function (require, module, exports) {
|
6557 | function exclude() {
|
6558 | var excludes = [].slice.call(arguments);
|
6559 | function excludeProps(res, obj) {
|
6560 | Object.keys(obj).forEach(function (key) {
|
6561 | if (!~excludes.indexOf(key)) res[key] = obj[key];
|
6562 | });
|
6563 | }
|
6564 | return function extendExclude() {
|
6565 | var args = [].slice.call(arguments), i = 0, res = {};
|
6566 | for (; i < args.length; i++) {
|
6567 | excludeProps(res, args[i]);
|
6568 | }
|
6569 | return res;
|
6570 | };
|
6571 | }
|
6572 | ;
|
6573 | module.exports = AssertionError;
|
6574 | function AssertionError(message, _props, ssf) {
|
6575 | var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON'), props = extend(_props || ({}));
|
6576 | this.message = message || 'Unspecified AssertionError';
|
6577 | this.showDiff = false;
|
6578 | for (var key in props) {
|
6579 | this[key] = props[key];
|
6580 | }
|
6581 | ssf = ssf || arguments.callee;
|
6582 | if (ssf && Error.captureStackTrace) {
|
6583 | Error.captureStackTrace(this, ssf);
|
6584 | } else {
|
6585 | try {
|
6586 | throw new Error();
|
6587 | } catch (e) {
|
6588 | this.stack = e.stack;
|
6589 | }
|
6590 | }
|
6591 | }
|
6592 | AssertionError.prototype = Object.create(Error.prototype);
|
6593 | AssertionError.prototype.name = 'AssertionError';
|
6594 | AssertionError.prototype.constructor = AssertionError;
|
6595 | AssertionError.prototype.toJSON = function (stack) {
|
6596 | var extend = exclude('constructor', 'toJSON', 'stack'), props = extend({
|
6597 | name: this.name
|
6598 | }, this);
|
6599 | if (false !== stack && this.stack) {
|
6600 | props.stack = this.stack;
|
6601 | }
|
6602 | return props;
|
6603 | };
|
6604 | return module.exports;
|
6605 | },
|
6606 | "node_modules/chai/lib/chai/utils/index.js": function (require, module, exports) {
|
6607 | var pathval = require("node_modules/pathval/index.js");
|
6608 | exports.test = require("node_modules/chai/lib/chai/utils/test.js");
|
6609 | exports.type = require("node_modules/type-detect/index.js");
|
6610 | exports.expectTypes = require("node_modules/chai/lib/chai/utils/expectTypes.js");
|
6611 | exports.getMessage = require("node_modules/chai/lib/chai/utils/getMessage.js");
|
6612 | exports.getActual = require("node_modules/chai/lib/chai/utils/getActual.js");
|
6613 | exports.inspect = require("node_modules/chai/lib/chai/utils/inspect.js");
|
6614 | exports.objDisplay = require("node_modules/chai/lib/chai/utils/objDisplay.js");
|
6615 | exports.flag = require("node_modules/chai/lib/chai/utils/flag.js");
|
6616 | exports.transferFlags = require("node_modules/chai/lib/chai/utils/transferFlags.js");
|
6617 | exports.eql = require("node_modules/deep-eql/index.js");
|
6618 | exports.getPathInfo = pathval.getPathInfo;
|
6619 | exports.hasProperty = pathval.hasProperty;
|
6620 | exports.getName = require("node_modules/get-func-name/index.js");
|
6621 | exports.addProperty = require("node_modules/chai/lib/chai/utils/addProperty.js");
|
6622 | exports.addMethod = require("node_modules/chai/lib/chai/utils/addMethod.js");
|
6623 | exports.overwriteProperty = require("node_modules/chai/lib/chai/utils/overwriteProperty.js");
|
6624 | exports.overwriteMethod = require("node_modules/chai/lib/chai/utils/overwriteMethod.js");
|
6625 | exports.addChainableMethod = require("node_modules/chai/lib/chai/utils/addChainableMethod.js");
|
6626 | exports.overwriteChainableMethod = require("node_modules/chai/lib/chai/utils/overwriteChainableMethod.js");
|
6627 | exports.compareByInspect = require("node_modules/chai/lib/chai/utils/compareByInspect.js");
|
6628 | exports.getOwnEnumerablePropertySymbols = require("node_modules/chai/lib/chai/utils/getOwnEnumerablePropertySymbols.js");
|
6629 | exports.getOwnEnumerableProperties = require("node_modules/chai/lib/chai/utils/getOwnEnumerableProperties.js");
|
6630 | exports.checkError = require("node_modules/check-error/index.js");
|
6631 | exports.proxify = require("node_modules/chai/lib/chai/utils/proxify.js");
|
6632 | exports.addLengthGuard = require("node_modules/chai/lib/chai/utils/addLengthGuard.js");
|
6633 | exports.isProxyEnabled = require("node_modules/chai/lib/chai/utils/isProxyEnabled.js");
|
6634 | exports.isNaN = require("node_modules/chai/lib/chai/utils/isNaN.js");
|
6635 | return module.exports;
|
6636 | },
|
6637 | "node_modules/chai/lib/chai/config.js": function (require, module, exports) {
|
6638 | module.exports = {
|
6639 | includeStack: false,
|
6640 | showDiff: true,
|
6641 | truncateThreshold: 40,
|
6642 | useProxy: true,
|
6643 | proxyExcludedKeys: ['then', 'inspect', 'toJSON']
|
6644 | };
|
6645 | return module.exports;
|
6646 | },
|
6647 | "node_modules/chai/lib/chai/assertion.js": function (require, module, exports) {
|
6648 | var config = require("node_modules/chai/lib/chai/config.js");
|
6649 | module.exports = function (_chai, util) {
|
6650 | var AssertionError = _chai.AssertionError, flag = util.flag;
|
6651 | _chai.Assertion = Assertion;
|
6652 | function Assertion(obj, msg, ssfi, lockSsfi) {
|
6653 | flag(this, 'ssfi', ssfi || Assertion);
|
6654 | flag(this, 'lockSsfi', lockSsfi);
|
6655 | flag(this, 'object', obj);
|
6656 | flag(this, 'message', msg);
|
6657 | return util.proxify(this);
|
6658 | }
|
6659 | Object.defineProperty(Assertion, 'includeStack', {
|
6660 | get: function () {
|
6661 | console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');
|
6662 | return config.includeStack;
|
6663 | },
|
6664 | set: function (value) {
|
6665 | console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.');
|
6666 | config.includeStack = value;
|
6667 | }
|
6668 | });
|
6669 | Object.defineProperty(Assertion, 'showDiff', {
|
6670 | get: function () {
|
6671 | console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');
|
6672 | return config.showDiff;
|
6673 | },
|
6674 | set: function (value) {
|
6675 | console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.');
|
6676 | config.showDiff = value;
|
6677 | }
|
6678 | });
|
6679 | Assertion.addProperty = function (name, fn) {
|
6680 | util.addProperty(this.prototype, name, fn);
|
6681 | };
|
6682 | Assertion.addMethod = function (name, fn) {
|
6683 | util.addMethod(this.prototype, name, fn);
|
6684 | };
|
6685 | Assertion.addChainableMethod = function (name, fn, chainingBehavior) {
|
6686 | util.addChainableMethod(this.prototype, name, fn, chainingBehavior);
|
6687 | };
|
6688 | Assertion.overwriteProperty = function (name, fn) {
|
6689 | util.overwriteProperty(this.prototype, name, fn);
|
6690 | };
|
6691 | Assertion.overwriteMethod = function (name, fn) {
|
6692 | util.overwriteMethod(this.prototype, name, fn);
|
6693 | };
|
6694 | Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) {
|
6695 | util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior);
|
6696 | };
|
6697 | Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) {
|
6698 | var ok = util.test(this, arguments);
|
6699 | if (false !== showDiff) showDiff = true;
|
6700 | if (undefined === expected && undefined === _actual) showDiff = false;
|
6701 | if (true !== config.showDiff) showDiff = false;
|
6702 | if (!ok) {
|
6703 | msg = util.getMessage(this, arguments);
|
6704 | var actual = util.getActual(this, arguments);
|
6705 | throw new AssertionError(msg, {
|
6706 | actual: actual,
|
6707 | expected: expected,
|
6708 | showDiff: showDiff
|
6709 | }, ((config.includeStack)) ? this.assert : flag(this, 'ssfi'));
|
6710 | }
|
6711 | };
|
6712 | Object.defineProperty(Assertion.prototype, '_obj', {
|
6713 | get: function () {
|
6714 | return flag(this, 'object');
|
6715 | },
|
6716 | set: function (val) {
|
6717 | flag(this, 'object', val);
|
6718 | }
|
6719 | });
|
6720 | };
|
6721 | return module.exports;
|
6722 | },
|
6723 | "node_modules/chai/lib/chai/core/assertions.js": function (require, module, exports) {
|
6724 | module.exports = function (chai, _) {
|
6725 | var Assertion = chai.Assertion, AssertionError = chai.AssertionError, flag = _.flag;
|
6726 | ['to', 'be', 'been', 'is', 'and', 'has', 'have', 'with', 'that', 'which', 'at', 'of', 'same', 'but', 'does'].forEach(function (chain) {
|
6727 | Assertion.addProperty(chain);
|
6728 | });
|
6729 | Assertion.addProperty('not', function () {
|
6730 | flag(this, 'negate', true);
|
6731 | });
|
6732 | Assertion.addProperty('deep', function () {
|
6733 | flag(this, 'deep', true);
|
6734 | });
|
6735 | Assertion.addProperty('nested', function () {
|
6736 | flag(this, 'nested', true);
|
6737 | });
|
6738 | Assertion.addProperty('own', function () {
|
6739 | flag(this, 'own', true);
|
6740 | });
|
6741 | Assertion.addProperty('ordered', function () {
|
6742 | flag(this, 'ordered', true);
|
6743 | });
|
6744 | Assertion.addProperty('any', function () {
|
6745 | flag(this, 'any', true);
|
6746 | flag(this, 'all', false);
|
6747 | });
|
6748 | Assertion.addProperty('all', function () {
|
6749 | flag(this, 'all', true);
|
6750 | flag(this, 'any', false);
|
6751 | });
|
6752 | function an(type, msg) {
|
6753 | if (msg) flag(this, 'message', msg);
|
6754 | type = type.toLowerCase();
|
6755 | var obj = flag(this, 'object'), article = ~['a', 'e', 'i', 'o', 'u'].indexOf(type.charAt(0)) ? 'an ' : 'a ';
|
6756 | this.assert(type === _.type(obj).toLowerCase(), 'expected #{this} to be ' + article + type, 'expected #{this} not to be ' + article + type);
|
6757 | }
|
6758 | Assertion.addChainableMethod('an', an);
|
6759 | Assertion.addChainableMethod('a', an);
|
6760 | function SameValueZero(a, b) {
|
6761 | return (_.isNaN(a) && _.isNaN(b)) || a === b;
|
6762 | }
|
6763 | function includeChainingBehavior() {
|
6764 | flag(this, 'contains', true);
|
6765 | }
|
6766 | function include(val, msg) {
|
6767 | if (msg) flag(this, 'message', msg);
|
6768 | var obj = flag(this, 'object'), objType = _.type(obj).toLowerCase(), flagMsg = flag(this, 'message'), negate = flag(this, 'negate'), ssfi = flag(this, 'ssfi'), isDeep = flag(this, 'deep'), descriptor = isDeep ? 'deep ' : '';
|
6769 | flagMsg = flagMsg ? flagMsg + ': ' : '';
|
6770 | var included = false;
|
6771 | switch (objType) {
|
6772 | case 'string':
|
6773 | included = obj.indexOf(val) !== -1;
|
6774 | break;
|
6775 | case 'weakset':
|
6776 | if (isDeep) {
|
6777 | throw new AssertionError(flagMsg + 'unable to use .deep.include with WeakSet', undefined, ssfi);
|
6778 | }
|
6779 | included = obj.has(val);
|
6780 | break;
|
6781 | case 'map':
|
6782 | var isEql = isDeep ? _.eql : SameValueZero;
|
6783 | obj.forEach(function (item) {
|
6784 | included = included || isEql(item, val);
|
6785 | });
|
6786 | break;
|
6787 | case 'set':
|
6788 | if (isDeep) {
|
6789 | obj.forEach(function (item) {
|
6790 | included = included || _.eql(item, val);
|
6791 | });
|
6792 | } else {
|
6793 | included = obj.has(val);
|
6794 | }
|
6795 | break;
|
6796 | case 'array':
|
6797 | if (isDeep) {
|
6798 | included = obj.some(function (item) {
|
6799 | return _.eql(item, val);
|
6800 | });
|
6801 | } else {
|
6802 | included = obj.indexOf(val) !== -1;
|
6803 | }
|
6804 | break;
|
6805 | default:
|
6806 | if (val !== Object(val)) {
|
6807 | throw new AssertionError(flagMsg + 'object tested must be an array, a map, an object,' + ' a set, a string, or a weakset, but ' + objType + ' given', undefined, ssfi);
|
6808 | }
|
6809 | var props = Object.keys(val), firstErr = null, numErrs = 0;
|
6810 | props.forEach(function (prop) {
|
6811 | var propAssertion = new Assertion(obj);
|
6812 | _.transferFlags(this, propAssertion, true);
|
6813 | flag(propAssertion, 'lockSsfi', true);
|
6814 | if (!negate || props.length === 1) {
|
6815 | propAssertion.property(prop, val[prop]);
|
6816 | return;
|
6817 | }
|
6818 | try {
|
6819 | propAssertion.property(prop, val[prop]);
|
6820 | } catch (err) {
|
6821 | if (!_.checkError.compatibleConstructor(err, AssertionError)) {
|
6822 | throw err;
|
6823 | }
|
6824 | if (firstErr === null) firstErr = err;
|
6825 | numErrs++;
|
6826 | }
|
6827 | }, this);
|
6828 | if (negate && props.length > 1 && numErrs === props.length) {
|
6829 | throw firstErr;
|
6830 | }
|
6831 | return;
|
6832 | }
|
6833 | this.assert(included, 'expected #{this} to ' + descriptor + 'include ' + _.inspect(val), 'expected #{this} to not ' + descriptor + 'include ' + _.inspect(val));
|
6834 | }
|
6835 | Assertion.addChainableMethod('include', include, includeChainingBehavior);
|
6836 | Assertion.addChainableMethod('contain', include, includeChainingBehavior);
|
6837 | Assertion.addChainableMethod('contains', include, includeChainingBehavior);
|
6838 | Assertion.addChainableMethod('includes', include, includeChainingBehavior);
|
6839 | Assertion.addProperty('ok', function () {
|
6840 | this.assert(flag(this, 'object'), 'expected #{this} to be truthy', 'expected #{this} to be falsy');
|
6841 | });
|
6842 | Assertion.addProperty('true', function () {
|
6843 | this.assert(true === flag(this, 'object'), 'expected #{this} to be true', 'expected #{this} to be false', flag(this, 'negate') ? false : true);
|
6844 | });
|
6845 | Assertion.addProperty('false', function () {
|
6846 | this.assert(false === flag(this, 'object'), 'expected #{this} to be false', 'expected #{this} to be true', flag(this, 'negate') ? true : false);
|
6847 | });
|
6848 | Assertion.addProperty('null', function () {
|
6849 | this.assert(null === flag(this, 'object'), 'expected #{this} to be null', 'expected #{this} not to be null');
|
6850 | });
|
6851 | Assertion.addProperty('undefined', function () {
|
6852 | this.assert(undefined === flag(this, 'object'), 'expected #{this} to be undefined', 'expected #{this} not to be undefined');
|
6853 | });
|
6854 | Assertion.addProperty('NaN', function () {
|
6855 | this.assert(_.isNaN(flag(this, 'object')), 'expected #{this} to be NaN', 'expected #{this} not to be NaN');
|
6856 | });
|
6857 | Assertion.addProperty('exist', function () {
|
6858 | var val = flag(this, 'object');
|
6859 | this.assert(val !== null && val !== undefined, 'expected #{this} to exist', 'expected #{this} to not exist');
|
6860 | });
|
6861 | Assertion.addProperty('empty', function () {
|
6862 | var val = flag(this, 'object'), ssfi = flag(this, 'ssfi'), flagMsg = flag(this, 'message'), itemsCount;
|
6863 | flagMsg = flagMsg ? flagMsg + ': ' : '';
|
6864 | switch (_.type(val).toLowerCase()) {
|
6865 | case 'array':
|
6866 | case 'string':
|
6867 | itemsCount = val.length;
|
6868 | break;
|
6869 | case 'map':
|
6870 | case 'set':
|
6871 | itemsCount = val.size;
|
6872 | break;
|
6873 | case 'weakmap':
|
6874 | case 'weakset':
|
6875 | throw new AssertionError(flagMsg + '.empty was passed a weak collection', undefined, ssfi);
|
6876 | case 'function':
|
6877 | var msg = flagMsg + '.empty was passed a function ' + _.getName(val);
|
6878 | throw new AssertionError(msg.trim(), undefined, ssfi);
|
6879 | default:
|
6880 | if (val !== Object(val)) {
|
6881 | throw new AssertionError(flagMsg + '.empty was passed non-string primitive ' + _.inspect(val), undefined, ssfi);
|
6882 | }
|
6883 | itemsCount = Object.keys(val).length;
|
6884 | }
|
6885 | this.assert(0 === itemsCount, 'expected #{this} to be empty', 'expected #{this} not to be empty');
|
6886 | });
|
6887 | function checkArguments() {
|
6888 | var obj = flag(this, 'object'), type = _.type(obj);
|
6889 | this.assert('Arguments' === type, 'expected #{this} to be arguments but got ' + type, 'expected #{this} to not be arguments');
|
6890 | }
|
6891 | Assertion.addProperty('arguments', checkArguments);
|
6892 | Assertion.addProperty('Arguments', checkArguments);
|
6893 | function assertEqual(val, msg) {
|
6894 | if (msg) flag(this, 'message', msg);
|
6895 | var obj = flag(this, 'object');
|
6896 | if (flag(this, 'deep')) {
|
6897 | return this.eql(val);
|
6898 | } else {
|
6899 | this.assert(val === obj, 'expected #{this} to equal #{exp}', 'expected #{this} to not equal #{exp}', val, this._obj, true);
|
6900 | }
|
6901 | }
|
6902 | Assertion.addMethod('equal', assertEqual);
|
6903 | Assertion.addMethod('equals', assertEqual);
|
6904 | Assertion.addMethod('eq', assertEqual);
|
6905 | function assertEql(obj, msg) {
|
6906 | if (msg) flag(this, 'message', msg);
|
6907 | this.assert(_.eql(obj, flag(this, 'object')), 'expected #{this} to deeply equal #{exp}', 'expected #{this} to not deeply equal #{exp}', obj, this._obj, true);
|
6908 | }
|
6909 | Assertion.addMethod('eql', assertEql);
|
6910 | Assertion.addMethod('eqls', assertEql);
|
6911 | function assertAbove(n, msg) {
|
6912 | if (msg) flag(this, 'message', msg);
|
6913 | var obj = flag(this, 'object'), doLength = flag(this, 'doLength'), flagMsg = flag(this, 'message'), msgPrefix = (((flagMsg)) ? flagMsg + ': ' : ''), ssfi = flag(this, 'ssfi'), objType = _.type(obj).toLowerCase(), nType = _.type(n).toLowerCase(), shouldThrow = true;
|
6914 | if (doLength) {
|
6915 | new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
|
6916 | }
|
6917 | if (!doLength && (objType === 'date' && nType !== 'date')) {
|
6918 | errorMessage = msgPrefix + 'the argument to above must be a date';
|
6919 | } else if (nType !== 'number' && (doLength || objType === 'number')) {
|
6920 | errorMessage = msgPrefix + 'the argument to above must be a number';
|
6921 | } else if (!doLength && (objType !== 'date' && objType !== 'number')) {
|
6922 | var printObj = ((objType === 'string')) ? "'" + obj + "'" : obj;
|
6923 | errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';
|
6924 | } else {
|
6925 | shouldThrow = false;
|
6926 | }
|
6927 | if (shouldThrow) {
|
6928 | throw new AssertionError(errorMessage, undefined, ssfi);
|
6929 | }
|
6930 | if (doLength) {
|
6931 | var len = obj.length;
|
6932 | this.assert(len > n, 'expected #{this} to have a length above #{exp} but got #{act}', 'expected #{this} to not have a length above #{exp}', n, len);
|
6933 | } else {
|
6934 | this.assert(obj > n, 'expected #{this} to be above #{exp}', 'expected #{this} to be at most #{exp}', n);
|
6935 | }
|
6936 | }
|
6937 | Assertion.addMethod('above', assertAbove);
|
6938 | Assertion.addMethod('gt', assertAbove);
|
6939 | Assertion.addMethod('greaterThan', assertAbove);
|
6940 | function assertLeast(n, msg) {
|
6941 | if (msg) flag(this, 'message', msg);
|
6942 | var obj = flag(this, 'object'), doLength = flag(this, 'doLength'), flagMsg = flag(this, 'message'), msgPrefix = (((flagMsg)) ? flagMsg + ': ' : ''), ssfi = flag(this, 'ssfi'), objType = _.type(obj).toLowerCase(), nType = _.type(n).toLowerCase(), shouldThrow = true;
|
6943 | if (doLength) {
|
6944 | new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
|
6945 | }
|
6946 | if (!doLength && (objType === 'date' && nType !== 'date')) {
|
6947 | errorMessage = msgPrefix + 'the argument to least must be a date';
|
6948 | } else if (nType !== 'number' && (doLength || objType === 'number')) {
|
6949 | errorMessage = msgPrefix + 'the argument to least must be a number';
|
6950 | } else if (!doLength && (objType !== 'date' && objType !== 'number')) {
|
6951 | var printObj = ((objType === 'string')) ? "'" + obj + "'" : obj;
|
6952 | errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';
|
6953 | } else {
|
6954 | shouldThrow = false;
|
6955 | }
|
6956 | if (shouldThrow) {
|
6957 | throw new AssertionError(errorMessage, undefined, ssfi);
|
6958 | }
|
6959 | if (doLength) {
|
6960 | var len = obj.length;
|
6961 | this.assert(len >= n, 'expected #{this} to have a length at least #{exp} but got #{act}', 'expected #{this} to have a length below #{exp}', n, len);
|
6962 | } else {
|
6963 | this.assert(obj >= n, 'expected #{this} to be at least #{exp}', 'expected #{this} to be below #{exp}', n);
|
6964 | }
|
6965 | }
|
6966 | Assertion.addMethod('least', assertLeast);
|
6967 | Assertion.addMethod('gte', assertLeast);
|
6968 | function assertBelow(n, msg) {
|
6969 | if (msg) flag(this, 'message', msg);
|
6970 | var obj = flag(this, 'object'), doLength = flag(this, 'doLength'), flagMsg = flag(this, 'message'), msgPrefix = (((flagMsg)) ? flagMsg + ': ' : ''), ssfi = flag(this, 'ssfi'), objType = _.type(obj).toLowerCase(), nType = _.type(n).toLowerCase(), shouldThrow = true;
|
6971 | if (doLength) {
|
6972 | new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
|
6973 | }
|
6974 | if (!doLength && (objType === 'date' && nType !== 'date')) {
|
6975 | errorMessage = msgPrefix + 'the argument to below must be a date';
|
6976 | } else if (nType !== 'number' && (doLength || objType === 'number')) {
|
6977 | errorMessage = msgPrefix + 'the argument to below must be a number';
|
6978 | } else if (!doLength && (objType !== 'date' && objType !== 'number')) {
|
6979 | var printObj = ((objType === 'string')) ? "'" + obj + "'" : obj;
|
6980 | errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';
|
6981 | } else {
|
6982 | shouldThrow = false;
|
6983 | }
|
6984 | if (shouldThrow) {
|
6985 | throw new AssertionError(errorMessage, undefined, ssfi);
|
6986 | }
|
6987 | if (doLength) {
|
6988 | var len = obj.length;
|
6989 | this.assert(len < n, 'expected #{this} to have a length below #{exp} but got #{act}', 'expected #{this} to not have a length below #{exp}', n, len);
|
6990 | } else {
|
6991 | this.assert(obj < n, 'expected #{this} to be below #{exp}', 'expected #{this} to be at least #{exp}', n);
|
6992 | }
|
6993 | }
|
6994 | Assertion.addMethod('below', assertBelow);
|
6995 | Assertion.addMethod('lt', assertBelow);
|
6996 | Assertion.addMethod('lessThan', assertBelow);
|
6997 | function assertMost(n, msg) {
|
6998 | if (msg) flag(this, 'message', msg);
|
6999 | var obj = flag(this, 'object'), doLength = flag(this, 'doLength'), flagMsg = flag(this, 'message'), msgPrefix = (((flagMsg)) ? flagMsg + ': ' : ''), ssfi = flag(this, 'ssfi'), objType = _.type(obj).toLowerCase(), nType = _.type(n).toLowerCase(), shouldThrow = true;
|
7000 | if (doLength) {
|
7001 | new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
|
7002 | }
|
7003 | if (!doLength && (objType === 'date' && nType !== 'date')) {
|
7004 | errorMessage = msgPrefix + 'the argument to most must be a date';
|
7005 | } else if (nType !== 'number' && (doLength || objType === 'number')) {
|
7006 | errorMessage = msgPrefix + 'the argument to most must be a number';
|
7007 | } else if (!doLength && (objType !== 'date' && objType !== 'number')) {
|
7008 | var printObj = ((objType === 'string')) ? "'" + obj + "'" : obj;
|
7009 | errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';
|
7010 | } else {
|
7011 | shouldThrow = false;
|
7012 | }
|
7013 | if (shouldThrow) {
|
7014 | throw new AssertionError(errorMessage, undefined, ssfi);
|
7015 | }
|
7016 | if (doLength) {
|
7017 | var len = obj.length;
|
7018 | this.assert(len <= n, 'expected #{this} to have a length at most #{exp} but got #{act}', 'expected #{this} to have a length above #{exp}', n, len);
|
7019 | } else {
|
7020 | this.assert(obj <= n, 'expected #{this} to be at most #{exp}', 'expected #{this} to be above #{exp}', n);
|
7021 | }
|
7022 | }
|
7023 | Assertion.addMethod('most', assertMost);
|
7024 | Assertion.addMethod('lte', assertMost);
|
7025 | Assertion.addMethod('within', function (start, finish, msg) {
|
7026 | if (msg) flag(this, 'message', msg);
|
7027 | var obj = flag(this, 'object'), doLength = flag(this, 'doLength'), flagMsg = flag(this, 'message'), msgPrefix = (((flagMsg)) ? flagMsg + ': ' : ''), ssfi = flag(this, 'ssfi'), objType = _.type(obj).toLowerCase(), startType = _.type(start).toLowerCase(), finishType = _.type(finish).toLowerCase(), shouldThrow = true, range = ((startType === 'date' && finishType === 'date')) ? start.toUTCString() + '..' + finish.toUTCString() : start + '..' + finish;
|
7028 | if (doLength) {
|
7029 | new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
|
7030 | }
|
7031 | if (!doLength && (objType === 'date' && (startType !== 'date' || finishType !== 'date'))) {
|
7032 | errorMessage = msgPrefix + 'the arguments to within must be dates';
|
7033 | } else if ((startType !== 'number' || finishType !== 'number') && (doLength || objType === 'number')) {
|
7034 | errorMessage = msgPrefix + 'the arguments to within must be numbers';
|
7035 | } else if (!doLength && (objType !== 'date' && objType !== 'number')) {
|
7036 | var printObj = ((objType === 'string')) ? "'" + obj + "'" : obj;
|
7037 | errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date';
|
7038 | } else {
|
7039 | shouldThrow = false;
|
7040 | }
|
7041 | if (shouldThrow) {
|
7042 | throw new AssertionError(errorMessage, undefined, ssfi);
|
7043 | }
|
7044 | if (doLength) {
|
7045 | var len = obj.length;
|
7046 | this.assert(len >= start && len <= finish, 'expected #{this} to have a length within ' + range, 'expected #{this} to not have a length within ' + range);
|
7047 | } else {
|
7048 | this.assert(obj >= start && obj <= finish, 'expected #{this} to be within ' + range, 'expected #{this} to not be within ' + range);
|
7049 | }
|
7050 | });
|
7051 | function assertInstanceOf(constructor, msg) {
|
7052 | if (msg) flag(this, 'message', msg);
|
7053 | var target = flag(this, 'object');
|
7054 | var ssfi = flag(this, 'ssfi');
|
7055 | var flagMsg = flag(this, 'message');
|
7056 | try {
|
7057 | var isInstanceOf = target instanceof constructor;
|
7058 | } catch (err) {
|
7059 | if (err instanceof TypeError) {
|
7060 | flagMsg = flagMsg ? flagMsg + ': ' : '';
|
7061 | throw new AssertionError(flagMsg + 'The instanceof assertion needs a constructor but ' + _.type(constructor) + ' was given.', undefined, ssfi);
|
7062 | }
|
7063 | throw err;
|
7064 | }
|
7065 | var name = _.getName(constructor);
|
7066 | if (name === null) {
|
7067 | name = 'an unnamed constructor';
|
7068 | }
|
7069 | this.assert(isInstanceOf, 'expected #{this} to be an instance of ' + name, 'expected #{this} to not be an instance of ' + name);
|
7070 | }
|
7071 | ;
|
7072 | Assertion.addMethod('instanceof', assertInstanceOf);
|
7073 | Assertion.addMethod('instanceOf', assertInstanceOf);
|
7074 | function assertProperty(name, val, msg) {
|
7075 | if (msg) flag(this, 'message', msg);
|
7076 | var isNested = flag(this, 'nested'), isOwn = flag(this, 'own'), flagMsg = flag(this, 'message'), obj = flag(this, 'object'), ssfi = flag(this, 'ssfi');
|
7077 | if (isNested && isOwn) {
|
7078 | flagMsg = flagMsg ? flagMsg + ': ' : '';
|
7079 | throw new AssertionError(flagMsg + 'The "nested" and "own" flags cannot be combined.', undefined, ssfi);
|
7080 | }
|
7081 | if (obj === null || obj === undefined) {
|
7082 | flagMsg = flagMsg ? flagMsg + ': ' : '';
|
7083 | throw new AssertionError(flagMsg + 'Target cannot be null or undefined.', undefined, ssfi);
|
7084 | }
|
7085 | var isDeep = flag(this, 'deep'), negate = flag(this, 'negate'), pathInfo = isNested ? _.getPathInfo(obj, name) : null, value = isNested ? pathInfo.value : obj[name];
|
7086 | var descriptor = '';
|
7087 | if (isDeep) descriptor += 'deep ';
|
7088 | if (isOwn) descriptor += 'own ';
|
7089 | if (isNested) descriptor += 'nested ';
|
7090 | descriptor += 'property ';
|
7091 | var hasProperty;
|
7092 | if (isOwn) hasProperty = Object.prototype.hasOwnProperty.call(obj, name); else if (isNested) hasProperty = pathInfo.exists; else hasProperty = _.hasProperty(obj, name);
|
7093 | if (!negate || arguments.length === 1) {
|
7094 | this.assert(hasProperty, 'expected #{this} to have ' + descriptor + _.inspect(name), 'expected #{this} to not have ' + descriptor + _.inspect(name));
|
7095 | }
|
7096 | if (arguments.length > 1) {
|
7097 | this.assert(hasProperty && (isDeep ? _.eql(val, value) : val === value), 'expected #{this} to have ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}', 'expected #{this} to not have ' + descriptor + _.inspect(name) + ' of #{act}', val, value);
|
7098 | }
|
7099 | flag(this, 'object', value);
|
7100 | }
|
7101 | Assertion.addMethod('property', assertProperty);
|
7102 | function assertOwnProperty(name, value, msg) {
|
7103 | flag(this, 'own', true);
|
7104 | assertProperty.apply(this, arguments);
|
7105 | }
|
7106 | Assertion.addMethod('ownProperty', assertOwnProperty);
|
7107 | Assertion.addMethod('haveOwnProperty', assertOwnProperty);
|
7108 | function assertOwnPropertyDescriptor(name, descriptor, msg) {
|
7109 | if (typeof descriptor === 'string') {
|
7110 | msg = descriptor;
|
7111 | descriptor = null;
|
7112 | }
|
7113 | if (msg) flag(this, 'message', msg);
|
7114 | var obj = flag(this, 'object');
|
7115 | var actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name);
|
7116 | if (actualDescriptor && descriptor) {
|
7117 | this.assert(_.eql(descriptor, actualDescriptor), 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to match ' + _.inspect(descriptor) + ', got ' + _.inspect(actualDescriptor), 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to not match ' + _.inspect(descriptor), descriptor, actualDescriptor, true);
|
7118 | } else {
|
7119 | this.assert(actualDescriptor, 'expected #{this} to have an own property descriptor for ' + _.inspect(name), 'expected #{this} to not have an own property descriptor for ' + _.inspect(name));
|
7120 | }
|
7121 | flag(this, 'object', actualDescriptor);
|
7122 | }
|
7123 | Assertion.addMethod('ownPropertyDescriptor', assertOwnPropertyDescriptor);
|
7124 | Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor);
|
7125 | function assertLengthChain() {
|
7126 | flag(this, 'doLength', true);
|
7127 | }
|
7128 | function assertLength(n, msg) {
|
7129 | if (msg) flag(this, 'message', msg);
|
7130 | var obj = flag(this, 'object'), flagMsg = flag(this, 'message'), ssfi = flag(this, 'ssfi');
|
7131 | new Assertion(obj, flagMsg, ssfi, true).to.have.property('length');
|
7132 | var len = obj.length;
|
7133 | this.assert(len == n, 'expected #{this} to have a length of #{exp} but got #{act}', 'expected #{this} to not have a length of #{act}', n, len);
|
7134 | }
|
7135 | Assertion.addChainableMethod('length', assertLength, assertLengthChain);
|
7136 | Assertion.addChainableMethod('lengthOf', assertLength, assertLengthChain);
|
7137 | function assertMatch(re, msg) {
|
7138 | if (msg) flag(this, 'message', msg);
|
7139 | var obj = flag(this, 'object');
|
7140 | this.assert(re.exec(obj), 'expected #{this} to match ' + re, 'expected #{this} not to match ' + re);
|
7141 | }
|
7142 | Assertion.addMethod('match', assertMatch);
|
7143 | Assertion.addMethod('matches', assertMatch);
|
7144 | Assertion.addMethod('string', function (str, msg) {
|
7145 | if (msg) flag(this, 'message', msg);
|
7146 | var obj = flag(this, 'object'), flagMsg = flag(this, 'message'), ssfi = flag(this, 'ssfi');
|
7147 | new Assertion(obj, flagMsg, ssfi, true).is.a('string');
|
7148 | this.assert(~obj.indexOf(str), 'expected #{this} to contain ' + _.inspect(str), 'expected #{this} to not contain ' + _.inspect(str));
|
7149 | });
|
7150 | function assertKeys(keys) {
|
7151 | var obj = flag(this, 'object'), objType = _.type(obj), keysType = _.type(keys), ssfi = flag(this, 'ssfi'), isDeep = flag(this, 'deep'), str, deepStr = '', ok = true, flagMsg = flag(this, 'message');
|
7152 | flagMsg = flagMsg ? flagMsg + ': ' : '';
|
7153 | var mixedArgsMsg = flagMsg + 'when testing keys against an object or an array you must give a single Array|Object|String argument or multiple String arguments';
|
7154 | if (objType === 'Map' || objType === 'Set') {
|
7155 | deepStr = isDeep ? 'deeply ' : '';
|
7156 | actual = [];
|
7157 | obj.forEach(function (val, key) {
|
7158 | actual.push(key);
|
7159 | });
|
7160 | if (keysType !== 'Array') {
|
7161 | keys = Array.prototype.slice.call(arguments);
|
7162 | }
|
7163 | } else {
|
7164 | actual = _.getOwnEnumerableProperties(obj);
|
7165 | switch (keysType) {
|
7166 | case 'Array':
|
7167 | if (arguments.length > 1) {
|
7168 | throw new AssertionError(mixedArgsMsg, undefined, ssfi);
|
7169 | }
|
7170 | break;
|
7171 | case 'Object':
|
7172 | if (arguments.length > 1) {
|
7173 | throw new AssertionError(mixedArgsMsg, undefined, ssfi);
|
7174 | }
|
7175 | keys = Object.keys(keys);
|
7176 | break;
|
7177 | default:
|
7178 | keys = Array.prototype.slice.call(arguments);
|
7179 | }
|
7180 | keys = keys.map(function (val) {
|
7181 | return typeof val === 'symbol' ? val : String(val);
|
7182 | });
|
7183 | }
|
7184 | if (!keys.length) {
|
7185 | throw new AssertionError(flagMsg + 'keys required', undefined, ssfi);
|
7186 | }
|
7187 | var len = keys.length, any = flag(this, 'any'), all = flag(this, 'all'), expected = keys, actual;
|
7188 | if (!any && !all) {
|
7189 | all = true;
|
7190 | }
|
7191 | if (any) {
|
7192 | ok = expected.some(function (expectedKey) {
|
7193 | return actual.some(function (actualKey) {
|
7194 | if (isDeep) {
|
7195 | return _.eql(expectedKey, actualKey);
|
7196 | } else {
|
7197 | return expectedKey === actualKey;
|
7198 | }
|
7199 | });
|
7200 | });
|
7201 | }
|
7202 | if (all) {
|
7203 | ok = expected.every(function (expectedKey) {
|
7204 | return actual.some(function (actualKey) {
|
7205 | if (isDeep) {
|
7206 | return _.eql(expectedKey, actualKey);
|
7207 | } else {
|
7208 | return expectedKey === actualKey;
|
7209 | }
|
7210 | });
|
7211 | });
|
7212 | if (!flag(this, 'contains')) {
|
7213 | ok = ok && keys.length == actual.length;
|
7214 | }
|
7215 | }
|
7216 | if (len > 1) {
|
7217 | keys = keys.map(function (key) {
|
7218 | return _.inspect(key);
|
7219 | });
|
7220 | var last = keys.pop();
|
7221 | if (all) {
|
7222 | str = keys.join(', ') + ', and ' + last;
|
7223 | }
|
7224 | if (any) {
|
7225 | str = keys.join(', ') + ', or ' + last;
|
7226 | }
|
7227 | } else {
|
7228 | str = _.inspect(keys[0]);
|
7229 | }
|
7230 | str = (len > 1 ? 'keys ' : 'key ') + str;
|
7231 | str = (flag(this, 'contains') ? 'contain ' : 'have ') + str;
|
7232 | this.assert(ok, 'expected #{this} to ' + deepStr + str, 'expected #{this} to not ' + deepStr + str, expected.slice(0).sort(_.compareByInspect), actual.sort(_.compareByInspect), true);
|
7233 | }
|
7234 | Assertion.addMethod('keys', assertKeys);
|
7235 | Assertion.addMethod('key', assertKeys);
|
7236 | function assertThrows(errorLike, errMsgMatcher, msg) {
|
7237 | if (msg) flag(this, 'message', msg);
|
7238 | var obj = flag(this, 'object'), ssfi = flag(this, 'ssfi'), flagMsg = flag(this, 'message'), negate = flag(this, 'negate') || false;
|
7239 | new Assertion(obj, flagMsg, ssfi, true).is.a('function');
|
7240 | if (errorLike instanceof RegExp || typeof errorLike === 'string') {
|
7241 | errMsgMatcher = errorLike;
|
7242 | errorLike = null;
|
7243 | }
|
7244 | var caughtErr;
|
7245 | try {
|
7246 | obj();
|
7247 | } catch (err) {
|
7248 | caughtErr = err;
|
7249 | }
|
7250 | var everyArgIsUndefined = errorLike === undefined && errMsgMatcher === undefined;
|
7251 | var everyArgIsDefined = Boolean(errorLike && errMsgMatcher);
|
7252 | var errorLikeFail = false;
|
7253 | var errMsgMatcherFail = false;
|
7254 | if (everyArgIsUndefined || !everyArgIsUndefined && !negate) {
|
7255 | var errorLikeString = 'an error';
|
7256 | if (errorLike instanceof Error) {
|
7257 | errorLikeString = '#{exp}';
|
7258 | } else if (errorLike) {
|
7259 | errorLikeString = _.checkError.getConstructorName(errorLike);
|
7260 | }
|
7261 | this.assert(caughtErr, 'expected #{this} to throw ' + errorLikeString, 'expected #{this} to not throw an error but #{act} was thrown', errorLike && errorLike.toString(), (caughtErr instanceof Error ? caughtErr.toString() : (typeof caughtErr === 'string' ? caughtErr : caughtErr && _.checkError.getConstructorName(caughtErr))));
|
7262 | }
|
7263 | if (errorLike && caughtErr) {
|
7264 | if (errorLike instanceof Error) {
|
7265 | var isCompatibleInstance = _.checkError.compatibleInstance(caughtErr, errorLike);
|
7266 | if (isCompatibleInstance === negate) {
|
7267 | if (everyArgIsDefined && negate) {
|
7268 | errorLikeFail = true;
|
7269 | } else {
|
7270 | this.assert(negate, 'expected #{this} to throw #{exp} but #{act} was thrown', 'expected #{this} to not throw #{exp}' + (caughtErr && !negate ? ' but #{act} was thrown' : ''), errorLike.toString(), caughtErr.toString());
|
7271 | }
|
7272 | }
|
7273 | }
|
7274 | var isCompatibleConstructor = _.checkError.compatibleConstructor(caughtErr, errorLike);
|
7275 | if (isCompatibleConstructor === negate) {
|
7276 | if (everyArgIsDefined && negate) {
|
7277 | errorLikeFail = true;
|
7278 | } else {
|
7279 | this.assert(negate, 'expected #{this} to throw #{exp} but #{act} was thrown', 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : ''), (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike)), (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr)));
|
7280 | }
|
7281 | }
|
7282 | }
|
7283 | if (caughtErr && errMsgMatcher !== undefined && errMsgMatcher !== null) {
|
7284 | var placeholder = 'including';
|
7285 | if (errMsgMatcher instanceof RegExp) {
|
7286 | placeholder = 'matching';
|
7287 | }
|
7288 | var isCompatibleMessage = _.checkError.compatibleMessage(caughtErr, errMsgMatcher);
|
7289 | if (isCompatibleMessage === negate) {
|
7290 | if (everyArgIsDefined && negate) {
|
7291 | errMsgMatcherFail = true;
|
7292 | } else {
|
7293 | this.assert(negate, 'expected #{this} to throw error ' + placeholder + ' #{exp} but got #{act}', 'expected #{this} to throw error not ' + placeholder + ' #{exp}', errMsgMatcher, _.checkError.getMessage(caughtErr));
|
7294 | }
|
7295 | }
|
7296 | }
|
7297 | if (errorLikeFail && errMsgMatcherFail) {
|
7298 | this.assert(negate, 'expected #{this} to throw #{exp} but #{act} was thrown', 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : ''), (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike)), (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr)));
|
7299 | }
|
7300 | flag(this, 'object', caughtErr);
|
7301 | }
|
7302 | ;
|
7303 | Assertion.addMethod('throw', assertThrows);
|
7304 | Assertion.addMethod('throws', assertThrows);
|
7305 | Assertion.addMethod('Throw', assertThrows);
|
7306 | function respondTo(method, msg) {
|
7307 | if (msg) flag(this, 'message', msg);
|
7308 | var obj = flag(this, 'object'), itself = flag(this, 'itself'), context = (('function' === typeof obj && !itself)) ? obj.prototype[method] : obj[method];
|
7309 | this.assert('function' === typeof context, 'expected #{this} to respond to ' + _.inspect(method), 'expected #{this} to not respond to ' + _.inspect(method));
|
7310 | }
|
7311 | Assertion.addMethod('respondTo', respondTo);
|
7312 | Assertion.addMethod('respondsTo', respondTo);
|
7313 | Assertion.addProperty('itself', function () {
|
7314 | flag(this, 'itself', true);
|
7315 | });
|
7316 | function satisfy(matcher, msg) {
|
7317 | if (msg) flag(this, 'message', msg);
|
7318 | var obj = flag(this, 'object');
|
7319 | var result = matcher(obj);
|
7320 | this.assert(result, 'expected #{this} to satisfy ' + _.objDisplay(matcher), 'expected #{this} to not satisfy' + _.objDisplay(matcher), flag(this, 'negate') ? false : true, result);
|
7321 | }
|
7322 | Assertion.addMethod('satisfy', satisfy);
|
7323 | Assertion.addMethod('satisfies', satisfy);
|
7324 | function closeTo(expected, delta, msg) {
|
7325 | if (msg) flag(this, 'message', msg);
|
7326 | var obj = flag(this, 'object'), flagMsg = flag(this, 'message'), ssfi = flag(this, 'ssfi');
|
7327 | new Assertion(obj, flagMsg, ssfi, true).is.a('number');
|
7328 | if (typeof expected !== 'number' || typeof delta !== 'number') {
|
7329 | flagMsg = flagMsg ? flagMsg + ': ' : '';
|
7330 | throw new AssertionError(flagMsg + 'the arguments to closeTo or approximately must be numbers', undefined, ssfi);
|
7331 | }
|
7332 | this.assert(Math.abs(obj - expected) <= delta, 'expected #{this} to be close to ' + expected + ' +/- ' + delta, 'expected #{this} not to be close to ' + expected + ' +/- ' + delta);
|
7333 | }
|
7334 | Assertion.addMethod('closeTo', closeTo);
|
7335 | Assertion.addMethod('approximately', closeTo);
|
7336 | function isSubsetOf(subset, superset, cmp, contains, ordered) {
|
7337 | if (!contains) {
|
7338 | if (subset.length !== superset.length) return false;
|
7339 | superset = superset.slice();
|
7340 | }
|
7341 | return subset.every(function (elem, idx) {
|
7342 | if (ordered) return cmp ? cmp(elem, superset[idx]) : elem === superset[idx];
|
7343 | if (!cmp) {
|
7344 | var matchIdx = superset.indexOf(elem);
|
7345 | if (matchIdx === -1) return false;
|
7346 | if (!contains) superset.splice(matchIdx, 1);
|
7347 | return true;
|
7348 | }
|
7349 | return superset.some(function (elem2, matchIdx) {
|
7350 | if (!cmp(elem, elem2)) return false;
|
7351 | if (!contains) superset.splice(matchIdx, 1);
|
7352 | return true;
|
7353 | });
|
7354 | });
|
7355 | }
|
7356 | Assertion.addMethod('members', function (subset, msg) {
|
7357 | if (msg) flag(this, 'message', msg);
|
7358 | var obj = flag(this, 'object'), flagMsg = flag(this, 'message'), ssfi = flag(this, 'ssfi');
|
7359 | new Assertion(obj, flagMsg, ssfi, true).to.be.an('array');
|
7360 | new Assertion(subset, flagMsg, ssfi, true).to.be.an('array');
|
7361 | var contains = flag(this, 'contains');
|
7362 | var ordered = flag(this, 'ordered');
|
7363 | var subject, failMsg, failNegateMsg, lengthCheck;
|
7364 | if (contains) {
|
7365 | subject = ordered ? 'an ordered superset' : 'a superset';
|
7366 | failMsg = 'expected #{this} to be ' + subject + ' of #{exp}';
|
7367 | failNegateMsg = 'expected #{this} to not be ' + subject + ' of #{exp}';
|
7368 | } else {
|
7369 | subject = ordered ? 'ordered members' : 'members';
|
7370 | failMsg = 'expected #{this} to have the same ' + subject + ' as #{exp}';
|
7371 | failNegateMsg = 'expected #{this} to not have the same ' + subject + ' as #{exp}';
|
7372 | }
|
7373 | var cmp = flag(this, 'deep') ? _.eql : undefined;
|
7374 | this.assert(isSubsetOf(subset, obj, cmp, contains, ordered), failMsg, failNegateMsg, subset, obj, true);
|
7375 | });
|
7376 | function oneOf(list, msg) {
|
7377 | if (msg) flag(this, 'message', msg);
|
7378 | var expected = flag(this, 'object'), flagMsg = flag(this, 'message'), ssfi = flag(this, 'ssfi');
|
7379 | new Assertion(list, flagMsg, ssfi, true).to.be.an('array');
|
7380 | this.assert(list.indexOf(expected) > -1, 'expected #{this} to be one of #{exp}', 'expected #{this} to not be one of #{exp}', list, expected);
|
7381 | }
|
7382 | Assertion.addMethod('oneOf', oneOf);
|
7383 | function assertChanges(subject, prop, msg) {
|
7384 | if (msg) flag(this, 'message', msg);
|
7385 | var fn = flag(this, 'object'), flagMsg = flag(this, 'message'), ssfi = flag(this, 'ssfi');
|
7386 | new Assertion(fn, flagMsg, ssfi, true).is.a('function');
|
7387 | var initial;
|
7388 | if (!prop) {
|
7389 | new Assertion(subject, flagMsg, ssfi, true).is.a('function');
|
7390 | initial = subject();
|
7391 | } else {
|
7392 | new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
|
7393 | initial = subject[prop];
|
7394 | }
|
7395 | fn();
|
7396 | var final = prop === undefined || prop === null ? subject() : subject[prop];
|
7397 | var msgObj = prop === undefined || prop === null ? initial : '.' + prop;
|
7398 | flag(this, 'deltaMsgObj', msgObj);
|
7399 | flag(this, 'initialDeltaValue', initial);
|
7400 | flag(this, 'finalDeltaValue', final);
|
7401 | flag(this, 'deltaBehavior', 'change');
|
7402 | flag(this, 'realDelta', final !== initial);
|
7403 | this.assert(initial !== final, 'expected ' + msgObj + ' to change', 'expected ' + msgObj + ' to not change');
|
7404 | }
|
7405 | Assertion.addMethod('change', assertChanges);
|
7406 | Assertion.addMethod('changes', assertChanges);
|
7407 | function assertIncreases(subject, prop, msg) {
|
7408 | if (msg) flag(this, 'message', msg);
|
7409 | var fn = flag(this, 'object'), flagMsg = flag(this, 'message'), ssfi = flag(this, 'ssfi');
|
7410 | new Assertion(fn, flagMsg, ssfi, true).is.a('function');
|
7411 | var initial;
|
7412 | if (!prop) {
|
7413 | new Assertion(subject, flagMsg, ssfi, true).is.a('function');
|
7414 | initial = subject();
|
7415 | } else {
|
7416 | new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
|
7417 | initial = subject[prop];
|
7418 | }
|
7419 | new Assertion(initial, flagMsg, ssfi, true).is.a('number');
|
7420 | fn();
|
7421 | var final = prop === undefined || prop === null ? subject() : subject[prop];
|
7422 | var msgObj = prop === undefined || prop === null ? initial : '.' + prop;
|
7423 | flag(this, 'deltaMsgObj', msgObj);
|
7424 | flag(this, 'initialDeltaValue', initial);
|
7425 | flag(this, 'finalDeltaValue', final);
|
7426 | flag(this, 'deltaBehavior', 'increase');
|
7427 | flag(this, 'realDelta', final - initial);
|
7428 | this.assert(final - initial > 0, 'expected ' + msgObj + ' to increase', 'expected ' + msgObj + ' to not increase');
|
7429 | }
|
7430 | Assertion.addMethod('increase', assertIncreases);
|
7431 | Assertion.addMethod('increases', assertIncreases);
|
7432 | function assertDecreases(subject, prop, msg) {
|
7433 | if (msg) flag(this, 'message', msg);
|
7434 | var fn = flag(this, 'object'), flagMsg = flag(this, 'message'), ssfi = flag(this, 'ssfi');
|
7435 | new Assertion(fn, flagMsg, ssfi, true).is.a('function');
|
7436 | var initial;
|
7437 | if (!prop) {
|
7438 | new Assertion(subject, flagMsg, ssfi, true).is.a('function');
|
7439 | initial = subject();
|
7440 | } else {
|
7441 | new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
|
7442 | initial = subject[prop];
|
7443 | }
|
7444 | new Assertion(initial, flagMsg, ssfi, true).is.a('number');
|
7445 | fn();
|
7446 | var final = prop === undefined || prop === null ? subject() : subject[prop];
|
7447 | var msgObj = prop === undefined || prop === null ? initial : '.' + prop;
|
7448 | flag(this, 'deltaMsgObj', msgObj);
|
7449 | flag(this, 'initialDeltaValue', initial);
|
7450 | flag(this, 'finalDeltaValue', final);
|
7451 | flag(this, 'deltaBehavior', 'decrease');
|
7452 | flag(this, 'realDelta', initial - final);
|
7453 | this.assert(final - initial < 0, 'expected ' + msgObj + ' to decrease', 'expected ' + msgObj + ' to not decrease');
|
7454 | }
|
7455 | Assertion.addMethod('decrease', assertDecreases);
|
7456 | Assertion.addMethod('decreases', assertDecreases);
|
7457 | function assertDelta(delta, msg) {
|
7458 | if (msg) flag(this, 'message', msg);
|
7459 | var msgObj = flag(this, 'deltaMsgObj');
|
7460 | var initial = flag(this, 'initialDeltaValue');
|
7461 | var final = flag(this, 'finalDeltaValue');
|
7462 | var behavior = flag(this, 'deltaBehavior');
|
7463 | var realDelta = flag(this, 'realDelta');
|
7464 | var expression;
|
7465 | if (behavior === 'change') {
|
7466 | expression = Math.abs(final - initial) === Math.abs(delta);
|
7467 | } else {
|
7468 | expression = realDelta === Math.abs(delta);
|
7469 | }
|
7470 | this.assert(expression, 'expected ' + msgObj + ' to ' + behavior + ' by ' + delta, 'expected ' + msgObj + ' to not ' + behavior + ' by ' + delta);
|
7471 | }
|
7472 | Assertion.addMethod('by', assertDelta);
|
7473 | Assertion.addProperty('extensible', function () {
|
7474 | var obj = flag(this, 'object');
|
7475 | var isExtensible = obj === Object(obj) && Object.isExtensible(obj);
|
7476 | this.assert(isExtensible, 'expected #{this} to be extensible', 'expected #{this} to not be extensible');
|
7477 | });
|
7478 | Assertion.addProperty('sealed', function () {
|
7479 | var obj = flag(this, 'object');
|
7480 | var isSealed = obj === Object(obj) ? Object.isSealed(obj) : true;
|
7481 | this.assert(isSealed, 'expected #{this} to be sealed', 'expected #{this} to not be sealed');
|
7482 | });
|
7483 | Assertion.addProperty('frozen', function () {
|
7484 | var obj = flag(this, 'object');
|
7485 | var isFrozen = obj === Object(obj) ? Object.isFrozen(obj) : true;
|
7486 | this.assert(isFrozen, 'expected #{this} to be frozen', 'expected #{this} to not be frozen');
|
7487 | });
|
7488 | Assertion.addProperty('finite', function (msg) {
|
7489 | var obj = flag(this, 'object');
|
7490 | this.assert(typeof obj === "number" && isFinite(obj), 'expected #{this} to be a finite number', 'expected #{this} to not be a finite number');
|
7491 | });
|
7492 | };
|
7493 | return module.exports;
|
7494 | },
|
7495 | "node_modules/chai/lib/chai/interface/expect.js": function (require, module, exports) {
|
7496 | module.exports = function (chai, util) {
|
7497 | chai.expect = function (val, message) {
|
7498 | return new chai.Assertion(val, message);
|
7499 | };
|
7500 | chai.expect.fail = function (actual, expected, message, operator) {
|
7501 | message = message || 'expect.fail()';
|
7502 | throw new chai.AssertionError(message, {
|
7503 | actual: actual,
|
7504 | expected: expected,
|
7505 | operator: operator
|
7506 | }, chai.expect.fail);
|
7507 | };
|
7508 | };
|
7509 | return module.exports;
|
7510 | },
|
7511 | "node_modules/chai/lib/chai/interface/should.js": function (require, module, exports) {
|
7512 | module.exports = function (chai, util) {
|
7513 | var Assertion = chai.Assertion;
|
7514 | function loadShould() {
|
7515 | function shouldGetter() {
|
7516 | if (this instanceof String || this instanceof Number || this instanceof Boolean || typeof Symbol === 'function' && this instanceof Symbol) {
|
7517 | return new Assertion(this.valueOf(), null, shouldGetter);
|
7518 | }
|
7519 | return new Assertion(this, null, shouldGetter);
|
7520 | }
|
7521 | function shouldSetter(value) {
|
7522 | Object.defineProperty(this, 'should', {
|
7523 | value: value,
|
7524 | enumerable: true,
|
7525 | configurable: true,
|
7526 | writable: true
|
7527 | });
|
7528 | }
|
7529 | Object.defineProperty(Object.prototype, 'should', {
|
7530 | set: shouldSetter,
|
7531 | get: shouldGetter,
|
7532 | configurable: true
|
7533 | });
|
7534 | var should = {};
|
7535 | should.fail = function (actual, expected, message, operator) {
|
7536 | message = message || 'should.fail()';
|
7537 | throw new chai.AssertionError(message, {
|
7538 | actual: actual,
|
7539 | expected: expected,
|
7540 | operator: operator
|
7541 | }, should.fail);
|
7542 | };
|
7543 | should.equal = function (val1, val2, msg) {
|
7544 | new Assertion(val1, msg).to.equal(val2);
|
7545 | };
|
7546 | should.Throw = function (fn, errt, errs, msg) {
|
7547 | new Assertion(fn, msg).to.Throw(errt, errs);
|
7548 | };
|
7549 | should.exist = function (val, msg) {
|
7550 | new Assertion(val, msg).to.exist;
|
7551 | };
|
7552 | should.not = {};
|
7553 | should.not.equal = function (val1, val2, msg) {
|
7554 | new Assertion(val1, msg).to.not.equal(val2);
|
7555 | };
|
7556 | should.not.Throw = function (fn, errt, errs, msg) {
|
7557 | new Assertion(fn, msg).to.not.Throw(errt, errs);
|
7558 | };
|
7559 | should.not.exist = function (val, msg) {
|
7560 | new Assertion(val, msg).to.not.exist;
|
7561 | };
|
7562 | should['throw'] = should['Throw'];
|
7563 | should.not['throw'] = should.not['Throw'];
|
7564 | return should;
|
7565 | }
|
7566 | ;
|
7567 | chai.should = loadShould;
|
7568 | chai.Should = loadShould;
|
7569 | };
|
7570 | return module.exports;
|
7571 | },
|
7572 | "node_modules/chai/lib/chai/interface/assert.js": function (require, module, exports) {
|
7573 | module.exports = function (chai, util) {
|
7574 | var Assertion = chai.Assertion, flag = util.flag;
|
7575 | var assert = chai.assert = function (express, errmsg) {
|
7576 | var test = new Assertion(null, null, chai.assert, true);
|
7577 | test.assert(express, errmsg, '[ negation message unavailable ]');
|
7578 | };
|
7579 | assert.fail = function (actual, expected, message, operator) {
|
7580 | message = message || 'assert.fail()';
|
7581 | throw new chai.AssertionError(message, {
|
7582 | actual: actual,
|
7583 | expected: expected,
|
7584 | operator: operator
|
7585 | }, assert.fail);
|
7586 | };
|
7587 | assert.isOk = function (val, msg) {
|
7588 | new Assertion(val, msg, assert.isOk, true).is.ok;
|
7589 | };
|
7590 | assert.isNotOk = function (val, msg) {
|
7591 | new Assertion(val, msg, assert.isNotOk, true).is.not.ok;
|
7592 | };
|
7593 | assert.equal = function (act, exp, msg) {
|
7594 | var test = new Assertion(act, msg, assert.equal, true);
|
7595 | test.assert(exp == flag(test, 'object'), 'expected #{this} to equal #{exp}', 'expected #{this} to not equal #{act}', exp, act, true);
|
7596 | };
|
7597 | assert.notEqual = function (act, exp, msg) {
|
7598 | var test = new Assertion(act, msg, assert.notEqual, true);
|
7599 | test.assert(exp != flag(test, 'object'), 'expected #{this} to not equal #{exp}', 'expected #{this} to equal #{act}', exp, act, true);
|
7600 | };
|
7601 | assert.strictEqual = function (act, exp, msg) {
|
7602 | new Assertion(act, msg, assert.strictEqual, true).to.equal(exp);
|
7603 | };
|
7604 | assert.notStrictEqual = function (act, exp, msg) {
|
7605 | new Assertion(act, msg, assert.notStrictEqual, true).to.not.equal(exp);
|
7606 | };
|
7607 | assert.deepEqual = assert.deepStrictEqual = function (act, exp, msg) {
|
7608 | new Assertion(act, msg, assert.deepEqual, true).to.eql(exp);
|
7609 | };
|
7610 | assert.notDeepEqual = function (act, exp, msg) {
|
7611 | new Assertion(act, msg, assert.notDeepEqual, true).to.not.eql(exp);
|
7612 | };
|
7613 | assert.isAbove = function (val, abv, msg) {
|
7614 | new Assertion(val, msg, assert.isAbove, true).to.be.above(abv);
|
7615 | };
|
7616 | assert.isAtLeast = function (val, atlst, msg) {
|
7617 | new Assertion(val, msg, assert.isAtLeast, true).to.be.least(atlst);
|
7618 | };
|
7619 | assert.isBelow = function (val, blw, msg) {
|
7620 | new Assertion(val, msg, assert.isBelow, true).to.be.below(blw);
|
7621 | };
|
7622 | assert.isAtMost = function (val, atmst, msg) {
|
7623 | new Assertion(val, msg, assert.isAtMost, true).to.be.most(atmst);
|
7624 | };
|
7625 | assert.isTrue = function (val, msg) {
|
7626 | new Assertion(val, msg, assert.isTrue, true).is['true'];
|
7627 | };
|
7628 | assert.isNotTrue = function (val, msg) {
|
7629 | new Assertion(val, msg, assert.isNotTrue, true).to.not.equal(true);
|
7630 | };
|
7631 | assert.isFalse = function (val, msg) {
|
7632 | new Assertion(val, msg, assert.isFalse, true).is['false'];
|
7633 | };
|
7634 | assert.isNotFalse = function (val, msg) {
|
7635 | new Assertion(val, msg, assert.isNotFalse, true).to.not.equal(false);
|
7636 | };
|
7637 | assert.isNull = function (val, msg) {
|
7638 | new Assertion(val, msg, assert.isNull, true).to.equal(null);
|
7639 | };
|
7640 | assert.isNotNull = function (val, msg) {
|
7641 | new Assertion(val, msg, assert.isNotNull, true).to.not.equal(null);
|
7642 | };
|
7643 | assert.isNaN = function (val, msg) {
|
7644 | new Assertion(val, msg, assert.isNaN, true).to.be.NaN;
|
7645 | };
|
7646 | assert.isNotNaN = function (val, msg) {
|
7647 | new Assertion(val, msg, assert.isNotNaN, true).not.to.be.NaN;
|
7648 | };
|
7649 | assert.exists = function (val, msg) {
|
7650 | new Assertion(val, msg, assert.exists, true).to.exist;
|
7651 | };
|
7652 | assert.notExists = function (val, msg) {
|
7653 | new Assertion(val, msg, assert.notExists, true).to.not.exist;
|
7654 | };
|
7655 | assert.isUndefined = function (val, msg) {
|
7656 | new Assertion(val, msg, assert.isUndefined, true).to.equal(undefined);
|
7657 | };
|
7658 | assert.isDefined = function (val, msg) {
|
7659 | new Assertion(val, msg, assert.isDefined, true).to.not.equal(undefined);
|
7660 | };
|
7661 | assert.isFunction = function (val, msg) {
|
7662 | new Assertion(val, msg, assert.isFunction, true).to.be.a('function');
|
7663 | };
|
7664 | assert.isNotFunction = function (val, msg) {
|
7665 | new Assertion(val, msg, assert.isNotFunction, true).to.not.be.a('function');
|
7666 | };
|
7667 | assert.isObject = function (val, msg) {
|
7668 | new Assertion(val, msg, assert.isObject, true).to.be.a('object');
|
7669 | };
|
7670 | assert.isNotObject = function (val, msg) {
|
7671 | new Assertion(val, msg, assert.isNotObject, true).to.not.be.a('object');
|
7672 | };
|
7673 | assert.isArray = function (val, msg) {
|
7674 | new Assertion(val, msg, assert.isArray, true).to.be.an('array');
|
7675 | };
|
7676 | assert.isNotArray = function (val, msg) {
|
7677 | new Assertion(val, msg, assert.isNotArray, true).to.not.be.an('array');
|
7678 | };
|
7679 | assert.isString = function (val, msg) {
|
7680 | new Assertion(val, msg, assert.isString, true).to.be.a('string');
|
7681 | };
|
7682 | assert.isNotString = function (val, msg) {
|
7683 | new Assertion(val, msg, assert.isNotString, true).to.not.be.a('string');
|
7684 | };
|
7685 | assert.isNumber = function (val, msg) {
|
7686 | new Assertion(val, msg, assert.isNumber, true).to.be.a('number');
|
7687 | };
|
7688 | assert.isNotNumber = function (val, msg) {
|
7689 | new Assertion(val, msg, assert.isNotNumber, true).to.not.be.a('number');
|
7690 | };
|
7691 | assert.isFinite = function (val, msg) {
|
7692 | new Assertion(val, msg, assert.isFinite, true).to.be.finite;
|
7693 | };
|
7694 | assert.isBoolean = function (val, msg) {
|
7695 | new Assertion(val, msg, assert.isBoolean, true).to.be.a('boolean');
|
7696 | };
|
7697 | assert.isNotBoolean = function (val, msg) {
|
7698 | new Assertion(val, msg, assert.isNotBoolean, true).to.not.be.a('boolean');
|
7699 | };
|
7700 | assert.typeOf = function (val, type, msg) {
|
7701 | new Assertion(val, msg, assert.typeOf, true).to.be.a(type);
|
7702 | };
|
7703 | assert.notTypeOf = function (val, type, msg) {
|
7704 | new Assertion(val, msg, assert.notTypeOf, true).to.not.be.a(type);
|
7705 | };
|
7706 | assert.instanceOf = function (val, type, msg) {
|
7707 | new Assertion(val, msg, assert.instanceOf, true).to.be.instanceOf(type);
|
7708 | };
|
7709 | assert.notInstanceOf = function (val, type, msg) {
|
7710 | new Assertion(val, msg, assert.notInstanceOf, true).to.not.be.instanceOf(type);
|
7711 | };
|
7712 | assert.include = function (exp, inc, msg) {
|
7713 | new Assertion(exp, msg, assert.include, true).include(inc);
|
7714 | };
|
7715 | assert.notInclude = function (exp, inc, msg) {
|
7716 | new Assertion(exp, msg, assert.notInclude, true).not.include(inc);
|
7717 | };
|
7718 | assert.deepInclude = function (exp, inc, msg) {
|
7719 | new Assertion(exp, msg, assert.deepInclude, true).deep.include(inc);
|
7720 | };
|
7721 | assert.notDeepInclude = function (exp, inc, msg) {
|
7722 | new Assertion(exp, msg, assert.notDeepInclude, true).not.deep.include(inc);
|
7723 | };
|
7724 | assert.nestedInclude = function (exp, inc, msg) {
|
7725 | new Assertion(exp, msg, assert.nestedInclude, true).nested.include(inc);
|
7726 | };
|
7727 | assert.notNestedInclude = function (exp, inc, msg) {
|
7728 | new Assertion(exp, msg, assert.notNestedInclude, true).not.nested.include(inc);
|
7729 | };
|
7730 | assert.deepNestedInclude = function (exp, inc, msg) {
|
7731 | new Assertion(exp, msg, assert.deepNestedInclude, true).deep.nested.include(inc);
|
7732 | };
|
7733 | assert.notDeepNestedInclude = function (exp, inc, msg) {
|
7734 | new Assertion(exp, msg, assert.notDeepNestedInclude, true).not.deep.nested.include(inc);
|
7735 | };
|
7736 | assert.ownInclude = function (exp, inc, msg) {
|
7737 | new Assertion(exp, msg, assert.ownInclude, true).own.include(inc);
|
7738 | };
|
7739 | assert.notOwnInclude = function (exp, inc, msg) {
|
7740 | new Assertion(exp, msg, assert.notOwnInclude, true).not.own.include(inc);
|
7741 | };
|
7742 | assert.deepOwnInclude = function (exp, inc, msg) {
|
7743 | new Assertion(exp, msg, assert.deepOwnInclude, true).deep.own.include(inc);
|
7744 | };
|
7745 | assert.notDeepOwnInclude = function (exp, inc, msg) {
|
7746 | new Assertion(exp, msg, assert.notDeepOwnInclude, true).not.deep.own.include(inc);
|
7747 | };
|
7748 | assert.match = function (exp, re, msg) {
|
7749 | new Assertion(exp, msg, assert.match, true).to.match(re);
|
7750 | };
|
7751 | assert.notMatch = function (exp, re, msg) {
|
7752 | new Assertion(exp, msg, assert.notMatch, true).to.not.match(re);
|
7753 | };
|
7754 | assert.property = function (obj, prop, msg) {
|
7755 | new Assertion(obj, msg, assert.property, true).to.have.property(prop);
|
7756 | };
|
7757 | assert.notProperty = function (obj, prop, msg) {
|
7758 | new Assertion(obj, msg, assert.notProperty, true).to.not.have.property(prop);
|
7759 | };
|
7760 | assert.propertyVal = function (obj, prop, val, msg) {
|
7761 | new Assertion(obj, msg, assert.propertyVal, true).to.have.property(prop, val);
|
7762 | };
|
7763 | assert.notPropertyVal = function (obj, prop, val, msg) {
|
7764 | new Assertion(obj, msg, assert.notPropertyVal, true).to.not.have.property(prop, val);
|
7765 | };
|
7766 | assert.deepPropertyVal = function (obj, prop, val, msg) {
|
7767 | new Assertion(obj, msg, assert.deepPropertyVal, true).to.have.deep.property(prop, val);
|
7768 | };
|
7769 | assert.notDeepPropertyVal = function (obj, prop, val, msg) {
|
7770 | new Assertion(obj, msg, assert.notDeepPropertyVal, true).to.not.have.deep.property(prop, val);
|
7771 | };
|
7772 | assert.ownProperty = function (obj, prop, msg) {
|
7773 | new Assertion(obj, msg, assert.ownProperty, true).to.have.own.property(prop);
|
7774 | };
|
7775 | assert.notOwnProperty = function (obj, prop, msg) {
|
7776 | new Assertion(obj, msg, assert.notOwnProperty, true).to.not.have.own.property(prop);
|
7777 | };
|
7778 | assert.ownPropertyVal = function (obj, prop, value, msg) {
|
7779 | new Assertion(obj, msg, assert.ownPropertyVal, true).to.have.own.property(prop, value);
|
7780 | };
|
7781 | assert.notOwnPropertyVal = function (obj, prop, value, msg) {
|
7782 | new Assertion(obj, msg, assert.notOwnPropertyVal, true).to.not.have.own.property(prop, value);
|
7783 | };
|
7784 | assert.deepOwnPropertyVal = function (obj, prop, value, msg) {
|
7785 | new Assertion(obj, msg, assert.deepOwnPropertyVal, true).to.have.deep.own.property(prop, value);
|
7786 | };
|
7787 | assert.notDeepOwnPropertyVal = function (obj, prop, value, msg) {
|
7788 | new Assertion(obj, msg, assert.notDeepOwnPropertyVal, true).to.not.have.deep.own.property(prop, value);
|
7789 | };
|
7790 | assert.nestedProperty = function (obj, prop, msg) {
|
7791 | new Assertion(obj, msg, assert.nestedProperty, true).to.have.nested.property(prop);
|
7792 | };
|
7793 | assert.notNestedProperty = function (obj, prop, msg) {
|
7794 | new Assertion(obj, msg, assert.notNestedProperty, true).to.not.have.nested.property(prop);
|
7795 | };
|
7796 | assert.nestedPropertyVal = function (obj, prop, val, msg) {
|
7797 | new Assertion(obj, msg, assert.nestedPropertyVal, true).to.have.nested.property(prop, val);
|
7798 | };
|
7799 | assert.notNestedPropertyVal = function (obj, prop, val, msg) {
|
7800 | new Assertion(obj, msg, assert.notNestedPropertyVal, true).to.not.have.nested.property(prop, val);
|
7801 | };
|
7802 | assert.deepNestedPropertyVal = function (obj, prop, val, msg) {
|
7803 | new Assertion(obj, msg, assert.deepNestedPropertyVal, true).to.have.deep.nested.property(prop, val);
|
7804 | };
|
7805 | assert.notDeepNestedPropertyVal = function (obj, prop, val, msg) {
|
7806 | new Assertion(obj, msg, assert.notDeepNestedPropertyVal, true).to.not.have.deep.nested.property(prop, val);
|
7807 | };
|
7808 | assert.lengthOf = function (exp, len, msg) {
|
7809 | new Assertion(exp, msg, assert.lengthOf, true).to.have.lengthOf(len);
|
7810 | };
|
7811 | assert.hasAnyKeys = function (obj, keys, msg) {
|
7812 | new Assertion(obj, msg, assert.hasAnyKeys, true).to.have.any.keys(keys);
|
7813 | };
|
7814 | assert.hasAllKeys = function (obj, keys, msg) {
|
7815 | new Assertion(obj, msg, assert.hasAllKeys, true).to.have.all.keys(keys);
|
7816 | };
|
7817 | assert.containsAllKeys = function (obj, keys, msg) {
|
7818 | new Assertion(obj, msg, assert.containsAllKeys, true).to.contain.all.keys(keys);
|
7819 | };
|
7820 | assert.doesNotHaveAnyKeys = function (obj, keys, msg) {
|
7821 | new Assertion(obj, msg, assert.doesNotHaveAnyKeys, true).to.not.have.any.keys(keys);
|
7822 | };
|
7823 | assert.doesNotHaveAllKeys = function (obj, keys, msg) {
|
7824 | new Assertion(obj, msg, assert.doesNotHaveAllKeys, true).to.not.have.all.keys(keys);
|
7825 | };
|
7826 | assert.hasAnyDeepKeys = function (obj, keys, msg) {
|
7827 | new Assertion(obj, msg, assert.hasAnyDeepKeys, true).to.have.any.deep.keys(keys);
|
7828 | };
|
7829 | assert.hasAllDeepKeys = function (obj, keys, msg) {
|
7830 | new Assertion(obj, msg, assert.hasAllDeepKeys, true).to.have.all.deep.keys(keys);
|
7831 | };
|
7832 | assert.containsAllDeepKeys = function (obj, keys, msg) {
|
7833 | new Assertion(obj, msg, assert.containsAllDeepKeys, true).to.contain.all.deep.keys(keys);
|
7834 | };
|
7835 | assert.doesNotHaveAnyDeepKeys = function (obj, keys, msg) {
|
7836 | new Assertion(obj, msg, assert.doesNotHaveAnyDeepKeys, true).to.not.have.any.deep.keys(keys);
|
7837 | };
|
7838 | assert.doesNotHaveAllDeepKeys = function (obj, keys, msg) {
|
7839 | new Assertion(obj, msg, assert.doesNotHaveAllDeepKeys, true).to.not.have.all.deep.keys(keys);
|
7840 | };
|
7841 | assert.throws = function (fn, errorLike, errMsgMatcher, msg) {
|
7842 | if ('string' === typeof errorLike || errorLike instanceof RegExp) {
|
7843 | errMsgMatcher = errorLike;
|
7844 | errorLike = null;
|
7845 | }
|
7846 | var assertErr = new Assertion(fn, msg, assert.throws, true).to.throw(errorLike, errMsgMatcher);
|
7847 | return flag(assertErr, 'object');
|
7848 | };
|
7849 | assert.doesNotThrow = function (fn, errorLike, errMsgMatcher, msg) {
|
7850 | if ('string' === typeof errorLike || errorLike instanceof RegExp) {
|
7851 | errMsgMatcher = errorLike;
|
7852 | errorLike = null;
|
7853 | }
|
7854 | new Assertion(fn, msg, assert.doesNotThrow, true).to.not.throw(errorLike, errMsgMatcher);
|
7855 | };
|
7856 | assert.operator = function (val, operator, val2, msg) {
|
7857 | var ok;
|
7858 | switch (operator) {
|
7859 | case '==':
|
7860 | ok = val == val2;
|
7861 | break;
|
7862 | case '===':
|
7863 | ok = val === val2;
|
7864 | break;
|
7865 | case '>':
|
7866 | ok = val > val2;
|
7867 | break;
|
7868 | case '>=':
|
7869 | ok = val >= val2;
|
7870 | break;
|
7871 | case '<':
|
7872 | ok = val < val2;
|
7873 | break;
|
7874 | case '<=':
|
7875 | ok = val <= val2;
|
7876 | break;
|
7877 | case '!=':
|
7878 | ok = val != val2;
|
7879 | break;
|
7880 | case '!==':
|
7881 | ok = val !== val2;
|
7882 | break;
|
7883 | default:
|
7884 | msg = msg ? msg + ': ' : msg;
|
7885 | throw new chai.AssertionError(msg + 'Invalid operator "' + operator + '"', undefined, assert.operator);
|
7886 | }
|
7887 | var test = new Assertion(ok, msg, assert.operator, true);
|
7888 | test.assert(true === flag(test, 'object'), 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2), 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2));
|
7889 | };
|
7890 | assert.closeTo = function (act, exp, delta, msg) {
|
7891 | new Assertion(act, msg, assert.closeTo, true).to.be.closeTo(exp, delta);
|
7892 | };
|
7893 | assert.approximately = function (act, exp, delta, msg) {
|
7894 | new Assertion(act, msg, assert.approximately, true).to.be.approximately(exp, delta);
|
7895 | };
|
7896 | assert.sameMembers = function (set1, set2, msg) {
|
7897 | new Assertion(set1, msg, assert.sameMembers, true).to.have.same.members(set2);
|
7898 | };
|
7899 | assert.notSameMembers = function (set1, set2, msg) {
|
7900 | new Assertion(set1, msg, assert.notSameMembers, true).to.not.have.same.members(set2);
|
7901 | };
|
7902 | assert.sameDeepMembers = function (set1, set2, msg) {
|
7903 | new Assertion(set1, msg, assert.sameDeepMembers, true).to.have.same.deep.members(set2);
|
7904 | };
|
7905 | assert.notSameDeepMembers = function (set1, set2, msg) {
|
7906 | new Assertion(set1, msg, assert.notSameDeepMembers, true).to.not.have.same.deep.members(set2);
|
7907 | };
|
7908 | assert.sameOrderedMembers = function (set1, set2, msg) {
|
7909 | new Assertion(set1, msg, assert.sameOrderedMembers, true).to.have.same.ordered.members(set2);
|
7910 | };
|
7911 | assert.notSameOrderedMembers = function (set1, set2, msg) {
|
7912 | new Assertion(set1, msg, assert.notSameOrderedMembers, true).to.not.have.same.ordered.members(set2);
|
7913 | };
|
7914 | assert.sameDeepOrderedMembers = function (set1, set2, msg) {
|
7915 | new Assertion(set1, msg, assert.sameDeepOrderedMembers, true).to.have.same.deep.ordered.members(set2);
|
7916 | };
|
7917 | assert.notSameDeepOrderedMembers = function (set1, set2, msg) {
|
7918 | new Assertion(set1, msg, assert.notSameDeepOrderedMembers, true).to.not.have.same.deep.ordered.members(set2);
|
7919 | };
|
7920 | assert.includeMembers = function (superset, subset, msg) {
|
7921 | new Assertion(superset, msg, assert.includeMembers, true).to.include.members(subset);
|
7922 | };
|
7923 | assert.notIncludeMembers = function (superset, subset, msg) {
|
7924 | new Assertion(superset, msg, assert.notIncludeMembers, true).to.not.include.members(subset);
|
7925 | };
|
7926 | assert.includeDeepMembers = function (superset, subset, msg) {
|
7927 | new Assertion(superset, msg, assert.includeDeepMembers, true).to.include.deep.members(subset);
|
7928 | };
|
7929 | assert.notIncludeDeepMembers = function (superset, subset, msg) {
|
7930 | new Assertion(superset, msg, assert.notIncludeDeepMembers, true).to.not.include.deep.members(subset);
|
7931 | };
|
7932 | assert.includeOrderedMembers = function (superset, subset, msg) {
|
7933 | new Assertion(superset, msg, assert.includeOrderedMembers, true).to.include.ordered.members(subset);
|
7934 | };
|
7935 | assert.notIncludeOrderedMembers = function (superset, subset, msg) {
|
7936 | new Assertion(superset, msg, assert.notIncludeOrderedMembers, true).to.not.include.ordered.members(subset);
|
7937 | };
|
7938 | assert.includeDeepOrderedMembers = function (superset, subset, msg) {
|
7939 | new Assertion(superset, msg, assert.includeDeepOrderedMembers, true).to.include.deep.ordered.members(subset);
|
7940 | };
|
7941 | assert.notIncludeDeepOrderedMembers = function (superset, subset, msg) {
|
7942 | new Assertion(superset, msg, assert.notIncludeDeepOrderedMembers, true).to.not.include.deep.ordered.members(subset);
|
7943 | };
|
7944 | assert.oneOf = function (inList, list, msg) {
|
7945 | new Assertion(inList, msg, assert.oneOf, true).to.be.oneOf(list);
|
7946 | };
|
7947 | assert.changes = function (fn, obj, prop, msg) {
|
7948 | if (arguments.length === 3 && typeof obj === 'function') {
|
7949 | msg = prop;
|
7950 | prop = null;
|
7951 | }
|
7952 | new Assertion(fn, msg, assert.changes, true).to.change(obj, prop);
|
7953 | };
|
7954 | assert.changesBy = function (fn, obj, prop, delta, msg) {
|
7955 | if (arguments.length === 4 && typeof obj === 'function') {
|
7956 | var tmpMsg = delta;
|
7957 | delta = prop;
|
7958 | msg = tmpMsg;
|
7959 | } else if (arguments.length === 3) {
|
7960 | delta = prop;
|
7961 | prop = null;
|
7962 | }
|
7963 | new Assertion(fn, msg, assert.changesBy, true).to.change(obj, prop).by(delta);
|
7964 | };
|
7965 | assert.doesNotChange = function (fn, obj, prop, msg) {
|
7966 | if (arguments.length === 3 && typeof obj === 'function') {
|
7967 | msg = prop;
|
7968 | prop = null;
|
7969 | }
|
7970 | return new Assertion(fn, msg, assert.doesNotChange, true).to.not.change(obj, prop);
|
7971 | };
|
7972 | assert.changesButNotBy = function (fn, obj, prop, delta, msg) {
|
7973 | if (arguments.length === 4 && typeof obj === 'function') {
|
7974 | var tmpMsg = delta;
|
7975 | delta = prop;
|
7976 | msg = tmpMsg;
|
7977 | } else if (arguments.length === 3) {
|
7978 | delta = prop;
|
7979 | prop = null;
|
7980 | }
|
7981 | new Assertion(fn, msg, assert.changesButNotBy, true).to.change(obj, prop).but.not.by(delta);
|
7982 | };
|
7983 | assert.increases = function (fn, obj, prop, msg) {
|
7984 | if (arguments.length === 3 && typeof obj === 'function') {
|
7985 | msg = prop;
|
7986 | prop = null;
|
7987 | }
|
7988 | return new Assertion(fn, msg, assert.increases, true).to.increase(obj, prop);
|
7989 | };
|
7990 | assert.increasesBy = function (fn, obj, prop, delta, msg) {
|
7991 | if (arguments.length === 4 && typeof obj === 'function') {
|
7992 | var tmpMsg = delta;
|
7993 | delta = prop;
|
7994 | msg = tmpMsg;
|
7995 | } else if (arguments.length === 3) {
|
7996 | delta = prop;
|
7997 | prop = null;
|
7998 | }
|
7999 | new Assertion(fn, msg, assert.increasesBy, true).to.increase(obj, prop).by(delta);
|
8000 | };
|
8001 | assert.doesNotIncrease = function (fn, obj, prop, msg) {
|
8002 | if (arguments.length === 3 && typeof obj === 'function') {
|
8003 | msg = prop;
|
8004 | prop = null;
|
8005 | }
|
8006 | return new Assertion(fn, msg, assert.doesNotIncrease, true).to.not.increase(obj, prop);
|
8007 | };
|
8008 | assert.increasesButNotBy = function (fn, obj, prop, delta, msg) {
|
8009 | if (arguments.length === 4 && typeof obj === 'function') {
|
8010 | var tmpMsg = delta;
|
8011 | delta = prop;
|
8012 | msg = tmpMsg;
|
8013 | } else if (arguments.length === 3) {
|
8014 | delta = prop;
|
8015 | prop = null;
|
8016 | }
|
8017 | new Assertion(fn, msg, assert.increasesButNotBy, true).to.increase(obj, prop).but.not.by(delta);
|
8018 | };
|
8019 | assert.decreases = function (fn, obj, prop, msg) {
|
8020 | if (arguments.length === 3 && typeof obj === 'function') {
|
8021 | msg = prop;
|
8022 | prop = null;
|
8023 | }
|
8024 | return new Assertion(fn, msg, assert.decreases, true).to.decrease(obj, prop);
|
8025 | };
|
8026 | assert.decreasesBy = function (fn, obj, prop, delta, msg) {
|
8027 | if (arguments.length === 4 && typeof obj === 'function') {
|
8028 | var tmpMsg = delta;
|
8029 | delta = prop;
|
8030 | msg = tmpMsg;
|
8031 | } else if (arguments.length === 3) {
|
8032 | delta = prop;
|
8033 | prop = null;
|
8034 | }
|
8035 | new Assertion(fn, msg, assert.decreasesBy, true).to.decrease(obj, prop).by(delta);
|
8036 | };
|
8037 | assert.doesNotDecrease = function (fn, obj, prop, msg) {
|
8038 | if (arguments.length === 3 && typeof obj === 'function') {
|
8039 | msg = prop;
|
8040 | prop = null;
|
8041 | }
|
8042 | return new Assertion(fn, msg, assert.doesNotDecrease, true).to.not.decrease(obj, prop);
|
8043 | };
|
8044 | assert.doesNotDecreaseBy = function (fn, obj, prop, delta, msg) {
|
8045 | if (arguments.length === 4 && typeof obj === 'function') {
|
8046 | var tmpMsg = delta;
|
8047 | delta = prop;
|
8048 | msg = tmpMsg;
|
8049 | } else if (arguments.length === 3) {
|
8050 | delta = prop;
|
8051 | prop = null;
|
8052 | }
|
8053 | return new Assertion(fn, msg, assert.doesNotDecreaseBy, true).to.not.decrease(obj, prop).by(delta);
|
8054 | };
|
8055 | assert.decreasesButNotBy = function (fn, obj, prop, delta, msg) {
|
8056 | if (arguments.length === 4 && typeof obj === 'function') {
|
8057 | var tmpMsg = delta;
|
8058 | delta = prop;
|
8059 | msg = tmpMsg;
|
8060 | } else if (arguments.length === 3) {
|
8061 | delta = prop;
|
8062 | prop = null;
|
8063 | }
|
8064 | new Assertion(fn, msg, assert.decreasesButNotBy, true).to.decrease(obj, prop).but.not.by(delta);
|
8065 | };
|
8066 | assert.ifError = function (val) {
|
8067 | if (val) {
|
8068 | throw (val);
|
8069 | }
|
8070 | };
|
8071 | assert.isExtensible = function (obj, msg) {
|
8072 | new Assertion(obj, msg, assert.isExtensible, true).to.be.extensible;
|
8073 | };
|
8074 | assert.isNotExtensible = function (obj, msg) {
|
8075 | new Assertion(obj, msg, assert.isNotExtensible, true).to.not.be.extensible;
|
8076 | };
|
8077 | assert.isSealed = function (obj, msg) {
|
8078 | new Assertion(obj, msg, assert.isSealed, true).to.be.sealed;
|
8079 | };
|
8080 | assert.isNotSealed = function (obj, msg) {
|
8081 | new Assertion(obj, msg, assert.isNotSealed, true).to.not.be.sealed;
|
8082 | };
|
8083 | assert.isFrozen = function (obj, msg) {
|
8084 | new Assertion(obj, msg, assert.isFrozen, true).to.be.frozen;
|
8085 | };
|
8086 | assert.isNotFrozen = function (obj, msg) {
|
8087 | new Assertion(obj, msg, assert.isNotFrozen, true).to.not.be.frozen;
|
8088 | };
|
8089 | assert.isEmpty = function (val, msg) {
|
8090 | new Assertion(val, msg, assert.isEmpty, true).to.be.empty;
|
8091 | };
|
8092 | assert.isNotEmpty = function (val, msg) {
|
8093 | new Assertion(val, msg, assert.isNotEmpty, true).to.not.be.empty;
|
8094 | };
|
8095 | (function alias(name, as) {
|
8096 | assert[as] = assert[name];
|
8097 | return alias;
|
8098 | })('isOk', 'ok')('isNotOk', 'notOk')('throws', 'throw')('throws', 'Throw')('isExtensible', 'extensible')('isNotExtensible', 'notExtensible')('isSealed', 'sealed')('isNotSealed', 'notSealed')('isFrozen', 'frozen')('isNotFrozen', 'notFrozen')('isEmpty', 'empty')('isNotEmpty', 'notEmpty');
|
8099 | };
|
8100 | return module.exports;
|
8101 | },
|
8102 | "node_modules/pathval/index.js": function (require, module, exports) {
|
8103 | ;
|
8104 | function hasProperty(obj, name) {
|
8105 | if (typeof obj === 'undefined' || obj === null) {
|
8106 | return false;
|
8107 | }
|
8108 | return (name in Object(obj));
|
8109 | }
|
8110 | function parsePath(path) {
|
8111 | var str = path.replace(/([^\\])\[/g, '$1.[');
|
8112 | var parts = str.match(/(\\\.|[^.]+?)+/g);
|
8113 | return parts.map(function mapMatches(value) {
|
8114 | var regexp = /^\[(\d+)\]$/;
|
8115 | var mArr = regexp.exec(value);
|
8116 | var parsed = null;
|
8117 | if (mArr) {
|
8118 | parsed = {
|
8119 | i: parseFloat(mArr[1])
|
8120 | };
|
8121 | } else {
|
8122 | parsed = {
|
8123 | p: value.replace(/\\([.\[\]])/g, '$1')
|
8124 | };
|
8125 | }
|
8126 | return parsed;
|
8127 | });
|
8128 | }
|
8129 | function internalGetPathValue(obj, parsed, pathDepth) {
|
8130 | var temporaryValue = obj;
|
8131 | var res = null;
|
8132 | pathDepth = (typeof pathDepth === 'undefined' ? parsed.length : pathDepth);
|
8133 | for (var i = 0; i < pathDepth; i++) {
|
8134 | var part = parsed[i];
|
8135 | if (temporaryValue) {
|
8136 | if (typeof part.p === 'undefined') {
|
8137 | temporaryValue = temporaryValue[part.i];
|
8138 | } else {
|
8139 | temporaryValue = temporaryValue[part.p];
|
8140 | }
|
8141 | if (i === (pathDepth - 1)) {
|
8142 | res = temporaryValue;
|
8143 | }
|
8144 | }
|
8145 | }
|
8146 | return res;
|
8147 | }
|
8148 | function internalSetPathValue(obj, val, parsed) {
|
8149 | var tempObj = obj;
|
8150 | var pathDepth = parsed.length;
|
8151 | var part = null;
|
8152 | for (var i = 0; i < pathDepth; i++) {
|
8153 | var propName = null;
|
8154 | var propVal = null;
|
8155 | part = parsed[i];
|
8156 | if (i === (pathDepth - 1)) {
|
8157 | propName = typeof part.p === 'undefined' ? part.i : part.p;
|
8158 | tempObj[propName] = val;
|
8159 | } else if (typeof part.p !== 'undefined' && tempObj[part.p]) {
|
8160 | tempObj = tempObj[part.p];
|
8161 | } else if (typeof part.i !== 'undefined' && tempObj[part.i]) {
|
8162 | tempObj = tempObj[part.i];
|
8163 | } else {
|
8164 | var next = parsed[i + 1];
|
8165 | propName = typeof part.p === 'undefined' ? part.i : part.p;
|
8166 | propVal = typeof next.p === 'undefined' ? [] : {};
|
8167 | tempObj[propName] = propVal;
|
8168 | tempObj = tempObj[propName];
|
8169 | }
|
8170 | }
|
8171 | }
|
8172 | function getPathInfo(obj, path) {
|
8173 | var parsed = parsePath(path);
|
8174 | var last = parsed[parsed.length - 1];
|
8175 | var info = {
|
8176 | parent: parsed.length > 1 ? internalGetPathValue(obj, parsed, parsed.length - 1) : obj,
|
8177 | name: last.p || last.i,
|
8178 | value: internalGetPathValue(obj, parsed)
|
8179 | };
|
8180 | info.exists = hasProperty(info.parent, info.name);
|
8181 | return info;
|
8182 | }
|
8183 | function getPathValue(obj, path) {
|
8184 | var info = getPathInfo(obj, path);
|
8185 | return info.value;
|
8186 | }
|
8187 | function setPathValue(obj, path, val) {
|
8188 | var parsed = parsePath(path);
|
8189 | internalSetPathValue(obj, val, parsed);
|
8190 | return obj;
|
8191 | }
|
8192 | module.exports = {
|
8193 | hasProperty: hasProperty,
|
8194 | getPathInfo: getPathInfo,
|
8195 | getPathValue: getPathValue,
|
8196 | setPathValue: setPathValue
|
8197 | };
|
8198 | return module.exports;
|
8199 | },
|
8200 | "node_modules/chai/lib/chai/utils/test.js": function (require, module, exports) {
|
8201 | var flag = require("node_modules/chai/lib/chai/utils/flag.js");
|
8202 | module.exports = function test(obj, args) {
|
8203 | var negate = flag(obj, 'negate'), expr = args[0];
|
8204 | return negate ? !expr : expr;
|
8205 | };
|
8206 | return module.exports;
|
8207 | },
|
8208 | "node_modules/type-detect/index.js": function (require, module, exports) {
|
8209 | ;
|
8210 | var promiseExists = typeof Promise === 'function';
|
8211 | var globalObject = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : self;
|
8212 | var isDom = ('location' in globalObject) && ('document' in globalObject);
|
8213 | var symbolExists = typeof Symbol !== 'undefined';
|
8214 | var mapExists = typeof Map !== 'undefined';
|
8215 | var setExists = typeof Set !== 'undefined';
|
8216 | var weakMapExists = typeof WeakMap !== 'undefined';
|
8217 | var weakSetExists = typeof WeakSet !== 'undefined';
|
8218 | var dataViewExists = typeof DataView !== 'undefined';
|
8219 | var symbolIteratorExists = symbolExists && typeof Symbol.iterator !== 'undefined';
|
8220 | var symbolToStringTagExists = symbolExists && typeof Symbol.toStringTag !== 'undefined';
|
8221 | var setEntriesExists = setExists && typeof Set.prototype.entries === 'function';
|
8222 | var mapEntriesExists = mapExists && typeof Map.prototype.entries === 'function';
|
8223 | var setIteratorPrototype = setEntriesExists && Object.getPrototypeOf(new Set().entries());
|
8224 | var mapIteratorPrototype = mapEntriesExists && Object.getPrototypeOf(new Map().entries());
|
8225 | var arrayIteratorExists = symbolIteratorExists && typeof Array.prototype[Symbol.iterator] === 'function';
|
8226 | var arrayIteratorPrototype = arrayIteratorExists && Object.getPrototypeOf([][Symbol.iterator]());
|
8227 | var stringIteratorExists = symbolIteratorExists && typeof String.prototype[Symbol.iterator] === 'function';
|
8228 | var stringIteratorPrototype = stringIteratorExists && Object.getPrototypeOf(('')[Symbol.iterator]());
|
8229 | var toStringLeftSliceLength = 8;
|
8230 | var toStringRightSliceLength = -1;
|
8231 | module.exports = function typeDetect(obj) {
|
8232 | var typeofObj = typeof obj;
|
8233 | if (typeofObj !== 'object') {
|
8234 | return typeofObj;
|
8235 | }
|
8236 | if (obj === null) {
|
8237 | return 'null';
|
8238 | }
|
8239 | if (obj === globalObject) {
|
8240 | return 'global';
|
8241 | }
|
8242 | if (Array.isArray(obj) && (symbolToStringTagExists === false || !((Symbol.toStringTag in obj)))) {
|
8243 | return 'Array';
|
8244 | }
|
8245 | if (isDom) {
|
8246 | if (obj === globalObject.location) {
|
8247 | return 'Location';
|
8248 | }
|
8249 | if (obj === globalObject.document) {
|
8250 | return 'Document';
|
8251 | }
|
8252 | if (obj === (globalObject.navigator || ({})).mimeTypes) {
|
8253 | return 'MimeTypeArray';
|
8254 | }
|
8255 | if (obj === (globalObject.navigator || ({})).plugins) {
|
8256 | return 'PluginArray';
|
8257 | }
|
8258 | if (obj instanceof HTMLElement && obj.tagName === 'BLOCKQUOTE') {
|
8259 | return 'HTMLQuoteElement';
|
8260 | }
|
8261 | if (obj instanceof HTMLElement && obj.tagName === 'TD') {
|
8262 | return 'HTMLTableDataCellElement';
|
8263 | }
|
8264 | if (obj instanceof HTMLElement && obj.tagName === 'TH') {
|
8265 | return 'HTMLTableHeaderCellElement';
|
8266 | }
|
8267 | }
|
8268 | var stringTag = (symbolToStringTagExists && obj[Symbol.toStringTag]);
|
8269 | if (typeof stringTag === 'string') {
|
8270 | return stringTag;
|
8271 | }
|
8272 | var objPrototype = Object.getPrototypeOf(obj);
|
8273 | if (objPrototype === RegExp.prototype) {
|
8274 | return 'RegExp';
|
8275 | }
|
8276 | if (objPrototype === Date.prototype) {
|
8277 | return 'Date';
|
8278 | }
|
8279 | if (promiseExists && objPrototype === Promise.prototype) {
|
8280 | return 'Promise';
|
8281 | }
|
8282 | if (setExists && objPrototype === Set.prototype) {
|
8283 | return 'Set';
|
8284 | }
|
8285 | if (mapExists && objPrototype === Map.prototype) {
|
8286 | return 'Map';
|
8287 | }
|
8288 | if (weakSetExists && objPrototype === WeakSet.prototype) {
|
8289 | return 'WeakSet';
|
8290 | }
|
8291 | if (weakMapExists && objPrototype === WeakMap.prototype) {
|
8292 | return 'WeakMap';
|
8293 | }
|
8294 | if (dataViewExists && objPrototype === DataView.prototype) {
|
8295 | return 'DataView';
|
8296 | }
|
8297 | if (mapExists && objPrototype === mapIteratorPrototype) {
|
8298 | return 'Map Iterator';
|
8299 | }
|
8300 | if (setExists && objPrototype === setIteratorPrototype) {
|
8301 | return 'Set Iterator';
|
8302 | }
|
8303 | if (arrayIteratorExists && objPrototype === arrayIteratorPrototype) {
|
8304 | return 'Array Iterator';
|
8305 | }
|
8306 | if (stringIteratorExists && objPrototype === stringIteratorPrototype) {
|
8307 | return 'String Iterator';
|
8308 | }
|
8309 | if (objPrototype === null) {
|
8310 | return 'Object';
|
8311 | }
|
8312 | return Object.prototype.toString.call(obj).slice(toStringLeftSliceLength, toStringRightSliceLength);
|
8313 | };
|
8314 | module.exports.typeDetect = module.exports;
|
8315 | return module.exports;
|
8316 | },
|
8317 | "node_modules/chai/lib/chai/utils/expectTypes.js": function (require, module, exports) {
|
8318 | var AssertionError = require("node_modules/assertion-error/index.js");
|
8319 | var flag = require("node_modules/chai/lib/chai/utils/flag.js");
|
8320 | var type = require("node_modules/type-detect/index.js");
|
8321 | module.exports = function expectTypes(obj, types) {
|
8322 | var flagMsg = flag(obj, 'message');
|
8323 | var ssfi = flag(obj, 'ssfi');
|
8324 | flagMsg = flagMsg ? flagMsg + ': ' : '';
|
8325 | obj = flag(obj, 'object');
|
8326 | types = types.map(function (t) {
|
8327 | return t.toLowerCase();
|
8328 | });
|
8329 | types.sort();
|
8330 | var str = types.map(function (t, index) {
|
8331 | var art = ~['a', 'e', 'i', 'o', 'u'].indexOf(t.charAt(0)) ? 'an' : 'a';
|
8332 | var or = types.length > 1 && index === types.length - 1 ? 'or ' : '';
|
8333 | return or + art + ' ' + t;
|
8334 | }).join(', ');
|
8335 | var objType = type(obj).toLowerCase();
|
8336 | if (!types.some(function (expected) {
|
8337 | return objType === expected;
|
8338 | })) {
|
8339 | throw new AssertionError(flagMsg + 'object tested must be ' + str + ', but ' + objType + ' given', undefined, ssfi);
|
8340 | }
|
8341 | };
|
8342 | return module.exports;
|
8343 | },
|
8344 | "node_modules/chai/lib/chai/utils/getMessage.js": function (require, module, exports) {
|
8345 | var flag = require("node_modules/chai/lib/chai/utils/flag.js"), getActual = require("node_modules/chai/lib/chai/utils/getActual.js"), inspect = require("node_modules/chai/lib/chai/utils/inspect.js"), objDisplay = require("node_modules/chai/lib/chai/utils/objDisplay.js");
|
8346 | module.exports = function getMessage(obj, args) {
|
8347 | var negate = flag(obj, 'negate'), val = flag(obj, 'object'), expected = args[3], actual = getActual(obj, args), msg = negate ? args[2] : args[1], flagMsg = flag(obj, 'message');
|
8348 | if (typeof msg === "function") msg = msg();
|
8349 | msg = msg || '';
|
8350 | msg = msg.replace(/#\{this\}/g, function () {
|
8351 | return objDisplay(val);
|
8352 | }).replace(/#\{act\}/g, function () {
|
8353 | return objDisplay(actual);
|
8354 | }).replace(/#\{exp\}/g, function () {
|
8355 | return objDisplay(expected);
|
8356 | });
|
8357 | return flagMsg ? flagMsg + ': ' + msg : msg;
|
8358 | };
|
8359 | return module.exports;
|
8360 | },
|
8361 | "node_modules/chai/lib/chai/utils/getActual.js": function (require, module, exports) {
|
8362 | module.exports = function getActual(obj, args) {
|
8363 | return args.length > 4 ? args[4] : obj._obj;
|
8364 | };
|
8365 | return module.exports;
|
8366 | },
|
8367 | "node_modules/chai/lib/chai/utils/inspect.js": function (require, module, exports) {
|
8368 | var getName = require("node_modules/get-func-name/index.js");
|
8369 | var getProperties = require("node_modules/chai/lib/chai/utils/getProperties.js");
|
8370 | var getEnumerableProperties = require("node_modules/chai/lib/chai/utils/getEnumerableProperties.js");
|
8371 | var config = require("node_modules/chai/lib/chai/config.js");
|
8372 | module.exports = inspect;
|
8373 | function inspect(obj, showHidden, depth, colors) {
|
8374 | var ctx = {
|
8375 | showHidden: showHidden,
|
8376 | seen: [],
|
8377 | stylize: function (str) {
|
8378 | return str;
|
8379 | }
|
8380 | };
|
8381 | return formatValue(ctx, obj, (typeof depth === 'undefined' ? 2 : depth));
|
8382 | }
|
8383 | var isDOMElement = function (object) {
|
8384 | if (typeof HTMLElement === 'object') {
|
8385 | return object instanceof HTMLElement;
|
8386 | } else {
|
8387 | return object && typeof object === 'object' && ('nodeType' in object) && object.nodeType === 1 && typeof object.nodeName === 'string';
|
8388 | }
|
8389 | };
|
8390 | function formatValue(ctx, value, recurseTimes) {
|
8391 | if (value && typeof value.inspect === 'function' && value.inspect !== exports.inspect && !(value.constructor && value.constructor.prototype === value)) {
|
8392 | var ret = value.inspect(recurseTimes, ctx);
|
8393 | if (typeof ret !== 'string') {
|
8394 | ret = formatValue(ctx, ret, recurseTimes);
|
8395 | }
|
8396 | return ret;
|
8397 | }
|
8398 | var primitive = formatPrimitive(ctx, value);
|
8399 | if (primitive) {
|
8400 | return primitive;
|
8401 | }
|
8402 | if (isDOMElement(value)) {
|
8403 | if (('outerHTML' in value)) {
|
8404 | return value.outerHTML;
|
8405 | } else {
|
8406 | try {
|
8407 | if (document.xmlVersion) {
|
8408 | var xmlSerializer = new XMLSerializer();
|
8409 | return xmlSerializer.serializeToString(value);
|
8410 | } else {
|
8411 | var ns = "http://www.w3.org/1999/xhtml";
|
8412 | var container = document.createElementNS(ns, '_');
|
8413 | container.appendChild(value.cloneNode(false));
|
8414 | var html = container.innerHTML.replace('><', '>' + value.innerHTML + '<');
|
8415 | container.innerHTML = '';
|
8416 | return html;
|
8417 | }
|
8418 | } catch (err) {}
|
8419 | }
|
8420 | }
|
8421 | var visibleKeys = getEnumerableProperties(value);
|
8422 | var keys = ctx.showHidden ? getProperties(value) : visibleKeys;
|
8423 | var name, nameSuffix;
|
8424 | if (keys.length === 0 || (isError(value) && ((keys.length === 1 && keys[0] === 'stack') || (keys.length === 2 && keys[0] === 'description' && keys[1] === 'stack')))) {
|
8425 | if (typeof value === 'function') {
|
8426 | name = getName(value);
|
8427 | nameSuffix = name ? ': ' + name : '';
|
8428 | return ctx.stylize('[Function' + nameSuffix + ']', 'special');
|
8429 | }
|
8430 | if (isRegExp(value)) {
|
8431 | return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
8432 | }
|
8433 | if (isDate(value)) {
|
8434 | return ctx.stylize(Date.prototype.toUTCString.call(value), 'date');
|
8435 | }
|
8436 | if (isError(value)) {
|
8437 | return formatError(value);
|
8438 | }
|
8439 | }
|
8440 | var base = '', array = false, typedArray = false, braces = ['{', '}'];
|
8441 | if (isTypedArray(value)) {
|
8442 | typedArray = true;
|
8443 | braces = ['[', ']'];
|
8444 | }
|
8445 | if (isArray(value)) {
|
8446 | array = true;
|
8447 | braces = ['[', ']'];
|
8448 | }
|
8449 | if (typeof value === 'function') {
|
8450 | name = getName(value);
|
8451 | nameSuffix = name ? ': ' + name : '';
|
8452 | base = ' [Function' + nameSuffix + ']';
|
8453 | }
|
8454 | if (isRegExp(value)) {
|
8455 | base = ' ' + RegExp.prototype.toString.call(value);
|
8456 | }
|
8457 | if (isDate(value)) {
|
8458 | base = ' ' + Date.prototype.toUTCString.call(value);
|
8459 | }
|
8460 | if (isError(value)) {
|
8461 | return formatError(value);
|
8462 | }
|
8463 | if (keys.length === 0 && (!array || value.length == 0)) {
|
8464 | return braces[0] + base + braces[1];
|
8465 | }
|
8466 | if (recurseTimes < 0) {
|
8467 | if (isRegExp(value)) {
|
8468 | return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
|
8469 | } else {
|
8470 | return ctx.stylize('[Object]', 'special');
|
8471 | }
|
8472 | }
|
8473 | ctx.seen.push(value);
|
8474 | var output;
|
8475 | if (array) {
|
8476 | output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
|
8477 | } else if (typedArray) {
|
8478 | return formatTypedArray(value);
|
8479 | } else {
|
8480 | output = keys.map(function (key) {
|
8481 | return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
|
8482 | });
|
8483 | }
|
8484 | ctx.seen.pop();
|
8485 | return reduceToSingleString(output, base, braces);
|
8486 | }
|
8487 | function formatPrimitive(ctx, value) {
|
8488 | switch (typeof value) {
|
8489 | case 'undefined':
|
8490 | return ctx.stylize('undefined', 'undefined');
|
8491 | case 'string':
|
8492 | var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '').replace(/'/g, "\\'").replace(/\\"/g, '"') + '\'';
|
8493 | return ctx.stylize(simple, 'string');
|
8494 | case 'number':
|
8495 | if (value === 0 && (1 / value) === -Infinity) {
|
8496 | return ctx.stylize('-0', 'number');
|
8497 | }
|
8498 | return ctx.stylize('' + value, 'number');
|
8499 | case 'boolean':
|
8500 | return ctx.stylize('' + value, 'boolean');
|
8501 | case 'symbol':
|
8502 | return ctx.stylize(value.toString(), 'symbol');
|
8503 | }
|
8504 | if (value === null) {
|
8505 | return ctx.stylize('null', 'null');
|
8506 | }
|
8507 | }
|
8508 | function formatError(value) {
|
8509 | return '[' + Error.prototype.toString.call(value) + ']';
|
8510 | }
|
8511 | function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
|
8512 | var output = [];
|
8513 | for (var i = 0, l = value.length; i < l; ++i) {
|
8514 | if (Object.prototype.hasOwnProperty.call(value, String(i))) {
|
8515 | output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true));
|
8516 | } else {
|
8517 | output.push('');
|
8518 | }
|
8519 | }
|
8520 | keys.forEach(function (key) {
|
8521 | if (!key.match(/^\d+$/)) {
|
8522 | output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true));
|
8523 | }
|
8524 | });
|
8525 | return output;
|
8526 | }
|
8527 | function formatTypedArray(value) {
|
8528 | var str = '[ ';
|
8529 | for (var i = 0; i < value.length; ++i) {
|
8530 | if (str.length >= config.truncateThreshold - 7) {
|
8531 | str += '...';
|
8532 | break;
|
8533 | }
|
8534 | str += value[i] + ', ';
|
8535 | }
|
8536 | str += ' ]';
|
8537 | if (str.indexOf(', ]') !== -1) {
|
8538 | str = str.replace(', ]', ' ]');
|
8539 | }
|
8540 | return str;
|
8541 | }
|
8542 | function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
|
8543 | var name;
|
8544 | var propDescriptor = Object.getOwnPropertyDescriptor(value, key);
|
8545 | var str;
|
8546 | if (propDescriptor) {
|
8547 | if (propDescriptor.get) {
|
8548 | if (propDescriptor.set) {
|
8549 | str = ctx.stylize('[Getter/Setter]', 'special');
|
8550 | } else {
|
8551 | str = ctx.stylize('[Getter]', 'special');
|
8552 | }
|
8553 | } else {
|
8554 | if (propDescriptor.set) {
|
8555 | str = ctx.stylize('[Setter]', 'special');
|
8556 | }
|
8557 | }
|
8558 | }
|
8559 | if (visibleKeys.indexOf(key) < 0) {
|
8560 | name = '[' + key + ']';
|
8561 | }
|
8562 | if (!str) {
|
8563 | if (ctx.seen.indexOf(value[key]) < 0) {
|
8564 | if (recurseTimes === null) {
|
8565 | str = formatValue(ctx, value[key], null);
|
8566 | } else {
|
8567 | str = formatValue(ctx, value[key], recurseTimes - 1);
|
8568 | }
|
8569 | if (str.indexOf('\n') > -1) {
|
8570 | if (array) {
|
8571 | str = str.split('\n').map(function (line) {
|
8572 | return ' ' + line;
|
8573 | }).join('\n').substr(2);
|
8574 | } else {
|
8575 | str = '\n' + str.split('\n').map(function (line) {
|
8576 | return ' ' + line;
|
8577 | }).join('\n');
|
8578 | }
|
8579 | }
|
8580 | } else {
|
8581 | str = ctx.stylize('[Circular]', 'special');
|
8582 | }
|
8583 | }
|
8584 | if (typeof name === 'undefined') {
|
8585 | if (array && key.match(/^\d+$/)) {
|
8586 | return str;
|
8587 | }
|
8588 | name = JSON.stringify('' + key);
|
8589 | if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
|
8590 | name = name.substr(1, name.length - 2);
|
8591 | name = ctx.stylize(name, 'name');
|
8592 | } else {
|
8593 | name = name.replace(/'/g, "\\'").replace(/\\"/g, '"').replace(/(^"|"$)/g, "'");
|
8594 | name = ctx.stylize(name, 'string');
|
8595 | }
|
8596 | }
|
8597 | return name + ': ' + str;
|
8598 | }
|
8599 | function reduceToSingleString(output, base, braces) {
|
8600 | var numLinesEst = 0;
|
8601 | var length = output.reduce(function (prev, cur) {
|
8602 | numLinesEst++;
|
8603 | if (cur.indexOf('\n') >= 0) numLinesEst++;
|
8604 | return prev + cur.length + 1;
|
8605 | }, 0);
|
8606 | if (length > 60) {
|
8607 | return braces[0] + (base === '' ? '' : base + '\n ') + ' ' + output.join(',\n ') + ' ' + braces[1];
|
8608 | }
|
8609 | return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
|
8610 | }
|
8611 | function isTypedArray(ar) {
|
8612 | return (typeof ar === 'object' && (/\w+Array]$/).test(objectToString(ar)));
|
8613 | }
|
8614 | function isArray(ar) {
|
8615 | return Array.isArray(ar) || (typeof ar === 'object' && objectToString(ar) === '[object Array]');
|
8616 | }
|
8617 | function isRegExp(re) {
|
8618 | return typeof re === 'object' && objectToString(re) === '[object RegExp]';
|
8619 | }
|
8620 | function isDate(d) {
|
8621 | return typeof d === 'object' && objectToString(d) === '[object Date]';
|
8622 | }
|
8623 | function isError(e) {
|
8624 | return typeof e === 'object' && objectToString(e) === '[object Error]';
|
8625 | }
|
8626 | function objectToString(o) {
|
8627 | return Object.prototype.toString.call(o);
|
8628 | }
|
8629 | return module.exports;
|
8630 | },
|
8631 | "node_modules/chai/lib/chai/utils/objDisplay.js": function (require, module, exports) {
|
8632 | var inspect = require("node_modules/chai/lib/chai/utils/inspect.js");
|
8633 | var config = require("node_modules/chai/lib/chai/config.js");
|
8634 | module.exports = function objDisplay(obj) {
|
8635 | var str = inspect(obj), type = Object.prototype.toString.call(obj);
|
8636 | if (config.truncateThreshold && str.length >= config.truncateThreshold) {
|
8637 | if (type === '[object Function]') {
|
8638 | return !obj.name || obj.name === '' ? '[Function]' : '[Function: ' + obj.name + ']';
|
8639 | } else if (type === '[object Array]') {
|
8640 | return '[ Array(' + obj.length + ') ]';
|
8641 | } else if (type === '[object Object]') {
|
8642 | var keys = Object.keys(obj), kstr = keys.length > 2 ? keys.splice(0, 2).join(', ') + ', ...' : keys.join(', ');
|
8643 | return '{ Object (' + kstr + ') }';
|
8644 | } else {
|
8645 | return str;
|
8646 | }
|
8647 | } else {
|
8648 | return str;
|
8649 | }
|
8650 | };
|
8651 | return module.exports;
|
8652 | },
|
8653 | "node_modules/chai/lib/chai/utils/flag.js": function (require, module, exports) {
|
8654 | module.exports = function flag(obj, key, value) {
|
8655 | var flags = obj.__flags || (obj.__flags = Object.create(null));
|
8656 | if (arguments.length === 3) {
|
8657 | flags[key] = value;
|
8658 | } else {
|
8659 | return flags[key];
|
8660 | }
|
8661 | };
|
8662 | return module.exports;
|
8663 | },
|
8664 | "node_modules/chai/lib/chai/utils/transferFlags.js": function (require, module, exports) {
|
8665 | module.exports = function transferFlags(assertion, object, includeAll) {
|
8666 | var flags = assertion.__flags || (assertion.__flags = Object.create(null));
|
8667 | if (!object.__flags) {
|
8668 | object.__flags = Object.create(null);
|
8669 | }
|
8670 | includeAll = arguments.length === 3 ? includeAll : true;
|
8671 | for (var flag in flags) {
|
8672 | if (includeAll || (flag !== 'object' && flag !== 'ssfi' && flag !== 'lockSsfi' && flag != 'message')) {
|
8673 | object.__flags[flag] = flags[flag];
|
8674 | }
|
8675 | }
|
8676 | };
|
8677 | return module.exports;
|
8678 | },
|
8679 | "node_modules/deep-eql/index.js": function (require, module, exports) {
|
8680 | ;
|
8681 | var type = require("node_modules/type-detect/index.js");
|
8682 | function FakeMap() {
|
8683 | this._key = 'chai/deep-eql__' + Math.random() + Date.now();
|
8684 | }
|
8685 | FakeMap.prototype = {
|
8686 | get: function getMap(key) {
|
8687 | return key[this._key];
|
8688 | },
|
8689 | set: function setMap(key, value) {
|
8690 | if (!Object.isFrozen(key)) {
|
8691 | Object.defineProperty(key, this._key, {
|
8692 | value: value,
|
8693 | configurable: true
|
8694 | });
|
8695 | }
|
8696 | }
|
8697 | };
|
8698 | var MemoizeMap = typeof WeakMap === 'function' ? WeakMap : FakeMap;
|
8699 | function memoizeCompare(leftHandOperand, rightHandOperand, memoizeMap) {
|
8700 | if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) {
|
8701 | return null;
|
8702 | }
|
8703 | var leftHandMap = memoizeMap.get(leftHandOperand);
|
8704 | if (leftHandMap) {
|
8705 | var result = leftHandMap.get(rightHandOperand);
|
8706 | if (typeof result === 'boolean') {
|
8707 | return result;
|
8708 | }
|
8709 | }
|
8710 | return null;
|
8711 | }
|
8712 | function memoizeSet(leftHandOperand, rightHandOperand, memoizeMap, result) {
|
8713 | if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) {
|
8714 | return;
|
8715 | }
|
8716 | var leftHandMap = memoizeMap.get(leftHandOperand);
|
8717 | if (leftHandMap) {
|
8718 | leftHandMap.set(rightHandOperand, result);
|
8719 | } else {
|
8720 | leftHandMap = new MemoizeMap();
|
8721 | leftHandMap.set(rightHandOperand, result);
|
8722 | memoizeMap.set(leftHandOperand, leftHandMap);
|
8723 | }
|
8724 | }
|
8725 | module.exports = deepEqual;
|
8726 | module.exports.MemoizeMap = MemoizeMap;
|
8727 | function deepEqual(leftHandOperand, rightHandOperand, options) {
|
8728 | if (options && options.comparator) {
|
8729 | return extensiveDeepEqual(leftHandOperand, rightHandOperand, options);
|
8730 | }
|
8731 | var simpleResult = simpleEqual(leftHandOperand, rightHandOperand);
|
8732 | if (simpleResult !== null) {
|
8733 | return simpleResult;
|
8734 | }
|
8735 | return extensiveDeepEqual(leftHandOperand, rightHandOperand, options);
|
8736 | }
|
8737 | function simpleEqual(leftHandOperand, rightHandOperand) {
|
8738 | if (leftHandOperand === rightHandOperand) {
|
8739 | return leftHandOperand !== 0 || 1 / leftHandOperand === 1 / rightHandOperand;
|
8740 | }
|
8741 | if (leftHandOperand !== leftHandOperand && rightHandOperand !== rightHandOperand) {
|
8742 | return true;
|
8743 | }
|
8744 | if (isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) {
|
8745 | return false;
|
8746 | }
|
8747 | return null;
|
8748 | }
|
8749 | function extensiveDeepEqual(leftHandOperand, rightHandOperand, options) {
|
8750 | options = options || ({});
|
8751 | options.memoize = options.memoize === false ? false : options.memoize || new MemoizeMap();
|
8752 | var comparator = options && options.comparator;
|
8753 | var memoizeResultLeft = memoizeCompare(leftHandOperand, rightHandOperand, options.memoize);
|
8754 | if (memoizeResultLeft !== null) {
|
8755 | return memoizeResultLeft;
|
8756 | }
|
8757 | var memoizeResultRight = memoizeCompare(rightHandOperand, leftHandOperand, options.memoize);
|
8758 | if (memoizeResultRight !== null) {
|
8759 | return memoizeResultRight;
|
8760 | }
|
8761 | if (comparator) {
|
8762 | var comparatorResult = comparator(leftHandOperand, rightHandOperand);
|
8763 | if (comparatorResult === false || comparatorResult === true) {
|
8764 | memoizeSet(leftHandOperand, rightHandOperand, options.memoize, comparatorResult);
|
8765 | return comparatorResult;
|
8766 | }
|
8767 | var simpleResult = simpleEqual(leftHandOperand, rightHandOperand);
|
8768 | if (simpleResult !== null) {
|
8769 | return simpleResult;
|
8770 | }
|
8771 | }
|
8772 | var leftHandType = type(leftHandOperand);
|
8773 | if (leftHandType !== type(rightHandOperand)) {
|
8774 | memoizeSet(leftHandOperand, rightHandOperand, options.memoize, false);
|
8775 | return false;
|
8776 | }
|
8777 | memoizeSet(leftHandOperand, rightHandOperand, options.memoize, true);
|
8778 | var result = extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options);
|
8779 | memoizeSet(leftHandOperand, rightHandOperand, options.memoize, result);
|
8780 | return result;
|
8781 | }
|
8782 | function extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options) {
|
8783 | switch (leftHandType) {
|
8784 | case 'String':
|
8785 | case 'Number':
|
8786 | case 'Boolean':
|
8787 | case 'Date':
|
8788 | return deepEqual(leftHandOperand.valueOf(), rightHandOperand.valueOf());
|
8789 | case 'Promise':
|
8790 | case 'Symbol':
|
8791 | case 'function':
|
8792 | case 'WeakMap':
|
8793 | case 'WeakSet':
|
8794 | case 'Error':
|
8795 | return leftHandOperand === rightHandOperand;
|
8796 | case 'Arguments':
|
8797 | case 'Int8Array':
|
8798 | case 'Uint8Array':
|
8799 | case 'Uint8ClampedArray':
|
8800 | case 'Int16Array':
|
8801 | case 'Uint16Array':
|
8802 | case 'Int32Array':
|
8803 | case 'Uint32Array':
|
8804 | case 'Float32Array':
|
8805 | case 'Float64Array':
|
8806 | case 'Array':
|
8807 | return iterableEqual(leftHandOperand, rightHandOperand, options);
|
8808 | case 'RegExp':
|
8809 | return regexpEqual(leftHandOperand, rightHandOperand);
|
8810 | case 'Generator':
|
8811 | return generatorEqual(leftHandOperand, rightHandOperand, options);
|
8812 | case 'DataView':
|
8813 | return iterableEqual(new Uint8Array(leftHandOperand.buffer), new Uint8Array(rightHandOperand.buffer), options);
|
8814 | case 'ArrayBuffer':
|
8815 | return iterableEqual(new Uint8Array(leftHandOperand), new Uint8Array(rightHandOperand), options);
|
8816 | case 'Set':
|
8817 | return entriesEqual(leftHandOperand, rightHandOperand, options);
|
8818 | case 'Map':
|
8819 | return entriesEqual(leftHandOperand, rightHandOperand, options);
|
8820 | default:
|
8821 | return objectEqual(leftHandOperand, rightHandOperand, options);
|
8822 | }
|
8823 | }
|
8824 | function regexpEqual(leftHandOperand, rightHandOperand) {
|
8825 | return leftHandOperand.toString() === rightHandOperand.toString();
|
8826 | }
|
8827 | function entriesEqual(leftHandOperand, rightHandOperand, options) {
|
8828 | if (leftHandOperand.size !== rightHandOperand.size) {
|
8829 | return false;
|
8830 | }
|
8831 | if (leftHandOperand.size === 0) {
|
8832 | return true;
|
8833 | }
|
8834 | var leftHandItems = [];
|
8835 | var rightHandItems = [];
|
8836 | leftHandOperand.forEach(function gatherEntries(key, value) {
|
8837 | leftHandItems.push([key, value]);
|
8838 | });
|
8839 | rightHandOperand.forEach(function gatherEntries(key, value) {
|
8840 | rightHandItems.push([key, value]);
|
8841 | });
|
8842 | return iterableEqual(leftHandItems.sort(), rightHandItems.sort(), options);
|
8843 | }
|
8844 | function iterableEqual(leftHandOperand, rightHandOperand, options) {
|
8845 | var length = leftHandOperand.length;
|
8846 | if (length !== rightHandOperand.length) {
|
8847 | return false;
|
8848 | }
|
8849 | if (length === 0) {
|
8850 | return true;
|
8851 | }
|
8852 | var index = -1;
|
8853 | while (++index < length) {
|
8854 | if (deepEqual(leftHandOperand[index], rightHandOperand[index], options) === false) {
|
8855 | return false;
|
8856 | }
|
8857 | }
|
8858 | return true;
|
8859 | }
|
8860 | function generatorEqual(leftHandOperand, rightHandOperand, options) {
|
8861 | return iterableEqual(getGeneratorEntries(leftHandOperand), getGeneratorEntries(rightHandOperand), options);
|
8862 | }
|
8863 | function hasIteratorFunction(target) {
|
8864 | return typeof Symbol !== 'undefined' && typeof target === 'object' && typeof Symbol.iterator !== 'undefined' && typeof target[Symbol.iterator] === 'function';
|
8865 | }
|
8866 | function getIteratorEntries(target) {
|
8867 | if (hasIteratorFunction(target)) {
|
8868 | try {
|
8869 | return getGeneratorEntries(target[Symbol.iterator]());
|
8870 | } catch (iteratorError) {
|
8871 | return [];
|
8872 | }
|
8873 | }
|
8874 | return [];
|
8875 | }
|
8876 | function getGeneratorEntries(generator) {
|
8877 | var generatorResult = generator.next();
|
8878 | var accumulator = [generatorResult.value];
|
8879 | while (generatorResult.done === false) {
|
8880 | generatorResult = generator.next();
|
8881 | accumulator.push(generatorResult.value);
|
8882 | }
|
8883 | return accumulator;
|
8884 | }
|
8885 | function getEnumerableKeys(target) {
|
8886 | var keys = [];
|
8887 | for (var key in target) {
|
8888 | keys.push(key);
|
8889 | }
|
8890 | return keys;
|
8891 | }
|
8892 | function keysEqual(leftHandOperand, rightHandOperand, keys, options) {
|
8893 | var length = keys.length;
|
8894 | if (length === 0) {
|
8895 | return true;
|
8896 | }
|
8897 | for (var i = 0; i < length; i += 1) {
|
8898 | if (deepEqual(leftHandOperand[keys[i]], rightHandOperand[keys[i]], options) === false) {
|
8899 | return false;
|
8900 | }
|
8901 | }
|
8902 | return true;
|
8903 | }
|
8904 | function objectEqual(leftHandOperand, rightHandOperand, options) {
|
8905 | var leftHandKeys = getEnumerableKeys(leftHandOperand);
|
8906 | var rightHandKeys = getEnumerableKeys(rightHandOperand);
|
8907 | if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) {
|
8908 | leftHandKeys.sort();
|
8909 | rightHandKeys.sort();
|
8910 | if (iterableEqual(leftHandKeys, rightHandKeys) === false) {
|
8911 | return false;
|
8912 | }
|
8913 | return keysEqual(leftHandOperand, rightHandOperand, leftHandKeys, options);
|
8914 | }
|
8915 | var leftHandEntries = getIteratorEntries(leftHandOperand);
|
8916 | var rightHandEntries = getIteratorEntries(rightHandOperand);
|
8917 | if (leftHandEntries.length && leftHandEntries.length === rightHandEntries.length) {
|
8918 | leftHandEntries.sort();
|
8919 | rightHandEntries.sort();
|
8920 | return iterableEqual(leftHandEntries, rightHandEntries, options);
|
8921 | }
|
8922 | if (leftHandKeys.length === 0 && leftHandEntries.length === 0 && rightHandKeys.length === 0 && rightHandEntries.length === 0) {
|
8923 | return true;
|
8924 | }
|
8925 | return false;
|
8926 | }
|
8927 | function isPrimitive(value) {
|
8928 | return value === null || typeof value !== 'object';
|
8929 | }
|
8930 | return module.exports;
|
8931 | },
|
8932 | "node_modules/get-func-name/index.js": function (require, module, exports) {
|
8933 | ;
|
8934 | var toString = Function.prototype.toString;
|
8935 | var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\s\(\/]+)/;
|
8936 | function getFuncName(aFunc) {
|
8937 | if (typeof aFunc !== 'function') {
|
8938 | return null;
|
8939 | }
|
8940 | var name = '';
|
8941 | if (typeof Function.prototype.name === 'undefined' && typeof aFunc.name === 'undefined') {
|
8942 | var match = toString.call(aFunc).match(functionNameMatch);
|
8943 | if (match) {
|
8944 | name = match[1];
|
8945 | }
|
8946 | } else {
|
8947 | name = aFunc.name;
|
8948 | }
|
8949 | return name;
|
8950 | }
|
8951 | module.exports = getFuncName;
|
8952 | return module.exports;
|
8953 | },
|
8954 | "node_modules/chai/lib/chai/utils/addProperty.js": function (require, module, exports) {
|
8955 | var chai = require("node_modules/chai/lib/chai.js");
|
8956 | var flag = require("node_modules/chai/lib/chai/utils/flag.js");
|
8957 | var isProxyEnabled = require("node_modules/chai/lib/chai/utils/isProxyEnabled.js");
|
8958 | var transferFlags = require("node_modules/chai/lib/chai/utils/transferFlags.js");
|
8959 | module.exports = function addProperty(ctx, name, getter) {
|
8960 | getter = getter === undefined ? function () {} : getter;
|
8961 | Object.defineProperty(ctx, name, {
|
8962 | get: function propertyGetter() {
|
8963 | if (!isProxyEnabled() && !flag(this, 'lockSsfi')) {
|
8964 | flag(this, 'ssfi', propertyGetter);
|
8965 | }
|
8966 | var result = getter.call(this);
|
8967 | if (result !== undefined) return result;
|
8968 | var newAssertion = new chai.Assertion();
|
8969 | transferFlags(this, newAssertion);
|
8970 | return newAssertion;
|
8971 | },
|
8972 | configurable: true
|
8973 | });
|
8974 | };
|
8975 | return module.exports;
|
8976 | },
|
8977 | "node_modules/chai/lib/chai/utils/addMethod.js": function (require, module, exports) {
|
8978 | var addLengthGuard = require("node_modules/chai/lib/chai/utils/addLengthGuard.js");
|
8979 | var chai = require("node_modules/chai/lib/chai.js");
|
8980 | var flag = require("node_modules/chai/lib/chai/utils/flag.js");
|
8981 | var proxify = require("node_modules/chai/lib/chai/utils/proxify.js");
|
8982 | var transferFlags = require("node_modules/chai/lib/chai/utils/transferFlags.js");
|
8983 | module.exports = function addMethod(ctx, name, method) {
|
8984 | var methodWrapper = function () {
|
8985 | if (!flag(this, 'lockSsfi')) {
|
8986 | flag(this, 'ssfi', methodWrapper);
|
8987 | }
|
8988 | var result = method.apply(this, arguments);
|
8989 | if (result !== undefined) return result;
|
8990 | var newAssertion = new chai.Assertion();
|
8991 | transferFlags(this, newAssertion);
|
8992 | return newAssertion;
|
8993 | };
|
8994 | addLengthGuard(methodWrapper, name, false);
|
8995 | ctx[name] = proxify(methodWrapper, name);
|
8996 | };
|
8997 | return module.exports;
|
8998 | },
|
8999 | "node_modules/chai/lib/chai/utils/overwriteProperty.js": function (require, module, exports) {
|
9000 | var chai = require("node_modules/chai/lib/chai.js");
|
9001 | var flag = require("node_modules/chai/lib/chai/utils/flag.js");
|
9002 | var isProxyEnabled = require("node_modules/chai/lib/chai/utils/isProxyEnabled.js");
|
9003 | var transferFlags = require("node_modules/chai/lib/chai/utils/transferFlags.js");
|
9004 | module.exports = function overwriteProperty(ctx, name, getter) {
|
9005 | var _get = Object.getOwnPropertyDescriptor(ctx, name), _super = function () {};
|
9006 | if (_get && 'function' === typeof _get.get) _super = _get.get;
|
9007 | Object.defineProperty(ctx, name, {
|
9008 | get: function overwritingPropertyGetter() {
|
9009 | if (!isProxyEnabled() && !flag(this, 'lockSsfi')) {
|
9010 | flag(this, 'ssfi', overwritingPropertyGetter);
|
9011 | }
|
9012 | var origLockSsfi = flag(this, 'lockSsfi');
|
9013 | flag(this, 'lockSsfi', true);
|
9014 | var result = getter(_super).call(this);
|
9015 | flag(this, 'lockSsfi', origLockSsfi);
|
9016 | if (result !== undefined) {
|
9017 | return result;
|
9018 | }
|
9019 | var newAssertion = new chai.Assertion();
|
9020 | transferFlags(this, newAssertion);
|
9021 | return newAssertion;
|
9022 | },
|
9023 | configurable: true
|
9024 | });
|
9025 | };
|
9026 | return module.exports;
|
9027 | },
|
9028 | "node_modules/chai/lib/chai/utils/overwriteMethod.js": function (require, module, exports) {
|
9029 | var addLengthGuard = require("node_modules/chai/lib/chai/utils/addLengthGuard.js");
|
9030 | var chai = require("node_modules/chai/lib/chai.js");
|
9031 | var flag = require("node_modules/chai/lib/chai/utils/flag.js");
|
9032 | var proxify = require("node_modules/chai/lib/chai/utils/proxify.js");
|
9033 | var transferFlags = require("node_modules/chai/lib/chai/utils/transferFlags.js");
|
9034 | module.exports = function overwriteMethod(ctx, name, method) {
|
9035 | var _method = ctx[name], _super = function () {
|
9036 | throw new Error(name + ' is not a function');
|
9037 | };
|
9038 | if (_method && 'function' === typeof _method) _super = _method;
|
9039 | var overwritingMethodWrapper = function () {
|
9040 | if (!flag(this, 'lockSsfi')) {
|
9041 | flag(this, 'ssfi', overwritingMethodWrapper);
|
9042 | }
|
9043 | var origLockSsfi = flag(this, 'lockSsfi');
|
9044 | flag(this, 'lockSsfi', true);
|
9045 | var result = method(_super).apply(this, arguments);
|
9046 | flag(this, 'lockSsfi', origLockSsfi);
|
9047 | if (result !== undefined) {
|
9048 | return result;
|
9049 | }
|
9050 | var newAssertion = new chai.Assertion();
|
9051 | transferFlags(this, newAssertion);
|
9052 | return newAssertion;
|
9053 | };
|
9054 | addLengthGuard(overwritingMethodWrapper, name, false);
|
9055 | ctx[name] = proxify(overwritingMethodWrapper, name);
|
9056 | };
|
9057 | return module.exports;
|
9058 | },
|
9059 | "node_modules/chai/lib/chai/utils/addChainableMethod.js": function (require, module, exports) {
|
9060 | var addLengthGuard = require("node_modules/chai/lib/chai/utils/addLengthGuard.js");
|
9061 | var chai = require("node_modules/chai/lib/chai.js");
|
9062 | var flag = require("node_modules/chai/lib/chai/utils/flag.js");
|
9063 | var proxify = require("node_modules/chai/lib/chai/utils/proxify.js");
|
9064 | var transferFlags = require("node_modules/chai/lib/chai/utils/transferFlags.js");
|
9065 | var canSetPrototype = typeof Object.setPrototypeOf === 'function';
|
9066 | var testFn = function () {};
|
9067 | var excludeNames = Object.getOwnPropertyNames(testFn).filter(function (name) {
|
9068 | var propDesc = Object.getOwnPropertyDescriptor(testFn, name);
|
9069 | if (typeof propDesc !== 'object') return true;
|
9070 | return !propDesc.configurable;
|
9071 | });
|
9072 | var call = Function.prototype.call, apply = Function.prototype.apply;
|
9073 | module.exports = function addChainableMethod(ctx, name, method, chainingBehavior) {
|
9074 | if (typeof chainingBehavior !== 'function') {
|
9075 | chainingBehavior = function () {};
|
9076 | }
|
9077 | var chainableBehavior = {
|
9078 | method: method,
|
9079 | chainingBehavior: chainingBehavior
|
9080 | };
|
9081 | if (!ctx.__methods) {
|
9082 | ctx.__methods = {};
|
9083 | }
|
9084 | ctx.__methods[name] = chainableBehavior;
|
9085 | Object.defineProperty(ctx, name, {
|
9086 | get: function chainableMethodGetter() {
|
9087 | chainableBehavior.chainingBehavior.call(this);
|
9088 | var chainableMethodWrapper = function () {
|
9089 | if (!flag(this, 'lockSsfi')) {
|
9090 | flag(this, 'ssfi', chainableMethodWrapper);
|
9091 | }
|
9092 | var result = chainableBehavior.method.apply(this, arguments);
|
9093 | if (result !== undefined) {
|
9094 | return result;
|
9095 | }
|
9096 | var newAssertion = new chai.Assertion();
|
9097 | transferFlags(this, newAssertion);
|
9098 | return newAssertion;
|
9099 | };
|
9100 | addLengthGuard(chainableMethodWrapper, name, true);
|
9101 | if (canSetPrototype) {
|
9102 | var prototype = Object.create(this);
|
9103 | prototype.call = call;
|
9104 | prototype.apply = apply;
|
9105 | Object.setPrototypeOf(chainableMethodWrapper, prototype);
|
9106 | } else {
|
9107 | var asserterNames = Object.getOwnPropertyNames(ctx);
|
9108 | asserterNames.forEach(function (asserterName) {
|
9109 | if (excludeNames.indexOf(asserterName) !== -1) {
|
9110 | return;
|
9111 | }
|
9112 | var pd = Object.getOwnPropertyDescriptor(ctx, asserterName);
|
9113 | Object.defineProperty(chainableMethodWrapper, asserterName, pd);
|
9114 | });
|
9115 | }
|
9116 | transferFlags(this, chainableMethodWrapper);
|
9117 | return proxify(chainableMethodWrapper);
|
9118 | },
|
9119 | configurable: true
|
9120 | });
|
9121 | };
|
9122 | return module.exports;
|
9123 | },
|
9124 | "node_modules/chai/lib/chai/utils/overwriteChainableMethod.js": function (require, module, exports) {
|
9125 | var chai = require("node_modules/chai/lib/chai.js");
|
9126 | var transferFlags = require("node_modules/chai/lib/chai/utils/transferFlags.js");
|
9127 | module.exports = function overwriteChainableMethod(ctx, name, method, chainingBehavior) {
|
9128 | var chainableBehavior = ctx.__methods[name];
|
9129 | var _chainingBehavior = chainableBehavior.chainingBehavior;
|
9130 | chainableBehavior.chainingBehavior = function overwritingChainableMethodGetter() {
|
9131 | var result = chainingBehavior(_chainingBehavior).call(this);
|
9132 | if (result !== undefined) {
|
9133 | return result;
|
9134 | }
|
9135 | var newAssertion = new chai.Assertion();
|
9136 | transferFlags(this, newAssertion);
|
9137 | return newAssertion;
|
9138 | };
|
9139 | var _method = chainableBehavior.method;
|
9140 | chainableBehavior.method = function overwritingChainableMethodWrapper() {
|
9141 | var result = method(_method).apply(this, arguments);
|
9142 | if (result !== undefined) {
|
9143 | return result;
|
9144 | }
|
9145 | var newAssertion = new chai.Assertion();
|
9146 | transferFlags(this, newAssertion);
|
9147 | return newAssertion;
|
9148 | };
|
9149 | };
|
9150 | return module.exports;
|
9151 | },
|
9152 | "node_modules/chai/lib/chai/utils/compareByInspect.js": function (require, module, exports) {
|
9153 | var inspect = require("node_modules/chai/lib/chai/utils/inspect.js");
|
9154 | module.exports = function compareByInspect(a, b) {
|
9155 | return inspect(a) < inspect(b) ? -1 : 1;
|
9156 | };
|
9157 | return module.exports;
|
9158 | },
|
9159 | "node_modules/chai/lib/chai/utils/getOwnEnumerablePropertySymbols.js": function (require, module, exports) {
|
9160 | module.exports = function getOwnEnumerablePropertySymbols(obj) {
|
9161 | if (typeof Object.getOwnPropertySymbols !== 'function') return [];
|
9162 | return Object.getOwnPropertySymbols(obj).filter(function (sym) {
|
9163 | return Object.getOwnPropertyDescriptor(obj, sym).enumerable;
|
9164 | });
|
9165 | };
|
9166 | return module.exports;
|
9167 | },
|
9168 | "node_modules/chai/lib/chai/utils/getOwnEnumerableProperties.js": function (require, module, exports) {
|
9169 | var getOwnEnumerablePropertySymbols = require("node_modules/chai/lib/chai/utils/getOwnEnumerablePropertySymbols.js");
|
9170 | module.exports = function getOwnEnumerableProperties(obj) {
|
9171 | return Object.keys(obj).concat(getOwnEnumerablePropertySymbols(obj));
|
9172 | };
|
9173 | return module.exports;
|
9174 | },
|
9175 | "node_modules/check-error/index.js": function (require, module, exports) {
|
9176 | ;
|
9177 | function compatibleInstance(thrown, errorLike) {
|
9178 | return errorLike instanceof Error && thrown === errorLike;
|
9179 | }
|
9180 | function compatibleConstructor(thrown, errorLike) {
|
9181 | if (errorLike instanceof Error) {
|
9182 | return thrown.constructor === errorLike.constructor || thrown instanceof errorLike.constructor;
|
9183 | } else if (errorLike.prototype instanceof Error || errorLike === Error) {
|
9184 | return thrown.constructor === errorLike || thrown instanceof errorLike;
|
9185 | }
|
9186 | return false;
|
9187 | }
|
9188 | function compatibleMessage(thrown, errMatcher) {
|
9189 | var comparisonString = typeof thrown === 'string' ? thrown : thrown.message;
|
9190 | if (errMatcher instanceof RegExp) {
|
9191 | return errMatcher.test(comparisonString);
|
9192 | } else if (typeof errMatcher === 'string') {
|
9193 | return comparisonString.indexOf(errMatcher) !== -1;
|
9194 | }
|
9195 | return false;
|
9196 | }
|
9197 | var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\(\/]+)/;
|
9198 | function getFunctionName(constructorFn) {
|
9199 | var name = '';
|
9200 | if (typeof constructorFn.name === 'undefined') {
|
9201 | var match = String(constructorFn).match(functionNameMatch);
|
9202 | if (match) {
|
9203 | name = match[1];
|
9204 | }
|
9205 | } else {
|
9206 | name = constructorFn.name;
|
9207 | }
|
9208 | return name;
|
9209 | }
|
9210 | function getConstructorName(errorLike) {
|
9211 | var constructorName = errorLike;
|
9212 | if (errorLike instanceof Error) {
|
9213 | constructorName = getFunctionName(errorLike.constructor);
|
9214 | } else if (typeof errorLike === 'function') {
|
9215 | constructorName = getFunctionName(errorLike).trim() || getFunctionName(new errorLike());
|
9216 | }
|
9217 | return constructorName;
|
9218 | }
|
9219 | function getMessage(errorLike) {
|
9220 | var msg = '';
|
9221 | if (errorLike && errorLike.message) {
|
9222 | msg = errorLike.message;
|
9223 | } else if (typeof errorLike === 'string') {
|
9224 | msg = errorLike;
|
9225 | }
|
9226 | return msg;
|
9227 | }
|
9228 | module.exports = {
|
9229 | compatibleInstance: compatibleInstance,
|
9230 | compatibleConstructor: compatibleConstructor,
|
9231 | compatibleMessage: compatibleMessage,
|
9232 | getMessage: getMessage,
|
9233 | getConstructorName: getConstructorName
|
9234 | };
|
9235 | return module.exports;
|
9236 | },
|
9237 | "node_modules/chai/lib/chai/utils/proxify.js": function (require, module, exports) {
|
9238 | var config = require("node_modules/chai/lib/chai/config.js");
|
9239 | var flag = require("node_modules/chai/lib/chai/utils/flag.js");
|
9240 | var getProperties = require("node_modules/chai/lib/chai/utils/getProperties.js");
|
9241 | var isProxyEnabled = require("node_modules/chai/lib/chai/utils/isProxyEnabled.js");
|
9242 | var builtins = ['__flags', '__methods', '_obj', 'assert'];
|
9243 | module.exports = function proxify(obj, nonChainableMethodName) {
|
9244 | if (!isProxyEnabled()) return obj;
|
9245 | return new Proxy(obj, {
|
9246 | get: function proxyGetter(target, property) {
|
9247 | if (typeof property === 'string' && config.proxyExcludedKeys.indexOf(property) === -1 && !Reflect.has(target, property)) {
|
9248 | if (nonChainableMethodName) {
|
9249 | throw Error('Invalid Chai property: ' + nonChainableMethodName + '.' + property + '. See docs for proper usage of "' + nonChainableMethodName + '".');
|
9250 | }
|
9251 | var orderedProperties = getProperties(target).filter(function (property) {
|
9252 | return !Object.prototype.hasOwnProperty(property) && builtins.indexOf(property) === -1;
|
9253 | }).sort(function (a, b) {
|
9254 | return stringDistance(property, a) - stringDistance(property, b);
|
9255 | });
|
9256 | if (orderedProperties.length && stringDistance(orderedProperties[0], property) < 4) {
|
9257 | throw Error('Invalid Chai property: ' + property + '. Did you mean "' + orderedProperties[0] + '"?');
|
9258 | } else {
|
9259 | throw Error('Invalid Chai property: ' + property);
|
9260 | }
|
9261 | }
|
9262 | if (builtins.indexOf(property) === -1 && !flag(target, 'lockSsfi')) {
|
9263 | flag(target, 'ssfi', proxyGetter);
|
9264 | }
|
9265 | return Reflect.get(target, property);
|
9266 | }
|
9267 | });
|
9268 | };
|
9269 | function stringDistance(strA, strB, memo) {
|
9270 | if (!memo) {
|
9271 | memo = [];
|
9272 | for (var i = 0; i <= strA.length; i++) {
|
9273 | memo[i] = [];
|
9274 | }
|
9275 | }
|
9276 | if (!memo[strA.length] || !memo[strA.length][strB.length]) {
|
9277 | if (strA.length === 0 || strB.length === 0) {
|
9278 | memo[strA.length][strB.length] = Math.max(strA.length, strB.length);
|
9279 | } else {
|
9280 | memo[strA.length][strB.length] = Math.min(stringDistance(strA.slice(0, -1), strB, memo) + 1, stringDistance(strA, strB.slice(0, -1), memo) + 1, stringDistance(strA.slice(0, -1), strB.slice(0, -1), memo) + (strA.slice(-1) === strB.slice(-1) ? 0 : 1));
|
9281 | }
|
9282 | }
|
9283 | return memo[strA.length][strB.length];
|
9284 | }
|
9285 | return module.exports;
|
9286 | },
|
9287 | "node_modules/chai/lib/chai/utils/addLengthGuard.js": function (require, module, exports) {
|
9288 | var config = require("node_modules/chai/lib/chai/config.js");
|
9289 | var fnLengthDesc = Object.getOwnPropertyDescriptor(function () {}, 'length');
|
9290 | module.exports = function addLengthGuard(fn, assertionName, isChainable) {
|
9291 | if (!fnLengthDesc.configurable) return fn;
|
9292 | Object.defineProperty(fn, 'length', {
|
9293 | get: function () {
|
9294 | if (isChainable) {
|
9295 | throw Error('Invalid Chai property: ' + assertionName + '.length. Due' + ' to a compatibility issue, "length" cannot directly follow "' + assertionName + '". Use "' + assertionName + '.lengthOf" instead.');
|
9296 | }
|
9297 | throw Error('Invalid Chai property: ' + assertionName + '.length. See' + ' docs for proper usage of "' + assertionName + '".');
|
9298 | }
|
9299 | });
|
9300 | return fn;
|
9301 | };
|
9302 | return module.exports;
|
9303 | },
|
9304 | "node_modules/chai/lib/chai/utils/isProxyEnabled.js": function (require, module, exports) {
|
9305 | var config = require("node_modules/chai/lib/chai/config.js");
|
9306 | module.exports = function isProxyEnabled() {
|
9307 | return config.useProxy && typeof Proxy !== 'undefined' && typeof Reflect !== 'undefined';
|
9308 | };
|
9309 | return module.exports;
|
9310 | },
|
9311 | "node_modules/chai/lib/chai/utils/isNaN.js": function (require, module, exports) {
|
9312 | function isNaN(value) {
|
9313 | return value !== value;
|
9314 | }
|
9315 | module.exports = Number.isNaN || isNaN;
|
9316 | return module.exports;
|
9317 | },
|
9318 | "node_modules/chai/lib/chai/utils/getProperties.js": function (require, module, exports) {
|
9319 | module.exports = function getProperties(object) {
|
9320 | var result = Object.getOwnPropertyNames(object);
|
9321 | function addProperty(property) {
|
9322 | if (result.indexOf(property) === -1) {
|
9323 | result.push(property);
|
9324 | }
|
9325 | }
|
9326 | var proto = Object.getPrototypeOf(object);
|
9327 | while (proto !== null) {
|
9328 | Object.getOwnPropertyNames(proto).forEach(addProperty);
|
9329 | proto = Object.getPrototypeOf(proto);
|
9330 | }
|
9331 | return result;
|
9332 | };
|
9333 | return module.exports;
|
9334 | },
|
9335 | "node_modules/chai/lib/chai/utils/getEnumerableProperties.js": function (require, module, exports) {
|
9336 | module.exports = function getEnumerableProperties(object) {
|
9337 | var result = [];
|
9338 | for (var name in object) {
|
9339 | result.push(name);
|
9340 | }
|
9341 | return result;
|
9342 | };
|
9343 | return module.exports;
|
9344 | }
|
9345 | }, this);
|
9346 | return require("entry.js");
|
9347 | }).call(this, null, typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : this);
|
9348 |
|
9349 |
|
9350 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QuY29mZmVlIiwiLi4vcGFja2FnZS5qc29uIiwic2ltdWxhdGUuY29mZmVlIiwibm9kZV9tb2R1bGVzL2NoYWkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2hhaS1zdHlsZS9zb3VyY2VzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkuanMiLCJub2RlX21vZHVsZXMvYXNzZXJ0aW9uLWVycm9yL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS9jb25maWcuanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS9hc3NlcnRpb24uanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS9jb3JlL2Fzc2VydGlvbnMuanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS9pbnRlcmZhY2UvZXhwZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvaW50ZXJmYWNlL3Nob3VsZC5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL2ludGVyZmFjZS9hc3NlcnQuanMiLCJub2RlX21vZHVsZXMvcGF0aHZhbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL3Rlc3QuanMiLCJub2RlX21vZHVsZXMvdHlwZS1kZXRlY3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9leHBlY3RUeXBlcy5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2dldE1lc3NhZ2UuanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9nZXRBY3R1YWwuanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9pbnNwZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvb2JqRGlzcGxheS5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2ZsYWcuanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy90cmFuc2ZlckZsYWdzLmpzIiwibm9kZV9tb2R1bGVzL2RlZXAtZXFsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2dldC1mdW5jLW5hbWUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9hZGRQcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2FkZE1ldGhvZC5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL292ZXJ3cml0ZVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvb3ZlcndyaXRlTWV0aG9kLmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvYWRkQ2hhaW5hYmxlTWV0aG9kLmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kLmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvY29tcGFyZUJ5SW5zcGVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2dldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMuanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9nZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcy5qcyIsIm5vZGVfbW9kdWxlcy9jaGVjay1lcnJvci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL3Byb3hpZnkuanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9hZGRMZW5ndGhHdWFyZC5qcyIsIm5vZGVfbW9kdWxlcy9jaGFpL2xpYi9jaGFpL3V0aWxzL2lzUHJveHlFbmFibGVkLmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvaXNOYU4uanMiLCJub2RlX21vZHVsZXMvY2hhaS9saWIvY2hhaS91dGlscy9nZXRQcm9wZXJ0aWVzLmpzIiwibm9kZV9tb2R1bGVzL2NoYWkvbGliL2NoYWkvdXRpbHMvZ2V0RW51bWVyYWJsZVByb3BlcnRpZXMuanMiXSwibmFtZXMiOlsiY2hhaSIsImRpbWVuc2lvbnMiLCJEb20iLCJET00iLCJ3aW5kb3ciLCJxdWlja2RvbSIsIm1vY2hhIiwic2V0dXAiLCJzbG93IiwidGltZW91dCIsImxvY2F0aW9uIiwiaG9zdG5hbWUiLCJiYWlsIiwidXNlIiwiY29uZmlnIiwidHJ1bmNhdGVUaHJlc2hvbGQiLCJzYW5kYm94IiwicmVzdGFydFNhbmRib3giLCJwYXJlbnRFbGVtZW50IiwicmVtb3ZlQ2hpbGQiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJpZCIsInNldEF0dHJpYnV0ZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNoZWNrQ2hpbGRTdHJ1Y3R1cmUiLCJtYWluIiwiY2hpbGRyZW4iLCJjaGlsZCIsImxlbmd0aCIsInRvIiwiZXF1YWwiLCJpbmRleCIsImV4cGVjdCIsImVsIiwicGFyZW50Tm9kZSIsInBhcmVudCIsInN1aXRlIiwidGVzdCIsInBhY2thZ2VWZXJzaW9uIiwidmVyc2lvbiIsImRpdiIsImJlIiwiaW5zdGFuY2VPZiIsIkhUTUxEaXZFbGVtZW50IiwidW5kZWZpbmVkIiwiaSIsImEiLCJjb25zdHJ1Y3RvciIsImxpbmsiLCJhbmNob3IiLCJ0ZXh0Iiwic3BhbiIsImg0IiwiaGVhZGVyIiwiZm9vdGVyIiwic2VjdGlvbiIsImJ1dHRvbiIsImlucHV0IiwidHlwZXMiLCJ0eXBlIiwibmFtZSIsIm5vdCIsImNvbnRhaW4iLCJBIiwiY2xhc3MiLCJwcm9wcyIsIkIiLCJjbGFzc05hbWUiLCJhdHRycyIsIkMiLCJ2YWx1ZSIsIkQiLCJjaGVja2VkIiwiRSIsIm9wdGlvbiIsInNlbGVjdGVkIiwiRiIsImhyZWYiLCJHIiwidXJsIiwiSCIsIkkiLCJpbWciLCJzcmMiLCJKIiwicmVsYXRlZEluc3RhbmNlIiwib2JqIiwiYWJjIiwiZGVmIiwiZ2V0QXR0cmlidXRlIiwiZGF0YXNldCIsIm5vZGVUeXBlIiwidGV4dENvbnRlbnQiLCJyZWxhdGVkIiwib3B0aW9ucyIsImNoaWxkTm9kZXMiLCJub2RlTmFtZSIsInRvTG93ZXJDYXNlIiwic3R5bGUiLCJkaXNwbGF5IiwiYXBwZW5kVG8iLCJyYXciLCJoYXZlIiwiZGl2UmF3IiwiX3F1aWNrRWxlbWVudCIsInJhd0IiLCJyYXdDIiwicmF3QSIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJkb2MiLCJwYXJlbnRzIiwid2luIiwidHJ1ZSIsImFwcGVuZCIsImh0bWwiLCJjb21wdXRlZFN0eWxlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImxhbWVvIiwid2lkdGgiLCJoZWlnaHQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJiYWNrZ3JvdW5kU2l6ZSIsInJlZ0RpdiIsInN2Z0dvb2QiLCJzdmdQb2x5QmFkIiwic3ZnUG9seUdvb2QiLCJzdmdEaXYiLCJzdmdCYWQiLCJIVE1MVW5rbm93bkVsZW1lbnQiLCJTVkdTVkdFbGVtZW50IiwiU1ZHUG9seWxpbmVFbGVtZW50IiwiaHRtbFN0cmluZyIsImJhdGNoIiwiZWxlbWVudHMiLCJpbmNsdWRlIiwiY3NzIiwicmVwbGFjZVdpdGgiLCJyZXBsYWNlIiwicmVtb3ZlTGlzdGVuZXIiLCJvZmYiLCJkaXZBIiwiZGl2QiIsIm1ldGhvZHMiLCJzY3JvbGxUb3AiLCJnZXQiLCJ3ZWlnaHQiLCJzZXQiLCJiaWdJbmRleCIsImVtaXRDb3VudEIiLCJvbiIsImV2ZW50IiwiZW1pdENvdW50QSIsImVtaXRFdmVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJlbWl0IiwiYXJnIiwiYXJndW1lbnRzIiwiZW1pdFByaXZhdGUiLCJlbWl0Q291bnRDIiwiYnViYmxlcyIsImNhbmNlbGFibGUiLCJmYWxzZSIsImUiLCJjdXN0b20iLCJlbWl0Q291bnREIiwiZXZlbnRDQiIsImF0dGFjaExpc3RlbmVycyIsImVtaXRDb3VudCIsIm9uY2UiLCJlbWl0Q29udGV4dCIsImxpc3RlbmVycyIsImV2ZW50cyIsInBhcmVudEEiLCJwYXJlbnRCIiwibWFzdGVyUGFyZW50QiIsInBhcmVudEMiLCJpbnZva2VDb3VudCIsImRldGFjaCIsImFub3RoZXJPYmoiLCJyYXRlIiwiYXBwbHlXaWR0aCIsImV4cGVjdGVkSW5zdGFuY2UiLCJpbnN0YW5jZSIsImZvbnRTaXplIiwic29tZSIsInMiLCJ6SW5kZXgiLCJmaWVsZCIsInRoZUluZGV4IiwiJGhhcHB5IiwiJHJlbGF4ZWQiLCJzdHlsZUFmdGVySW5zZXJ0IiwicG9zaXRpb24iLCJwcm9wIiwidGFyZ2V0IiwiY29tcHV0ZWQiLCJpbmxpbmUiLCJzYWZlIiwic3R5bGVTYWZlIiwiZXFsIiwic3RhdGUiLCJoZWlnaHRBIiwiaGVpZ2h0QiIsInRocm93Iiwic3R5bGVQYXJzZWQiLCJwYXJzZUZsb2F0IiwiY291bnQiLCJvcGFjaXR5IiwiJGZ1bm55IiwicmVjYWxjU3R5bGUiLCJ3cmFwcGVyQ291bnQiLCJ3cmFwcGVyIiwicmVjYWxjT25SZXNpemUiLCJpbm5lckhUTUwiLCJmb3JjZVN0eWxlIiwiaGVhZCIsImF0dHIiLCJyZW1vdmUiLCJoaWRlIiwic2hvdyIsInN2ZyIsImIiLCJjIiwicmVzZXRTdGF0ZSIsInRvZ2dsZVN0YXRlIiwiJGJhc2UiLCJtYXJnaW5Ub3AiLCJtYXJnaW5MZWZ0Iiwic3RhdGVUcmlnZ2VycyIsImhhcHB5IiwicmVsYXhlZCIsIiRob3ZlciIsIiRmb2N1cyIsImF0dGFjaFN0YXRlRXZlbnRzIiwiX2F0dGFjaFN0YXRlRXZlbnRzIiwiTWFpbiIsInBhc3NTdGF0ZVRvQ2hpbGRyZW4iLCJyZWN0QSIsInJlY3QiLCJyZWN0QiIsIkNsaWVudFJlY3QiLCJyZWN0QyIsIm9yaWVudGF0aW9uIiwiYXNwZWN0UmF0aW8iLCJkaXZSZWciLCJwYXJlbnRPcGFjaXR5R2V0dGVyIiwiZGl2QyIsImluc2VydEJlZm9yZSIsImRldGFjaGVkUGFyZW50IiwidmlzaWJpbGl0eSIsImNoaWxkQSIsImNoaWxkQiIsInBpcGVTdGF0ZSIsInVucGFzc2FibGVTdGF0ZXMiLCJzcGFuQSIsInNwYW5CIiwic3ViU3BhbiIsInN1YlBhcmVudEEiLCJzdWJDaGlsZEEiLCJzdWJQYXJlbnRCIiwic3ViQ2hpbGRCIiwiZm9yY2UiLCJkaXZCXyIsImRpdkFfIiwiaXNOYU4iLCJjb2xvciIsInJlc3VsdHMiLCJwdXNoIiwiZGVlcCIsIiRzb21ldGhpbmdFbHNlIiwiZ2V0U3R5bGVzIiwidXBkYXRlU3RhdGVTdHlsZXMiLCJlbDEiLCJlbDIiLCJlbDMiLCJzdWl0ZVRlYXJkb3duIiwicmVmIiwiY29uZmlndXJhYmxlIiwicmVzdG9yZSIsInN1aXRlU2V0dXAiLCJza2lwIiwidGVhcmRvd24iLCJyZXN1bHRzMSIsImxldmVsIiwiQ1NTIiwiY2xlYXJSZWdpc3RlcmVkIiwic2ltdWxhdGUiLCJsaW5lSGVpZ2h0Iiwic2ltdWxhdGVQYXJlbnQiLCJ0b3AiLCJtYXJnaW5Cb3R0b20iLCJmb250V2VpZ2h0IiwiZ2hpIiwibWFyZ2luUmlnaHQiLCJjb21tZW50IiwiZWxlbWVudENoaWxkcmVuIiwiY3JlYXRlVGV4dE5vZGUiLCJjcmVhdGVDb21tZW50IiwiZGl2JCIsInNsaWNlIiwiZG9jdW1lbnRFbGVtZW50IiwiZWxzIiwicGFyZW50TWF0Y2hpbmciLCJwYXJlbnRzVW50aWwiLCJuZXh0IiwibmV4dEFsbCIsIm5leHRFbCIsIm5leHRFbEFsbCIsInByZXYiLCJwcmV2QWxsIiwicHJldkVsIiwicHJldkVsQWxsIiwic2libGluZ3MiLCJyZXZlcnNlIiwiY29uY2F0IiwiZWxlbWVudFNpYmxpbmdzIiwiZGl2QkEiLCJkaXZCQiIsImZpcnN0Q2hpbGQiLCJsYXN0Q2hpbGQiLCJ0ZW1wbGF0ZSIsInNwYXduIiwiY2hpbGRBXzEiLCJjaGlsZEFfMiIsImNoaWxkQV8zIiwiY2hpbGRCXzEiLCJjaGlsZEJfMiIsImRpdkQiLCJzYW5kQm94IiwiY2hpbGRmIiwibmV3Q2hpbGQiLCJuZXdDaGlsZENoaWxkIiwiT2JqZWN0Iiwia2V5cyIsIm5ld1BhcmVudCIsImNoaWxkQyIsImNoaWxkRCIsImNoaWxkRSIsImNoaWxkRiIsImNoaWxkRyIsImluZGV4VHlwZSIsImluZGV4UmVmIiwicXVlcnkiLCJxdWVyeUFsbCIsImFsbEEiLCJhbGxCIiwiTWFpbkEiLCJNYWluQiIsInByZXBlbmQiLCJwcmVwZW5kVG8iLCJhZnRlciIsImluc2VydEFmdGVyIiwiYmVmb3JlIiwiZXhpc3QiLCJlbXB0eSIsIndyYXBBIiwid3JhcEIiLCJ3cmFwQyIsIndyYXAiLCJ1bndyYXAiLCJvcHRzIiwiY2xvbmUiLCJteVByb3AiLCJhbm90aGVyUHJvcCIsImxhc3RQcm9wIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInRvZ2dsZUNsYXNzIiwic2V0UmVmIiwiYmF0Y2gxIiwiYmF0Y2gyIiwicmVzdWx0IiwicmV0dXJuIiwiYXJyIiwic3Bhd25BIiwic3Bhd25CIiwic2VjdGlvblRlbXBsYXRlIiwidG9UZW1wbGF0ZSIsInRlbXBsYXRlU3Bhd24iLCJzZWN0aW9uRWwiLCJ0ZW1wbGF0ZUNvcHlBIiwiZXh0ZW5kIiwidGVtcGxhdGVDb3B5QiIsInRlbXBsYXRlQ29weUMiLCJzcGF3bkMiLCJzcGF3blJhdyIsImNsb25lQSIsImNsb25lQiIsImNsb25lQyIsImZvbnRGYW1pbHkiLCJ0ZW1wbGF0ZUNvcHkiLCJzcGF3bmVkQSIsInNwYXduZWRCIiwic3Bhd25lZEMiLCJkZWZhdWx0cyIsImNvbXB1dGVycyIsImxhYmVsIiwidGhlU3BhbiIsImhlYWRlclRlbXBsYXRlIiwiaGVhZGVyVGVtcGxhdGVDbG9uZSIsImR5bmFtaWNIZWlnaHRTdHlsZSIsIm15SGVpZ2h0IiwicmVuZGVyZWQiLCJ0ZW1wbGF0ZU1haW4iLCJ0ZW1wbGF0ZUNvcHkyIiwiY2hpbGRBXzJfMSIsIkNISUxEYV8yIiwiQ2hpbGRCIiwiQ2hpbGRDIiwidGVtcGxhdGVBIiwidGVtcGxhdGVCIiwidGVtcGxhdGVDIiwidGVtcGxhdGVEIiwic3Bhd25EIiwidmFsdWVBIiwidmFsdWVCIiwiJGFjdGl2ZSIsInJlY2VpdmVkRGF0YSIsImRhdGEiLCJjb250ZXh0IiwiZmlyc3QiLCJzZWNvbmQiLCJ0aGlyZCIsImZvdXJ0aCIsImZpZnRoIiwic2l4dGgiLCJjaGlsZENoaWxkIiwiZCIsImYiLCJhcHBseURhdGEiLCJfaW5pdCIsIm5hbWUxIiwiZGl2RSIsImV4cGVjdGVkIiwic2l6ZSIsInRlbXBsYXRlMSIsInRlbXBsYXRlMiIsInBhc3NEYXRhVG9DaGlsZHJlbiIsImhpc3RvcnkiLCJpbnZva2VDb21wdXRlcnNPbmNlIiwiaXNUZW1wbGF0ZSIsImlzUXVpY2tFbCIsImlzRWwiLCJzdHJpbmdpZmllZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJzZWN0aW9uQ29weSIsInBhcnNlIiwiY2hhaW5SZXN1bHQiLCJ1cGRhdGVTdGF0ZVRleHRzIiwiY2IiLCJsb3N0T3B0cyIsInVwZGF0ZU9wdGlvbnMiLCJudWxsIiwiX3JlbW92ZUNoaWxkIiwiSFRNTEVsZW1lbnQiLCJwcm90b3R5cGUiLCJvbkV2ZW50IiwiZXZlbnROYW1lIiwiY2FsbGJhY2siLCJhdHRhY2hFdmVudCIsInJlbW92ZUV2ZW50IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImRldGFjaEV2ZW50IiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJkaXNwYXRjaEV2ZW50IiwiVGV4dCIsIm5vbkVsZW1lbnRTdWZmaXgiLCJlbGVtZW50U3VmZml4IiwiY3JlYXRvciIsImoiLCJET01SZWN0Iiwib3JpZ0Rlc2NyaXB0b3JzIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwibW9kdWxlIiwiZXhwb3J0cyIsImN1cnJlbnQiLCJpbm5lcldpZHRoIiwiaW5uZXJIZWlnaHQiLCJnZXRSZWFsIiwiZGltZW5zaW9uIiwibGV0dGVyIiwidG9VcHBlckNhc2UiLCJjYWxsIiwib3ZlcndyaXRlIiwib3ZlcndyaXR0ZW4iLCJkZWZpbmVQcm9wZXJ0eSIsIm5ld1ZhbHVlIiwiY2hhaVN0eWxlIiwidXRpbHMiLCJBc3NlcnRpb24iLCJmbGFnIiwic2FtcGxlRGl2Iiwic2FtcGxlU3R5bGUiLCJzYW1wbGVJZnJhbWUiLCJhZGRNZXRob2QiLCJwcm9wZXJ0eSIsImVsZW1lbnQiLCJ0cmltIiwiaXNOb25Db2xvcnMiLCJwcm9wZXJ0eVZhbHVlIiwiYXNzZXJ0aW9uIiwiY29tcGFyZUNTU1ZhbHVlIiwiQm9vbGVhbiIsImVsZW1lbnRUYWciLCJ0YWdOYW1lIiwidGhyb3dNZXNzYWdlIiwidGhyb3dNZXNzYWdlTmVnYXRpdmUiLCJhc3NlcnQiLCJwcm9wZXJ0eUhpZmVuQ2FzZSIsIm1hdGNoIiwic2V0UHJvcGVydHkiLCJoYXNBdXRvVmFsdWUiLCJpbmNsdWRlcyIsInJlZyIsIlJlZ0V4cCIsImVzY2FwZVJlZ0V4cCIsIlN0cmluZyIsInVzZWQiLCJBc3NlcnRpb25FcnJvciIsInV0aWwiLCJmbiIsImluZGV4T2YiLCJjb3JlIiwic2hvdWxkIiwiZXhjbHVkZXMiLCJyZXMiLCJmb3JFYWNoIiwia2V5IiwiYXJncyIsImV4Y2x1ZGVQcm9wcyIsIm1lc3NhZ2UiLCJfcHJvcHMiLCJzc2YiLCJleGNsdWRlIiwic2hvd0RpZmYiLCJjYWxsZWUiLCJFcnJvciIsImNhcHR1cmVTdGFja1RyYWNlIiwic3RhY2siLCJjcmVhdGUiLCJ0b0pTT04iLCJwYXRodmFsIiwiZXhwZWN0VHlwZXMiLCJnZXRNZXNzYWdlIiwiZ2V0QWN0dWFsIiwiaW5zcGVjdCIsIm9iakRpc3BsYXkiLCJ0cmFuc2ZlckZsYWdzIiwiZ2V0UGF0aEluZm8iLCJoYXNQcm9wZXJ0eSIsImdldE5hbWUiLCJhZGRQcm9wZXJ0eSIsIm92ZXJ3cml0ZVByb3BlcnR5Iiwib3ZlcndyaXRlTWV0aG9kIiwiYWRkQ2hhaW5hYmxlTWV0aG9kIiwib3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kIiwiY29tcGFyZUJ5SW5zcGVjdCIsImdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMiLCJnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcyIsImNoZWNrRXJyb3IiLCJwcm94aWZ5IiwiYWRkTGVuZ3RoR3VhcmQiLCJpc1Byb3h5RW5hYmxlZCIsImluY2x1ZGVTdGFjayIsInVzZVByb3h5IiwicHJveHlFeGNsdWRlZEtleXMiLCJfY2hhaSIsIm1zZyIsInNzZmkiLCJsb2NrU3NmaSIsImNvbnNvbGUiLCJ3YXJuIiwiY2hhaW5pbmdCZWhhdmlvciIsImV4cHIiLCJuZWdhdGVNc2ciLCJfYWN0dWFsIiwib2siLCJhY3R1YWwiLCJ2YWwiLCJfIiwiY2hhaW4iLCJhcnRpY2xlIiwiY2hhckF0IiwiYW4iLCJvYmpUeXBlIiwiZmxhZ01zZyIsIm5lZ2F0ZSIsImlzRGVlcCIsImRlc2NyaXB0b3IiLCJpbmNsdWRlZCIsImhhcyIsImlzRXFsIiwiU2FtZVZhbHVlWmVybyIsIml0ZW0iLCJmaXJzdEVyciIsIm51bUVycnMiLCJwcm9wQXNzZXJ0aW9uIiwiZXJyIiwiY29tcGF0aWJsZUNvbnN0cnVjdG9yIiwiaW5jbHVkZUNoYWluaW5nQmVoYXZpb3IiLCJpdGVtc0NvdW50IiwiY2hlY2tBcmd1bWVudHMiLCJfb2JqIiwiYXNzZXJ0RXF1YWwiLCJhc3NlcnRFcWwiLCJuIiwiZG9MZW5ndGgiLCJtc2dQcmVmaXgiLCJuVHlwZSIsInNob3VsZFRocm93IiwiZXJyb3JNZXNzYWdlIiwicHJpbnRPYmoiLCJsZW4iLCJhc3NlcnRBYm92ZSIsImFzc2VydExlYXN0IiwiYXNzZXJ0QmVsb3ciLCJhc3NlcnRNb3N0Iiwic3RhcnQiLCJmaW5pc2giLCJzdGFydFR5cGUiLCJmaW5pc2hUeXBlIiwicmFuZ2UiLCJ0b1VUQ1N0cmluZyIsImlzSW5zdGFuY2VPZiIsIlR5cGVFcnJvciIsImFzc2VydEluc3RhbmNlT2YiLCJpc05lc3RlZCIsImlzT3duIiwicGF0aEluZm8iLCJoYXNPd25Qcm9wZXJ0eSIsImV4aXN0cyIsImFzc2VydFByb3BlcnR5IiwiYXBwbHkiLCJhc3NlcnRPd25Qcm9wZXJ0eSIsImFjdHVhbERlc2NyaXB0b3IiLCJhc3NlcnRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJhc3NlcnRMZW5ndGgiLCJhc3NlcnRMZW5ndGhDaGFpbiIsInJlIiwiZXhlYyIsImFzc2VydE1hdGNoIiwic3RyIiwiaXMiLCJrZXlzVHlwZSIsImRlZXBTdHIiLCJtaXhlZEFyZ3NNc2ciLCJBcnJheSIsIm1hcCIsImFueSIsImFsbCIsImV4cGVjdGVkS2V5IiwiYWN0dWFsS2V5IiwiZXZlcnkiLCJsYXN0IiwicG9wIiwiam9pbiIsInNvcnQiLCJhc3NlcnRLZXlzIiwiZXJyb3JMaWtlIiwiZXJyTXNnTWF0Y2hlciIsImNhdWdodEVyciIsImV2ZXJ5QXJnSXNVbmRlZmluZWQiLCJldmVyeUFyZ0lzRGVmaW5lZCIsImVycm9yTGlrZUZhaWwiLCJlcnJNc2dNYXRjaGVyRmFpbCIsImVycm9yTGlrZVN0cmluZyIsImdldENvbnN0cnVjdG9yTmFtZSIsInRvU3RyaW5nIiwiaXNDb21wYXRpYmxlSW5zdGFuY2UiLCJjb21wYXRpYmxlSW5zdGFuY2UiLCJpc0NvbXBhdGlibGVDb25zdHJ1Y3RvciIsInBsYWNlaG9sZGVyIiwiaXNDb21wYXRpYmxlTWVzc2FnZSIsImNvbXBhdGlibGVNZXNzYWdlIiwiYXNzZXJ0VGhyb3dzIiwibWV0aG9kIiwiaXRzZWxmIiwicmVzcG9uZFRvIiwibWF0Y2hlciIsInNhdGlzZnkiLCJkZWx0YSIsIk1hdGgiLCJhYnMiLCJjbG9zZVRvIiwic3Vic2V0Iiwic3VwZXJzZXQiLCJjbXAiLCJjb250YWlucyIsIm9yZGVyZWQiLCJlbGVtIiwiaWR4IiwibWF0Y2hJZHgiLCJzcGxpY2UiLCJlbGVtMiIsInN1YmplY3QiLCJmYWlsTXNnIiwiZmFpbE5lZ2F0ZU1zZyIsImxlbmd0aENoZWNrIiwiaXNTdWJzZXRPZiIsImxpc3QiLCJvbmVPZiIsImluaXRpYWwiLCJmaW5hbCIsIm1zZ09iaiIsImFzc2VydENoYW5nZXMiLCJhc3NlcnRJbmNyZWFzZXMiLCJhc3NlcnREZWNyZWFzZXMiLCJiZWhhdmlvciIsInJlYWxEZWx0YSIsImV4cHJlc3Npb24iLCJhc3NlcnREZWx0YSIsImlzRXh0ZW5zaWJsZSIsImlzU2VhbGVkIiwiaXNGcm96ZW4iLCJpc0Zpbml0ZSIsImZhaWwiLCJvcGVyYXRvciIsIk51bWJlciIsIlN5bWJvbCIsInZhbHVlT2YiLCJzaG91bGRHZXR0ZXIiLCJlbnVtZXJhYmxlIiwid3JpdGFibGUiLCJzaG91bGRTZXR0ZXIiLCJ2YWwxIiwidmFsMiIsIlRocm93IiwiZXJydCIsImVycnMiLCJsb2FkU2hvdWxkIiwiU2hvdWxkIiwiZXhwcmVzcyIsImVycm1zZyIsImlzT2siLCJpc05vdE9rIiwiYWN0IiwiZXhwIiwibm90RXF1YWwiLCJzdHJpY3RFcXVhbCIsIm5vdFN0cmljdEVxdWFsIiwiZGVlcEVxdWFsIiwiZGVlcFN0cmljdEVxdWFsIiwibm90RGVlcEVxdWFsIiwiaXNBYm92ZSIsImFidiIsImFib3ZlIiwiaXNBdExlYXN0IiwiYXRsc3QiLCJsZWFzdCIsImlzQmVsb3ciLCJibHciLCJiZWxvdyIsImlzQXRNb3N0IiwiYXRtc3QiLCJtb3N0IiwiaXNUcnVlIiwiaXNOb3RUcnVlIiwiaXNGYWxzZSIsImlzTm90RmFsc2UiLCJpc051bGwiLCJpc05vdE51bGwiLCJOYU4iLCJpc05vdE5hTiIsIm5vdEV4aXN0cyIsImlzVW5kZWZpbmVkIiwiaXNEZWZpbmVkIiwiaXNGdW5jdGlvbiIsImlzTm90RnVuY3Rpb24iLCJpc09iamVjdCIsImlzTm90T2JqZWN0IiwiaXNBcnJheSIsImlzTm90QXJyYXkiLCJpc1N0cmluZyIsImlzTm90U3RyaW5nIiwiaXNOdW1iZXIiLCJpc05vdE51bWJlciIsImZpbml0ZSIsImlzQm9vbGVhbiIsImlzTm90Qm9vbGVhbiIsInR5cGVPZiIsIm5vdFR5cGVPZiIsIm5vdEluc3RhbmNlT2YiLCJpbmMiLCJub3RJbmNsdWRlIiwiZGVlcEluY2x1ZGUiLCJub3REZWVwSW5jbHVkZSIsIm5lc3RlZEluY2x1ZGUiLCJuZXN0ZWQiLCJub3ROZXN0ZWRJbmNsdWRlIiwiZGVlcE5lc3RlZEluY2x1ZGUiLCJub3REZWVwTmVzdGVkSW5jbHVkZSIsIm93bkluY2x1ZGUiLCJvd24iLCJub3RPd25JbmNsdWRlIiwiZGVlcE93bkluY2x1ZGUiLCJub3REZWVwT3duSW5jbHVkZSIsIm5vdE1hdGNoIiwibm90UHJvcGVydHkiLCJwcm9wZXJ0eVZhbCIsIm5vdFByb3BlcnR5VmFsIiwiZGVlcFByb3BlcnR5VmFsIiwibm90RGVlcFByb3BlcnR5VmFsIiwib3duUHJvcGVydHkiLCJub3RPd25Qcm9wZXJ0eSIsIm93blByb3BlcnR5VmFsIiwibm90T3duUHJvcGVydHlWYWwiLCJkZWVwT3duUHJvcGVydHlWYWwiLCJub3REZWVwT3duUHJvcGVydHlWYWwiLCJuZXN0ZWRQcm9wZXJ0eSIsIm5vdE5lc3RlZFByb3BlcnR5IiwibmVzdGVkUHJvcGVydHlWYWwiLCJub3ROZXN0ZWRQcm9wZXJ0eVZhbCIsImRlZXBOZXN0ZWRQcm9wZXJ0eVZhbCIsIm5vdERlZXBOZXN0ZWRQcm9wZXJ0eVZhbCIsImxlbmd0aE9mIiwiaGFzQW55S2V5cyIsImhhc0FsbEtleXMiLCJjb250YWluc0FsbEtleXMiLCJkb2VzTm90SGF2ZUFueUtleXMiLCJkb2VzTm90SGF2ZUFsbEtleXMiLCJoYXNBbnlEZWVwS2V5cyIsImhhc0FsbERlZXBLZXlzIiwiY29udGFpbnNBbGxEZWVwS2V5cyIsImRvZXNOb3RIYXZlQW55RGVlcEtleXMiLCJkb2VzTm90SGF2ZUFsbERlZXBLZXlzIiwidGhyb3dzIiwiYXNzZXJ0RXJyIiwiZG9lc05vdFRocm93IiwiYXBwcm94aW1hdGVseSIsInNhbWVNZW1iZXJzIiwic2V0MSIsInNldDIiLCJzYW1lIiwibWVtYmVycyIsIm5vdFNhbWVNZW1iZXJzIiwic2FtZURlZXBNZW1iZXJzIiwibm90U2FtZURlZXBNZW1iZXJzIiwic2FtZU9yZGVyZWRNZW1iZXJzIiwibm90U2FtZU9yZGVyZWRNZW1iZXJzIiwic2FtZURlZXBPcmRlcmVkTWVtYmVycyIsIm5vdFNhbWVEZWVwT3JkZXJlZE1lbWJlcnMiLCJpbmNsdWRlTWVtYmVycyIsIm5vdEluY2x1ZGVNZW1iZXJzIiwiaW5jbHVkZURlZXBNZW1iZXJzIiwibm90SW5jbHVkZURlZXBNZW1iZXJzIiwiaW5jbHVkZU9yZGVyZWRNZW1iZXJzIiwibm90SW5jbHVkZU9yZGVyZWRNZW1iZXJzIiwiaW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycyIsIm5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMiLCJpbkxpc3QiLCJjaGFuZ2VzIiwiY2hhbmdlIiwiY2hhbmdlc0J5IiwidG1wTXNnIiwiYnkiLCJkb2VzTm90Q2hhbmdlIiwiY2hhbmdlc0J1dE5vdEJ5IiwiYnV0IiwiaW5jcmVhc2VzIiwiaW5jcmVhc2UiLCJpbmNyZWFzZXNCeSIsImRvZXNOb3RJbmNyZWFzZSIsImluY3JlYXNlc0J1dE5vdEJ5IiwiZGVjcmVhc2VzIiwiZGVjcmVhc2UiLCJkZWNyZWFzZXNCeSIsImRvZXNOb3REZWNyZWFzZSIsImRvZXNOb3REZWNyZWFzZUJ5IiwiZGVjcmVhc2VzQnV0Tm90QnkiLCJpZkVycm9yIiwiZXh0ZW5zaWJsZSIsImlzTm90RXh0ZW5zaWJsZSIsInNlYWxlZCIsImlzTm90U2VhbGVkIiwiZnJvemVuIiwiaXNOb3RGcm96ZW4iLCJpc0VtcHR5IiwiaXNOb3RFbXB0eSIsImFzIiwiYWxpYXMiLCJwYXRoIiwicGFydHMiLCJyZWdleHAiLCJtQXJyIiwicGFyc2VkIiwicCIsInBhdGhEZXB0aCIsInRlbXBvcmFyeVZhbHVlIiwicGFydCIsInRlbXBPYmoiLCJwcm9wTmFtZSIsInByb3BWYWwiLCJwYXJzZVBhdGgiLCJpbmZvIiwiaW50ZXJuYWxHZXRQYXRoVmFsdWUiLCJpbnRlcm5hbFNldFBhdGhWYWx1ZSIsImdldFBhdGhWYWx1ZSIsInNldFBhdGhWYWx1ZSIsInByb21pc2VFeGlzdHMiLCJQcm9taXNlIiwiZ2xvYmFsT2JqZWN0IiwiZ2xvYmFsIiwic2VsZiIsImlzRG9tIiwic3ltYm9sRXhpc3RzIiwibWFwRXhpc3RzIiwiTWFwIiwic2V0RXhpc3RzIiwiU2V0Iiwid2Vha01hcEV4aXN0cyIsIldlYWtNYXAiLCJ3ZWFrU2V0RXhpc3RzIiwiV2Vha1NldCIsImRhdGFWaWV3RXhpc3RzIiwiRGF0YVZpZXciLCJzeW1ib2xJdGVyYXRvckV4aXN0cyIsIml0ZXJhdG9yIiwic3ltYm9sVG9TdHJpbmdUYWdFeGlzdHMiLCJ0b1N0cmluZ1RhZyIsInNldEVudHJpZXNFeGlzdHMiLCJlbnRyaWVzIiwibWFwRW50cmllc0V4aXN0cyIsInNldEl0ZXJhdG9yUHJvdG90eXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJtYXBJdGVyYXRvclByb3RvdHlwZSIsImFycmF5SXRlcmF0b3JFeGlzdHMiLCJhcnJheUl0ZXJhdG9yUHJvdG90eXBlIiwic3RyaW5nSXRlcmF0b3JFeGlzdHMiLCJzdHJpbmdJdGVyYXRvclByb3RvdHlwZSIsInRvU3RyaW5nTGVmdFNsaWNlTGVuZ3RoIiwidG9TdHJpbmdSaWdodFNsaWNlTGVuZ3RoIiwidHlwZW9mT2JqIiwibmF2aWdhdG9yIiwibWltZVR5cGVzIiwicGx1Z2lucyIsInN0cmluZ1RhZyIsIm9ialByb3RvdHlwZSIsIkRhdGUiLCJ0eXBlRGV0ZWN0IiwidCIsImFydCIsIm9yIiwiZ2V0UHJvcGVydGllcyIsImdldEVudW1lcmFibGVQcm9wZXJ0aWVzIiwic2hvd0hpZGRlbiIsImRlcHRoIiwiY29sb3JzIiwiY3R4Iiwic2VlbiIsInN0eWxpemUiLCJmb3JtYXRWYWx1ZSIsImlzRE9NRWxlbWVudCIsIm9iamVjdCIsInJlY3Vyc2VUaW1lcyIsInJldCIsInByaW1pdGl2ZSIsImZvcm1hdFByaW1pdGl2ZSIsIm91dGVySFRNTCIsInhtbFZlcnNpb24iLCJ4bWxTZXJpYWxpemVyIiwiWE1MU2VyaWFsaXplciIsInNlcmlhbGl6ZVRvU3RyaW5nIiwibnMiLCJjb250YWluZXIiLCJjcmVhdGVFbGVtZW50TlMiLCJjbG9uZU5vZGUiLCJ2aXNpYmxlS2V5cyIsIm5hbWVTdWZmaXgiLCJpc0Vycm9yIiwiaXNSZWdFeHAiLCJpc0RhdGUiLCJmb3JtYXRFcnJvciIsImJhc2UiLCJhcnJheSIsInR5cGVkQXJyYXkiLCJicmFjZXMiLCJpc1R5cGVkQXJyYXkiLCJvdXRwdXQiLCJmb3JtYXRBcnJheSIsImZvcm1hdFR5cGVkQXJyYXkiLCJmb3JtYXRQcm9wZXJ0eSIsInJlZHVjZVRvU2luZ2xlU3RyaW5nIiwic2ltcGxlIiwiSW5maW5pdHkiLCJsIiwicHJvcERlc2NyaXB0b3IiLCJzcGxpdCIsImxpbmUiLCJzdWJzdHIiLCJudW1MaW5lc0VzdCIsInJlZHVjZSIsImN1ciIsImFyIiwib2JqZWN0VG9TdHJpbmciLCJvIiwia3N0ciIsImZsYWdzIiwiX19mbGFncyIsImluY2x1ZGVBbGwiLCJfa2V5IiwicmFuZG9tIiwibm93IiwiRmFrZU1hcCIsIk1lbW9pemVNYXAiLCJsZWZ0SGFuZE9wZXJhbmQiLCJyaWdodEhhbmRPcGVyYW5kIiwibWVtb2l6ZU1hcCIsImlzUHJpbWl0aXZlIiwibGVmdEhhbmRNYXAiLCJjb21wYXJhdG9yIiwiZXh0ZW5zaXZlRGVlcEVxdWFsIiwic2ltcGxlUmVzdWx0Iiwic2ltcGxlRXF1YWwiLCJtZW1vaXplIiwibWVtb2l6ZVJlc3VsdExlZnQiLCJtZW1vaXplQ29tcGFyZSIsIm1lbW9pemVSZXN1bHRSaWdodCIsImNvbXBhcmF0b3JSZXN1bHQiLCJtZW1vaXplU2V0IiwibGVmdEhhbmRUeXBlIiwiZXh0ZW5zaXZlRGVlcEVxdWFsQnlUeXBlIiwiaXRlcmFibGVFcXVhbCIsInJlZ2V4cEVxdWFsIiwiZ2VuZXJhdG9yRXF1YWwiLCJVaW50OEFycmF5IiwiYnVmZmVyIiwiZW50cmllc0VxdWFsIiwib2JqZWN0RXF1YWwiLCJsZWZ0SGFuZEl0ZW1zIiwicmlnaHRIYW5kSXRlbXMiLCJnZXRHZW5lcmF0b3JFbnRyaWVzIiwiaGFzSXRlcmF0b3JGdW5jdGlvbiIsIml0ZXJhdG9yRXJyb3IiLCJnZW5lcmF0b3IiLCJnZW5lcmF0b3JSZXN1bHQiLCJhY2N1bXVsYXRvciIsImRvbmUiLCJsZWZ0SGFuZEtleXMiLCJnZXRFbnVtZXJhYmxlS2V5cyIsInJpZ2h0SGFuZEtleXMiLCJrZXlzRXF1YWwiLCJsZWZ0SGFuZEVudHJpZXMiLCJnZXRJdGVyYXRvckVudHJpZXMiLCJyaWdodEhhbmRFbnRyaWVzIiwiRnVuY3Rpb24iLCJmdW5jdGlvbk5hbWVNYXRjaCIsImFGdW5jIiwiZ2V0RnVuY05hbWUiLCJnZXR0ZXIiLCJwcm9wZXJ0eUdldHRlciIsIm5ld0Fzc2VydGlvbiIsIm1ldGhvZFdyYXBwZXIiLCJfZ2V0IiwiX3N1cGVyIiwib3ZlcndyaXRpbmdQcm9wZXJ0eUdldHRlciIsIm9yaWdMb2NrU3NmaSIsIl9tZXRob2QiLCJvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIiLCJjYW5TZXRQcm90b3R5cGUiLCJzZXRQcm90b3R5cGVPZiIsInRlc3RGbiIsImV4Y2x1ZGVOYW1lcyIsImdldE93blByb3BlcnR5TmFtZXMiLCJmaWx0ZXIiLCJwcm9wRGVzYyIsImNoYWluYWJsZUJlaGF2aW9yIiwiX19tZXRob2RzIiwiY2hhaW5hYmxlTWV0aG9kV3JhcHBlciIsImFzc2VydGVyTmFtZXMiLCJhc3NlcnRlck5hbWUiLCJwZCIsIl9jaGFpbmluZ0JlaGF2aW9yIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwic3ltIiwidGhyb3duIiwiZXJyTWF0Y2hlciIsImNvbXBhcmlzb25TdHJpbmciLCJjb25zdHJ1Y3RvckZuIiwiY29uc3RydWN0b3JOYW1lIiwiZ2V0RnVuY3Rpb25OYW1lIiwiYnVpbHRpbnMiLCJub25DaGFpbmFibGVNZXRob2ROYW1lIiwiUHJveHkiLCJSZWZsZWN0Iiwib3JkZXJlZFByb3BlcnRpZXMiLCJzdHJpbmdEaXN0YW5jZSIsInByb3h5R2V0dGVyIiwic3RyQSIsInN0ckIiLCJtZW1vIiwibWF4IiwibWluIiwiZm5MZW5ndGhEZXNjIiwiYXNzZXJ0aW9uTmFtZSIsImlzQ2hhaW5hYmxlIiwicHJvdG8iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBQTtLQUFDQyxhQUVpQjtBQURsQixLQUFDQyxNQUFNLEtBQUNDLE1BQU1DLE9BQU9DO0FBQ3JCQyxNQUFNQyxNQUFNO0FBQ1pELE1BQU1FLEtBQUs7QUFDWEYsTUFBTUcsUUFBUTtBQUNkLEtBQW9CTCxPQUFPTSxTQUFTQyxVQUFwQ0w7TUFBTU07O0FBQ05aLE9B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QU87QUFHcEIsT0FBT0EsVUFBVUE7O0FBSW5CcVosT0FBT0MsVUFBVW1QLE9BQU92YyxTQUFTQTs7OztBQ05qQ21OLE9BQU9DLFVBQVUsdUJBQXVCOGQsUUFBUTtBQUM5QyxJQUFJdmtCLFNBQVN2QyxPQUFPNHRCLG9CQUFvQjlHO0FBRXhDLHFCQUFxQnpjLFVBQVU7QUFDN0IsSUFBSTlILE9BQU93SixRQUFRMUIsY0FBYyxDQUFDLEdBQUc7QUFDbkM5SCxPQUFPeEcsS0FBS3NPOzs7QUFJaEIsSUFBSXdsQixRQUFRN3ZCLE9BQU9pbEIsZUFBZTZCO0FBQ2xDLE9BQU8rSSxVQUFVLE1BQU07QUFDckI3dkIsT0FBTzR0QixvQkFBb0JpQyxPQUFPempCLFFBQVF5QjtBQUMxQ2dpQixRQUFRN3ZCLE9BQU9pbEIsZUFBZTRLOztBQUdoQyxPQUFPdHRCOzs7OztBQ2ZUd0csT0FBT0MsVUFBVSxpQ0FBaUM4ZCxRQUFRO0FBQ3hELElBQUl2a0IsU0FBUztBQUNiLFNBQVN2VCxRQUFRODNCLFFBQVE7QUFDdkJ2a0IsT0FBT3hHLEtBQUsvTTs7QUFFZCxPQUFPdVQiLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiQGRpbWVuc2lvbnMgPSBpbXBvcnQgJy4vc2ltdWxhdGUuY29mZmVlJ1xuQERvbSA9IEBET00gPSB3aW5kb3cucXVpY2tkb21cbm1vY2hhLnNldHVwKCd0ZGQnKVxubW9jaGEuc2xvdyg0MDApXG5tb2NoYS50aW1lb3V0KDEyMDAwKVxubW9jaGEuYmFpbCgpIHVubGVzcyB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWVcbmNoYWkgPSBpbXBvcnQgJ2NoYWknXG5jaGFpLnVzZSBpbXBvcnQgJ2NoYWktc3R5bGUnXG5jaGFpLmNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZCA9IDFlM1xue2V4cGVjdH0gPSBjaGFpXG5cbnNhbmRib3ggPSBudWxsXG5yZXN0YXJ0U2FuZGJveCA9ICgpLT5cblx0c2FuZGJveC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHNhbmRib3gpIGlmIHNhbmRib3hcblx0c2FuZGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG5cdHNhbmRib3guaWQgPSAnc2FuZGJveCdcblx0c2FuZGJveC5zZXRBdHRyaWJ1dGUgJ3N0eWxlJywgJ2JvcmRlcjoxcHggc29saWQ7IHBhZGRpbmc6MjBweDsgYm94LXNpemluZzpib3JkZXItYm94J1xuXHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNhbmRib3gpXG5cbmNoZWNrQ2hpbGRTdHJ1Y3R1cmUgPSAobWFpbiktPiAoY2hpbGRyZW4uLi4pLT5cblx0ZXhwZWN0KG1haW4uY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbChjaGlsZHJlbi5sZW5ndGgpXG5cdGZvciBjaGlsZCxpbmRleCBpbiBjaGlsZHJlblxuXHRcdGV4cGVjdChtYWluLmNoaWxkcmVuW2luZGV4XSkudG8uZXF1YWwoY2hpbGQpXG5cdFx0ZXhwZWN0KGNoaWxkLmVsLnBhcmVudE5vZGUpLnRvLmVxdWFsKG1haW4uZWwpXG5cdFx0ZXhwZWN0KGNoaWxkLnBhcmVudCkudG8uZXF1YWwobWFpbilcblx0cmV0dXJuXG5cblxuc3VpdGUgXCJRdWlja0RvbVwiLCAoKS0+XG5cdHNldHVwKHJlc3RhcnRTYW5kYm94KVxuXG5cdHRlc3QgXCJWZXJzaW9uIFByb3BlcnR5XCIsICgpLT5cblx0XHRwYWNrYWdlVmVyc2lvbiA9IChpbXBvcnQgJy4uL3BhY2thZ2UgJCB2ZXJzaW9uJylcblx0XHRleHBlY3QoRG9tLnZlcnNpb24pLnRvLmVxdWFsKHBhY2thZ2VWZXJzaW9uKVxuXG5cblx0c3VpdGUgXCJFbGVtZW50IENyZWF0aW9uXCIsICgpLT5cblx0XHR0ZXN0IFwiQmFzaWMgQ3JlYXRpb25cIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tKCdkaXYnKVxuXHRcdFx0ZXhwZWN0KHR5cGVvZiBkaXYpLnRvLmVxdWFsICdvYmplY3QnXG5cdFx0XHRleHBlY3QodHlwZW9mIGRpdi5lbCkudG8uZXF1YWwgJ29iamVjdCdcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmJlLmluc3RhbmNlT2Ygd2luZG93LkhUTUxEaXZFbGVtZW50XG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkudG8uYmUudW5kZWZpbmVkXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwgMFxuXG5cblx0XHR0ZXN0IFwiU2hvcnRjdXRzXCIsICgpLT5cblx0XHRcdGV4cGVjdChEb20uYSgpLmVsLmNvbnN0cnVjdG9yKS50by5lcXVhbChEb20oJ2EnKS5lbC5jb25zdHJ1Y3Rvcilcblx0XHRcdGV4cGVjdChEb20ubGluaygpLmVsLmNvbnN0cnVjdG9yKS50by5lcXVhbChEb20oJ2EnKS5lbC5jb25zdHJ1Y3Rvcilcblx0XHRcdGV4cGVjdChEb20uYW5jaG9yKCkuZWwuY29uc3RydWN0b3IpLnRvLmVxdWFsKERvbSgnYScpLmVsLmNvbnN0cnVjdG9yKVxuXHRcdFx0ZXhwZWN0KERvbS5kaXYoKS5lbC5jb25zdHJ1Y3RvcikudG8uZXF1YWwoRG9tKCdkaXYnKS5lbC5jb25zdHJ1Y3Rvcilcblx0XHRcdGV4cGVjdChEb20udGV4dCgpLmVsLmNvbnN0cnVjdG9yKS50by5lcXVhbChEb20oJ3RleHQnKS5lbC5jb25zdHJ1Y3Rvcilcblx0XHRcdGV4cGVjdChEb20uc3BhbigpLmVsLmNvbnN0cnVjdG9yKS50by5lcXVhbChEb20oJ3NwYW4nKS5lbC5jb25zdHJ1Y3Rvcilcblx0XHRcdGV4cGVjdChEb20uaDQoKS5lbC5jb25zdHJ1Y3RvcikudG8uZXF1YWwoRG9tKCdoNCcpLmVsLmNvbnN0cnVjdG9yKVxuXHRcdFx0ZXhwZWN0KERvbS5oZWFkZXIoKS5lbC5jb25zdHJ1Y3RvcikudG8uZXF1YWwoRG9tKCdoZWFkZXInKS5lbC5jb25zdHJ1Y3Rvcilcblx0XHRcdGV4cGVjdChEb20uZm9vdGVyKCkuZWwuY29uc3RydWN0b3IpLnRvLmVxdWFsKERvbSgnZm9vdGVyJykuZWwuY29uc3RydWN0b3IpXG5cdFx0XHRleHBlY3QoRG9tLnNlY3Rpb24oKS5lbC5jb25zdHJ1Y3RvcikudG8uZXF1YWwoRG9tKCdzZWN0aW9uJykuZWwuY29uc3RydWN0b3IpXG5cdFx0XHRleHBlY3QoRG9tLmJ1dHRvbigpLmVsLmNvbnN0cnVjdG9yKS50by5lcXVhbChEb20oJ2J1dHRvbicpLmVsLmNvbnN0cnVjdG9yKVxuXHRcdFx0ZXhwZWN0KERvbS5pbnB1dCgpLmVsLmNvbnN0cnVjdG9yKS50by5lcXVhbChEb20oJ2lucHV0JykuZWwuY29uc3RydWN0b3IpXG5cdFx0XHQjIGV4cGVjdChEb20ubWFpbigpLmVsLmNvbnN0cnVjdG9yKS50by5lcXVhbChEb20oJ21haW4nKS5lbC5jb25zdHJ1Y3Rvcilcblx0XHRcdHR5cGVzID0gWydhJywnZGl2JywndGV4dCcsJ3NwYW4nLCdoNCcsJ2hlYWRlcicsJ2Zvb3RlcicsJ3NlY3Rpb24nLCdidXR0b24nLCdpbnB1dCddXG5cdFx0XHRmb3IgdHlwZSBpbiB0eXBlc1xuXHRcdFx0XHRleHBlY3QoRG9tW3R5cGVdKCkuZWwuY29uc3RydWN0b3IubmFtZSkubm90LnRvLmNvbnRhaW4oJ1Vua25vd24nKVxuXHRcdFx0cmV0dXJuXG5cblxuXHRcdHRlc3QgXCJCYXNpYyBvcHRpb25zXCIsICgpLT5cblx0XHRcdEEgPSBEb20uZGl2KGNsYXNzOidhYmMtMTIzJywgcHJvcHM6eydhYmMnOjEyMywgJ2RlZic6NDU2fSlcblx0XHRcdEIgPSBEb20uZGl2KGlkOidCJywgY2xhc3NOYW1lOidhYmMtMTIzJywgYXR0cnM6eydkYXRhLWFiYyc6MTIzLCAnZGF0YS1kZWYnOjQ1Nn0pXG5cdFx0XHRDID0gRG9tLmlucHV0KHR5cGU6J3RleHQnLCBuYW1lOidhYmMnLCB2YWx1ZTonaGVsbG8nKVxuXHRcdFx0RCA9IERvbS5pbnB1dCh0eXBlOidjaGVja2JveCcsIGNoZWNrZWQ6dHJ1ZSlcblx0XHRcdEUgPSBEb20ub3B0aW9uKG5hbWU6J2FiYycsIHZhbHVlOidoZWxsbycsIHNlbGVjdGVkOnRydWUpXG5cdFx0XHRGID0gRG9tLmxpbmsoaHJlZjonaHR0cHM6Ly9nb29nbGUuY29tLycpXG5cdFx0XHRHID0gRG9tLmFuY2hvcih1cmw6J2h0dHBzOi8vZ29vZ2xlLmNvbS8nKVxuXHRcdFx0SCA9IERvbS50ZXh0KCdTb21lIHRleHQnKVxuXHRcdFx0SSA9IERvbS5pbWcoc3JjOidodHRwczovL2dvb2dsZS5jb20vJylcblx0XHRcdEogPSBEb20uZGl2KHJlbGF0ZWRJbnN0YW5jZTogb2JqPXthOjF9KVxuXG5cdFx0XHRleHBlY3QoQS5lbC5jbGFzc05hbWUpLnRvLmVxdWFsKCdhYmMtMTIzJylcblx0XHRcdGV4cGVjdChBLmVsLmFiYykudG8uZXF1YWwoMTIzKVxuXHRcdFx0ZXhwZWN0KEEuZWwuZGVmKS50by5lcXVhbCg0NTYpXG5cdFx0XHRleHBlY3QoQi5lbC5jbGFzc05hbWUpLnRvLmVxdWFsKCdhYmMtMTIzJylcblx0XHRcdGV4cGVjdChCLmVsLmlkKS50by5lcXVhbCgnQicpXG5cdFx0XHRleHBlY3QoQi5lbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYWJjJykpLnRvLmVxdWFsKCcxMjMnKVxuXHRcdFx0ZXhwZWN0KEIuZWwuZ2V0QXR0cmlidXRlKCdkYXRhLWRlZicpKS50by5lcXVhbCgnNDU2Jylcblx0XHRcdGV4cGVjdChCLmVsLmRhdGFzZXQuYWJjKS50by5lcXVhbCgnMTIzJykgaWYgQi5lbC5kYXRhc2V0XG5cdFx0XHRleHBlY3QoQy5lbC50eXBlKS50by5lcXVhbCgndGV4dCcpXG5cdFx0XHRleHBlY3QoQy5lbC5uYW1lKS50by5lcXVhbCgnYWJjJylcblx0XHRcdGV4cGVjdChDLmVsLnZhbHVlKS50by5lcXVhbCgnaGVsbG8nKVxuXHRcdFx0ZXhwZWN0KEQuZWwuY2hlY2tlZCkudG8uZXF1YWwodHJ1ZSlcblx0XHRcdGV4cGVjdChFLmVsLm5hbWUpLnRvLmVxdWFsKCdhYmMnKVxuXHRcdFx0ZXhwZWN0KEUuZWwuc2VsZWN0ZWQpLnRvLmVxdWFsKHRydWUpXG5cdFx0XHRleHBlY3QoRi5lbC5ocmVmKS50by5lcXVhbCgnaHR0cHM6Ly9nb29nbGUuY29tLycpXG5cdFx0XHRleHBlY3QoRy5lbC5ocmVmKS50by5lcXVhbCgnaHR0cHM6Ly9nb29nbGUuY29tLycpXG5cdFx0XHRleHBlY3QoSC5lbC5ub2RlVHlwZSkudG8uZXF1YWwoMylcblx0XHRcdGV4cGVjdChILmVsLnRleHRDb250ZW50KS50by5lcXVhbCgnU29tZSB0ZXh0Jylcblx0XHRcdGV4cGVjdChJLmVsLnNyYykudG8uZXF1YWwoJ2h0dHBzOi8vZ29vZ2xlLmNvbS8nKVxuXHRcdFx0ZXhwZWN0KEoucmVsYXRlZCkudG8uZXF1YWwob2JqKVxuXHRcdFx0ZXhwZWN0KEoub3B0aW9ucy5yZWxhdGVkKS50by5lcXVhbChvYmopXG5cblxuXHRcdHRlc3QgXCJDcmVhdGlvbiB3LyBjaGlsZHJlblwiLCAoKS0+XG5cdFx0XHRBID0gRG9tLmRpdihudWxsLCAnU29tZSB0ZXh0Jylcblx0XHRcdEIgPSBEb20uZGl2KG51bGwsIERvbS5zcGFuKCksICdTb21lIHRleHQnLCBEb20uc3BhbigpKVxuXG5cdFx0XHRleHBlY3QoQS5lbC5jaGlsZE5vZGVzLmxlbmd0aCkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChBLmVsLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMClcblx0XHRcdGV4cGVjdChBLmVsLmNoaWxkTm9kZXNbMF0ubm9kZVR5cGUpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3QoQS5lbC5jaGlsZE5vZGVzWzBdLnRleHRDb250ZW50KS50by5lcXVhbCgnU29tZSB0ZXh0Jylcblx0XHRcdGV4cGVjdChBLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChCLmVsLmNoaWxkTm9kZXMubGVuZ3RoKS50by5lcXVhbCgzKVxuXHRcdFx0ZXhwZWN0KEIuZWwuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KEIuZWwuY2hpbGROb2Rlc1swXS5ub2RlVHlwZSkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChCLmVsLmNoaWxkTm9kZXNbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkudG8uZXF1YWwoJ3NwYW4nKVxuXHRcdFx0ZXhwZWN0KEIuZWwuY2hpbGROb2Rlc1sxXS5ub2RlVHlwZSkudG8uZXF1YWwoMylcblx0XHRcdGV4cGVjdChCLmVsLmNoaWxkTm9kZXNbMV0udGV4dENvbnRlbnQpLnRvLmVxdWFsKCdTb21lIHRleHQnKVxuXHRcdFx0ZXhwZWN0KEIuZWwuY2hpbGROb2Rlc1syXS5ub2RlVHlwZSkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChCLmVsLmNoaWxkTm9kZXNbMl0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkudG8uZXF1YWwoJ3NwYW4nKVxuXHRcdFx0ZXhwZWN0KEIuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgzKVxuXG5cblx0XHR0ZXN0IFwiQXJyYXkgc3ludGF4XCIsICgpLT5cblx0XHRcdHNlY3Rpb24gPSBEb20oXG5cdFx0XHRcdFsnc2VjdGlvbicsIHtzdHlsZTpkaXNwbGF5OidpbmxpbmUnfSwgXG5cdFx0XHRcdFx0WydkaXYnLCBudWxsLCAnY2hpbGRBJ11cblx0XHRcdFx0XHRbJ3NwYW4nLCBudWxsLCBcblx0XHRcdFx0XHRcdFsnc3Ryb25nJywgbnVsbCwgJ2NoaWxkQiddXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFsnZGl2JywgbnVsbCwgJ2NoaWxkQycsIFxuXHRcdFx0XHRcdFx0WydzcGFuJywgbnVsbCwgJ2NoaWxkQ18xJ11cblx0XHRcdFx0XHRcdFsnc3BhbicsIG51bGwsICdjaGlsZENfMiddXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRdXG5cdFx0XHQpLmFwcGVuZFRvKHNhbmRib3gpXG5cblx0XHRcdGV4cGVjdChzZWN0aW9uKS5ub3QudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24ucmF3KS50by5oYXZlLnN0eWxlKCdkaXNwbGF5JywgJ2lubGluZScpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblswXS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblsxXS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblsyXS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblsyXS5jaGlsZHJlblsxXS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblsyXS5jaGlsZHJlblsyXS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblswXS50ZXh0KS50by5lcXVhbCgnY2hpbGRBJylcblx0XHRcdGV4cGVjdChzZWN0aW9uLmNoaWxkcmVuWzFdLnRleHQpLnRvLmVxdWFsKCdjaGlsZEInKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24uY2hpbGRyZW5bMl0udGV4dCkudG8uZXF1YWwoJ2NoaWxkQ2NoaWxkQ18xY2hpbGRDXzInKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24uY2hpbGRyZW5bMl0uY2hpbGRyZW5bMV0udGV4dCkudG8uZXF1YWwoJ2NoaWxkQ18xJylcblx0XHRcdGV4cGVjdChzZWN0aW9uLmNoaWxkcmVuWzJdLmNoaWxkcmVuWzJdLnRleHQpLnRvLmVxdWFsKCdjaGlsZENfMicpXG5cblxuXHRcdHRlc3QgXCJFeGlzdGluZyBFbGVtZW50XCIsICgpLT5cblx0XHRcdGRpdlJhdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG5cdFx0XHRBID0gRG9tKGRpdlJhdylcblx0XHRcdEIgPSBEb20oZGl2UmF3KVxuXHRcdFx0QyA9IERvbShBKVxuXG5cdFx0XHRleHBlY3QoQS5lbCkudG8uZXF1YWwoZGl2UmF3KVxuXHRcdFx0ZXhwZWN0KEIuZWwpLnRvLmVxdWFsKGRpdlJhdylcblx0XHRcdGV4cGVjdChDLmVsKS50by5lcXVhbChkaXZSYXcpXG5cdFx0XHRleHBlY3QoQSkudG8uZXF1YWwoQilcblx0XHRcdGV4cGVjdChCKS50by5lcXVhbChDKVxuXHRcdFx0ZXhwZWN0KEMpLnRvLmVxdWFsKGRpdlJhdy5fcXVpY2tFbGVtZW50KVxuXG5cblx0XHR0ZXN0IFwiRXhpc3RpbmcgRWxlbWVudCB3LyBPcHRpb25zXCIsICgpLT5cblx0XHRcdGRpdlJhdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG5cdFx0XHRkaXZSYXcuaWQgPSAnQSdcblxuXHRcdFx0ZGl2ID0gRG9tKGRpdlJhdywge2lkOidCJywgY2xhc3M6J2FiYy0xMjMnfSlcblx0XHRcdGV4cGVjdChkaXZSYXcuaWQpLnRvLmVxdWFsKCdCJylcblx0XHRcdGV4cGVjdChkaXZSYXcuY2xhc3NOYW1lKS50by5lcXVhbCgnYWJjLTEyMycpXG5cdFx0XHRcblx0XHRcdGRpdiA9IERvbShkaXYsIHtpZDonQycsIGNsYXNzOidkZWYtNDU2J30pXG5cdFx0XHRleHBlY3QoZGl2UmF3LmlkKS50by5lcXVhbCgnQycpXG5cdFx0XHRleHBlY3QoZGl2UmF3LmNsYXNzTmFtZSkudG8uZXF1YWwoJ2RlZi00NTYnKVxuXG5cblx0XHR0ZXN0IFwiRXhpc3RpbmcgRWxlbWVudCBmcm9tIGFycmF5LWxpa2Ugb2JqZWN0c1wiLCAoKS0+XG5cdFx0XHRyYXdBID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jylcblx0XHRcdHJhd0IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuXHRcdFx0cmF3QyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG5cdFx0XHRwYXJlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJylcblx0XHRcdHBhcmVudC5hcHBlbmRDaGlsZChyYXdBKTsgcGFyZW50LmFwcGVuZENoaWxkKHJhd0IpOyBwYXJlbnQuYXBwZW5kQ2hpbGQocmF3Qyk7XG5cdFx0XHRBID0gRG9tKFtyYXdBLCByYXdCLCByYXdDXSlcblx0XHRcdEIgPSBEb20ocGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RpdicpKVxuXHRcdFx0QyA9IERvbShCKVxuXG5cdFx0XHRleHBlY3QoQS5lbCkudG8uZXF1YWwocmF3QSlcblx0XHRcdGV4cGVjdChCLmVsKS50by5lcXVhbChyYXdBKVxuXHRcdFx0ZXhwZWN0KEMuZWwpLnRvLmVxdWFsKHJhd0EpXG5cdFx0XHRleHBlY3QoQSkudG8uZXF1YWwoQilcblx0XHRcdGV4cGVjdChCKS50by5lcXVhbChDKVxuXHRcdFx0ZXhwZWN0KEMpLnRvLmVxdWFsKHJhd0EuX3F1aWNrRWxlbWVudClcblxuXG5cblx0XHR0ZXN0IFwiRG9jdW1lbnQgbm9kZVwiLCAoKS0+XG5cdFx0XHRkb2MgPSBEb20oZG9jdW1lbnQpXG5cdFx0XHRleHBlY3QoZG9jKS5ub3QudG8uYmUudW5kZWZpbmVkXG5cdFx0XHRleHBlY3QoZG9jLnJhdykudG8uZXF1YWwoZG9jdW1lbnQpXG5cdFx0XHRleHBlY3QoZG9jLnBhcmVudCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KGRvYy5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoRG9tKHNhbmRib3gpLnBhcmVudHMpLm5vdC50by5jb250YWluKGRvYylcblx0XHRcdGV4cGVjdChEb20oc2FuZGJveCkucGFyZW50cykudG8uY29udGFpbihkb2MuY2hpbGRyZW5bMF0pXG5cblxuXHRcdHRlc3QgXCJXaW5kb3cgb2JqZWN0XCIsICgpLT5cblx0XHRcdHdpbiA9IERvbSh3aW5kb3cpXG5cdFx0XHRleHBlY3Qod2luKS5ub3QudG8uYmUudW5kZWZpbmVkXG5cdFx0XHRleHBlY3Qod2luLnJhdyBpcyB3aW5kb3cpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdCh3aW4ucGFyZW50KS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRleHBlY3Qod2luLmNoaWxkcmVuKS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRleHBlY3Qod2luLmFwcGVuZCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KHdpbi5odG1sKS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRleHBlY3Qod2luLnN0eWxlKS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRleHBlY3QoRG9tKHNhbmRib3gpLnBhcmVudHMpLm5vdC50by5jb250YWluKHdpbilcblxuXG5cdFx0dGVzdCBcIkNyZWF0aW9uIHcvIHN0eWxpbmdcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLmRpdiBzdHlsZTpcblx0XHRcdFx0J3dpZHRoJzogJzEwcHgnXG5cdFx0XHRcdCdoZWlnaHQnOiAxNVxuXHRcdFx0XHQnbGFtZW8nOiAnMTlweCdcblx0XHRcdFx0J2JhY2tncm91bmQtY29sb3InOiAnYmx1ZSdcblx0XHRcdFx0J2JhY2tncm91bmRTaXplJzogJ2NvdmVyJ1xuXG5cdFx0XHRzYW5kYm94LmFwcGVuZENoaWxkKGRpdi5lbClcblx0XHRcdGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRpdi5lbClcblxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZS5sYW1lbykudG8uZXF1YWwgdW5kZWZpbmVkXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5sYW1lbykudG8uZXF1YWwgdW5kZWZpbmVkXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS53aWR0aCkudG8uZXF1YWwgJzEwcHgnXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5oZWlnaHQpLnRvLmVxdWFsICcxNXB4J1xuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUuYmFja2dyb3VuZENvbG9yKS5ub3QudG8uZXF1YWwgJydcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLmJhY2tncm91bmRTaXplKS50by5lcXVhbCAnY292ZXInXG5cblxuXHRcdHRlc3QgXCJTVkcgZWxlbWVudHMgY2FuIGJlIGNyZWF0ZWQgdmlhIGEgJyonIGluIHRoZSBlbGVtZW50J3MgdHlwZSBzdHJpbmdcIiwgKCktPlxuXHRcdFx0c3ZnQmFkID0gRG9tKCdzdmcnKS5lbFxuXHRcdFx0c3ZnR29vZCA9IERvbSgnKnN2ZycpLmVsXG5cdFx0XHRzdmdQb2x5QmFkID0gRG9tKCdwb2x5bGluZScpLmVsXG5cdFx0XHRzdmdQb2x5R29vZCA9IERvbSgnKnBvbHlsaW5lJykuZWxcblx0XHRcdHN2Z0RpdiA9IERvbSgnKmRpdicpLmVsXG5cdFx0XHRyZWdEaXYgPSBEb20oJ2RpdicpLmVsXG5cblx0XHRcdGV4cGVjdChzdmdCYWQpLnRvLmJlLmluc3RhbmNlT2YoSFRNTFVua25vd25FbGVtZW50KVxuXHRcdFx0ZXhwZWN0KHN2Z1BvbHlCYWQpLnRvLmJlLmluc3RhbmNlT2YoSFRNTFVua25vd25FbGVtZW50KVxuXHRcdFx0ZXhwZWN0KHN2Z0dvb2QpLnRvLmJlLmluc3RhbmNlT2YoU1ZHU1ZHRWxlbWVudClcblx0XHRcdGV4cGVjdChzdmdQb2x5R29vZCkudG8uYmUuaW5zdGFuY2VPZihTVkdQb2x5bGluZUVsZW1lbnQpXG5cdFx0XHQjIGV4cGVjdChzdmdEaXYpLnRvLmJlLmluc3RhbmNlT2YoJ1NWR0VsZW1lbnQnKVxuXHRcdFx0ZXhwZWN0KHN2Z0Rpdi5jb25zdHJ1Y3Rvcikubm90LnRvLmVxdWFsKHJlZ0Rpdi5jb25zdHJ1Y3RvcilcblxuXG5cdFx0dGVzdCBcIlF1aWNrRG9tLmh0bWwoKSBhY2NlcHRzIGFuIGh0bWwgc3RyaW5nIHdoaWNoIHdvdWxkIGJlIHBhcnNlZCBhbmQgY29udmVydGVkIGludG8gYSBRdWlja0JhdGNoIGluc3RhbmNlXCIsICgpLT5cblx0XHRcdGh0bWxTdHJpbmcgPSBcIlxuXHRcdFx0XHQ8ZGl2PmZpcnN0Q2hpbGRUZXh0PC9kaXY+PHNwYW4+c2Vjb25kQ2hpbGRUZXh0PC9zcGFuPlxuXHRcdFx0XHR0ZXh0Tm9kZVxuXHRcdFx0XHQ8c3Ryb25nPmFiYzEyMzwvc3Ryb25nPlxuXHRcdFx0XCJcblx0XHRcdHdpbmRvdy5iYXRjaCA9IERvbS5odG1sKGh0bWxTdHJpbmcpXG5cblx0XHRcdGV4cGVjdCh0eXBlb2YgYmF0Y2gpLnRvLmVxdWFsICdvYmplY3QnXG5cdFx0XHRleHBlY3QoYmF0Y2guY29uc3RydWN0b3IubmFtZSkudG8uZXF1YWwgJ1F1aWNrQmF0Y2gnXG5cdFx0XHRleHBlY3QoYmF0Y2guZWxlbWVudHMubGVuZ3RoKS50by5lcXVhbCA0XG5cdFx0XHRleHBlY3QoYmF0Y2guZWxlbWVudHNbMF0udHlwZSkudG8uZXF1YWwgJ2Rpdidcblx0XHRcdGV4cGVjdChiYXRjaC5lbGVtZW50c1sxXS50eXBlKS50by5lcXVhbCAnc3Bhbidcblx0XHRcdGV4cGVjdChiYXRjaC5lbGVtZW50c1syXS50eXBlKS50by5lcXVhbCAndGV4dCdcblx0XHRcdGV4cGVjdChiYXRjaC5lbGVtZW50c1szXS50eXBlKS50by5lcXVhbCAnc3Ryb25nJ1xuXHRcdFx0ZXhwZWN0KGJhdGNoLmVsZW1lbnRzWzBdLnRleHQpLnRvLmVxdWFsICdmaXJzdENoaWxkVGV4dCdcblx0XHRcdGV4cGVjdChiYXRjaC5lbGVtZW50c1sxXS50ZXh0KS50by5lcXVhbCAnc2Vjb25kQ2hpbGRUZXh0J1xuXHRcdFx0ZXhwZWN0KGJhdGNoLmVsZW1lbnRzWzJdLnRleHQpLnRvLmluY2x1ZGUgJ3RleHROb2RlJ1xuXHRcdFx0ZXhwZWN0KGJhdGNoLmVsZW1lbnRzWzNdLnRleHQpLnRvLmVxdWFsICdhYmMxMjMnXG5cblxuXHRcdHRlc3QgXCJNZXRob2QvUHJvcGVydHkgYWxpYXNlc1wiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20oJ2RpdicpXG5cdFx0XHRleHBlY3QoZGl2LnJhdykudG8uZXF1YWwoZGl2LmVsKVxuXHRcdFx0ZXhwZWN0KGRpdlswXSkudG8uZXF1YWwoZGl2LmVsKVxuXHRcdFx0ZXhwZWN0KGRpdi5jc3MpLnRvLmVxdWFsKGRpdi5zdHlsZSlcblx0XHRcdGV4cGVjdChkaXYucmVwbGFjZVdpdGgpLnRvLmVxdWFsKGRpdi5yZXBsYWNlKVxuXHRcdFx0ZXhwZWN0KGRpdi5yZW1vdmVMaXN0ZW5lcikudG8uZXF1YWwoZGl2Lm9mZilcblx0XHRcdGV4cGVjdChkaXYucmVtb3ZlTGlzdGVuZXIoJ2V2ZW50QScpKVxuXG5cblx0XHR0ZXN0IFwidXNlci1kZWZpbmVkIG1ldGhkb2RzL2dldHRlcnMvc2V0dGVyc1wiLCAoKS0+XG5cdFx0XHRkaXZBID0gRG9tLmRpdigpXG5cdFx0XHRkaXZCID0gRG9tLmRpdiBtZXRob2RzOlxuXHRcdFx0XHRzY3JvbGxUb3A6XG5cdFx0XHRcdFx0Z2V0OiAoKS0+IEByYXcuc2Nyb2xsVG9wXG5cdFx0XHRcdHdlaWdodDpcblx0XHRcdFx0XHRnZXQ6ICgpLT4gQHJhdy53ZWlnaHRcblx0XHRcdFx0dmFsdWU6XG5cdFx0XHRcdFx0Z2V0OiAoKS0+IEByYXcudmFsdWVcblx0XHRcdFx0XHRzZXQ6ICh2YWx1ZSktPiBAcmF3LnZhbHVlID0gdmFsdWVcblx0XHRcdFx0bmFtZTogdHJ1ZVxuXHRcdFx0XHRiaWdJbmRleDogKCktPiBAaW5kZXggKiAxMFxuXG5cdFx0XHRzYW5kYm94LmFwcGVuZCBkaXZBXG5cdFx0XHRzYW5kYm94LmFwcGVuZCBkaXZCXG5cdFx0XHRkaXZBLnJhdy52YWx1ZSA9IGRpdkIucmF3LnZhbHVlID0gJ2FiYydcblxuXHRcdFx0ZXhwZWN0KHR5cGVvZiBkaXZBLnNjcm9sbFRvcCkudG8uZXF1YWwgJ3VuZGVmaW5lZCdcblx0XHRcdGV4cGVjdCh0eXBlb2YgZGl2Qi5zY3JvbGxUb3ApLnRvLmVxdWFsICdudW1iZXInXG5cdFx0XHRleHBlY3QodHlwZW9mIGRpdkEudmFsdWUpLnRvLmVxdWFsICd1bmRlZmluZWQnXG5cdFx0XHRleHBlY3QodHlwZW9mIGRpdkIudmFsdWUpLnRvLmVxdWFsICdzdHJpbmcnXG5cdFx0XHRleHBlY3QodHlwZW9mIGRpdkEubmFtZSkudG8uZXF1YWwgJ3VuZGVmaW5lZCdcblx0XHRcdGV4cGVjdCh0eXBlb2YgZGl2Qi5uYW1lKS50by5lcXVhbCAndW5kZWZpbmVkJ1xuXHRcdFx0ZXhwZWN0KHR5cGVvZiBkaXZBLmJpZ0luZGV4KS50by5lcXVhbCAndW5kZWZpbmVkJ1xuXHRcdFx0ZXhwZWN0KHR5cGVvZiBkaXZCLmJpZ0luZGV4KS50by5lcXVhbCAnZnVuY3Rpb24nXG5cdFx0XHRcblx0XHRcdGV4cGVjdChkaXZCLnNjcm9sbFRvcCkudG8uZXF1YWwgZGl2Qi5yYXcuc2Nyb2xsVG9wXG5cdFx0XHRcblx0XHRcdGRpdkIucmF3LndlaWdodCA9ICcxJ1xuXHRcdFx0ZXhwZWN0KGRpdkIud2VpZ2h0KS50by5lcXVhbCAnMSdcblx0XHRcdFxuXHRcdFx0ZGl2Qi53ZWlnaHQgPSAnMidcblx0XHRcdGV4cGVjdChkaXZCLndlaWdodCkudG8uZXF1YWwgJzEnXG5cdFx0XHRcblx0XHRcdGV4cGVjdChkaXZCLnZhbHVlKS50by5lcXVhbCAnYWJjJ1xuXHRcdFx0ZGl2Qi52YWx1ZSA9ICcxMjMnXG5cdFx0XHRleHBlY3QoZGl2Qi52YWx1ZSkudG8uZXF1YWwgJzEyMydcblxuXHRcdFx0ZXhwZWN0KGRpdkIuYmlnSW5kZXgoKSkudG8uZXF1YWwgZGl2Qi5pbmRleCoxMFxuXG5cblx0c3VpdGUgXCJFdmVudHNcIiwgKCktPlxuXHRcdHRlc3QgXCJFdmVudHMgY2FuIGJlIGxpc3RlbmVkIHRvIHZpYSB0aGUgLm9uIG1ldGhvZFwiLCAoKS0+XG5cdFx0XHRlbWl0Q291bnRBID0gZW1pdENvdW50QiA9IDBcblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXHRcdFx0ZGl2Lm9uICdteUNsaWNrJywgKGV2ZW50KS0+XG5cdFx0XHRcdGV4cGVjdCh0eXBlb2YgZXZlbnQpLnRvLmVxdWFsICdvYmplY3QnXG5cdFx0XHRcdGV4cGVjdChldmVudC50eXBlKS50by5lcXVhbCAnbXlDbGljaydcblx0XHRcdFx0ZW1pdENvdW50QSsrXG5cdFx0XHRcblxuXHRcdFx0ZGl2LmVsLmVtaXRFdmVudCgnbXlDbGljaycpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoMSlcblx0XHRcdGRpdi5lbC5lbWl0RXZlbnQoJ215Q2xpY2snKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDIpXG5cdFx0XHRcblx0XHRcdGRpdi5vbiAnbXlDbGljaycsIChldmVudCktPiBlbWl0Q291bnRCKytcblx0XHRcdGRpdi5lbC5lbWl0RXZlbnQoJ215Q2xpY2snKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEIpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoMylcblx0XHRcdGRpdi5lbC5lbWl0RXZlbnQoJ215Q2xpY2snKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEIpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoNClcblxuXG5cdFx0dGVzdCBcIkV2ZW50cyBjYW4gYmUgZW1pdHRlZCB2aWEgdGhlIC5lbWl0IG1ldGhvZFwiLCAoKS0+XG5cdFx0XHRlbWl0Q291bnRBID0gZW1pdENvdW50QiA9IDBcblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXHRcdFx0ZGl2Lm9uICdteUV2ZW50JywgKCktPiBlbWl0Q291bnRBKytcblx0XHRcdGRpdi5lbC5hZGRFdmVudExpc3RlbmVyICdteUV2ZW50JywgKCktPiBlbWl0Q291bnRCKytcblxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDApXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMClcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQoJ215RXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMSlcblx0XHRcdFxuXHRcdFx0ZGl2LmVsLmVtaXRFdmVudCgnbXlFdmVudCcpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoMilcblx0XHRcdGV4cGVjdChlbWl0Q291bnRCKS50by5lcXVhbCgyKVxuXG5cblx0XHR0ZXN0IFwiRXZlbnQgaGFuZGxlcnMgY2FuIGJlIG1hbnVhbGx5IGludm9rZWQgd2l0aCBhIGN1c3RvbSBhcmcgdmlhIHRoZSAuZW1pdFByaXZhdGUgbWV0aG9kXCIsICgpLT5cblx0XHRcdGVtaXRDb3VudEEgPSBlbWl0Q291bnRCID0gMFxuXHRcdFx0YXJnID0gbnVsbFxuXHRcdFx0ZGl2ID0gRG9tLmRpdigpXG5cdFx0XHRkaXYub24gJ215RXZlbnQnLCAoKS0+IGVtaXRDb3VudEErKzsgYXJnID0gYXJndW1lbnRzWzBdXG5cdFx0XHRkaXYuZWwuYWRkRXZlbnRMaXN0ZW5lciAnbXlFdmVudCcsICgpLT4gZW1pdENvdW50QisrXG5cblx0XHRcdGV4cGVjdChlbWl0Q291bnRBKS50by5lcXVhbCgwKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEIpLnRvLmVxdWFsKDApXG5cdFx0XHRleHBlY3QoYXJnKS50by5lcXVhbChudWxsKVxuXHRcdFx0XG5cdFx0XHRkaXYuZW1pdFByaXZhdGUoJ215RXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMClcblx0XHRcdGV4cGVjdChhcmcpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXRQcml2YXRlKCdteUV2ZW50JywgJ2FiYzEyMycpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoMilcblx0XHRcdGV4cGVjdChlbWl0Q291bnRCKS50by5lcXVhbCgwKVxuXHRcdFx0ZXhwZWN0KGFyZykudG8uZXF1YWwoJ2FiYzEyMycpXG5cdFx0XHRcblx0XHRcdGRpdi5lbC5lbWl0RXZlbnQoJ215RXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChhcmcpLm5vdC50by5lcXVhbCgnYWJjMTIzJylcblx0XHRcdGV4cGVjdCh0eXBlb2YgYXJnKS50by5lcXVhbCgnb2JqZWN0JylcblxuXG5cdFx0dGVzdCBcIkJvb2xlYW5zIGNhbiBiZSBwYXNzZWQgZm9yIHRoZSAybmQgYW5kIDNyZCBhcmdzIG9mIC5lbWl0IHRvIGNvbnRyb2wgZXZlbnQuYnViYmxlcyBhbmQgZXZlbnQuY2FuY2VsYWJsZVwiLCAoKS0+XG5cdFx0XHRlbWl0Q291bnRBID0gZW1pdENvdW50QiA9IGVtaXRDb3VudEMgPSAwXG5cdFx0XHRkaXYgPSBEb20uZGl2KClcblx0XHRcdGRpdi5vbiAnZXZlbnRBJywgKGV2ZW50KS0+IGVtaXRDb3VudEErKzsgZXhwZWN0KGV2ZW50LmJ1YmJsZXMpLnRvLmJlLnRydWU7IGV4cGVjdChldmVudC5jYW5jZWxhYmxlKS50by5iZS50cnVlXG5cdFx0XHRkaXYub24gJ2V2ZW50QicsIChldmVudCktPiBlbWl0Q291bnRCKys7IGV4cGVjdChldmVudC5idWJibGVzKS50by5iZS5mYWxzZTsgZXhwZWN0KGV2ZW50LmNhbmNlbGFibGUpLnRvLmJlLnRydWVcblx0XHRcdGRpdi5vbiAnZXZlbnRDJywgKGV2ZW50KS0+IGVtaXRDb3VudEMrKzsgZXhwZWN0KGV2ZW50LmJ1YmJsZXMpLnRvLmJlLmZhbHNlOyBleHBlY3QoZXZlbnQuY2FuY2VsYWJsZSkudG8uYmUuZmFsc2VcblxuXHRcdFx0ZGl2LmVtaXQoJ2V2ZW50QScpOyBkaXYuZW1pdCgnZXZlbnRCJywgZmFsc2UpOyBkaXYuZW1pdCgnZXZlbnRDJywgZmFsc2UsIGZhbHNlKTtcblx0XHRcdGV4cGVjdChlbWl0Q291bnRBKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEIpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QykudG8uZXF1YWwoMSlcblxuXG5cdFx0dGVzdCBcIkEgZGF0YSBvYmplY3QgY2FuIGJlIHBhc3NlZCBhcyB0aGUgNHRoIGFyZyBvZiAuZW1pdCB3aGljaCB3aWxsIGJlIGV4dGVuZGVkIG9udG8gdGhlIGV2ZW50IG9iamVjdFwiLCAoKS0+XG5cdFx0XHRkaXYgPSBET00uZGl2KClcblx0XHRcdGV2ZW50ID0gbnVsbFxuXHRcdFx0ZGl2Lm9uICdtb3VzZWRvd24nLCAoZSktPiBldmVudCA9IGVcblxuXHRcdFx0ZXhwZWN0KGV2ZW50KS50by5lcXVhbCBudWxsXG5cdFx0XHRkaXYuZW1pdCAnbW91c2Vkb3duJ1xuXHRcdFx0ZXhwZWN0KGV2ZW50LnR5cGUpLnRvLmVxdWFsICdtb3VzZWRvd24nXG5cdFx0XHRleHBlY3QoZXZlbnQuY3VzdG9tKS50by5lcXVhbCB1bmRlZmluZWRcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQgJ21vdXNlZG93bicsIG51bGwsIG51bGwsIHtjdXN0b206J2N1c3RvbScsIGFiYzoxMjN9XG5cdFx0XHRleHBlY3QoZXZlbnQudHlwZSkudG8uZXF1YWwgJ21vdXNlZG93bidcblx0XHRcdGV4cGVjdChldmVudC5jdXN0b20pLnRvLmVxdWFsICdjdXN0b20nXG5cdFx0XHRleHBlY3QoZXZlbnQuYWJjKS50by5lcXVhbCAxMjNcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQgJ21vdXNlZG93bicsIG51bGwsIG51bGwsIHRydWVcblx0XHRcdGV4cGVjdChldmVudC50eXBlKS50by5lcXVhbCAnbW91c2Vkb3duJ1xuXHRcdFx0ZXhwZWN0KGV2ZW50LmN1c3RvbSkudG8uZXF1YWwgdW5kZWZpbmVkXG5cblxuXHRcdHRlc3QgXCJFdmVudCBsaXN0ZW5lcnMgY2FuIGJlIHJlbW92ZWQgdmlhIHRoZSAub2ZmIG1ldGhvZFwiLCAoKS0+XG5cdFx0XHRlbWl0Q291bnRBID0gZW1pdENvdW50QiA9IGVtaXRDb3VudEMgPSBlbWl0Q291bnREID0gMFxuXHRcdFx0ZGl2ID0gRG9tLmRpdigpXG5cdFx0XHRkaXYub24gJ215RXZlbnQnLCAoKS0+IGVtaXRDb3VudEErK1xuXHRcdFx0ZGl2Lm9uICdteUV2ZW50JywgZXZlbnRDQj0oKS0+IGVtaXRDb3VudEIrK1xuXHRcdFx0ZGl2Lm9uICdhbm90aGVyRXZlbnQnLCAoKS0+IGVtaXRDb3VudEMrK1xuXHRcdFx0ZGl2LmVsLmFkZEV2ZW50TGlzdGVuZXIgJ215RXZlbnQnLCAoKS0+IGVtaXRDb3VudEQrK1xuXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoMClcblx0XHRcdGV4cGVjdChlbWl0Q291bnRCKS50by5lcXVhbCgwKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEMpLnRvLmVxdWFsKDApXG5cdFx0XHRleHBlY3QoZW1pdENvdW50RCkudG8uZXF1YWwoMClcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQoJ215RXZlbnQnKTsgZGl2LmVtaXQoJ2Fub3RoZXJFdmVudCcpO1xuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChlbWl0Q291bnRDKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEQpLnRvLmVxdWFsKDEpXG5cdFx0XHRcblx0XHRcdGRpdi5vZmYoJ215RXZlbnQnLCBldmVudENCKVxuXHRcdFx0ZGl2LmVtaXQoJ215RXZlbnQnKTsgZGl2LmVtaXQoJ2Fub3RoZXJFdmVudCcpO1xuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChlbWl0Q291bnRDKS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEQpLnRvLmVxdWFsKDIpXG5cdFx0XHRcblx0XHRcdGRpdi5vbiAnbXlFdmVudCcsICgpLT4gZW1pdENvdW50QisrXG5cdFx0XHRkaXYub2ZmKCdteUV2ZW50Jylcblx0XHRcdGRpdi5lbWl0KCdteUV2ZW50Jyk7IGRpdi5lbWl0KCdhbm90aGVyRXZlbnQnKTtcblx0XHRcdGV4cGVjdChlbWl0Q291bnRBKS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEIpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QykudG8uZXF1YWwoMylcblx0XHRcdGV4cGVjdChlbWl0Q291bnREKS50by5lcXVhbCgzKVxuXHRcdFx0XG5cdFx0XHRkaXYub24gJ215RXZlbnQnLCAoKS0+IGVtaXRDb3VudEErK1xuXHRcdFx0ZGl2Lm9uICdteUV2ZW50JywgKCktPiBlbWl0Q291bnRCKytcblx0XHRcdGRpdi5vZmYoKVxuXHRcdFx0ZGl2LmVtaXQoJ215RXZlbnQnKTsgZGl2LmVtaXQoJ2Fub3RoZXJFdmVudCcpO1xuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChlbWl0Q291bnRDKS50by5lcXVhbCgzKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEQpLnRvLmVxdWFsKDQpXG5cblxuXHRcdHRlc3QgXCJFdmVudHMgY2FuIGJlIG5hbWVkIHZpYSBhICc8ZXZlbnQ+LjxuYW1lPicgc3ludGF4IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSBsaXN0ZW5lcnMgbGF0ZXIgb24gd2l0aG91dCB0aGUgb3JpZ2luYWwgY2FsbGJhY2tzXCIsICgpLT5cblx0XHRcdGVtaXRDb3VudEEgPSBlbWl0Q291bnRCID0gMFxuXHRcdFx0ZGl2ID0gRG9tLmRpdigpLmFwcGVuZFRvKHNhbmRib3gpXG5cblx0XHRcdGF0dGFjaExpc3RlbmVycyA9ICgpLT5cblx0XHRcdFx0ZGl2Lm9uICdteUV2ZW50LnNvbWVOYW1lJywgKCktPiBlbWl0Q291bnRBKys7XG5cdFx0XHRcdGRpdi5vbiAnbXlFdmVudCcsICgpLT4gZW1pdENvdW50QisrO1xuXG5cdFx0XHRhdHRhY2hMaXN0ZW5lcnMoKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDApXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMClcblxuXHRcdFx0ZGl2LmVtaXQoJ215RXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMSlcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQoJ215RXZlbnQuc29tZU5hbWUnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMSlcblx0XHRcdFxuXHRcdFx0ZGl2Lm9mZignbXlFdmVudC5zb21lT3RoZXJOYW1lJylcblx0XHRcdGRpdi5lbWl0KCdteUV2ZW50Jylcblx0XHRcdGV4cGVjdChlbWl0Q291bnRBKS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEIpLnRvLmVxdWFsKDIpXG5cdFx0XHRcblx0XHRcdGRpdi5vZmYoJ215RXZlbnQuc29tZU5hbWUnKVxuXHRcdFx0ZGl2LmVtaXQoJ215RXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMylcblx0XHRcdFxuXHRcdFx0ZGl2Lm9mZignbXlFdmVudCcpXG5cdFx0XHRhdHRhY2hMaXN0ZW5lcnMoKVxuXHRcdFx0ZGl2LmVtaXQoJ215RXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoNClcblx0XHRcdFxuXHRcdFx0ZGl2Lm9mZignbXlFdmVudCcpXG5cdFx0XHRkaXYuZW1pdCgnbXlFdmVudCcpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoMylcblx0XHRcdGV4cGVjdChlbWl0Q291bnRCKS50by5lcXVhbCg0KVxuXG5cblx0XHR0ZXN0IFwiTXVsdGlwbGUgZXZlbnRzIGNhbiBiZSByZWdpc3RlcmVkL2RlcmVnaXN0ZXJlZCBhdCBvbmNlIHVzaW5nIHdoaXRlc3BhY2Ugc2VwYXJhdG9yc1wiLCAoKS0+XG5cdFx0XHRlbWl0Q291bnQgPSAwXG5cdFx0XHRkaXYgPSBEb20uZGl2KClcblxuXHRcdFx0ZGl2Lm9uICdvbmUgdHdvICAgdGhyZWUnLCAoKS0+IGVtaXRDb3VudCsrXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCAwXG5cblx0XHRcdGRpdi5lbWl0KCdvbmUnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwgMVxuXG5cdFx0XHRkaXYuZW1pdCgndHdvJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDJcblxuXHRcdFx0ZGl2LmVtaXQoJ3RocmVlJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDNcblxuXHRcdFx0ZGl2Lm9mZignb25lICAgICAgdGhyZWUnKVxuXHRcdFx0ZGl2LmVtaXQoJ29uZScpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCAzXG5cblx0XHRcdGRpdi5lbWl0KCd0d28nKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwgNFxuXG5cdFx0XHRkaXYuZW1pdCgndGhyZWUnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwgNFxuXG5cdFx0XHRkaXYub2ZmKClcblx0XHRcdGRpdi5lbWl0KCdvbmUnKTsgZGl2LmVtaXQoJ3R3bycpOyBkaXYuZW1pdCgndGhyZWUnKTtcblx0XHRcdGRpdi5vbiAnb25lIHR3byAgIHRocmVlLnNvbWVOYW1lJywgKCktPiBlbWl0Q291bnQrK1xuXHRcdFx0ZGl2Lm9uICdvbmUgdHdvICAgdGhyZWUnLCAoKS0+IGVtaXRDb3VudCsrXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCA0XG5cblx0XHRcdGRpdi5lbWl0KCdvbmUnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwgNlxuXG5cdFx0XHRkaXYuZW1pdCgndHdvJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDhcblxuXHRcdFx0ZGl2LmVtaXQoJ3RocmVlJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDEwXG5cblx0XHRcdGRpdi5vZmYoJ3R3byBcXHRvbmUuc29tZU5hbWUnKVxuXHRcdFx0ZGl2LmVtaXQoJ29uZScpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCAxMVxuXG5cdFx0XHRkaXYuZW1pdCgndHdvJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDEyXG5cblx0XHRcdGRpdi5lbWl0KCd0aHJlZScpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCAxNFxuXHRcdFx0XG5cdFx0XHRkaXYub2ZmKCdvbmUgdGhyZWUnKVxuXHRcdFx0ZGl2LmVtaXQoJ29uZScpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCAxNFxuXG5cdFx0XHRkaXYuZW1pdCgndHdvJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDE1XG5cblx0XHRcdGRpdi5lbWl0KCd0aHJlZScpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCAxNVxuXG5cblx0XHR0ZXN0IFwiRXZlbnRzIGNhbiBiZSBsaXN0ZW5lZCBmb3Igb25jZSB2aWEgdGhlIC5vbmNlIG1ldGhvZFwiLCAoKS0+XG5cdFx0XHRlbWl0Q291bnRBID0gZW1pdENvdW50QiA9IDBcblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXHRcdFx0ZGl2Lm9uY2UgJ215Q2xpY2snLCAoZXZlbnQpLT5cblx0XHRcdFx0ZXhwZWN0KHR5cGVvZiBldmVudCkudG8uZXF1YWwgJ29iamVjdCdcblx0XHRcdFx0ZXhwZWN0KGV2ZW50LnR5cGUpLnRvLmVxdWFsICdteUNsaWNrJ1xuXG5cdFx0XHRkaXYub24gJ215Q2xpY2snLCAoKS0+IGVtaXRDb3VudEErK1xuXHRcdFx0ZGl2Lm9uY2UgJ215Q2xpY2snLCAoKS0+IGVtaXRDb3VudEIrK1xuXHRcdFx0XG5cblx0XHRcdGV4cGVjdChlbWl0Q291bnRBKS50by5lcXVhbCgwKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEIpLnRvLmVxdWFsKDApXG5cdFx0XHRcblx0XHRcdGRpdi5lbC5lbWl0RXZlbnQoJ215Q2xpY2snKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEEpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QikudG8uZXF1YWwoMSlcblx0XHRcdFxuXHRcdFx0ZGl2LmVsLmVtaXRFdmVudCgnbXlDbGljaycpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoMilcblx0XHRcdGV4cGVjdChlbWl0Q291bnRCKS50by5lcXVhbCgxKVxuXHRcdFx0XG5cdFx0XHRkaXYub25jZSAnbXlDbGljaycsIChldmVudCktPiBlbWl0Q291bnRCKytcblx0XHRcdFxuXHRcdFx0ZGl2LmVsLmVtaXRFdmVudCgnbXlDbGljaycpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50QSkudG8uZXF1YWwoMylcblx0XHRcdGV4cGVjdChlbWl0Q291bnRCKS50by5lcXVhbCgyKVxuXHRcdFx0XG5cdFx0XHRkaXYuZWwuZW1pdEV2ZW50KCdteUNsaWNrJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnRBKS50by5lcXVhbCg0KVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudEIpLnRvLmVxdWFsKDIpXG5cblxuXHRcdHRlc3QgXCJQcmUtZGVmaW5lZCBldmVudCBsaXN0ZW5lcnMgY2FuIGJlIHBhc3NlZCBpbiBvcHRpb25zLmV2ZW50c1wiLCAoKS0+XG5cdFx0XHRlbWl0Q291bnQgPSAwXG5cdFx0XHRlbWl0Q29udGV4dCA9IG51bGxcblx0XHRcdGxpc3RlbmVycyA9XG5cdFx0XHRcdCdvbmUgdHdvIHRocmVlJzogKCktPiBlbWl0Q291bnQrK1xuXHRcdFx0XHQnZm91cic6ICgpLT4gZW1pdENvdW50Kytcblx0XHRcdFx0J2ZpdmUnOiAoKS0+IGVtaXRDb250ZXh0ID0gQFxuXHRcdFx0XG5cdFx0XHRkaXYgPSBEb20uZGl2KGV2ZW50czpsaXN0ZW5lcnMpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCAwXG5cblx0XHRcdGRpdi5lbWl0KCdvbmUnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwgMVxuXG5cdFx0XHRkaXYuZW1pdCgndHdvJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDJcblxuXHRcdFx0ZGl2LmVtaXQoJ3RocmVlJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDNcblxuXHRcdFx0ZGl2LmVtaXQoJ2ZvdXInKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwgNFxuXG5cdFx0XHRkaXYub2ZmKCdvbmUgICAgICB0aHJlZScpXG5cdFx0XHRkaXYuZW1pdCgnb25lJylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsIDRcblxuXHRcdFx0ZGl2LmVtaXQoJ3R3bycpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCA1XG5cblx0XHRcdGRpdi5lbWl0KCd0aHJlZScpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCA1XG5cblx0XHRcdGRpdi5lbWl0KCdmaXZlJylcblx0XHRcdGV4cGVjdChlbWl0Q29udGV4dCkudG8uZXF1YWwgZGl2XG5cblx0XHRcdGRpdi5vZmYoKVxuXHRcdFx0ZGl2LmVtaXQoJ29uZScpOyBkaXYuZW1pdCgndHdvJyk7IGRpdi5lbWl0KCd0aHJlZScpOyBkaXYuZW1pdCgnZm91cicpO1xuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwgNVxuXG5cdFx0XHRkaXZCID0gRG9tLmRpdihldmVudHM6bGlzdGVuZXJzKVxuXHRcdFx0ZGl2Qi5lbWl0KCdvbmUnKTsgZGl2Qi5lbWl0KCd0aHJlZScpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCA3XG5cdFx0XHRcblx0XHRcdGV4cGVjdChlbWl0Q29udGV4dCkudG8uZXF1YWwgZGl2XG5cdFx0XHRkaXZCLmVtaXQoJ2ZpdmUnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb250ZXh0KS50by5lcXVhbCBkaXZCXG5cblxuXHRcdHRlc3QgXCJ0aGUgaW5zZXJ0ZWQgZXZlbnQgd2lsbCBiZSBwcml2YXRlbHkgZW1pdHRlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGluc2VydGVkIGludG8gdGhlIERPTVwiLCAoKS0+XG5cdFx0XHRpbnZva2VDb3VudCA9IDBcblx0XHRcdHBhcmVudEEgPSBEb20uc2VjdGlvbigpXG5cdFx0XHRwYXJlbnRCID0gRG9tLnNlY3Rpb24oKVxuXHRcdFx0bWFzdGVyUGFyZW50QiA9IERvbS5kaXYoKVxuXHRcdFx0cGFyZW50QyA9IERvbS5zZWN0aW9uKCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXG5cdFx0XHRkaXYub24gJ2luc2VydGVkJywgKGVsKS0+XG5cdFx0XHRcdGV4cGVjdChAKS50by5lcXVhbChkaXYpXG5cdFx0XHRcdGV4cGVjdChlbCkudG8uZXF1YWwoZGl2LnBhcmVudClcblx0XHRcdFx0ZXhwZWN0KGludm9rZUNvdW50KyspLnRvLmVxdWFsKDApXG5cblx0XHRcdGV4cGVjdChpbnZva2VDb3VudCkudG8uZXF1YWwoMClcblx0XHRcdGRpdi5hcHBlbmRUbyhwYXJlbnRBKVxuXHRcdFx0ZXhwZWN0KGludm9rZUNvdW50KS50by5lcXVhbCgwKVxuXHRcdFx0XG5cdFx0XHRkaXYuYXBwZW5kVG8ocGFyZW50Qi5hcHBlbmRUbyhtYXN0ZXJQYXJlbnRCKSlcblx0XHRcdGV4cGVjdChpbnZva2VDb3VudCkudG8uZXF1YWwoMClcblx0XHRcdFxuXHRcdFx0cGFyZW50QS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0ZXhwZWN0KGludm9rZUNvdW50KS50by5lcXVhbCgwKVxuXHRcdFx0XG5cdFx0XHRkaXYuYXBwZW5kVG8ocGFyZW50Qylcblx0XHRcdGV4cGVjdChpbnZva2VDb3VudCkudG8uZXF1YWwoMSlcblxuXHRcdFx0ZGl2LmRldGFjaCgpXG5cdFx0XHRkaXYuYXBwZW5kVG8ocGFyZW50Qi5hcHBlbmRUbyhzYW5kYm94KSlcblx0XHRcdGV4cGVjdChpbnZva2VDb3VudCkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChkaXYucGFyZW50KS50by5lcXVhbCBwYXJlbnRCXG5cblx0XHRcdGRpdi5vbiAnaW5zZXJ0ZWQnLCAoKS0+IGV4cGVjdChpbnZva2VDb3VudCsrKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KGludm9rZUNvdW50KS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KGRpdi5wYXJlbnQpLnRvLmVxdWFsIHBhcmVudEJcblx0XHRcdFxuXHRcdFx0ZGl2LmFwcGVuZFRvKHBhcmVudEMpXG5cdFx0XHRleHBlY3QoaW52b2tlQ291bnQpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkudG8uZXF1YWwgcGFyZW50Q1xuXHRcdFx0XG5cdFx0XHRkaXYuZGV0YWNoKClcblx0XHRcdGRpdi5hcHBlbmRUbyhwYXJlbnRBKVxuXHRcdFx0ZGl2Lm9uICdpbnNlcnRlZCcsICgpLT4gaW52b2tlQ291bnQrK1xuXHRcdFx0ZXhwZWN0KGludm9rZUNvdW50KS50by5lcXVhbCgzKVxuXHRcdFx0XG5cdFx0XHRkaXYuZGV0YWNoKClcblx0XHRcdGRpdi5hcHBlbmRUbyhwYXJlbnRCKVxuXHRcdFx0ZXhwZWN0KGludm9rZUNvdW50KS50by5lcXVhbCgzKVxuXG5cblx0XHR0ZXN0IFwiUXVpY2tFbGVtZW50LnJlcGxhY2Ugd2lsbCB0cmlnZ2VyIHRoZSBpbnNlcnRlZCBldmVudFwiLCAoKS0+XG5cdFx0XHRpbnZva2VDb3VudCA9IDBcblx0XHRcdHBhcmVudCA9IERvbS5zZWN0aW9uKCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdEEgPSBEb20uZGl2KClcblx0XHRcdEIgPSBEb20uZGl2KClcblxuXHRcdFx0Qi5vbiAnaW5zZXJ0ZWQnLCAoZWwpLT5cblx0XHRcdFx0ZXhwZWN0KEApLnRvLmVxdWFsKEIpXG5cdFx0XHRcdGV4cGVjdChlbCkudG8uZXF1YWwoQi5wYXJlbnQpXG5cdFx0XHRcdGV4cGVjdChpbnZva2VDb3VudCsrKS50by5lcXVhbCgwKVxuXG5cdFx0XHRleHBlY3QoaW52b2tlQ291bnQpLnRvLmVxdWFsIDBcblx0XHRcdGV4cGVjdChBLnBhcmVudCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KEIucGFyZW50KS50by5lcXVhbCh1bmRlZmluZWQpXG5cblx0XHRcdHBhcmVudC5hcHBlbmQoQSlcblx0XHRcdGV4cGVjdChpbnZva2VDb3VudCkudG8uZXF1YWwgMFxuXHRcdFx0ZXhwZWN0KEEucGFyZW50KS50by5lcXVhbChwYXJlbnQpXG5cdFx0XHRleHBlY3QoQi5wYXJlbnQpLnRvLmVxdWFsKHVuZGVmaW5lZClcblxuXHRcdFx0QS5yZXBsYWNlKEIpXG5cdFx0XHRleHBlY3QoaW52b2tlQ291bnQpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChBLnBhcmVudCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KEIucGFyZW50KS50by5lcXVhbChwYXJlbnQpXG5cblxuXG5cblxuXG5cdHN1aXRlIFwiU3R5bGVcIiwgKCktPlxuXHRcdHRlc3QgXCJTdHlsZXMgY2FuIGJlIHNldCB2aWEgdGhlIC5zdHlsZS8uY3NzIG1ldGhvZCB3aXRoIGFyZ3MgcGFpciBvZiBbcHJvcGVydHksIHZhbHVlXVwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KHN0eWxlOnt3aWR0aDonMTVweCd9KS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0Y29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZGl2LmVsKVxuXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS53aWR0aCkudG8uZXF1YWwoJzE1cHgnKVxuXG5cdFx0XHRkaXYuc3R5bGUgJ3dpZHRoJywgJzI1cHgnXG5cdFx0XHRleHBlY3QoZGl2LmVsLnN0eWxlLndpZHRoKS50by5lcXVhbCgnMjVweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS53aWR0aCkudG8uZXF1YWwoJzI1cHgnKVxuXG5cdFx0XHRkaXYuc3R5bGUgJ3dpZHRoJywgJzV2aCdcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUud2lkdGgpLnRvLmVxdWFsKCc1dmgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmNvbnRhaW4oJ3B4JylcblxuXG5cdFx0dGVzdCBcIk11bHRpcGxlIFN0eWxlcyBjYW4gYmUgc2V0IHZpYSB0aGUgLnN0eWxlLy5jc3MgbWV0aG9kIGJ5IHBhc3NpbmcgYSBzdHlsZSBvYmplY3RcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLmRpdihzdHlsZTp7d2lkdGg6JzE1cHgnfSkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRpdi5lbClcblxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmVxdWFsKCcxNXB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzBweCcpXG5cblx0XHRcdGRpdi5zdHlsZSB7d2lkdGg6MjUsIGhlaWdodDonMzMnfVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmVxdWFsKCcyNXB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzMzcHgnKVxuXG5cblx0XHR0ZXN0IFwiU3R5bGVzIGRlZmluZWQgaW4gdGhlIG9wdGlvbnMgb2JqZWN0IHdpbGwgYmUgYXBwbGllZCB2aWEgY2xhc3NOYW1lcyBhbmQgbm90IGlubGluZSBzdHlsZVwiLCAoKS0+XG5cdFx0XHRkaXZBID0gRG9tLmRpdihzdHlsZTp7d2lkdGg6MTUsIGhlaWdodDozMH0pLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRkaXZCID0gRG9tLmRpdigpLmFwcGVuZFRvKHNhbmRib3gpLnN0eWxlIHt3aWR0aDoxNSwgaGVpZ2h0OjMwfVxuXG5cdFx0XHRleHBlY3QoZGl2QS5yYXcpLnRvLmhhdmUuc3R5bGUoJ3dpZHRoJywgJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkIucmF3KS50by5oYXZlLnN0eWxlKCd3aWR0aCcsICcxNXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLnJhdykudG8uaGF2ZS5zdHlsZSgnaGVpZ2h0JywgJzMwcHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkIucmF3KS50by5oYXZlLnN0eWxlKCdoZWlnaHQnLCAnMzBweCcpXG5cdFx0XHRcblx0XHRcdGV4cGVjdChkaXZBLnJhdy5zdHlsZS53aWR0aCkudG8uZXF1YWwgJydcblx0XHRcdGV4cGVjdChkaXZCLnJhdy5zdHlsZS53aWR0aCkudG8uZXF1YWwgJzE1cHgnXG5cdFx0XHRleHBlY3QoZGl2QS5yYXcuc3R5bGUuaGVpZ2h0KS50by5lcXVhbCAnJ1xuXHRcdFx0ZXhwZWN0KGRpdkIucmF3LnN0eWxlLmhlaWdodCkudG8uZXF1YWwgJzMwcHgnXG5cblxuXHRcdHRlc3QgXCJJZiBwYXNzZWQgYSBwcm9wZXJ0eSBuYW1lIHdpdGhvdXQgYSB2YWx1ZSwgdGhlIGNvbXB1dGVkIHZhbHVlIGZvciB0aGF0IHByb3BlcnR5IHdpbGwgYmUgcmV0dXJuZWRcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLmRpdihzdHlsZTp7d2lkdGg6JzE1cHgnfSkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRpdi5lbClcblxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCAnMTVweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2hlaWdodCcpLnRvLmVxdWFsICcwcHgnXG5cblx0XHRcdGRpdi5zdHlsZSB3aWR0aDpudWxsLCBoZWlnaHQ6IDU1XG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd3aWR0aCcpLnRvLmVxdWFsIGNvbXB1dGVkU3R5bGUud2lkdGhcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2hlaWdodCcpLnRvLmVxdWFsICc1NXB4J1xuXHRcdFx0XG5cdFx0XHRkaXYuc3R5bGUgJ3dpZHRoJywgJzE5dncnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd3aWR0aCcpLnRvLmNvbnRhaW4gJ3B4J1xuXG5cblx0XHR0ZXN0IFwiRnVuY3Rpb25zIGNhbiBiZSBwYXNzZWQgYXMgdmFsdWVzIGZvciBwcm9wZXJ0aWVzIGluIHN0eWxlIG9iamVjdHMgd2hpY2ggd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIGVsZW1lbnQncyBvcHRpb25zLnJlbGF0ZWRJbnN0YW5jZSBhcyB0aGUgb25seSBhcmd1bWVudFwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KHJhdGU6MjUpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRhcHBseVdpZHRoID0gKGV4cGVjdGVkSW5zdGFuY2UpLT5cblx0XHRcdFx0ZGl2LnN0eWxlIHdpZHRoOiAoaW5zdGFuY2UpLT5cblx0XHRcdFx0XHRleHBlY3QodHlwZW9mIGluc3RhbmNlKS50by5lcXVhbCAnb2JqZWN0J1xuXHRcdFx0XHRcdGV4cGVjdChpbnN0YW5jZSkudG8uZXF1YWwoZXhwZWN0ZWRJbnN0YW5jZSlcblx0XHRcdFx0XHRyZXR1cm4gZGl2Lm9wdGlvbnMucmF0ZVxuXG5cdFx0XHRhcHBseVdpZHRoKGRpdilcblx0XHRcdGV4cGVjdChkaXYub3B0aW9ucy5yYXRlKS50by5lcXVhbCAyNVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCAnMjVweCdcblxuXHRcdFx0ZGl2Lm9wdGlvbnMucmF0ZSA9IDI1MFxuXHRcdFx0ZGl2LnJlbGF0ZWQgPSBhbm90aGVyT2JqID0ge31cblx0XHRcdGFwcGx5V2lkdGgoYW5vdGhlck9iailcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzI1MHB4J1xuXG5cdFx0XHRkaXYgPSBEb20uZGl2KHN0eWxlOnt3aWR0aDozMCwgaGVpZ2h0OigtPjUwKSwgZm9udFNpemU6KC0+MjApfSkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGV4cGVjdChkaXYucmF3KS50by5oYXZlLnN0eWxlICd3aWR0aCcsICczMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5yYXcpLnRvLmhhdmUuc3R5bGUgJ2hlaWdodCcsICc1MHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5yYXcpLnRvLmhhdmUuc3R5bGUgJ2ZvbnRTaXplJywgJzIwcHgnXG5cblxuXHRcdHRlc3QgXCJBIG51bGwgdmFsdWUgY2FuIGJlIHBhc3NlZCBmb3IgYSBwcm9wZXJ0eSBpbiBvcmRlciB0byBkZWxldGUgdGhhdCBzdHlsZVwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KHN0eWxlOnt3aWR0aDonMTVweCcsIGZvbnRTaXplOiAtPiAzMH0pLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRkaXYuc3R5bGUgJ2hlaWdodCcsIDIwXG5cblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ3dpZHRoJywgJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnaGVpZ2h0JywgJzIwcHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5zdHlsZS53aWR0aCkudG8uZXF1YWwgJydcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUuaGVpZ2h0KS50by5lcXVhbCAnMjBweCdcblxuXHRcdFx0ZGl2LnN0eWxlIHt3aWR0aDpudWxsLCBoZWlnaHQ6MTJ9XG5cdFx0XHRleHBlY3QoZGl2LmVsKS5ub3QudG8uaGF2ZS5zdHlsZSgnd2lkdGgnLCAnMTVweCcpXG5cdFx0XHRleHBlY3QoZGl2LmVsKS50by5oYXZlLnN0eWxlKCdoZWlnaHQnLCAnMTJweCcpXG5cdFx0XHRleHBlY3QoWyd1bnNldCcsJ2luaGVyaXQnLCdpbml0aWFsJ10uc29tZSAocyktPiBzIGlzIGRpdi5lbC5zdHlsZS53aWR0aCkudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5zdHlsZS5oZWlnaHQpLnRvLmVxdWFsICcxMnB4J1xuXG5cdFx0XHRkaXYuY3NzICdoZWlnaHQnLCBudWxsXG5cdFx0XHRleHBlY3QoZGl2LmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwgJydcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUud2lkdGgpLm5vdC50by5lcXVhbCAnJ1xuXG5cdFx0XHRkaXYuZWwuc3R5bGUud2lkdGggPSBudWxsXG5cdFx0XHRleHBlY3QoZGl2LmVsLnN0eWxlLndpZHRoKS50by5lcXVhbCAnJ1xuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnd2lkdGgnLCAnMTVweCcpXG5cdFx0XHRcblx0XHRcdGRpdi5jc3MgJ3dpZHRoJywgbnVsbFxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5zdHlsZS53aWR0aCkubm90LnRvLmVxdWFsICcnXG5cdFx0XHRleHBlY3QoZGl2LmVsKS5ub3QudG8uaGF2ZS5zdHlsZSgnd2lkdGgnLCAnMTVweCcpXG5cblx0XHRcdGRpdi5zdHlsZSAnaGVpZ2h0JywgLT4gMzBcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUuaGVpZ2h0KS50by5lcXVhbCAnMzBweCdcblx0XHRcdFxuXHRcdFx0ZGl2LnN0eWxlICdoZWlnaHQnLCAtPiBudWxsXG5cdFx0XHRleHBlY3QoZGl2LmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwgJydcblx0XHRcdFxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5zdHlsZS5mb250U2l6ZSkudG8uZXF1YWwgJzMwcHgnXG5cdFx0XHRkaXYuc3R5bGUgJ2ZvbnRTaXplJywgbnVsbFxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5zdHlsZS5mb250U2l6ZSkudG8uZXF1YWwgJydcblxuXG5cdFx0dGVzdCBcIi5zdHlsZVNhZmUoKSBjYW4gYmUgdXNlZCB0byBvYnRhaW4gdGhlIHZhbHVlIGZvciBhIGdpdmVuIHByb3BlcnR5IGV2ZW4gZm9yIG5vbi1pbnNlcnRlZCBlbGVtZW50cyBvciBlbGVtZW50cyB3aXRoIG9wdGlvbnMuc3R5bGVBZnRlckluc2VydFwiLCAoKS0+XG5cdFx0XHRzdHlsZSA9XG5cdFx0XHRcdHdpZHRoOiAnOHB4J1xuXHRcdFx0XHRoZWlnaHQ6ICc5cHgnXG5cdFx0XHRcdHpJbmRleDogKGZpZWxkKS0+IGZpZWxkLm9wdGlvbnMudGhlSW5kZXhcblx0XHRcdFx0JGhhcHB5OlxuXHRcdFx0XHRcdHdpZHRoOiAnMThweCdcblx0XHRcdFx0XHR6SW5kZXg6IChmaWVsZCktPiBmaWVsZC5vcHRpb25zLnRoZUluZGV4KjJcblx0XHRcdFx0JHJlbGF4ZWQ6XG5cdFx0XHRcdFx0aGVpZ2h0OiAnMTAwJSdcblx0XHRcdGRpdkEgPSBEb20uZGl2IHtzdHlsZSwgdGhlSW5kZXg6JzEyJ31cblx0XHRcdGRpdkIgPSBEb20uZGl2IHtzdHlsZSwgdGhlSW5kZXg6JzI5Jywgc3R5bGVBZnRlckluc2VydDp0cnVlfVxuXHRcdFx0ZGl2QS5zdHlsZSBmb250U2l6ZToxMCwgcG9zaXRpb246J3JlbGF0aXZlJ1xuXHRcdFx0ZGl2Qi5zdHlsZSBmb250U2l6ZToxMCwgcG9zaXRpb246J3JlbGF0aXZlJ1xuXHRcdFx0cHJvcCA9IChlbCx0YXJnZXQpLT4gY29tcHV0ZWQ6ZWwuc3R5bGUodGFyZ2V0KSwgaW5saW5lOmVsLnJhdy5zdHlsZVt0YXJnZXRdLCBzYWZlOicnK2VsLnN0eWxlU2FmZSh0YXJnZXQpXG5cblx0XHRcdGV4cGVjdChwcm9wIGRpdkEsICdmb250U2l6ZScpLnRvLmVxbCB7Y29tcHV0ZWQ6JycsIGlubGluZTonMTBweCcsIHNhZmU6JzEwcHgnfVxuXHRcdFx0ZXhwZWN0KHByb3AgZGl2QiwgJ2ZvbnRTaXplJykudG8uZXFsIHtjb21wdXRlZDonJywgaW5saW5lOicxMHB4Jywgc2FmZTonMTBweCd9XG5cdFx0XHRleHBlY3QocHJvcCBkaXZBLCAnd2lkdGgnKS50by5lcWwge2NvbXB1dGVkOicnLCBpbmxpbmU6JycsIHNhZmU6JzhweCd9XG5cdFx0XHRleHBlY3QocHJvcCBkaXZCLCAnd2lkdGgnKS50by5lcWwge2NvbXB1dGVkOicnLCBpbmxpbmU6JycsIHNhZmU6JzhweCd9XG5cdFx0XHRleHBlY3QocHJvcCBkaXZBLCAnaGVpZ2h0JykudG8uZXFsIHtjb21wdXRlZDonJywgaW5saW5lOicnLCBzYWZlOic5cHgnfVxuXHRcdFx0ZXhwZWN0KHByb3AgZGl2QiwgJ2hlaWdodCcpLnRvLmVxbCB7Y29tcHV0ZWQ6JycsIGlubGluZTonJywgc2FmZTonOXB4J31cblx0XHRcdGV4cGVjdChwcm9wIGRpdkEsICd6SW5kZXgnKS50by5lcWwge2NvbXB1dGVkOicnLCBpbmxpbmU6JzEyJywgc2FmZTonMTInfVxuXHRcdFx0ZXhwZWN0KHByb3AgZGl2QiwgJ3pJbmRleCcpLnRvLmVxbCB7Y29tcHV0ZWQ6JycsIGlubGluZTonJywgc2FmZTonMjknfVxuXHRcdFx0XG5cdFx0XHRkaXZBLnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRkaXZCLnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRleHBlY3QocHJvcCBkaXZBLCAnd2lkdGgnKS50by5lcWwge2NvbXB1dGVkOicnLCBpbmxpbmU6JycsIHNhZmU6JzE4cHgnfVxuXHRcdFx0ZXhwZWN0KHByb3AgZGl2QiwgJ3dpZHRoJykudG8uZXFsIHtjb21wdXRlZDonJywgaW5saW5lOicnLCBzYWZlOicxOHB4J31cblx0XHRcdGV4cGVjdChwcm9wIGRpdkEsICd6SW5kZXgnKS50by5lcWwge2NvbXB1dGVkOicnLCBpbmxpbmU6JzI0Jywgc2FmZTonMjQnfVxuXHRcdFx0ZXhwZWN0KHByb3AgZGl2QiwgJ3pJbmRleCcpLnRvLmVxbCB7Y29tcHV0ZWQ6JycsIGlubGluZTonJywgc2FmZTonNTgnfVxuXHRcdFx0XG5cdFx0XHRkaXZBLnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdGRpdkIuc3RhdGUgJ3JlbGF4ZWQnLCBvblxuXHRcdFx0ZXhwZWN0KHByb3AgZGl2QSwgJ2hlaWdodCcpLnRvLmVxbCB7Y29tcHV0ZWQ6JycsIGlubGluZTonJywgc2FmZTonMTAwJSd9XG5cdFx0XHRleHBlY3QocHJvcCBkaXZCLCAnaGVpZ2h0JykudG8uZXFsIHtjb21wdXRlZDonJywgaW5saW5lOicnLCBzYWZlOicxMDAlJ31cblx0XHRcdFxuXHRcdFx0ZGl2QS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0ZGl2Qi5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0aGVpZ2h0QSA9IGdldENvbXB1dGVkU3R5bGUoZGl2QS5yYXcpLmhlaWdodFxuXHRcdFx0aGVpZ2h0QiA9IGdldENvbXB1dGVkU3R5bGUoZGl2Qi5yYXcpLmhlaWdodFxuXHRcdFx0ZXhwZWN0KHByb3AgZGl2QSwgJ3pJbmRleCcpLnRvLmVxbCB7Y29tcHV0ZWQ6JzI0JywgaW5saW5lOicyNCcsIHNhZmU6JzI0J31cblx0XHRcdGV4cGVjdChwcm9wIGRpdkIsICd6SW5kZXgnKS50by5lcWwge2NvbXB1dGVkOic1OCcsIGlubGluZTonNTgnLCBzYWZlOic1OCd9XG5cdFx0XHRleHBlY3QocHJvcCBkaXZBLCAnaGVpZ2h0JykudG8uZXFsIHtjb21wdXRlZDpoZWlnaHRBLCBpbmxpbmU6JycsIHNhZmU6aGVpZ2h0QX1cblx0XHRcdGV4cGVjdChwcm9wIGRpdkIsICdoZWlnaHQnKS50by5lcWwge2NvbXB1dGVkOmhlaWdodEIsIGlubGluZTonJywgc2FmZTpoZWlnaHRCfVxuXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVNhZmUgJ2hlaWdodCcpLnRvLmVxdWFsIGhlaWdodEFcblx0XHRcdGV4cGVjdChkaXZBLnN0eWxlU2FmZSAnaGVpZ2h0JywgdHJ1ZSkudG8uZXF1YWwgJzEwMCUnXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZVNhZmUgJ2hlaWdodCcpLnRvLmVxdWFsIGhlaWdodEJcblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlU2FmZSAnaGVpZ2h0JywgdHJ1ZSkudG8uZXF1YWwgJzEwMCUnXG5cdFx0XHRcblx0XHRcdGRpdkIuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlKCdoZWlnaHQnKSkubm90LnRvLmVxdWFsKCcnKVxuXHRcdFx0ZXhwZWN0KGRpdkIuc3R5bGUoJ2hlaWdodCcpKS5ub3QudG8uZXF1YWwoJzEwMCUnKVxuXHRcdFx0ZXhwZWN0KGRpdkIuc3R5bGUoJ2hlaWdodCcpKS50by5jb250YWluKCdweCcpXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZVNhZmUoJ2hlaWdodCcpKS50by5lcXVhbChkaXZCLnN0eWxlKCdoZWlnaHQnKSlcblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlU2FmZSgnaGVpZ2h0JywgdHJ1ZSkpLm5vdC50by5lcXVhbChkaXZCLnN0eWxlKCdoZWlnaHQnKSlcblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlU2FmZSgnaGVpZ2h0JywgdHJ1ZSkpLnRvLmVxdWFsKCcxMDAlJylcblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlU2FmZSgnbWFyZ2luJywgdHJ1ZSkpLnRvLmVxdWFsKCcnKVxuXHRcdFx0ZXhwZWN0KGRpdkIuc3R5bGUoJ3dpZHRoJykpLnRvLmVxdWFsKCcxOHB4JylcblxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGVTYWZlKCdmYWtlUHJvcCcpKS50by5lcXVhbChkaXZBKVxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGVTYWZlKDEyMykpLnRvLmVxdWFsKGRpdkEpXG5cblx0XHRcdHRleHQgPSBEb20udGV4dCgnYWJjMTIzJykuYXBwZW5kVG8oZGl2QSlcblx0XHRcdGV4cGVjdCh0ZXh0LnN0eWxlU2FmZSgnZmFrZVByb3AnKSkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KHRleHQuc3R5bGVTYWZlKDEyMykpLnRvLmVxdWFsKHVuZGVmaW5lZClcblxuXG5cdFx0dGVzdCBcIi5zdHlsZVNhZmUoKSB3aWxsIHdvcmsgd2l0aCBpbnN0YW5jZXMgd2l0aCBubyBnaXZlbiBiYXNlIHN0eWxlc1wiLCAoKS0+XG5cdFx0XHRkaXZBID0gRG9tLmRpdigpXG5cdFx0XHRkaXZCID0gRG9tKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJ2RpdicpXG5cblx0XHRcdGV4cGVjdCAoKS0+XG5cdFx0XHRcdGRpdkEuc3R5bGVTYWZlKCdoZWlnaHQnKVxuXHRcdFx0XHRkaXZCLnN0eWxlU2FmZSgnaGVpZ2h0Jylcblx0XHRcdC5ub3QudG8udGhyb3coKVxuXHRcdFx0XG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVNhZmUgJ2hlaWdodCcpLnRvLmVxdWFsICcnXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZVNhZmUgJ2hlaWdodCcpLnRvLmVxdWFsICcnXG5cblxuXHRcdHRlc3QgXCIuc3R5bGVQYXJzZWQoKSBpcyBhIHNob3J0aGFuZCBmb3IgcGFyc2VGbG9hdCguc3R5bGVTYWZlKCkpXCIsICgpLT5cblx0XHRcdHN0eWxlID1cblx0XHRcdFx0d2lkdGg6ICc4cHgnXG5cdFx0XHRcdGhlaWdodDogJzlweCdcblx0XHRcdFx0JGhhcHB5OlxuXHRcdFx0XHRcdHdpZHRoOiAnMThweCdcblx0XHRcdFx0JHJlbGF4ZWQ6XG5cdFx0XHRcdFx0aGVpZ2h0OiAnMTAwJSdcblx0XHRcdGRpdkEgPSBEb20uZGl2IHtzdHlsZX1cblx0XHRcdGRpdkIgPSBEb20uZGl2IHtzdHlsZSwgc3R5bGVBZnRlckluc2VydDp0cnVlfVxuXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZSgnd2lkdGgnKSkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVNhZmUoJ3dpZHRoJykpLnRvLmVxdWFsKCc4cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGVQYXJzZWQoJ3dpZHRoJykpLnRvLmVxdWFsKHBhcnNlRmxvYXQgZGl2QS5zdHlsZVNhZmUoJ3dpZHRoJykpXG5cblx0XHRcdGV4cGVjdChkaXZBLnN0eWxlKCdoZWlnaHQnKSkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVNhZmUoJ2hlaWdodCcpKS50by5lcXVhbCgnOXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLnN0eWxlUGFyc2VkKCdoZWlnaHQnKSkudG8uZXF1YWwocGFyc2VGbG9hdCBkaXZBLnN0eWxlU2FmZSgnaGVpZ2h0JykpXG5cblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlKCd3aWR0aCcpKS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlU2FmZSgnd2lkdGgnKSkudG8uZXF1YWwoJzhweCcpXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZVBhcnNlZCgnd2lkdGgnKSkudG8uZXF1YWwocGFyc2VGbG9hdCBkaXZCLnN0eWxlU2FmZSgnd2lkdGgnKSlcblxuXHRcdFx0ZGl2QS5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZGl2Qi5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGUoJ3dpZHRoJykpLnRvLmVxdWFsKCcnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGVTYWZlKCd3aWR0aCcpKS50by5lcXVhbCgnMThweCcpXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVBhcnNlZCgnd2lkdGgnKSkudG8uZXF1YWwocGFyc2VGbG9hdCBkaXZBLnN0eWxlU2FmZSgnd2lkdGgnKSlcblx0XHRcdFxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGUoJ2hlaWdodCcpKS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChkaXZBLnN0eWxlU2FmZSgnaGVpZ2h0JykpLnRvLmVxdWFsKCc5cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGVQYXJzZWQoJ2hlaWdodCcpKS50by5lcXVhbChwYXJzZUZsb2F0IGRpdkEuc3R5bGVTYWZlKCdoZWlnaHQnKSlcblxuXHRcdFx0ZXhwZWN0KGRpdkIuc3R5bGUoJ3dpZHRoJykpLnRvLmVxdWFsKCcnKVxuXHRcdFx0ZXhwZWN0KGRpdkIuc3R5bGVTYWZlKCd3aWR0aCcpKS50by5lcXVhbCgnMThweCcpXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZVBhcnNlZCgnd2lkdGgnKSkudG8uZXF1YWwocGFyc2VGbG9hdCBkaXZCLnN0eWxlU2FmZSgnd2lkdGgnKSlcblxuXHRcdFx0ZGl2QS5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRkaXZCLnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdGV4cGVjdChkaXZBLnN0eWxlKCd3aWR0aCcpKS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChkaXZBLnN0eWxlU2FmZSgnd2lkdGgnKSkudG8uZXF1YWwoJzE4cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGVQYXJzZWQoJ3dpZHRoJykpLnRvLmVxdWFsKHBhcnNlRmxvYXQgZGl2QS5zdHlsZVNhZmUoJ3dpZHRoJykpXG5cdFx0XHRcblx0XHRcdGV4cGVjdChkaXZBLnN0eWxlKCdoZWlnaHQnKSkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVNhZmUoJ2hlaWdodCcpKS50by5lcXVhbCgnMTAwJScpXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVBhcnNlZCgnaGVpZ2h0JykpLnRvLmVxdWFsKHBhcnNlRmxvYXQgZGl2QS5zdHlsZVNhZmUoJ2hlaWdodCcpKVxuXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZSgnd2lkdGgnKSkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZVNhZmUoJ3dpZHRoJykpLnRvLmVxdWFsKCcxOHB4Jylcblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlUGFyc2VkKCd3aWR0aCcpKS50by5lcXVhbChwYXJzZUZsb2F0IGRpdkIuc3R5bGVTYWZlKCd3aWR0aCcpKVxuXG5cdFx0XHRkaXZBLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRkaXZCLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRkaXZBLnN0YXRlICdyZWxheGVkJywgb2ZmXG5cdFx0XHRkaXZCLnN0YXRlICdyZWxheGVkJywgb2ZmXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZSgnd2lkdGgnKSkudG8uZXF1YWwoJzE4cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGVTYWZlKCd3aWR0aCcpKS50by5lcXVhbCgnMThweCcpXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVBhcnNlZCgnd2lkdGgnKSkudG8uZXF1YWwocGFyc2VGbG9hdCBkaXZBLnN0eWxlU2FmZSgnd2lkdGgnKSlcblx0XHRcdFxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGUoJ2hlaWdodCcpKS50by5lcXVhbCgnOXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLnN0eWxlU2FmZSgnaGVpZ2h0JykpLnRvLmVxdWFsKCc5cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGVQYXJzZWQoJ2hlaWdodCcpKS50by5lcXVhbChwYXJzZUZsb2F0IGRpdkEuc3R5bGVTYWZlKCdoZWlnaHQnKSlcblxuXHRcdFx0ZXhwZWN0KGRpdkIuc3R5bGUoJ3dpZHRoJykpLnRvLmVxdWFsKCcxOHB4Jylcblx0XHRcdGV4cGVjdChkaXZCLnN0eWxlU2FmZSgnd2lkdGgnKSkudG8uZXF1YWwoJzE4cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkIuc3R5bGVQYXJzZWQoJ3dpZHRoJykpLnRvLmVxdWFsKHBhcnNlRmxvYXQgZGl2Qi5zdHlsZVNhZmUoJ3dpZHRoJykpXG5cblxuXHRcdHRlc3QgXCIucmVjYWxjU3R5bGUoKSByZS1hcHBsaWVzIGFsbCBmdW5jdGlvbi12YWx1ZSBzdHlsZXNcIiwgKCktPlxuXHRcdFx0Y291bnQgPSBBOjAsQjowLEM6MCxEOjAsRTowLEY6MCxHOjBcblx0XHRcdGRpdiA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdHdpZHRoOiAoKS0+ICsrY291bnQuQVxuXHRcdFx0XHRvcGFjaXR5OiAxXG5cdFx0XHRcdGhlaWdodDogKCktPiArK2NvdW50LkJcblx0XHRcdFx0Zm9udFNpemU6ICgpLT4gKytjb3VudC5DXG5cdFx0XHRcdCRoYXBweTpcblx0XHRcdFx0XHRvcGFjaXR5OiAwLjVcblx0XHRcdFx0XHRmb250U2l6ZTogKCktPiArK2NvdW50LkRcblx0XHRcdFx0JHJlbGF4ZWQ6XG5cdFx0XHRcdFx0aGVpZ2h0OiAoKS0+ICsrY291bnQuRVxuXHRcdFx0XHRcdGZvbnRTaXplOiAoKS0+ICsrY291bnQuRlxuXHRcdFx0XHRcdCRmdW5ueTpcblx0XHRcdFx0XHRcdHdpZHRoOiAoKS0+ICsrY291bnQuR1xuXG5cdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCBBOjEsQjoxLEM6MSxEOjAsRTowLEY6MCxHOjBcblx0XHRcdFxuXHRcdFx0ZGl2LnJlY2FsY1N0eWxlKClcblx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIEE6MixCOjIsQzoyLEQ6MCxFOjAsRjowLEc6MFxuXHRcdFx0XG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIEE6MixCOjIsQzoyLEQ6MSxFOjAsRjowLEc6MFxuXG5cdFx0XHRkaXYucmVjYWxjU3R5bGUoKVxuXHRcdFx0ZXhwZWN0KGNvdW50KS50by5lcWwgQTozLEI6MyxDOjIsRDoyLEU6MCxGOjAsRzowXG5cblx0XHRcdGRpdi5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCBBOjMsQjozLEM6MixEOjIsRToxLEY6MSxHOjBcblxuXHRcdFx0ZGl2LnJlY2FsY1N0eWxlKClcblx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIEE6NCxCOjMsQzoyLEQ6MixFOjIsRjoyLEc6MFxuXG5cdFx0XHRkaXYuc3RhdGUgJ2Z1bm55Jywgb25cblx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIEE6NCxCOjMsQzoyLEQ6MixFOjIsRjoyLEc6MVxuXG5cdFx0XHRkaXYucmVjYWxjU3R5bGUoKVxuXHRcdFx0ZXhwZWN0KGNvdW50KS50by5lcWwgQTo0LEI6MyxDOjIsRDoyLEU6MyxGOjMsRzoyXG5cdFx0XHRcblx0XHRcdGRpdi5zdGF0ZSAnZnVubnknLCBvZmZcblx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIEE6NSxCOjMsQzoyLEQ6MixFOjMsRjozLEc6MlxuXHRcdFx0XG5cdFx0XHRkaXYucmVjYWxjU3R5bGUoKVxuXHRcdFx0ZXhwZWN0KGNvdW50KS50by5lcWwgQTo2LEI6MyxDOjIsRDoyLEU6NCxGOjQsRzoyXG5cblxuXHRcdHRlc3QgXCIucmVjYWxjU3R5bGUoKSBhY2NlcHRzIGEgc2luZ2xlIGFyZ3VtZW50IHRvIGluZGljYXRlIGlmIHRvIHJlY2FsYyBzdHlsZSBvbiBjaGlsZHJlblwiLCAoKS0+XG5cdFx0XHRjb3VudCA9IEE6MCxCOjAsQzowLEQ6MCxFOjAsRjowLEc6MFxuXHRcdFx0d3JhcHBlckNvdW50ID0gMFxuXHRcdFx0d3JhcHBlciA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdHdpZHRoOiAoKS0+ICsrd3JhcHBlckNvdW50XG5cdFx0XHRcblx0XHRcdGRpdiA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdHdpZHRoOiAoKS0+ICsrY291bnQuQVxuXHRcdFx0XHRvcGFjaXR5OiAxXG5cdFx0XHRcdGhlaWdodDogKCktPiArK2NvdW50LkJcblx0XHRcdFx0Zm9udFNpemU6ICgpLT4gKytjb3VudC5DXG5cdFx0XHRcdCRoYXBweTpcblx0XHRcdFx0XHRvcGFjaXR5OiAwLjVcblx0XHRcdFx0XHRmb250U2l6ZTogKCktPiArK2NvdW50LkRcblx0XHRcdFx0JHJlbGF4ZWQ6XG5cdFx0XHRcdFx0aGVpZ2h0OiAoKS0+ICsrY291bnQuRVxuXHRcdFx0XHRcdGZvbnRTaXplOiAoKS0+ICsrY291bnQuRlxuXHRcdFx0XHRcdCRmdW5ueTpcblx0XHRcdFx0XHRcdHdpZHRoOiAoKS0+ICsrY291bnQuR1xuXG5cdFx0XHRkaXYuYXBwZW5kVG8od3JhcHBlcilcblx0XHRcdGV4cGVjdCh3cmFwcGVyQ291bnQpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIEE6MSxCOjEsQzoxLEQ6MCxFOjAsRjowLEc6MFxuXHRcdFx0XG5cdFx0XHR3cmFwcGVyLnJlY2FsY1N0eWxlKClcblx0XHRcdGV4cGVjdCh3cmFwcGVyQ291bnQpLnRvLmVxdWFsIDJcblx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIEE6MSxCOjEsQzoxLEQ6MCxFOjAsRjowLEc6MFxuXHRcdFx0XG5cdFx0XHR3cmFwcGVyLnJlY2FsY1N0eWxlKHRydWUpXG5cdFx0XHRleHBlY3Qod3JhcHBlckNvdW50KS50by5lcXVhbCAzXG5cdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCBBOjIsQjoyLEM6MixEOjAsRTowLEY6MCxHOjBcblx0XHRcdFxuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCBBOjIsQjoyLEM6MixEOjEsRTowLEY6MCxHOjBcblxuXHRcdFx0d3JhcHBlci5yZWNhbGNTdHlsZSgpXG5cdFx0XHRleHBlY3Qod3JhcHBlckNvdW50KS50by5lcXVhbCA0XG5cdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCBBOjIsQjoyLEM6MixEOjEsRTowLEY6MCxHOjBcblx0XHRcdFxuXHRcdFx0d3JhcHBlci5yZWNhbGNTdHlsZSgxKVxuXHRcdFx0ZXhwZWN0KHdyYXBwZXJDb3VudCkudG8uZXF1YWwgNVxuXHRcdFx0ZXhwZWN0KGNvdW50KS50by5lcWwgQTozLEI6MyxDOjIsRDoyLEU6MCxGOjAsRzowXG5cblxuXHRcdHRlc3QgXCJJZiBvcHRpb25zLnJlY2FsY09uUmVzaXplIGlzIHNldCwgLnJlY2FsY1N0eWxlKCkgd2lsbCBiZSBpbnZva2VkIG9uIGVhY2ggcmVzaXplIGV2ZW50XCIsICgpLT5cblx0XHRcdGNvdW50ID0gQTowLEI6MCxDOjAsRDowXG5cdFx0XHREb20uZGl2XG5cdFx0XHRcdHN0eWxlOlxuXHRcdFx0XHRcdHdpZHRoOiAoKS0+ICsrY291bnQuQVxuXHRcdFx0XHRcdG9wYWNpdHk6IDFcblx0XHRcdFx0XHRoZWlnaHQ6ICgpLT4gKytjb3VudC5CXG5cdFx0XHRcblx0XHRcdERvbS5kaXZcblx0XHRcdFx0cmVjYWxjT25SZXNpemU6IHRydWVcblx0XHRcdFx0c3R5bGU6XG5cdFx0XHRcdFx0d2lkdGg6ICgpLT4gKytjb3VudC5DXG5cdFx0XHRcdFx0b3BhY2l0eTogMVxuXHRcdFx0XHRcdGhlaWdodDogKCktPiArK2NvdW50LkRcblxuXHRcdFx0ZXhwZWN0KGNvdW50KS50by5lcWwgQToxLEI6MSxDOjEsRDoxXG5cdFx0XHRcblx0XHRcdERvbSh3aW5kb3cpLmVtaXQgJ3Jlc2l6ZSdcblx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIEE6MSxCOjEsQzoyLEQ6MlxuXHRcdFx0XG5cdFx0XHREb20od2luZG93KS5lbWl0ICdyZXNpemUnXG5cdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCBBOjEsQjoxLEM6MyxEOjNcblxuXG5cdFx0dGVzdCBcIklmIG9wdGlvbnMuZm9yY2VTdHlsZSBpcyBzZXQsIGFsbCByZWdpc3RlcmVkIHN0eWxlcyB3aWxsIGhhdmUgdGhlICchaW1wb3J0YW50JyBmbGFnIHNldFwiLCAoKS0+XG5cdFx0XHRzdHlsZSA9IERPTS5zdHlsZShwcm9wczppbm5lckhUTUw6XCIudGhlRGl2IHt3aWR0aDo1MHB4fVwiKVxuXHRcdFx0ZGl2QSA9IERPTS5kaXYoY2xhc3NOYW1lOid0aGVEaXYnLCBzdHlsZTp7d2lkdGg6MTAwLCBoZWlnaHQ6MTAwfSkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGRpdkIgPSBET00uZGl2KGNsYXNzTmFtZTondGhlRGl2Jywgc3R5bGU6e3dpZHRoOjEwMCwgaGVpZ2h0OjEwMH0sIGZvcmNlU3R5bGU6dHJ1ZSkuYXBwZW5kVG8oc2FuZGJveClcblxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzEwMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdkIuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzEwMHB4J1xuXHRcdFx0XG5cdFx0XHRzdHlsZS5hcHBlbmRUbyhkb2N1bWVudC5oZWFkKVxuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzUwcHgnXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCAnMTAwcHgnXG5cdFx0XHRcblx0XHRcdGV4cGVjdChkaXZBLmF0dHIoJ3N0eWxlJykgaXMgJycgb3IgZGl2QS5hdHRyKCdzdHlsZScpIGlzIG51bGwpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChkaXZCLmF0dHIoJ3N0eWxlJykgaXMgJycgb3IgZGl2Qi5hdHRyKCdzdHlsZScpIGlzIG51bGwpLnRvLmJlLnRydWVcblx0XHRcdFxuXHRcdFx0ZGl2QS5zdHlsZSAnd2lkdGgnLCAoKS0+IDc1XG5cdFx0XHRkaXZCLnN0eWxlICd3aWR0aCcsICgpLT4gNzVcblx0XHRcdGRpdkEuc3R5bGUgJ2hlaWdodCcsIDg1XG5cdFx0XHRkaXZCLnN0eWxlICdoZWlnaHQnLCA4NVxuXHRcdFx0ZXhwZWN0KGRpdkEuYXR0ciAnc3R5bGUnKS5ub3QudG8uZXF1YWwgJydcblx0XHRcdGV4cGVjdChkaXZCLmF0dHIgJ3N0eWxlJykubm90LnRvLmVxdWFsICcnXG5cdFx0XHRleHBlY3QoZGl2QS5hdHRyICdzdHlsZScpLm5vdC50by5pbmNsdWRlICc3NXB4ICFpbXBvcnRhbnQnXG5cdFx0XHRleHBlY3QoZGl2Qi5hdHRyICdzdHlsZScpLnRvLmluY2x1ZGUgJzc1cHggIWltcG9ydGFudCdcblx0XHRcdGV4cGVjdChkaXZBLmF0dHIgJ3N0eWxlJykubm90LnRvLmluY2x1ZGUgJzg1cHggIWltcG9ydGFudCdcblx0XHRcdGV4cGVjdChkaXZCLmF0dHIgJ3N0eWxlJykudG8uaW5jbHVkZSAnODVweCAhaW1wb3J0YW50J1xuXHRcdFx0ZXhwZWN0KGRpdkEuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzc1cHgnXG5cdFx0XHRleHBlY3QoZGl2Qi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCAnNzVweCdcblx0XHRcdHN0eWxlLnJlbW92ZSgpXG5cblxuXHRcdHRlc3QgXCIuc2hvdygpLy5oaWRlKCkgd2lsbCB0b2dnbGUgdGhlIGVsZW1lbnQncyB2aXNpYmlsaXR5XCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYoKS5hcHBlbmRUbyBzYW5kYm94XG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlKCdkaXNwbGF5JykpLnRvLmVxdWFsICdibG9jaydcblxuXHRcdFx0ZGl2LmhpZGUoKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSgnZGlzcGxheScpKS50by5lcXVhbCAnbm9uZSdcblxuXHRcdFx0ZGl2LnNob3coKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSgnZGlzcGxheScpKS50by5lcXVhbCAnYmxvY2snXG5cblx0XHRcdGRpdi5zaG93KClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUoJ2Rpc3BsYXknKSkudG8uZXF1YWwgJ2Jsb2NrJ1xuXG5cblx0XHR0ZXN0IFwiLnNob3coKSB3aWxsIHNldCB0aGUgZWxlbWVudCdzIGRpc3BsYXkgc3R5bGUgdG8gdGhlIHByb3ZpZGVkIGFyZ3VtZW50LCBvciB0byB0aGUgdmFsdWUgcHJvdmlkZWQgaW4gdGhlIHN0eWxlIG9iamVjdFwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KHN0eWxlOmRpc3BsYXk6J2lubGluZScpLmFwcGVuZFRvIHNhbmRib3hcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUoJ2Rpc3BsYXknKSkudG8uZXF1YWwgJ2lubGluZSdcblxuXHRcdFx0ZGl2LmhpZGUoKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSgnZGlzcGxheScpKS50by5lcXVhbCAnbm9uZSdcblxuXHRcdFx0ZGl2LnNob3coKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSgnZGlzcGxheScpKS50by5lcXVhbCAnaW5saW5lJ1xuXG5cdFx0XHRkaXYuaGlkZSgpXG5cdFx0XHRkaXYuc2hvdygnaW5saW5lLWJsb2NrJylcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUoJ2Rpc3BsYXknKSkudG8uZXF1YWwgJ2lubGluZS1ibG9jaydcblxuXG5cdFx0dGVzdCBcIlNWRyBlbGVtZW50c1wiLCAoKS0+XG5cdFx0XHRzdmcgPSBEb20oXG5cdFx0XHRcdFsnKnN2Zydcblx0XHRcdFx0XHRzdHlsZTpcblx0XHRcdFx0XHRcdGRpc3BsYXk6ICdibG9jaydcblx0XHRcdFx0XHRcdHdpZHRoOiAxMFxuXHRcdFx0XHRcdFx0aGVpZ2h0OiAxMFxuXHRcdFx0XHRcdFx0JGhhcHB5OlxuXHRcdFx0XHRcdFx0XHR3aWR0aDogMjBcblx0XHRcdFx0XHRcdFx0aGVpZ2h0OiAyMFxuXHRcdFx0XHRdXG5cdFx0XHQpLmFwcGVuZFRvKHNhbmRib3gpXG5cblx0XHRcdGV4cGVjdChzdmcuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzEwcHgnXG5cdFx0XHRleHBlY3Qoc3ZnLnN0eWxlICdoZWlnaHQnKS50by5lcXVhbCAnMTBweCdcblxuXHRcdFx0c3ZnLnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRleHBlY3Qoc3ZnLnN0eWxlICd3aWR0aCcpLnRvLmVxdWFsICcyMHB4J1xuXHRcdFx0ZXhwZWN0KHN2Zy5zdHlsZSAnaGVpZ2h0JykudG8uZXF1YWwgJzIwcHgnXG5cblxuXG5cblx0c3VpdGUgXCJTdGF0ZVwiLCAoKS0+XG5cdFx0dGVzdCBcIlN0YXRlcyBjYW4gYmUgcG9sbGVkIGZvciBhIHZhbHVlIGJ5IHBhc3Npbmcgb25seSB0aGUgdGFyZ2V0IHN0YXRlJ3MgbmFtZSB0byAuc3RhdGUgJiBjYW4gYmUgdG9nZ2xlZCBvbi9vZmYgYnkgcGFzc2luZyBhIHNlY29uZCBhcmd1bWVudFwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KClcblxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnZnVubnknKS50by5iZS5mYWxzZVxuXG5cdFx0XHRkaXYuc3RhdGUgJ2Z1bm55JywgdHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnZnVubnknKS50by5iZS50cnVlXG5cdFx0XHRcblx0XHRcdGRpdi5zdGF0ZSAnaGFwcHknLCB0cnVlXG5cdFx0XHRkaXYuc3RhdGUgJ3JlbGF4ZWQnLCB0cnVlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdmdW5ueScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2hhcHB5JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAncmVsYXhlZCcpLnRvLmJlLnRydWVcblx0XHRcdFxuXHRcdFx0ZGl2LnN0YXRlICdmdW5ueScsIGZhbHNlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdmdW5ueScpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ3JlbGF4ZWQnKS50by5iZS50cnVlXG5cdFx0XHRcblx0XHRcdGRpdi5zdGF0ZSAnJGZ1bm55JywgdHJ1ZVxuXHRcdFx0ZGl2LnN0YXRlICckYmFzZScsIHRydWVcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2Z1bm55JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnYmFzZScpLnRvLmJlLmZhbHNlXG5cblxuXHRcdHRlc3QgXCJBIGtleTp2YWx1ZSBwYWlyIG9iamVjdCBjYW4gYmUgcGFzc2VkIHRvIHRvZ2dsZSBzdGF0ZSBmb3IgbXVsdGlwbGUgc3RhdGVzIGF0IG9uY2VcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLmRpdigpXG5cblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2EnKS50by5lcXVhbCBmYWxzZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnYicpLnRvLmVxdWFsIGZhbHNlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdjJykudG8uZXF1YWwgZmFsc2VcblxuXHRcdFx0ZGl2LnN0YXRlIGE6dHJ1ZSxiOjFcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2EnKS50by5lcXVhbCB0cnVlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdiJykudG8uZXF1YWwgdHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnYycpLnRvLmVxdWFsIGZhbHNlXG5cblx0XHRcdGRpdi5zdGF0ZSBiOmZhbHNlLGM6J3knXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdhJykudG8uZXF1YWwgdHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnYicpLnRvLmVxdWFsIGZhbHNlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdjJykudG8uZXF1YWwgdHJ1ZVxuXG5cblx0XHR0ZXN0IFwiLnN0YXRlKCkgd2l0aG91dCBhcmd1bWVudHMgc2hvdWxkIHJldHVybiBhbiBhcnJheSBvZiBhY3RpdmUgc3RhdGVzXCIsICgpLT5cblx0XHRcdGVsID0gRE9NLmRpdigpXG5cdFx0XHRleHBlY3QoZWwuc3RhdGUoKSkudG8uZXFsIFtdXG5cblx0XHRcdGVsLnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRlbC5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRleHBlY3QoZWwuc3RhdGUoKSkudG8uZXFsIFsnaGFwcHknLCdyZWxheGVkJ11cblxuXHRcdFx0ZWwuc3RhdGUgJ2hhcHB5Jywgb2ZmXG5cdFx0XHRleHBlY3QoZWwuc3RhdGUoKSkudG8uZXFsIFsncmVsYXhlZCddXG5cblx0XHRcdGVsLnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRleHBlY3QoZWwuc3RhdGUoKSkudG8uZXFsIFsncmVsYXhlZCcsJ2hhcHB5J11cblxuXG5cdFx0dGVzdCBcIkFsbCBzdGF0ZXMgY2FuIGJlIGNsZWFyZWQvdG9nZ2xlZCBvZmYgdmlhIC5yZXNldFN0YXRlXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXG5cdFx0XHRkaXYuc3RhdGUgJ2Z1bm55Jywgb25cblx0XHRcdGRpdi5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZGl2LnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2Z1bm55JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnaGFwcHknKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdyZWxheGVkJykudG8uYmUudHJ1ZVxuXG5cdFx0XHRkaXYucmVzZXRTdGF0ZSgpXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdmdW5ueScpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdoYXBweScpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdyZWxheGVkJykudG8uYmUuZmFsc2VcblxuXG5cdFx0dGVzdCBcIkEgc3RhdGUgY2FuIGJlIHRvZ2dsZWQgb24vb2ZmIHZpYSAudG9nZ2xlU3RhdGVcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRE9NLmRpdigpXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXG5cdFx0XHRkaXYudG9nZ2xlU3RhdGUoJ2hhcHB5Jylcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb25cblx0XHRcdFxuXHRcdFx0ZGl2LnRvZ2dsZVN0YXRlKCdoYXBweScpXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0XG5cdFx0XHRkaXYudG9nZ2xlU3RhdGUoJ2hhcHB5Jylcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb25cblxuXG5cdFx0dGVzdCBcIlN0eWxlcyBjYW4gYmUgcGFzc2VkIHVuZGVyIHNwZWNpZmljIHN0YXRlcyB1c2luZyBhICckJyBwcmVmaXggYmVmb3JlIHRoZSBzdGF0ZSBuYW1lXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdCRiYXNlOlxuXHRcdFx0XHRcdHdpZHRoOiAnMTVweCdcblx0XHRcdFx0XHRoZWlnaHQ6ICcxNXB4J1xuXHRcdFx0XHQkaGFwcHk6XG5cdFx0XHRcdFx0d2lkdGg6ICcyNXB4J1xuXHRcdFx0XHRcdG1hcmdpblRvcDogJzIwcHgnXG5cdFx0XHRcdCRyZWxheGVkOlxuXHRcdFx0XHRcdHdpZHRoOiAnMzVweCdcblx0XHRcdFx0XHRtYXJnaW5MZWZ0OiAnMTJweCdcblxuXHRcdFx0ZGl2LmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRjb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShkaXYuZWwpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS53aWR0aCkudG8uZXF1YWwoJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUuaGVpZ2h0KS50by5lcXVhbCgnMTVweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5tYXJnaW5Ub3ApLnRvLmVxdWFsKCcwcHgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUubWFyZ2luTGVmdCkudG8uZXF1YWwoJzBweCcpXG5cdFx0XHRcblx0XHRcdGRpdi5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmVxdWFsKCcyNXB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUubWFyZ2luVG9wKS50by5lcXVhbCgnMjBweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5tYXJnaW5MZWZ0KS50by5lcXVhbCgnMHB4Jylcblx0XHRcdFxuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9mZlxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmVxdWFsKCcxNXB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUubWFyZ2luVG9wKS50by5lcXVhbCgnMHB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLm1hcmdpbkxlZnQpLnRvLmVxdWFsKCcwcHgnKVxuXHRcdFx0XG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGRpdi5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS53aWR0aCkudG8uZXF1YWwoJzM1cHgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUuaGVpZ2h0KS50by5lcXVhbCgnMTVweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5tYXJnaW5Ub3ApLnRvLmVxdWFsKCcyMHB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLm1hcmdpbkxlZnQpLnRvLmVxdWFsKCcxMnB4Jylcblx0XHRcdFxuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9mZlxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmVxdWFsKCczNXB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUubWFyZ2luVG9wKS50by5lcXVhbCgnMHB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLm1hcmdpbkxlZnQpLnRvLmVxdWFsKCcxMnB4JylcblxuXG5cdFx0dGVzdCBcIkEgc3RhdGU6ZXZlbnROYW1lIChvciBzdGF0ZTpldmVudE9wdHMpIG1hcCBjYW4gYmUgcGFzc2VkIHNldCBmb3Igb3B0aW9ucy5zdGF0ZVRyaWdnZXJzXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYoXG5cdFx0XHRcdHN0YXRlVHJpZ2dlcnM6XG5cdFx0XHRcdFx0aGFwcHk6IHtvbjonYmVjYW1lSGFwcHknLCBvZmY6J2JlY2FtZVNhZCd9XG5cdFx0XHRcdFx0cmVsYXhlZDogJ2lzUmVsYXhlZCcgXG5cdFx0XHRcdHN0eWxlOlxuXHRcdFx0XHRcdCRiYXNlOlx0XHR3aWR0aDogJzE1cHgnXG5cdFx0XHRcdFx0JGhhcHB5Olx0XHR3aWR0aDogJzI1cHgnXG5cdFx0XHRcdFx0JHJlbGF4ZWQ6XHR3aWR0aDogJzM1cHgnXG5cdFx0XHQpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRjb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShkaXYuZWwpXG5cblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2hhcHB5JykudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ3JlbGF4ZWQnKS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmVxdWFsKCcxNXB4JylcblxuXHRcdFx0ZGl2LmVtaXQoJ2JlY2FtZUhhcHB5Jylcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2hhcHB5JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAncmVsYXhlZCcpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS53aWR0aCkudG8uZXF1YWwoJzI1cHgnKVxuXG5cdFx0XHRkaXYuZW1pdCgnaXNSZWxheGVkJylcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2hhcHB5JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAncmVsYXhlZCcpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLndpZHRoKS50by5lcXVhbCgnMzVweCcpXG5cblx0XHRcdGRpdi5lbWl0KCdiZWNhbWVTYWQnKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnaGFwcHknKS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAncmVsYXhlZCcpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLndpZHRoKS50by5lcXVhbCgnMzVweCcpXG5cblx0XHRcdGRpdi5zdGF0ZSgncmVsYXhlZCcsIG9mZilcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLndpZHRoKS50by5lcXVhbCgnMTVweCcpXG5cblxuXHRcdHRlc3QgXCJvcHRpb25zLnN0YXRlVHJpZ2dlcnMgd29uJ3QgYmUgYXR0YWNoZWQgaWYgdGhleSBhcmVuJ3QgYmVpbmcgdXNlZCBpbiBzdHlsZSBvYmplY3RcIiwgKCktPlxuXHRcdFx0ZGl2QSA9IERvbS5kaXYoc3R5bGU6eyRob3ZlcjogZGlzcGxheTonYmxvY2snfSlcblx0XHRcdGRpdkIgPSBEb20uZGl2KHN0eWxlOnskZm9jdXM6IGRpc3BsYXk6J2Jsb2NrJ30pXG5cblx0XHRcdGV4cGVjdChkaXZBLnN0YXRlICdob3ZlcicpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGRpdkIuc3RhdGUgJ2hvdmVyJykudG8uZXF1YWwgb2ZmXG5cblx0XHRcdGRpdkEuZWwuZW1pdEV2ZW50ICdtb3VzZWVudGVyJ1xuXHRcdFx0ZGl2Qi5lbC5lbWl0RXZlbnQgJ21vdXNlZW50ZXInXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnaG92ZXInKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KGRpdkIuc3RhdGUgJ2hvdmVyJykudG8uZXF1YWwgb2ZmXG5cblx0XHRcdGRpdkEuZWwuZW1pdEV2ZW50ICdtb3VzZWxlYXZlJ1xuXHRcdFx0ZGl2Qi5lbC5lbWl0RXZlbnQgJ21vdXNlbGVhdmUnXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnaG92ZXInKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICdob3ZlcicpLnRvLmVxdWFsIG9mZlxuXG5cdFx0XHRkaXZBLmVsLmVtaXRFdmVudCAnZm9jdXMnXG5cdFx0XHRkaXZCLmVsLmVtaXRFdmVudCAnZm9jdXMnXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnZm9jdXMnKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICdmb2N1cycpLnRvLmVxdWFsIG9uXG5cblx0XHRcdGRpdkEuZWwuZW1pdEV2ZW50ICdibHVyJ1xuXHRcdFx0ZGl2Qi5lbC5lbWl0RXZlbnQgJ2JsdXInXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnZm9jdXMnKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICdmb2N1cycpLnRvLmVxdWFsIG9mZlxuXG5cblx0XHR0ZXN0IFwib3B0aW9ucy5zdGF0ZVRyaWdnZXJzIGNhbiBiZSBmb3JjZWQgdG8gYmUgYXR0YWNoZWQgZXZlbiBpZiB0aGV5IGFyZW4ndCBiZWluZyB1c2VkIGluIHN0eWxlIG9iamVjdCB2aWEgLl9hdHRhY2hTdGF0ZUV2ZW50cyh0cnVlKVwiLCAoKS0+XG5cdFx0XHRhdHRhY2hTdGF0ZUV2ZW50cyA9IGlmIERvbS5kaXYoKS5fYXR0YWNoU3RhdGVFdmVudHMgdGhlbiAnX2F0dGFjaFN0YXRlRXZlbnRzJyBlbHNlICdfYWUnXG5cdFx0XHRkaXZBID0gRG9tLmRpdihzdHlsZTp7JGhvdmVyOiBkaXNwbGF5OidibG9jayd9KVxuXHRcdFx0ZGl2QiA9IERvbS5kaXYoc3R5bGU6eyRmb2N1czogZGlzcGxheTonYmxvY2snfSlcblx0XHRcdGRpdkFbYXR0YWNoU3RhdGVFdmVudHNdKHRydWUpXG5cdFx0XHRkaXZCW2F0dGFjaFN0YXRlRXZlbnRzXSh0cnVlKVxuXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnaG92ZXInKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICdob3ZlcicpLnRvLmVxdWFsIG9mZlxuXG5cdFx0XHRkaXZBLmVsLmVtaXRFdmVudCAnbW91c2VlbnRlcidcblx0XHRcdGRpdkIuZWwuZW1pdEV2ZW50ICdtb3VzZWVudGVyJ1xuXHRcdFx0ZXhwZWN0KGRpdkEuc3RhdGUgJ2hvdmVyJykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICdob3ZlcicpLnRvLmVxdWFsIG9uXG5cblx0XHRcdGRpdkEuZWwuZW1pdEV2ZW50ICdtb3VzZWxlYXZlJ1xuXHRcdFx0ZGl2Qi5lbC5lbWl0RXZlbnQgJ21vdXNlbGVhdmUnXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnaG92ZXInKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICdob3ZlcicpLnRvLmVxdWFsIG9mZlxuXG5cdFx0XHRkaXZBLmVsLmVtaXRFdmVudCAnZm9jdXMnXG5cdFx0XHRkaXZCLmVsLmVtaXRFdmVudCAnZm9jdXMnXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnZm9jdXMnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KGRpdkIuc3RhdGUgJ2ZvY3VzJykudG8uZXF1YWwgb25cblxuXHRcdFx0ZGl2QS5lbC5lbWl0RXZlbnQgJ2JsdXInXG5cdFx0XHRkaXZCLmVsLmVtaXRFdmVudCAnYmx1cidcblx0XHRcdGV4cGVjdChkaXZBLnN0YXRlICdmb2N1cycpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGRpdkIuc3RhdGUgJ2ZvY3VzJykudG8uZXF1YWwgb2ZmXG5cblxuXHRcdHRlc3QgXCJUaGUgaG92ZXIgYW5kIGZvY3VzIHN0YXRlcyB3aWxsIGJlIGxpc3RlbmVkIGZvciBhbmQgdG9nZ2xlZCBieSBkZWZhdWx0IGJ5IHRoZWlyIGFwcHJvcHJpYXRlIGV2ZW50c1wiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2IHN0eWxlOlxuXHRcdFx0XHQkYmFzZTpcblx0XHRcdFx0XHR3aWR0aDogJzE1cHgnXG5cdFx0XHRcdFx0aGVpZ2h0OiAnMTVweCdcblx0XHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6ICdyZ2IoNDUsIDQ1LCA0NSknXG5cdFx0XHRcdCRob3Zlcjpcblx0XHRcdFx0XHR3aWR0aDogJzI1cHgnXG5cdFx0XHRcdFx0bWFyZ2luVG9wOiAnMjBweCdcblx0XHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6ICdyZ2IoMTU1LCAxNTUsIDE1NSknXG5cdFx0XHRcdCRmb2N1czpcblx0XHRcdFx0XHR3aWR0aDogJzM1cHgnXG5cdFx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiAncmdiKDIwMCwgMjAwLCAyMDApJ1xuXG5cdFx0XHRkaXYuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ3dpZHRoJywgJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnaGVpZ2h0JywgJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnbWFyZ2luVG9wJywgJzBweCcpXG5cdFx0XHRleHBlY3QoZGl2LmVsKS50by5oYXZlLnN0eWxlKCdiYWNrZ3JvdW5kQ29sb3InLCAncmdiKDQ1LCA0NSwgNDUpJylcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUubWFyZ2luVG9wKS50by5lcXVhbCgnJylcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQgJ21vdXNlZW50ZXInXG5cdFx0XHRleHBlY3QoZGl2LmVsKS50by5oYXZlLnN0eWxlKCd3aWR0aCcsICcyNXB4Jylcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ2hlaWdodCcsICcxNXB4Jylcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ21hcmdpblRvcCcsICcyMHB4Jylcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ2JhY2tncm91bmRDb2xvcicsICdyZ2IoMTU1LCAxNTUsIDE1NSknKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5zdHlsZS5tYXJnaW5Ub3ApLnRvLmVxdWFsKCcnKVxuXHRcdFx0XG5cdFx0XHRkaXYuZW1pdCAnbW91c2VsZWF2ZSdcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ3dpZHRoJywgJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnaGVpZ2h0JywgJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnbWFyZ2luVG9wJywgJzBweCcpXG5cdFx0XHRleHBlY3QoZGl2LmVsKS50by5oYXZlLnN0eWxlKCdiYWNrZ3JvdW5kQ29sb3InLCAncmdiKDQ1LCA0NSwgNDUpJylcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUubWFyZ2luVG9wKS50by5lcXVhbCgnJylcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQgJ21vdXNlZW50ZXInXG5cdFx0XHRkaXYuZW1pdCAnZm9jdXMnXG5cdFx0XHRleHBlY3QoZGl2LmVsKS50by5oYXZlLnN0eWxlKCd3aWR0aCcsICczNXB4Jylcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ2hlaWdodCcsICcxNXB4Jylcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ21hcmdpblRvcCcsICcyMHB4Jylcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ2JhY2tncm91bmRDb2xvcicsICdyZ2IoMjAwLCAyMDAsIDIwMCknKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5zdHlsZS5tYXJnaW5Ub3ApLnRvLmVxdWFsKCcnKVxuXHRcdFx0XG5cdFx0XHRkaXYuZW1pdCAnbW91c2VsZWF2ZSdcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ3dpZHRoJywgJzM1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnaGVpZ2h0JywgJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnbWFyZ2luVG9wJywgJzBweCcpXG5cdFx0XHRleHBlY3QoZGl2LmVsKS50by5oYXZlLnN0eWxlKCdiYWNrZ3JvdW5kQ29sb3InLCAncmdiKDIwMCwgMjAwLCAyMDApJylcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUubWFyZ2luVG9wKS50by5lcXVhbCgnJylcblxuXG5cdFx0dGVzdCBcIklmIG5vdCBwYXNzZWQgYSBzdHlsZSBtYXAgdW5kZXIgdGhlICdiYXNlJyBzdGF0ZSwgYWxsIG5vbi1zdGF0ZSBwcm9wZXJ0aWVzIG9uIHRoZSBzdHlsZSBvYmplY3Qgd2lsbCBiZSBjb25zaWRlcmVkIGFzICdiYXNlJyBzdGF0ZSBwcm9wZXJ0aWVzXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdHdpZHRoOiAnMTVweCdcblx0XHRcdFx0aGVpZ2h0OiAnMjBweCdcblx0XHRcdFx0JGhvdmVyOlxuXHRcdFx0XHRcdHdpZHRoOiAnMjVweCdcblx0XHRcdFx0XHRoZWlnaHQ6ICczMHB4J1xuXG5cdFx0XHRkaXYuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRpdi5lbClcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLndpZHRoKS50by5lcXVhbCgnMTVweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCcyMHB4Jylcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQgJ21vdXNlZW50ZXInXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS53aWR0aCkudG8uZXF1YWwoJzI1cHgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUuaGVpZ2h0KS50by5lcXVhbCgnMzBweCcpXG5cdFx0XHRcblx0XHRcdGRpdi5lbWl0ICdtb3VzZWxlYXZlJ1xuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmVxdWFsKCcxNXB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzIwcHgnKVxuXG5cblx0XHR0ZXN0IFwiU3RhdGUtc3BlY2lmaWMgc3R5bGVzIHdpbGwgYmUgcmVtb3ZlZCB1cG9uIHN0YXRlIHR1cm4gb2ZmIG9yIHJlc3RvcmVkIHRvIHRoZSBiYXNlIHZhbHVlXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdHdpZHRoOiAnMTVweCdcblx0XHRcdFx0JGhvdmVyOlxuXHRcdFx0XHRcdHdpZHRoOiAnMjVweCdcblx0XHRcdFx0XHRoZWlnaHQ6ICczMHB4J1xuXG5cdFx0XHRkaXYuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRpdi5lbClcblx0XHRcdGV4cGVjdChkaXYuZWwpLnRvLmhhdmUuc3R5bGUoJ3dpZHRoJywgJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnaGVpZ2h0JywgJzBweCcpXG5cdFx0XHRleHBlY3QoZGl2LmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJycpXG5cdFx0XHRcblx0XHRcdGRpdi5lbWl0ICdtb3VzZWVudGVyJ1xuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnd2lkdGgnLCAnMjVweCcpXG5cdFx0XHRleHBlY3QoZGl2LmVsKS50by5oYXZlLnN0eWxlKCdoZWlnaHQnLCAnMzBweCcpXG5cdFx0XHRleHBlY3QoZGl2LmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJycpXG5cdFx0XHRcblx0XHRcdGRpdi5lbWl0ICdtb3VzZWxlYXZlJ1xuXHRcdFx0ZXhwZWN0KGRpdi5lbCkudG8uaGF2ZS5zdHlsZSgnd2lkdGgnLCAnMTVweCcpXG5cdFx0XHRleHBlY3QoZGl2LmVsKS50by5oYXZlLnN0eWxlKCdoZWlnaHQnLCAnMHB4Jylcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUuaGVpZ2h0KS50by5lcXVhbCgnJylcblxuXG5cdFx0dGVzdCBcIkhpZ2hlciBvcmRlciBzdGF0ZSBzdHlsZXMgd2lsbCBoYXZlIGEgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiB0aGUgJ2Jhc2UnIHN0eWxlIHRvIGJlIHVzZWQgYXMgcmVwbGFjbWVudHMgZm9yIHBlbmRpbmctcmVtb3ZhbCBzdGF0ZS1zdHlsZXNcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLmRpdiBzdHlsZTpcblx0XHRcdFx0d2lkdGg6ICcxNXB4J1xuXHRcdFx0XHQkaG92ZXI6XG5cdFx0XHRcdFx0d2lkdGg6ICcyNXB4J1xuXHRcdFx0XHRcdGhlaWdodDogJzMwcHgnXG5cdFx0XHRcdCRmb2N1czpcblx0XHRcdFx0XHRoZWlnaHQ6ICc0NXB4J1xuXG5cdFx0XHRkaXYuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGRpdi5lbClcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLndpZHRoKS50by5lcXVhbCgnMTVweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCcwcHgnKVxuXHRcdFx0XG5cdFx0XHRkaXYuZW1pdCAnbW91c2VlbnRlcidcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLndpZHRoKS50by5lcXVhbCgnMjVweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCczMHB4Jylcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQgJ2ZvY3VzJ1xuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUud2lkdGgpLnRvLmVxdWFsKCcyNXB4Jylcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzQ1cHgnKVxuXHRcdFx0XG5cdFx0XHRkaXYuZW1pdCAnbW91c2VsZWF2ZSdcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLndpZHRoKS50by5lcXVhbCgnMTVweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCc0NXB4Jylcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQgJ2JsdXInXG5cdFx0XHRkaXYuZW1pdCAnZm9jdXMnXG5cdFx0XHRkaXYuZW1pdCAnbW91c2VlbnRlcidcblx0XHRcdGV4cGVjdChjb21wdXRlZFN0eWxlLndpZHRoKS50by5lcXVhbCgnMjVweCcpXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCc0NXB4Jylcblx0XHRcdFxuXHRcdFx0ZGl2LmVtaXQgJ2JsdXInXG5cdFx0XHRleHBlY3QoY29tcHV0ZWRTdHlsZS53aWR0aCkudG8uZXF1YWwoJzI1cHgnKVxuXHRcdFx0ZXhwZWN0KGNvbXB1dGVkU3R5bGUuaGVpZ2h0KS50by5lcXVhbCgnMzBweCcpXG5cblxuXHRcdHRlc3QgXCJTdGF0ZSB0b2dnbGVzIHdpbGwgYmUgcGFzc2VkIHRvIGNoaWxkcmVuIGVsZW1lbnRzIHVubGVzcyBvcHRpb25zLnBhc3NTdGF0ZVRvQ2hpbGRyZW4gaXMgb2ZmXCIsICgpLT5cblx0XHRcdE1haW4gPSBEb20uZGl2KClcblx0XHRcdEEgPSBEb20uZGl2KCkuYXBwZW5kVG8oTWFpbilcblx0XHRcdEIgPSBEb20uZGl2KCkuYXBwZW5kVG8oQSlcblx0XHRcdEMgPSBEb20uZGl2KHBhc3NTdGF0ZVRvQ2hpbGRyZW46ZmFsc2UpLmFwcGVuZFRvKEEpXG5cblx0XHRcdGV4cGVjdChNYWluLnN0YXRlICdoYXBweScpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoQS5zdGF0ZSAnaGFwcHknKS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KEIuc3RhdGUgJ2hhcHB5JykudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChDLnN0YXRlICdoYXBweScpLnRvLmJlLmZhbHNlXG5cblx0XHRcdE1haW4uc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChNYWluLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChBLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChCLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChDLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblxuXHRcdFx0TWFpbi5vcHRpb25zLnBhc3NTdGF0ZVRvQ2hpbGRyZW4gPSBmYWxzZVxuXHRcdFx0TWFpbi5zdGF0ZSAnaGFwcHknLCBmYWxzZVxuXHRcdFx0ZXhwZWN0KE1haW4uc3RhdGUgJ2hhcHB5JykudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChBLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChCLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChDLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblxuXHRcdFx0TWFpbi5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0TWFpbi5vcHRpb25zLnBhc3NTdGF0ZVRvQ2hpbGRyZW4gPSB0cnVlXG5cdFx0XHRBLm9wdGlvbnMucGFzc1N0YXRlVG9DaGlsZHJlbiA9IGZhbHNlXG5cdFx0XHRNYWluLnN0YXRlICdoYXBweScsIGZhbHNlXG5cdFx0XHRleHBlY3QoTWFpbi5zdGF0ZSAnaGFwcHknKS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KEEuc3RhdGUgJ2hhcHB5JykudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChCLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChDLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblxuXG5cdFx0dGVzdCBcIlN0YXRlIHN0eWxlcyBjYW4gYmUgbmVzdGVkIHRvIHRyaWdnZXIgd2hlbiBhbGwgc3RhdGVzIGFyZSB0b2dnbGVkIG9uXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdCRiYXNlOlxuXHRcdFx0XHRcdHdpZHRoOiAnMTJweCdcblx0XHRcdFx0XHRoZWlnaHQ6ICcxMnB4J1xuXHRcdFx0XHRcdGZvbnRTaXplOiAnMTBweCdcblx0XHRcdFx0JGZ1bm55OlxuXHRcdFx0XHRcdGZvbnRTaXplOiAnMTVweCdcblx0XHRcdFx0XHRoZWlnaHQ6ICcxNXB4J1xuXHRcdFx0XHRcdCMgd2lkdGg6ICcxMHB4J1xuXHRcdFx0XHQkaGFwcHk6XG5cdFx0XHRcdFx0d2lkdGg6ICcxNHB4J1xuXHRcdFx0XHRcdGZvbnRTaXplOiAnMTRweCdcblx0XHRcdFx0XHQkcmVsYXhlZDpcblx0XHRcdFx0XHRcdGhlaWdodDogJzExcHgnXG5cdFx0XHRcdFx0XHRmb250U2l6ZTogJzE3cHgnXG5cdFx0XHRcdFx0XHQkZnVubnk6XG5cdFx0XHRcdFx0XHRcdHdpZHRoOiAnMTBweCdcblx0XHRcdFx0XHRcdFx0aGVpZ2h0OiAnMTRweCdcblx0XHRcdFx0JHJlbGF4ZWQ6XG5cdFx0XHRcdFx0d2lkdGg6ICcxN3B4J1xuXG5cdFx0XHRkaXYuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwoJzEycHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnaGVpZ2h0JykudG8uZXF1YWwoJzEycHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCgnMTBweCcpXG5cblx0XHRcdGRpdi5zdGF0ZSAnZnVubnknLCBvblxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCgnMTJweCcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdoZWlnaHQnKS50by5lcXVhbCgnMTVweCcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsKCcxNXB4JylcblxuXHRcdFx0ZGl2LnN0YXRlICdmdW5ueScsIG9mZlxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCgnMTJweCcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdoZWlnaHQnKS50by5lcXVhbCgnMTJweCcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsKCcxMHB4JylcblxuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd3aWR0aCcpLnRvLmVxdWFsKCcxNHB4Jylcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2hlaWdodCcpLnRvLmVxdWFsKCcxMnB4Jylcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwoJzE0cHgnKVxuXG5cdFx0XHRkaXYuc3RhdGUgJ3JlbGF4ZWQnLCBvblxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCgnMTdweCcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdoZWlnaHQnKS50by5lcXVhbCgnMTFweCcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsKCcxN3B4JylcblxuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9mZlxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCgnMTdweCcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdoZWlnaHQnKS50by5lcXVhbCgnMTJweCcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsKCcxMHB4JylcblxuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd3aWR0aCcpLnRvLmVxdWFsKCcxN3B4Jylcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2hlaWdodCcpLnRvLmVxdWFsKCcxMXB4Jylcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwoJzE3cHgnKVxuXHRcdFx0XG5cdFx0XHRkaXYuc3RhdGUgJ2Z1bm55Jywgb25cblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwoJzEwcHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnaGVpZ2h0JykudG8uZXF1YWwoJzE0cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCgnMTdweCcpXG5cblx0XHRcdGRpdi5zdGF0ZSAnaGFwcHknLCBvZmZcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwoJzE3cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnaGVpZ2h0JykudG8uZXF1YWwoJzE1cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCgnMTVweCcpXG5cblxuXHRcdHRlc3QgXCJRdWlja0VsZW1lbnQucmVjdCBzaG91bGQgY29udGFpbiBhbiB1cGRhdGVkIHZlcnNpb24gb2YgdGhlIGVsZW1lbnQncyBDbGllbnRSZWN0XCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYoKS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0cmVjdEEgPSBkaXYucmVjdFxuXHRcdFx0cmVjdEIgPSBkaXYucmVjdFxuXG5cdFx0XHRleHBlY3QocmVjdEEpLnRvLmJlLmluc3RhbmNlT2YoQ2xpZW50UmVjdClcblx0XHRcdGV4cGVjdChyZWN0QikudG8uYmUuaW5zdGFuY2VPZihDbGllbnRSZWN0KVxuXHRcdFx0ZXhwZWN0KHJlY3RBKS50by5lcWwocmVjdEIpXG5cblxuXHRcdFx0ZGl2LnN0eWxlICd3aWR0aCcsICc3cHgnXG5cdFx0XHRyZWN0QyA9IGRpdi5yZWN0XG5cdFx0XHRleHBlY3QocmVjdEMpLnRvLmJlLmluc3RhbmNlT2YoQ2xpZW50UmVjdClcblx0XHRcdGV4cGVjdChyZWN0QSkudG8uZXFsKHJlY3RCKVxuXHRcdFx0ZXhwZWN0KHJlY3RBKS5ub3QudG8uZXFsKHJlY3RDKVxuXHRcdFx0ZXhwZWN0KHJlY3RBLndpZHRoKS5ub3QudG8uZXF1YWwoNylcblx0XHRcdGV4cGVjdChyZWN0Qi53aWR0aCkubm90LnRvLmVxdWFsKDcpXG5cdFx0XHRleHBlY3QocmVjdEMud2lkdGgpLnRvLmVxdWFsKDcpXG5cblxuXHRcdHRlc3QgXCJRdWlja0VsZW1lbnQud2lkdGggc2hvdWxkIHJldHVybiB0aGUgdXBkYXRlZCB2ZXJzaW9uIG9mIGFuIGVsZW1lbnQncyBjb21wdXRlZCB3aWR0aFwiLCAoKS0+XG5cdFx0XHRwYXJlbnQgPSBEb20uZGl2KCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGRpdiA9IERvbS5kaXYoKS5hcHBlbmRUbyhwYXJlbnQpXG5cdFx0XHRcblx0XHRcdHBhcmVudC5zdHlsZSB3aWR0aDonMTAwMHB4J1xuXHRcdFx0ZGl2LnN0eWxlIHdpZHRoOic1MCUnXG5cdFx0XHRleHBlY3QoZGl2LndpZHRoKS50by5lcXVhbCg1MDApXG5cdFx0XHRcblx0XHRcdGRpdi5zdHlsZSB3aWR0aDonMTAlJ1xuXHRcdFx0ZXhwZWN0KGRpdi53aWR0aCkudG8uZXF1YWwoMTAwKVxuXHRcdFx0XG5cdFx0XHRkaXYuc3R5bGUgd2lkdGg6Jzk3cHgnXG5cdFx0XHRleHBlY3QoZGl2LndpZHRoKS50by5lcXVhbCg5NylcblxuXG5cdFx0dGVzdCBcIlF1aWNrRWxlbWVudC5oZWlnaHQgc2hvdWxkIHJldHVybiB0aGUgdXBkYXRlZCB2ZXJzaW9uIG9mIGFuIGVsZW1lbnQncyBjb21wdXRlZCBoZWlnaHRcIiwgKCktPlxuXHRcdFx0cGFyZW50ID0gRG9tLmRpdigpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRkaXYgPSBEb20uZGl2KCkuYXBwZW5kVG8ocGFyZW50KVxuXHRcdFx0XG5cdFx0XHRwYXJlbnQuc3R5bGUgaGVpZ2h0OicxMDAwcHgnXG5cdFx0XHRkaXYuc3R5bGUgaGVpZ2h0Oic1MCUnXG5cdFx0XHRleHBlY3QoZGl2LmhlaWdodCkudG8uZXF1YWwoNTAwKVxuXHRcdFx0XG5cdFx0XHRkaXYuc3R5bGUgaGVpZ2h0OicxMCUnXG5cdFx0XHRleHBlY3QoZGl2LmhlaWdodCkudG8uZXF1YWwoMTAwKVxuXHRcdFx0XG5cdFx0XHRkaXYuc3R5bGUgaGVpZ2h0Oic5N3B4J1xuXHRcdFx0ZXhwZWN0KGRpdi5oZWlnaHQpLnRvLmVxdWFsKDk3KVxuXG5cdFx0XG5cdFx0dGVzdCBcIlF1aWNrRWxlbWVudC53aWR0aC8uaGVpZ2h0IHNldHRlcnMgYXJlIHNob3J0Y3V0cyBmb3IgLnN0eWxlKCkgc2V0dGVyc1wiLCAoKS0+XG5cdFx0XHRwYXJlbnQgPSBEb20uZGl2KCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGRpdiA9IERvbS5kaXYoKS5hcHBlbmRUbyhwYXJlbnQpXG5cdFx0XHRcblx0XHRcdHBhcmVudC5zdHlsZSB3aWR0aDonMTAwMHB4JywgaGVpZ2h0OicxMDAwcHgnXG5cdFx0XHRkaXYuc3R5bGUgd2lkdGg6JzUwJScsIGhlaWdodDonNTAlJ1xuXHRcdFx0ZGl2LndpZHRoID0gZGl2LmhlaWdodCA9ICc1MCUnXG5cdFx0XHRleHBlY3QoZGl2LndpZHRoKS50by5lcXVhbCg1MDApXG5cdFx0XHRleHBlY3QoZGl2LmhlaWdodCkudG8uZXF1YWwoNTAwKVxuXHRcdFx0XG5cdFx0XHRkaXYud2lkdGggPSBkaXYuaGVpZ2h0ID0gJzEwJSdcblx0XHRcdGV4cGVjdChkaXYud2lkdGgpLnRvLmVxdWFsKDEwMClcblx0XHRcdGV4cGVjdChkaXYuaGVpZ2h0KS50by5lcXVhbCgxMDApXG5cdFx0XHRcblx0XHRcdGRpdi53aWR0aCA9IGRpdi5oZWlnaHQgPSAnOTdweCdcblx0XHRcdGV4cGVjdChkaXYud2lkdGgpLnRvLmVxdWFsKDk3KVxuXHRcdFx0ZXhwZWN0KGRpdi5oZWlnaHQpLnRvLmVxdWFsKDk3KVxuXG5cblx0XHR0ZXN0IFwiUXVpY2tFbGVtZW50Lm9yaWVudGF0aW9uIHNob3VsZCByZXR1cm4gdGhlIHVwZGF0ZWQgdmVyc2lvbiBvZiBhbiBlbGVtZW50J3MgY29tcHV0ZWQgb3JpZW50YXRpb25cIiwgKCktPlxuXHRcdFx0cGFyZW50ID0gRG9tLmRpdigpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRkaXYgPSBEb20uZGl2KCkuYXBwZW5kVG8ocGFyZW50KVxuXHRcdFx0XG5cdFx0XHRkaXYuc3R5bGUgd2lkdGg6NTAwLCBoZWlnaHQ6NDAwXG5cdFx0XHRleHBlY3QoZGl2Lm9yaWVudGF0aW9uKS50by5lcXVhbCgnbGFuZHNjYXBlJylcblx0XHRcdFxuXHRcdFx0ZGl2LnN0eWxlIHdpZHRoOjU1MCwgaGVpZ2h0OjYwMFxuXHRcdFx0ZXhwZWN0KGRpdi5vcmllbnRhdGlvbikudG8uZXF1YWwoJ3BvcnRyYWl0Jylcblx0XHRcdFxuXHRcdFx0ZGl2LnN0eWxlIHdpZHRoOjYwMCwgaGVpZ2h0OjYwMFxuXHRcdFx0ZXhwZWN0KGRpdi5vcmllbnRhdGlvbikudG8uZXF1YWwoJ3BvcnRyYWl0Jylcblx0XHRcdFxuXHRcdFx0ZGl2LnN0eWxlIHdpZHRoOjYwMSwgaGVpZ2h0OjYwMFxuXHRcdFx0ZXhwZWN0KGRpdi5vcmllbnRhdGlvbikudG8uZXF1YWwoJ2xhbmRzY2FwZScpXG5cblxuXHRcdHRlc3QgXCJRdWlja0VsZW1lbnQuYXNwZWN0UmF0aW8gc2hvdWxkIHJldHVybiB0aGUgdXBkYXRlZCB2ZXJzaW9uIG9mIGFuIGVsZW1lbnQncyBjb21wdXRlZCBhc3BlY3QtcmF0aW9cIiwgKCktPlxuXHRcdFx0cGFyZW50ID0gRG9tLmRpdigpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRkaXYgPSBEb20uZGl2KCkuYXBwZW5kVG8ocGFyZW50KVxuXHRcdFx0XG5cdFx0XHRkaXYuc3R5bGUgd2lkdGg6NTAwLCBoZWlnaHQ6NDAwXG5cdFx0XHRleHBlY3QoZGl2LmFzcGVjdFJhdGlvKS50by5lcXVhbCgxLjI1KVxuXHRcdFx0XG5cdFx0XHRkaXYuc3R5bGUgd2lkdGg6NTQwLCBoZWlnaHQ6NjAwXG5cdFx0XHRleHBlY3QoZGl2LmFzcGVjdFJhdGlvKS50by5lcXVhbCgwLjkpXG5cdFx0XHRcblx0XHRcdGRpdi5zdHlsZSB3aWR0aDo2MDAsIGhlaWdodDo2MDBcblx0XHRcdGV4cGVjdChkaXYuYXNwZWN0UmF0aW8pLnRvLmVxdWFsKDEpXG5cdFx0XHRcblx0XHRcdGRpdi5zdHlsZSB3aWR0aDozMDAsIGhlaWdodDo5MDBcblx0XHRcdGV4cGVjdChkaXYuYXNwZWN0UmF0aW8pLnRvLmVxdWFsKDAuMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMpXG5cblxuXHRcdHRlc3QgXCJJZiBvcHRpb25zLnN0eWxlQWZ0ZXJJbnNlcnQgaXMgcGFzc2VkLCBmdW5jdGlvbiBzdHlsZXMgd2lsbCBiZSBhcHBsaWVkIG9ubHkgYWZ0ZXIgdGhlIGVsZW1lbnQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgRE9NXCIsICgpLT5cblx0XHRcdHBhcmVudE9wYWNpdHlHZXR0ZXIgPSAoKS0+IGlmIEBwYXJlbnQgdGhlbiBAcGFyZW50LnN0eWxlKCdvcGFjaXR5JykgZWxzZSAnMC41J1xuXHRcdFx0ZGl2UmVnID0gRG9tLmRpdihzdHlsZTp7aGVpZ2h0OicxOXB4Jywgb3BhY2l0eTpwYXJlbnRPcGFjaXR5R2V0dGVyfSlcblx0XHRcdGRpdkEgPSBEb20uZGl2KHN0eWxlOntoZWlnaHQ6JzE5cHgnLCBvcGFjaXR5OnBhcmVudE9wYWNpdHlHZXR0ZXJ9LCBzdHlsZUFmdGVySW5zZXJ0OnRydWUpXG5cdFx0XHRkaXZCID0gRG9tLmRpdihzdHlsZTp7aGVpZ2h0OicxOXB4Jywgb3BhY2l0eTpwYXJlbnRPcGFjaXR5R2V0dGVyfSwgc3R5bGVBZnRlckluc2VydDp0cnVlKVxuXHRcdFx0ZGl2QyA9IERvbS5kaXYoc3R5bGU6e2hlaWdodDonMTlweCcsIG9wYWNpdHk6cGFyZW50T3BhY2l0eUdldHRlcn0sIHN0eWxlQWZ0ZXJJbnNlcnQ6dHJ1ZSlcblxuXHRcdFx0Y2xhc3NOYW1lID0gZGl2UmVnLnJhdy5jbGFzc05hbWUgb3IgJ25vIGNsYXNzTmFtZSdcblx0XHRcdGV4cGVjdChkaXZSZWcucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwoY2xhc3NOYW1lKVxuXHRcdFx0ZXhwZWN0KGRpdkEucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwoY2xhc3NOYW1lKVxuXHRcdFx0ZXhwZWN0KGRpdkIucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwoY2xhc3NOYW1lKVxuXHRcdFx0ZXhwZWN0KGRpdkMucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwoY2xhc3NOYW1lKVxuXHRcdFx0ZXhwZWN0KGRpdlJlZy5lbC5zdHlsZS5vcGFjaXR5KS50by5lcXVhbCgnMC41Jylcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsKCcnKVxuXHRcdFx0ZXhwZWN0KGRpdkIuZWwuc3R5bGUub3BhY2l0eSkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2Qy5lbC5zdHlsZS5vcGFjaXR5KS50by5lcXVhbCgnJylcblx0XHRcdFxuXHRcdFx0ZGl2QS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0ZXhwZWN0KGRpdkEuZWwuc3R5bGUub3BhY2l0eSkudG8uZXF1YWwoJzEnKVxuXHRcdFx0ZXhwZWN0KGRpdkIuZWwuc3R5bGUub3BhY2l0eSkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2Qy5lbC5zdHlsZS5vcGFjaXR5KS50by5lcXVhbCgnJylcblx0XHRcdFxuXHRcdFx0ZGl2Qi5pbnNlcnRCZWZvcmUoc2FuZGJveClcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsKCcxJylcblx0XHRcdGV4cGVjdChkaXZCLmVsLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsKCcxJylcblx0XHRcdGV4cGVjdChkaXZDLmVsLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsKCcnKVxuXHRcdFx0XG5cdFx0XHRzYW5kYm94LmFwcGVuZENoaWxkKGRpdkMuZWwpXG5cdFx0XHRleHBlY3QoZGl2QS5lbC5zdHlsZS5vcGFjaXR5KS50by5lcXVhbCgnMScpXG5cdFx0XHRleHBlY3QoZGl2Qi5lbC5zdHlsZS5vcGFjaXR5KS50by5lcXVhbCgnMScpXG5cdFx0XHRleHBlY3QoZGl2Qy5lbC5zdHlsZS5vcGFjaXR5KS50by5lcXVhbCgnJylcblx0XHRcdFxuXHRcdFx0ZGl2Qy5wYXJlbnRcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsKCcxJylcblx0XHRcdGV4cGVjdChkaXZCLmVsLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsKCcxJylcblx0XHRcdGV4cGVjdChkaXZDLmVsLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsKCcxJylcblx0XHRcdGRpdkMuYXBwZW5kVG8oc2FuZGJveClcblxuXG5cdFx0dGVzdCBcIkFueSBzdHlsZXMgYXBwbGllZCBieSBzdGF0ZXMgYmVmb3JlIHRoZSBlbGVtZW50IGhhcyBiZWVuIGluc2VydGVkIGludG8gdGhlIERPTSBhbmQgd2hlbiBvcHRpb25zLnN0eWxlQWZ0ZXJJbnNlcnQgaXMgb24gd2lsbCBiZSByZS1hcHBsaWVkIGFmdGVyIGluc2VydFwiLCAoKS0+XG5cdFx0XHRkaXZSZWcgPSBEb20uZGl2KHN0eWxlOnskYmFzZTp7aGVpZ2h0Oi0+JzE5cHgnfSwgJGZ1bm55OntoZWlnaHQ6LT4nMjlweCd9LCAkaGFwcHk6e2hlaWdodDotPiczOXB4J319KVxuXHRcdFx0ZGl2QSA9IERvbS5kaXYoc3R5bGU6eyRiYXNlOntoZWlnaHQ6LT4nMTlweCd9LCAkZnVubnk6e2hlaWdodDotPicyOXB4J30sICRoYXBweTp7aGVpZ2h0Oi0+JzM5cHgnfX0sIHN0eWxlQWZ0ZXJJbnNlcnQ6dHJ1ZSlcblxuXHRcdFx0ZXhwZWN0KGRpdlJlZy5lbC5zdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCcxOXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJycpXG5cblx0XHRcdGRpdlJlZy5zdGF0ZSAnZnVubnknLCBvblxuXHRcdFx0ZGl2QS5zdGF0ZSAnZnVubnknLCBvblxuXHRcdFx0ZXhwZWN0KGRpdlJlZy5lbC5zdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCcyOXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJycpXG5cdFx0XHRcblx0XHRcdGRpdlJlZy5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZGl2QS5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZXhwZWN0KGRpdlJlZy5lbC5zdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCczOXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJycpXG5cdFx0XHRcblx0XHRcdGRpdlJlZy5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0ZGl2QS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0ZXhwZWN0KGRpdlJlZy5lbC5zdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCczOXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzM5cHgnKVxuXG5cblx0XHR0ZXN0IFwiSWYgYW4gZWxlbWVudCB3aXRoIG9wdGlvbnMuc3R5bGVBZnRlckluc2VydCBpcyBhcHBlbmRlZCBpbnRvIGEgZGV0YWNoZWQgZWxlbWVudCwgc3R5bGVzIHdpbGwgYmUgYXBwbGllZCBvbmx5IGFmdGVyIHRoZSBwYXJlbnQgaXMgYXBwZW5kZWQgdG8gdGhlIERPTVwiLCAoKS0+XG5cdFx0XHRkZXRhY2hlZFBhcmVudCA9IERvbS5kaXYoKVxuXHRcdFx0ZGl2UmVnID0gRG9tLmRpdihzdHlsZTp7aGVpZ2h0OigtPicxOXB4JyksICRoYXBweTokcmVsYXhlZDp7d2lkdGg6LT4nMzFweCd9fSlcblx0XHRcdGRpdkEgPSBEb20uZGl2KHN0eWxlOntoZWlnaHQ6KC0+JzE5cHgnKSwgJGhhcHB5OiRyZWxheGVkOnt3aWR0aDotPiczMXB4J319LCBzdHlsZUFmdGVySW5zZXJ0OnRydWUpXG5cblx0XHRcdGRpdlJlZy5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZGl2UmVnLnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdGRpdkEuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGRpdkEuc3RhdGUgJ3JlbGF4ZWQnLCBvblxuXHRcdFx0ZGl2QS5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRkaXZBLnN0eWxlICd2aXNpYmlsaXR5JywgJ2hpZGRlbidcblxuXHRcdFx0ZXhwZWN0KGRpdlJlZy5lbC5zdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCcxOXB4Jylcblx0XHRcdGV4cGVjdChkaXZSZWcuZWwuc3R5bGUud2lkdGgpLnRvLmVxdWFsKCczMXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2QS5lbC5zdHlsZS53aWR0aCkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2QS5lbC5zdHlsZS52aXNpYmlsaXR5KS50by5lcXVhbCgnaGlkZGVuJylcblxuXHRcdFx0ZGl2QS5hcHBlbmRUbyhkZXRhY2hlZFBhcmVudClcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2QS5lbC5zdHlsZS53aWR0aCkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2QS5lbC5zdHlsZS52aXNpYmlsaXR5KS50by5lcXVhbCgnaGlkZGVuJylcblxuXHRcdFx0ZGV0YWNoZWRQYXJlbnQuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzE5cHgnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuZWwuc3R5bGUud2lkdGgpLnRvLmVxdWFsKCczMXB4Jylcblx0XHRcdGV4cGVjdChkaXZBLmVsLnN0eWxlLnZpc2liaWxpdHkpLnRvLmVxdWFsKCdoaWRkZW4nKVxuXG5cblx0XHR0ZXN0IFwiUXVpY2tFbGVtZW50LnBpcGVTdGF0ZSBjYW4gYmUgdXNlZCB0byByZWRpcmVjdCBhbGwgc3RhdGUgdG9nZ2xlcyB0byB0aGUgcHJvdmlkZWQgdGFyZ2V0IGVsZW1lbnRcIiwgKCktPlxuXHRcdFx0cGFyZW50QSA9IERvbS5kaXYoKVxuXHRcdFx0cGFyZW50QiA9IERvbS5kaXYocGFzc1N0YXRlVG9DaGlsZHJlbjpmYWxzZSlcblx0XHRcdGRpdkEgPSBEb20uZGl2KG51bGwpLmFwcGVuZFRvKHBhcmVudEEpXG5cdFx0XHRkaXZCID0gRG9tLmRpdihudWxsKS5hcHBlbmRUbyhwYXJlbnRCKVxuXHRcdFx0Y2hpbGRBID0gRG9tLnNwYW4oKS5hcHBlbmRUbyhkaXZBKVxuXHRcdFx0Y2hpbGRCID0gRG9tLnNwYW4oKS5hcHBlbmRUbyhkaXZCKVxuXG5cdFx0XHRkaXZBLnBpcGVTdGF0ZSgpXG5cdFx0XHRkaXZBLnN0YXRlICcxJywgb25cblx0XHRcdGV4cGVjdChwYXJlbnRBLnN0YXRlICcxJykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnMScpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3QoY2hpbGRBLnN0YXRlICcxJykudG8uZXF1YWwgb25cblx0XHRcdFxuXHRcdFx0ZGl2QS5waXBlU3RhdGUocGFyZW50QSlcblx0XHRcdGRpdkEuc3RhdGUgJzInLCBvblxuXHRcdFx0ZXhwZWN0KHBhcmVudEEuc3RhdGUgJzInKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KGRpdkEuc3RhdGUgJzInKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KGNoaWxkQS5zdGF0ZSAnMicpLnRvLmVxdWFsIG9uXG5cblx0XHRcdGRpdkEucGlwZVN0YXRlKGZhbHNlKVxuXHRcdFx0ZGl2QS5zdGF0ZSAnMi41Jywgb25cblx0XHRcdGV4cGVjdChwYXJlbnRBLnN0YXRlICcyLjUnKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZBLnN0YXRlICcyLjUnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KGNoaWxkQS5zdGF0ZSAnMi41JykudG8uZXF1YWwgb25cblx0XHRcdFxuXHRcdFx0ZGl2Qi5waXBlU3RhdGUodHJ1ZSlcblx0XHRcdGRpdkIuc3RhdGUgJzMnLCBvblxuXHRcdFx0ZXhwZWN0KHBhcmVudEIuc3RhdGUgJzMnKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICczJykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChjaGlsZEIuc3RhdGUgJzMnKS50by5lcXVhbCBvblxuXHRcdFx0XG5cdFx0XHRkaXZCLnBpcGVTdGF0ZShwYXJlbnRCKVxuXHRcdFx0ZGl2Qi5zdGF0ZSAnNCcsIG9uXG5cdFx0XHRleHBlY3QocGFyZW50Qi5zdGF0ZSAnNCcpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3QoZGl2Qi5zdGF0ZSAnNCcpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGNoaWxkQi5zdGF0ZSAnNCcpLnRvLmVxdWFsIG9mZlxuXHRcdFx0XG5cdFx0XHRkaXZBLnBpcGVTdGF0ZShwYXJlbnRCKVxuXHRcdFx0ZGl2QS5zdGF0ZSAnNScsIG9uXG5cdFx0XHRleHBlY3QocGFyZW50QS5zdGF0ZSAnNScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHBhcmVudEIuc3RhdGUgJzUnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KGRpdkEuc3RhdGUgJzUnKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICc1JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoY2hpbGRBLnN0YXRlICc1JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoY2hpbGRCLnN0YXRlICc1JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRcblx0XHRcdGRpdkEucGlwZVN0YXRlKGZhbHNlKVxuXHRcdFx0ZGl2Qi5waXBlU3RhdGUocGFyZW50QSlcblx0XHRcdGRpdkIuc3RhdGUgJzYnLCBvblxuXHRcdFx0ZXhwZWN0KHBhcmVudEEuc3RhdGUgJzYnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KHBhcmVudEIuc3RhdGUgJzYnKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZBLnN0YXRlICc2JykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICc2JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoY2hpbGRBLnN0YXRlICc2JykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChjaGlsZEIuc3RhdGUgJzYnKS50by5lcXVhbCBvZmZcblxuXG5cdFx0dGVzdCBcIlN0YXRlcyBjYW4gYmUgbWFya2VkIGFzIHVucGFzc2FibGUgdG8gYXZvaWQgcGFzc2luZyB0byBjaGlsZHJlbiBieSBpbmNsdWRpbmcgdGhlbSBpbiBvcHRpb25zLnVucGFzc2FibGVTdGF0ZXNcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLmRpdih1bnBhc3NhYmxlU3RhdGVzOiBbJ0InLCdEJ10pXG5cdFx0XHRzcGFuQSA9IERvbS5zcGFuKCkuYXBwZW5kVG8oZGl2KVxuXHRcdFx0c3BhbkIgPSBEb20uc3BhbigpLmFwcGVuZFRvKGRpdilcblx0XHRcdHN1YlNwYW4gPSBEb20uc3BhbigpLmFwcGVuZFRvKHNwYW5CKVxuXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdBJykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3BhbkEuc3RhdGUgJ0EnKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChzcGFuQi5zdGF0ZSAnQScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHN1YlNwYW4uc3RhdGUgJ0EnKS50by5lcXVhbCBvZmZcblxuXHRcdFx0ZGl2LnN0YXRlICdBJywgb25cblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ0EnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KHNwYW5BLnN0YXRlICdBJykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChzcGFuQi5zdGF0ZSAnQScpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3Qoc3ViU3Bhbi5zdGF0ZSAnQScpLnRvLmVxdWFsIG9uXG5cblx0XHRcdGRpdi5zdGF0ZSAnQicsIG9uXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdCJykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChzcGFuQS5zdGF0ZSAnQicpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHNwYW5CLnN0YXRlICdCJykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3ViU3Bhbi5zdGF0ZSAnQicpLnRvLmVxdWFsIG9mZlxuXG5cdFx0XHRkaXYuc3RhdGUgJ0MnLCBvblxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnQycpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3Qoc3BhbkEuc3RhdGUgJ0MnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KHNwYW5CLnN0YXRlICdDJykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChzdWJTcGFuLnN0YXRlICdDJykudG8uZXF1YWwgb25cblxuXHRcdFx0ZGl2LnN0YXRlICdEJywgb25cblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ0QnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KHNwYW5BLnN0YXRlICdEJykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3BhbkIuc3RhdGUgJ0QnKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChzdWJTcGFuLnN0YXRlICdEJykudG8uZXF1YWwgb2ZmXG5cdFx0XHRcblx0XHRcdHNwYW5CLnN0YXRlICdEJywgb25cblx0XHRcdGV4cGVjdChzcGFuQi5zdGF0ZSAnRCcpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3Qoc3ViU3Bhbi5zdGF0ZSAnRCcpLnRvLmVxdWFsIG9uXG5cdFx0XHRcblx0XHRcdGRpdi5zdGF0ZSAnRCcsIG9mZlxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnRCcpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHNwYW5CLnN0YXRlICdEJykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChzdWJTcGFuLnN0YXRlICdEJykudG8uZXF1YWwgb25cblxuXG5cdFx0dGVzdCBcIldoZW4gLnN0YXRlKCkgcmVjZWl2ZXMgYSB0cnV0aHkgdmFsdWUgYXMgdGhlIHRoaXJkIGFyZ3VtZW50IHRoZSBldmVudCB3aWxsIGJ1YmJsZSB1cCB0byBwYXJlbnRzIGluc3RlYWQgb2YgY2FzY2FkZSB0byBjaGlsZHJlblwiLCAoKS0+XG5cdFx0XHRwYXJlbnRBID0gRG9tLnNlY3Rpb24gbnVsbCxcblx0XHRcdFx0c3ViUGFyZW50QSA9IERvbS5kaXYgbnVsbCxcblx0XHRcdFx0XHRjaGlsZEEgPSBEb20uZGl2IG51bGwsXG5cdFx0XHRcdFx0XHRzdWJDaGlsZEEgPSBEb20uZGl2KClcblx0XHRcdFxuXHRcdFx0cGFyZW50QiA9IERvbS5zZWN0aW9uIG51bGwsXG5cdFx0XHRcdHN1YlBhcmVudEIgPSBEb20uZGl2IG51bGwsXG5cdFx0XHRcdFx0Y2hpbGRCID0gRG9tLmRpdiBudWxsLFxuXHRcdFx0XHRcdFx0c3ViQ2hpbGRCID0gRG9tLmRpdigpXG5cblx0XHRcdGV4cGVjdChwYXJlbnRBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHBhcmVudEIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3ViUGFyZW50QS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChzdWJQYXJlbnRCLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGNoaWxkQS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChjaGlsZEIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3ViQ2hpbGRBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHN1YkNoaWxkQi5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblxuXHRcdFx0Y2hpbGRBLnN0YXRlICdoYXBweScsIG9uLCB0cnVlXG5cdFx0XHRjaGlsZEIuc3RhdGUgJ2hhcHB5Jywgb25cblxuXHRcdFx0ZXhwZWN0KHBhcmVudEEuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChwYXJlbnRCLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHN1YlBhcmVudEEuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChzdWJQYXJlbnRCLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGNoaWxkQS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KGNoaWxkQi5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KHN1YkNoaWxkQS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChzdWJDaGlsZEIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb25cblxuXHRcdFx0Y2hpbGRBLnN0YXRlICdyZWxheGVkJywgb24sIG51bGxcblx0XHRcdGNoaWxkQi5zdGF0ZSAncmVsYXhlZCcsIG9uLCAnb24nXG5cblx0XHRcdGV4cGVjdChwYXJlbnRBLnN0YXRlICdyZWxheGVkJykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QocGFyZW50Qi5zdGF0ZSAncmVsYXhlZCcpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3Qoc3ViUGFyZW50QS5zdGF0ZSAncmVsYXhlZCcpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHN1YlBhcmVudEIuc3RhdGUgJ3JlbGF4ZWQnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KGNoaWxkQS5zdGF0ZSAncmVsYXhlZCcpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3QoY2hpbGRCLnN0YXRlICdyZWxheGVkJykudG8uZXF1YWwgb25cblx0XHRcdGV4cGVjdChzdWJDaGlsZEEuc3RhdGUgJ3JlbGF4ZWQnKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KHN1YkNoaWxkQi5zdGF0ZSAncmVsYXhlZCcpLnRvLmVxdWFsIG9mZlxuXG5cblx0XHR0ZXN0IFwib3B0aW9ucy5zdGF0ZVRyaWdnZXJzIGNvbmZpZyBvYmplY3RzIGNhbiBzcGVjaWZ5IGEgJ2ZvcmNlJyBwcm9wZXJ0eSB3aGljaCB3aWxsIG1ha2UgdGhlbSBnZXQgYXR0YWNoZWQgZXZlbiBpZiB0aGV5IGFyZW4ndCB1c2VkXCIsICgpLT5cblx0XHRcdGRpdkEgPSBEb20uZGl2IHN0YXRlVHJpZ2dlcnM6eydoYXBweSc6IG9uOidoYXBweU9OJywgb2ZmOidoYXBweU9GRicsIGZvcmNlOnRydWV9XG5cdFx0XHRkaXZCID0gRG9tLmRpdiBzdGF0ZVRyaWdnZXJzOnsnaGFwcHknOiBvbjonaGFwcHlPTicsIG9mZjonaGFwcHlPRkYnfVxuXG5cdFx0XHRleHBlY3QoZGl2QS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChkaXZCLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXG5cdFx0XHRkaXZBLnJhdy5lbWl0RXZlbnQgJ2hhcHB5T04nXG5cdFx0XHRkaXZCLnJhdy5lbWl0RXZlbnQgJ2hhcHB5T04nXG5cblx0XHRcdGV4cGVjdChkaXZBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3QoZGl2Qi5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblxuXHRcdFx0ZGl2Qi5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZGl2QS5yYXcuZW1pdEV2ZW50ICdoYXBweU9GRidcblx0XHRcdGRpdkIucmF3LmVtaXRFdmVudCAnaGFwcHlPRkYnXG5cblx0XHRcdGV4cGVjdChkaXZBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGRpdkIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb25cblxuXG5cdFx0dGVzdCBcIm9wdGlvbnMuc3RhdGVUcmlnZ2VycyBjb25maWcgb2JqZWN0cyBjYW4gc3BlY2lmeSBhICdidWJibGVzJyBwcm9wZXJ0eSB3aGljaCB3aWxsIGNhdXNlIHRoZSBzdGF0ZSB0byBidWJibGUgdG8gcGFyZW50cyBpbnN0ZWFkIG9mIGNhc2NhZGUgdG8gY2hpbGRyZW5cIiwgKCktPlxuXHRcdFx0cGFyZW50QSA9IERvbS5zZWN0aW9uIG51bGwsXG5cdFx0XHRcdHN1YlBhcmVudEEgPSBEb20uZGl2IG51bGwsXG5cdFx0XHRcdFx0Y2hpbGRBID0gRG9tLmRpdiBzdGF0ZVRyaWdnZXJzOnsnaGFwcHknOiBvbjonaGFwcHlPTicsIG9mZjonaGFwcHlPRkYnLCBidWJibGVzOnRydWUsIGZvcmNlOnRydWV9LFxuXHRcdFx0XHRcdFx0c3ViQ2hpbGRBID0gRG9tLmRpdigpXG5cdFx0XHRcblx0XHRcdHBhcmVudEIgPSBEb20uc2VjdGlvbiBudWxsLFxuXHRcdFx0XHRzdWJQYXJlbnRCID0gRG9tLmRpdiBudWxsLFxuXHRcdFx0XHRcdGNoaWxkQiA9IERvbS5kaXYgc3RhdGVUcmlnZ2Vyczp7J2hhcHB5Jzogb246J2hhcHB5T04nLCBvZmY6J2hhcHB5T0ZGJywgZm9yY2U6dHJ1ZX0sXG5cdFx0XHRcdFx0XHRzdWJDaGlsZEIgPSBEb20uZGl2KClcblxuXHRcdFx0ZXhwZWN0KHBhcmVudEEuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QocGFyZW50Qi5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChzdWJQYXJlbnRBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHN1YlBhcmVudEIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoY2hpbGRBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGNoaWxkQi5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChzdWJDaGlsZEEuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3ViQ2hpbGRCLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXG5cdFx0XHRjaGlsZEEucmF3LmVtaXRFdmVudCAnaGFwcHlPTidcblx0XHRcdGNoaWxkQi5yYXcuZW1pdEV2ZW50ICdoYXBweU9OJ1xuXG5cdFx0XHRleHBlY3QocGFyZW50QS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KHBhcmVudEIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3ViUGFyZW50QS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvblxuXHRcdFx0ZXhwZWN0KHN1YlBhcmVudEIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoY2hpbGRBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3QoY2hpbGRCLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3Qoc3ViQ2hpbGRBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHN1YkNoaWxkQi5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvblxuXG5cdFx0XHRjaGlsZEEucmF3LmVtaXRFdmVudCAnaGFwcHlPRkYnXG5cdFx0XHRjaGlsZEIucmF3LmVtaXRFdmVudCAnaGFwcHlPRkYnXG5cblx0XHRcdGV4cGVjdChwYXJlbnRBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHBhcmVudEIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3ViUGFyZW50QS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChzdWJQYXJlbnRCLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGNoaWxkQS5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblx0XHRcdGV4cGVjdChjaGlsZEIuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3Qoc3ViQ2hpbGRBLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KHN1YkNoaWxkQi5zdGF0ZSAnaGFwcHknKS50by5lcXVhbCBvZmZcblxuXG5cdFx0dGVzdCBcIndyYXBwZXJzIGNyZWF0ZWQgZm9yIGV4aXN0aW5nIGVsZW1lbnRzIHNob3VsZCBhdHRlbXB0IHRvIHJlc29sdmUgaWYgaXRzIGluc2VydGVkIGludG8gdGhlIERPTSBvbiBpbml0XCIsICgpLT5cblx0XHRcdGRpdkFfID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jylcblx0XHRcdGRpdkJfID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jylcblx0XHRcdHNhbmRib3guYXBwZW5kQ2hpbGQoZGl2Ql8pXG5cdFx0XHRkaXZBID0gRG9tKGRpdkFfKVxuXHRcdFx0ZGl2QiA9IERvbShkaXZCXylcblxuXHRcdFx0ZGl2QV8uc3R5bGUuaGVpZ2h0ID0gJzEwMHB4J1xuXHRcdFx0ZGl2Ql8uc3R5bGUuaGVpZ2h0ID0gJzEwMHB4J1xuXG5cdFx0XHRleHBlY3QodHlwZW9mIGRpdkEuaGVpZ2h0KS50by5lcXVhbCgnbnVtYmVyJylcblx0XHRcdGV4cGVjdCh0eXBlb2YgZGl2Qi5oZWlnaHQpLnRvLmVxdWFsKCdudW1iZXInKVxuXHRcdFx0ZXhwZWN0KGlzTmFOIGRpdkEuaGVpZ2h0KS50by5iZS50cnVlXG5cdFx0XHRleHBlY3QoaXNOYU4gZGl2Qi5oZWlnaHQpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoZGl2QS5zdHlsZVNhZmUgJ2hlaWdodCcpLnRvLmVxdWFsICcxMDBweCdcblxuXG5cdFx0dGVzdCBcInN0YXRlLWJhc2VkIHRleHRcIiwgKCktPlxuXHRcdFx0ZGl2QSA9IERvbShcblx0XHRcdFx0WydkaXYnLCBudWxsLFxuXHRcdFx0XHRcdFsndGV4dCcsXG5cdFx0XHRcdFx0XHR0ZXh0OlxuXHRcdFx0XHRcdFx0XHQkYmFzZTogJ2FiYzEyMydcblx0XHRcdFx0XHRcdFx0JGhhcHB5OiAnSGFwcHknXG5cdFx0XHRcdFx0XHRcdCRyZWxheGVkOiAnUmVsYXhlZCdcblx0XHRcdFx0XHRdXG5cdFx0XHRcdF1cblx0XHRcdClcblx0XHRcdGRpdkIgPSBEb20oXG5cdFx0XHRcdFsnZGl2JywgbnVsbCxcblx0XHRcdFx0XHRbJ3RleHQnLFxuXHRcdFx0XHRcdFx0dGV4dDpcblx0XHRcdFx0XHRcdFx0JGhhcHB5OiAnSGFwcHknXG5cdFx0XHRcdFx0XHRcdCRyZWxheGVkOiAnUmVsYXhlZCdcblx0XHRcdFx0XHRcdFx0JyRyZWxheGVkK2Z1bm55JzogJ0Z1bm55ICYgUmVsYXhlZCdcblx0XHRcdFx0XHRdXG5cdFx0XHRcdF1cblx0XHRcdClcblx0XHRcdGRpdkMgPSBEb20uZGl2KHRleHQ6eyRiYXNlOidkZWY0NTYnLCAkaGFwcHk6J2doaTc4OSd9KVxuXHRcdFx0XG5cdFx0XHRleHBlY3QoZGl2QS50ZXh0KS50by5lcXVhbCAnYWJjMTIzJ1xuXHRcdFx0ZXhwZWN0KGRpdkIudGV4dCkudG8uZXF1YWwgJydcblx0XHRcdGV4cGVjdChkaXZDLnRleHQpLnRvLmVxdWFsICdkZWY0NTYnXG5cdFx0XHRcblx0XHRcdGRpdkEuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGRpdkIuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGRpdkMuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChkaXZBLnRleHQpLnRvLmVxdWFsICdIYXBweSdcblx0XHRcdGV4cGVjdChkaXZCLnRleHQpLnRvLmVxdWFsICdIYXBweSdcblx0XHRcdGV4cGVjdChkaXZDLnRleHQpLnRvLmVxdWFsICdnaGk3ODknXG5cdFx0XHRcblx0XHRcdGRpdkEuc3RhdGUgJ2hhcHB5Jywgb2ZmXG5cdFx0XHRkaXZCLnN0YXRlICdoYXBweScsIG9mZlxuXHRcdFx0ZGl2Qy5zdGF0ZSAnaGFwcHknLCBvZmZcblx0XHRcdGV4cGVjdChkaXZBLnRleHQpLnRvLmVxdWFsICdhYmMxMjMnXG5cdFx0XHRleHBlY3QoZGl2Qi50ZXh0KS50by5lcXVhbCAnJ1xuXHRcdFx0ZXhwZWN0KGRpdkMudGV4dCkudG8uZXF1YWwgJ2RlZjQ1Nidcblx0XHRcdFxuXHRcdFx0ZGl2QS5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRkaXZCLnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdGV4cGVjdChkaXZBLnRleHQpLnRvLmVxdWFsICdSZWxheGVkJ1xuXHRcdFx0ZXhwZWN0KGRpdkIudGV4dCkudG8uZXF1YWwgJ1JlbGF4ZWQnXG5cdFx0XHRcblx0XHRcdGRpdkEuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGRpdkIuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChkaXZBLnRleHQpLnRvLmVxdWFsICdSZWxheGVkJ1xuXHRcdFx0ZXhwZWN0KGRpdkIudGV4dCkudG8uZXF1YWwgJ1JlbGF4ZWQnXG5cdFx0XHRcblx0XHRcdGRpdkEuc3RhdGUgJ3JlbGF4ZWQnLCBvZmZcblx0XHRcdGRpdkIuc3RhdGUgJ3JlbGF4ZWQnLCBvZmZcblx0XHRcdGV4cGVjdChkaXZBLnRleHQpLnRvLmVxdWFsICdIYXBweSdcblx0XHRcdGV4cGVjdChkaXZCLnRleHQpLnRvLmVxdWFsICdIYXBweSdcblx0XHRcdFxuXHRcdFx0ZGl2Qi5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRkaXZCLnN0YXRlICdmdW5ueScsIG9uXG5cdFx0XHRleHBlY3QoZGl2Qi50ZXh0KS50by5lcXVhbCAnUmVsYXhlZCdcblxuXHRcdFx0ZGl2Qi5zdGF0ZSAncmVsYXhlZCtmdW5ueScsIG9uXG5cdFx0XHRleHBlY3QoZGl2Qi50ZXh0KS50by5lcXVhbCAnRnVubnkgJiBSZWxheGVkJ1xuXG5cblx0XHR0ZXN0IFwic3RhdGUgY2hhbmdlcyB3aWxsIGVtaXQgYSBwcml2YXRlIHN0YXRlQ2hhbmdlOjxzdGF0ZT4gZXZlbnRcIiwgKCktPlxuXHRcdFx0cmVzdWx0cyA9IFtdXG5cdFx0XHRkaXYgPSBEb20uZGl2IHN0eWxlOlxuXHRcdFx0XHRjb2xvcjogJ3doaXRlJ1xuXHRcdFx0XHRvcGFjaXR5OiAxXG5cdFx0XHRcdCRoYXBweTogY29sb3I6ICdibGFjaydcblx0XHRcdFxuXHRcdFx0XG5cdFx0XHRkaXYuc3RhdGUgJ2FueScsIG9uXG5cdFx0XHRkaXYub24gJ3N0YXRlQ2hhbmdlOmhhcHB5JywgKHN0YXRlKS0+IHJlc3VsdHMucHVzaCBbJ2hhcHB5Jywgc3RhdGVdXG5cdFx0XHRkaXYub24gJ3N0YXRlQ2hhbmdlOnJlbGF4ZWQnLCAoc3RhdGUpLT4gcmVzdWx0cy5wdXNoIFsncmVsYXhlZCcsIHN0YXRlXVxuXHRcdFx0ZGl2Lm9uICdzdGF0ZUNoYW5nZTphcmJpdHJhcnknLCAoc3RhdGUpLT4gcmVzdWx0cy5wdXNoIFsnYXJiaXRyYXJ5Jywgc3RhdGVdXG5cdFx0XHRleHBlY3QocmVzdWx0cykudG8uZGVlcC5lcXVhbCBbXVxuXG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsIFtbJ2hhcHB5Jyxvbl1dXG5cblx0XHRcdGRpdi5zdGF0ZSAnaGFwcHknLCBvZmZcblx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsIFtbJ2hhcHB5Jyxvbl0sIFsnaGFwcHknLG9mZl1dXG5cblx0XHRcdGRpdi5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0ZXhwZWN0KHJlc3VsdHMpLnRvLmRlZXAuZXF1YWwgW1snaGFwcHknLG9uXSwgWydoYXBweScsb2ZmXSwgWydoYXBweScsb25dXVxuXG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsIFtbJ2hhcHB5Jyxvbl0sIFsnaGFwcHknLG9mZl0sIFsnaGFwcHknLG9uXV1cblxuXHRcdFx0ZGl2LnN0YXRlICdhbm90aGVyJywgb25cblx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsIFtbJ2hhcHB5Jyxvbl0sIFsnaGFwcHknLG9mZl0sIFsnaGFwcHknLG9uXV1cblxuXHRcdFx0ZGl2LnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsIFtbJ2hhcHB5Jyxvbl0sIFsnaGFwcHknLG9mZl0sIFsnaGFwcHknLG9uXSwgWydyZWxheGVkJyxvbl1dXG5cblx0XHRcdGRpdi5zdGF0ZSAnYXJiaXRyYXJ5Jywgb25cblx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsIFtbJ2hhcHB5Jyxvbl0sIFsnaGFwcHknLG9mZl0sIFsnaGFwcHknLG9uXSwgWydyZWxheGVkJyxvbl0sIFsnYXJiaXRyYXJ5Jyxvbl1dXG5cblx0XHRcdGRpdi5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRleHBlY3QocmVzdWx0cykudG8uZGVlcC5lcXVhbCBbWydoYXBweScsb25dLCBbJ2hhcHB5JyxvZmZdLCBbJ2hhcHB5Jyxvbl0sIFsncmVsYXhlZCcsb25dLCBbJ2FyYml0cmFyeScsb25dXVxuXG5cblx0XHR0ZXN0IFwic3RhdGUtYmFzZWQgc3R5bGVzIGNhbiBiZSB1cGRhdGVkIHZpYSBRdWlja0VsZW1lbnQudXBkYXRlU3RhdGVTdHlsZXNcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLmRpdihzdHlsZTpcblx0XHRcdFx0d2lkdGg6IDVcblx0XHRcdFx0aGVpZ2h0OiA1XG5cdFx0XHRcdG1hcmdpblRvcDogNVxuXHRcdFx0XHQkaGFwcHk6XG5cdFx0XHRcdFx0bWFyZ2luVG9wOiAxMFxuXHRcdFx0XHQkcmVsYXhlZDpcblx0XHRcdFx0XHRtYXJnaW5Ub3A6IDIwXG5cdFx0XHRcdFx0d2lkdGg6IDIwXG5cdFx0XHRcdFx0JGhhcHB5OlxuXHRcdFx0XHRcdFx0aGVpZ2h0OiA0MFxuXHRcdFx0XHRcdFx0bWFyZ2luVG9wOiA0MFxuXHRcdFx0XHQkc29tZXRoaW5nRWxzZTpcblx0XHRcdFx0XHR3aWR0aDogNjBcblx0XHRcdFx0XHRtYXJnaW5Ub3A6IDYwXG5cdFx0XHQpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRnZXRTdHlsZXMgPSAoKS0+IHdpZHRoOmRpdi5zdHlsZSgnd2lkdGgnKSwgaGVpZ2h0OmRpdi5zdHlsZSgnaGVpZ2h0JyksIG1hcmdpblRvcDpkaXYuc3R5bGUoJ21hcmdpblRvcCcpXG5cblx0XHRcdGV4cGVjdChnZXRTdHlsZXMoKSkudG8uZXFsIHdpZHRoOic1cHgnLCBoZWlnaHQ6JzVweCcsIG1hcmdpblRvcDonNXB4J1xuXHRcdFx0XG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChnZXRTdHlsZXMoKSkudG8uZXFsIHdpZHRoOic1cHgnLCBoZWlnaHQ6JzVweCcsIG1hcmdpblRvcDonMTBweCdcblx0XHRcdFxuXHRcdFx0ZGl2LnVwZGF0ZVN0YXRlU3R5bGVzIHt3aWR0aDo3LCBoZWlnaHQ6OCwgJGhhcHB5OnttYXJnaW5Ub3A6MTIsIGhlaWdodDoxMn19XG5cdFx0XHRleHBlY3QoZ2V0U3R5bGVzKCkpLnRvLmVxbCB3aWR0aDonN3B4JywgaGVpZ2h0OicxMnB4JywgbWFyZ2luVG9wOicxMnB4J1xuXG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb2ZmXG5cdFx0XHRleHBlY3QoZ2V0U3R5bGVzKCkpLnRvLmVxbCB3aWR0aDonN3B4JywgaGVpZ2h0Oic4cHgnLCBtYXJnaW5Ub3A6JzVweCdcblx0XHRcdFxuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRleHBlY3QoZ2V0U3R5bGVzKCkpLnRvLmVxbCB3aWR0aDonN3B4JywgaGVpZ2h0OicxMnB4JywgbWFyZ2luVG9wOicxMnB4J1xuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9mZlxuXHRcdFx0XG5cdFx0XHRkaXYudXBkYXRlU3RhdGVTdHlsZXNcblx0XHRcdFx0JGJhc2U6XG5cdFx0XHRcdFx0d2lkdGg6IDJcblx0XHRcdFx0XHRoZWlnaHQ6IDlcblx0XHRcdFx0JHJlbGF4ZWQ6XG5cdFx0XHRcdFx0aGVpZ2h0OiAyMFxuXHRcdFx0XHRcdCRoYXBweTpcblx0XHRcdFx0XHRcdHdpZHRoOiA0MFxuXHRcdFx0XHRcdFx0bWFyZ2luVG9wOiAtPiA0NVxuXHRcdFx0XG5cdFx0XHRleHBlY3QoZ2V0U3R5bGVzKCkpLnRvLmVxbCB3aWR0aDonMnB4JywgaGVpZ2h0Oic5cHgnLCBtYXJnaW5Ub3A6JzVweCdcblxuXHRcdFx0ZGl2LnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdGV4cGVjdChnZXRTdHlsZXMoKSkudG8uZXFsIHdpZHRoOicyMHB4JywgaGVpZ2h0OicyMHB4JywgbWFyZ2luVG9wOicyMHB4J1xuXG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChnZXRTdHlsZXMoKSkudG8uZXFsIHdpZHRoOic0MHB4JywgaGVpZ2h0Oic0MHB4JywgbWFyZ2luVG9wOic0NXB4J1xuXG5cdFx0XHRkaXYuc3RhdGUge2hhcHB5Om9mZiwgcmVsYXhlZDpvZmZ9XG5cdFx0XHRkaXYuZWwuc3R5bGUubWFyZ2luVG9wID0gbnVsbFxuXHRcdFx0ZXhwZWN0KGdldFN0eWxlcygpKS50by5lcWwgd2lkdGg6JzJweCcsIGhlaWdodDonOXB4JywgbWFyZ2luVG9wOic1cHgnXG5cblx0XHRcdGRpdi5zdGF0ZSAnc29tZXRoaW5nRWxzZScsIG9uXG5cdFx0XHRleHBlY3QoZ2V0U3R5bGVzKCkpLnRvLmVxbCB3aWR0aDonNjBweCcsIGhlaWdodDonOXB4JywgbWFyZ2luVG9wOic2MHB4J1xuXG5cblx0XHR0ZXN0IFwiZGVmYXVsdCBzdGF0ZXMgdG8gYXBwbHkgdG8gYW4gZWxlbWVudCB1cG9uIGNyZWF0aW9uIGNhbiBiZSBzcGVjaWZpZWQgdmlhIG9wdGlvbnMuc3RhdGUgbWFwcGluZ1wiLCAoKS0+XG5cdFx0XHRlbDEgPSBET00uZGl2KClcblx0XHRcdGVsMiA9IERPTS5kaXYoc3RhdGU6e2hhcHB5Om9uLCByZWxheGVkOm9mZn0pXG5cdFx0XHRlbDMgPSBET00uZGl2KHN0YXRlOntyZWxheGVkOm9ufSlcblx0XHRcdGV4cGVjdChlbDEuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoZWwxLnN0YXRlICdyZWxheGVkJykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoZWwyLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9uXG5cdFx0XHRleHBlY3QoZWwyLnN0YXRlICdyZWxheGVkJykudG8uZXF1YWwgb2ZmXG5cdFx0XHRleHBlY3QoZWwzLnN0YXRlICdoYXBweScpLnRvLmVxdWFsIG9mZlxuXHRcdFx0ZXhwZWN0KGVsMy5zdGF0ZSAncmVsYXhlZCcpLnRvLmVxdWFsIG9uXG5cblxuXG5cdHN1aXRlIFwiTWVkaWEgUXVlcmllc1wiLCAoKS0+XG5cdFx0c3VpdGVUZWFyZG93biAoKS0+IGRpbWVuc2lvbnMucmVzdG9yZSgpIGlmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnaW5uZXJXaWR0aCcpPy5jb25maWd1cmFibGVcblx0XHRzdWl0ZVNldHVwICgpLT4gQHNraXAoKSBpZiBub3QgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdpbm5lcldpZHRoJyk/LmNvbmZpZ3VyYWJsZVxuXHRcdHRlYXJkb3duICgpLT4gRG9tLkNTUy5jbGVhclJlZ2lzdGVyZWQobGV2ZWwpIGZvciBsZXZlbCBpbiBbMC4uM11cblxuXG5cdFx0dGVzdCBcIldpbmRvdyBkaW1lbnNpb25zXCIsICgpLT5cblx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoMTAwMCwgMTAwMClcblx0XHRcdGRpdiA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdHBvc2l0aW9uOiAncmVsYXRpdmUnXG5cdFx0XHRcdHpJbmRleDogMlxuXHRcdFx0XHR3aWR0aDogJzMwMHB4J1xuXHRcdFx0XHRoZWlnaHQ6ICczMDBweCdcblx0XHRcdFx0Zm9udFNpemU6ICczMHB4J1xuXHRcdFx0XHRsaW5lSGVpZ2h0OiAnMzBweCdcblxuXHRcdFx0XHQnQHdpbmRvdyhvcmllbnRhdGlvbjpsYW5kc2NhcGUpJzpcblx0XHRcdFx0XHRtYXJnaW5Ub3A6IDZcblxuXHRcdFx0XHQnQHdpbmRvdyhvcmllbnRhdGlvbjpwb3J0cmFpdCknOlxuXHRcdFx0XHRcdG1hcmdpblRvcDogN1xuXG5cdFx0XHRcdCdAd2luZG93KG1heC13aWR0aDo4MDApJzpcblx0XHRcdFx0XHR6SW5kZXg6IDNcblx0XHRcdFx0XHR3aWR0aDogJzI4MHB4J1xuXHRcdFx0XHRcblx0XHRcdFx0J0B3aW5kb3cobWF4LXdpZHRoOjcwMCwgbWF4LWhlaWdodDoxMDAwKSc6XG5cdFx0XHRcdFx0ekluZGV4OiA0XG5cdFx0XHRcdFx0d2lkdGg6ICcyNTBweCdcblx0XHRcdFx0XHRoZWlnaHQ6ICcyNTBweCdcblx0XHRcdFx0XG5cdFx0XHRcdCdAd2luZG93KG1heC1oZWlnaHQ6MTAwMCknOlxuXHRcdFx0XHRcdGZvbnRTaXplOiAnMjVweCdcblx0XHRcdFx0XG5cdFx0XHRcdCdAd2luZG93KG1pbi13aWR0aDo5MDBweCknOlxuXHRcdFx0XHRcdGZvbnRTaXplOiAnMjNweCdcblx0XHRcdFx0XG5cdFx0XHRcdCdAd2luZG93KGFzcGVjdC1yYXRpbzowLjUpJzpcblx0XHRcdFx0XHRmb250U2l6ZTogJzIxcHgnXG5cdFx0XHRcdFx0bGluZUhlaWdodDogJzEycHgnXG5cdFx0XHRcdFxuXHRcdFx0XHQnQHdpbmRvdyhtaW4taGVpZ2h0OjEyMDApJzpcblx0XHRcdFx0XHRmb250U2l6ZTogJzIwcHgnXG5cblx0XHRcdGRpdi5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0XG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd6SW5kZXgnKS50by5lcXVhbCAnMidcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzMwMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnaGVpZ2h0JykudG8uZXF1YWwgJzMwMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMjNweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ21hcmdpblRvcCcpLnRvLmVxdWFsICc3cHgnXG5cdFx0XHRcblx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoOTAwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMjNweCdcblx0XHRcdFxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSg4OTkpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsICcyNXB4J1xuXG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDg5OSwgMTEwMClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwgJzMwcHgnXG5cblx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoOTUwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMjNweCdcblxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSg5NTAsIDE5MDApXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsICcyMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnbGluZUhlaWdodCcpLnRvLmVxdWFsICcxMnB4J1xuXHRcdFx0XG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDk1MCwgMTg5OSlcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwgJzIwcHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdsaW5lSGVpZ2h0JykudG8uZXF1YWwgJzMwcHgnXG5cblx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoNzkwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnekluZGV4JykudG8uZXF1YWwgJzMnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd3aWR0aCcpLnRvLmVxdWFsICcyODBweCdcblxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSg4MTApXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd6SW5kZXgnKS50by5lcXVhbCAnMidcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzMwMHB4J1xuXG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDc5MSlcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3pJbmRleCcpLnRvLmVxdWFsICczJ1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCAnMjgwcHgnXG5cblx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoNzAxLCA5MDApXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd6SW5kZXgnKS50by5lcXVhbCAnMydcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzI4MHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnaGVpZ2h0JykudG8uZXF1YWwgJzMwMHB4J1xuXG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDcwMCwgOTAwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnekluZGV4JykudG8uZXF1YWwgJzQnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd3aWR0aCcpLnRvLmVxdWFsICcyNTBweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2hlaWdodCcpLnRvLmVxdWFsICcyNTBweCdcblxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSg3MDAsIDEwMDEpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd6SW5kZXgnKS50by5lcXVhbCAnMydcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzI4MHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnaGVpZ2h0JykudG8uZXF1YWwgJzMwMHB4J1xuXG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDcwMCwgMTAwMClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3pJbmRleCcpLnRvLmVxdWFsICc0J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCAnMjUwcHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdoZWlnaHQnKS50by5lcXVhbCAnMjUwcHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdtYXJnaW5Ub3AnKS50by5lcXVhbCAnN3B4J1xuXHRcdFx0XG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDExMDAsIDEwMDApXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdtYXJnaW5Ub3AnKS50by5lcXVhbCAnNnB4J1xuXHRcdFx0XG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDExMDAsIDExMDEpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdtYXJnaW5Ub3AnKS50by5lcXVhbCAnN3B4J1xuXG5cblx0XHR0ZXN0IFwiU2VsZiBkaW1lbnNpb25zL3N0eWxlc1wiLCAoKS0+XG5cdFx0XHRwYXJlbnQgPSBEb20uZGl2KCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdHNpbXVsYXRlUGFyZW50ID0gKHdpZHRoLCBoZWlnaHQpLT5cblx0XHRcdFx0cGFyZW50LnN0eWxlICd3aWR0aCcsIHdpZHRoIGlmIHdpZHRoXG5cdFx0XHRcdHBhcmVudC5zdHlsZSAnaGVpZ2h0JywgaGVpZ2h0IGlmIGhlaWdodFxuXHRcdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKClcblx0XHRcdFxuXHRcdFx0ZGl2ID0gRG9tLmRpdiBzdHlsZTpcblx0XHRcdFx0cG9zaXRpb246ICdyZWxhdGl2ZSdcblx0XHRcdFx0ekluZGV4OiAyXG5cdFx0XHRcdHRvcDogJzMwcHgnXG5cdFx0XHRcdHdpZHRoOiAnMTAwJSdcblx0XHRcdFx0aGVpZ2h0OiAnMTAwJSdcblx0XHRcdFx0Zm9udFNpemU6ICczMHB4J1xuXHRcdFx0XHRsaW5lSGVpZ2h0OiAnMzBweCdcblxuXHRcdFx0XHQnQHNlbGYob3JpZW50YXRpb246bGFuZHNjYXBlKSc6XG5cdFx0XHRcdFx0bWFyZ2luVG9wOiA2XG5cblx0XHRcdFx0J0BzZWxmKG9yaWVudGF0aW9uOnBvcnRyYWl0KSc6XG5cdFx0XHRcdFx0bWFyZ2luVG9wOiA3XG5cdFx0XHRcdFxuXHRcdFx0XHQnQHNlbGYocG9zaXRpb246cmVsYXRpdmUpJzpcblx0XHRcdFx0XHR0b3A6ICcyMHB4J1xuXG5cdFx0XHRcdCdAc2VsZihtYXgtd2lkdGg6MzUwKSc6XG5cdFx0XHRcdFx0ekluZGV4OiAzXG5cdFx0XHRcdFx0Zm9udFNpemU6ICczM3B4J1xuXHRcdFx0XHRcblx0XHRcdFx0J0BzZWxmKG1heC13aWR0aDo1MDAsIG1pbi1oZWlnaHQ6NDAwKSc6XG5cdFx0XHRcdFx0ekluZGV4OiA0XG5cdFx0XHRcdFx0Zm9udFNpemU6ICcyN3B4J1xuXHRcdFx0XHRcdGxpbmVIZWlnaHQ6ICczN3B4J1xuXHRcdFx0XHRcblx0XHRcdFx0J0BzZWxmKHpJbmRleDo0KSc6XG5cdFx0XHRcdFx0bGluZUhlaWdodDogJzE1cHgnXG5cdFx0XHRcdFxuXHRcdFx0XHQnQHNlbGYobWluLXpJbmRleDo2KSc6XG5cdFx0XHRcdFx0b3BhY2l0eTogJzAnXG5cdFx0XHRcdFxuXHRcdFx0XHQnQHNlbGYobWF4LWZvbnRTaXplOjIwKSc6XG5cdFx0XHRcdFx0bGluZUhlaWdodDogJzE5cHgnXG5cdFx0XHRcdFxuXHRcdFx0XHQnQHNlbGYobWluLXdpZHRoOjYwMHB4KSc6XG5cdFx0XHRcdFx0Zm9udFNpemU6ICcxOXB4J1xuXHRcdFx0XHRcblx0XHRcdFx0J0BzZWxmKGFzcGVjdC1yYXRpbzoyLjI1KSc6XG5cdFx0XHRcdFx0Zm9udFNpemU6ICcyMnB4J1xuXHRcdFx0XHRcdGxpbmVIZWlnaHQ6ICcxMnB4J1xuXHRcdFx0XHRcblx0XHRcdFx0J0BzZWxmKG1pbi1oZWlnaHQ6NzAwKSc6XG5cdFx0XHRcdFx0Zm9udFNpemU6ICc0MHB4J1xuXG5cdFx0XHRzaW11bGF0ZVBhcmVudCg0MDAsIDMwMClcblx0XHRcdGRpdi5hcHBlbmRUbyhwYXJlbnQpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd6SW5kZXgnKS50by5lcXVhbCAnMidcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3dpZHRoJykudG8uZXF1YWwgJzQwMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnaGVpZ2h0JykudG8uZXF1YWwgJzMwMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMzBweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2xpbmVIZWlnaHQnKS50by5lcXVhbCAnMzBweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ21hcmdpblRvcCcpLnRvLmVxdWFsICc2cHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd0b3AnKS50by5lcXVhbCAnMjBweCdcblx0XHRcdFxuXHRcdFx0c2ltdWxhdGVQYXJlbnQoMzQ5LCA0MjApXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd6SW5kZXgnKS50by5lcXVhbCAnNCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwgJzI3cHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdsaW5lSGVpZ2h0JykudG8uZXF1YWwgJzE1cHgnXG5cdFx0XHRcblx0XHRcdHNpbXVsYXRlUGFyZW50KDM0OSwgMzk5KVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnekluZGV4JykudG8uZXF1YWwgJzMnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsICczM3B4J1xuXHRcdFx0XG5cdFx0XHRzaW11bGF0ZVBhcmVudCgzNDksIDQwMSlcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3pJbmRleCcpLnRvLmVxdWFsICc0J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMjdweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2xpbmVIZWlnaHQnKS50by5lcXVhbCAnMTVweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ29wYWNpdHknKS50by5lcXVhbCAnMSdcblx0XHRcdFxuXHRcdFx0ZGl2LnN0eWxlKCd6SW5kZXgnLCA1KVxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSgpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdvcGFjaXR5JykudG8uZXF1YWwgJzEnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdsaW5lSGVpZ2h0JykudG8uZXF1YWwgJzM3cHgnXG5cdFx0XHRcblx0XHRcdGRpdi5zdHlsZSgnekluZGV4JywgMTcpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdvcGFjaXR5JykudG8uZXF1YWwgJzEnXG5cdFx0XHRcblx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnb3BhY2l0eScpLnRvLmVxdWFsICcwJ1xuXG5cdFx0XHRzaW11bGF0ZVBhcmVudCg5MDApXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsICcxOXB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnbGluZUhlaWdodCcpLnRvLmVxdWFsICczMHB4J1xuXHRcdFx0XG5cdFx0XHRzaW11bGF0ZVBhcmVudCg5MDApXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdsaW5lSGVpZ2h0JykudG8uZXF1YWwgJzE5cHgnXG5cdFx0XHRcblx0XHRcdHNpbXVsYXRlUGFyZW50KDkwMCwgNDAwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMjJweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2xpbmVIZWlnaHQnKS50by5lcXVhbCAnMTJweCdcblx0XHRcdFxuXHRcdFx0c2ltdWxhdGVQYXJlbnQoMjAyNSwgOTAwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnNDBweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2xpbmVIZWlnaHQnKS50by5lcXVhbCAnMTJweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ21hcmdpblRvcCcpLnRvLmVxdWFsICc2cHgnXG5cdFx0XHRcblx0XHRcdHNpbXVsYXRlUGFyZW50KDIwMjUsIDIwMjYpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdtYXJnaW5Ub3AnKS50by5lcXVhbCAnN3B4J1xuXG5cblx0XHR0ZXN0IFwiUGFyZW50IGRpbWVuc2lvbnMvc3R5bGVzXCIsICgpLT5cblx0XHRcdHBhcmVudCA9IERvbS5kaXYoc3R5bGU6e3Bvc2l0aW9uOidhYnNvbHV0ZSd9KS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0c2ltdWxhdGVQYXJlbnQgPSAod2lkdGgsIGhlaWdodCktPlxuXHRcdFx0XHRwYXJlbnQuc3R5bGUgJ3dpZHRoJywgd2lkdGggaWYgd2lkdGhcblx0XHRcdFx0cGFyZW50LnN0eWxlICdoZWlnaHQnLCBoZWlnaHQgaWYgaGVpZ2h0XG5cdFx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoKVxuXHRcdFx0XG5cdFx0XHRkaXYgPSBEb20uZGl2IHN0eWxlOlxuXHRcdFx0XHRwb3NpdGlvbjogJ3JlbGF0aXZlJ1xuXHRcdFx0XHR6SW5kZXg6IDJcblx0XHRcdFx0dG9wOiAnMzBweCdcblx0XHRcdFx0d2lkdGg6ICc0MDBweCdcblx0XHRcdFx0aGVpZ2h0OiAnMzAwcHgnXG5cdFx0XHRcdGZvbnRTaXplOiAnMzBweCdcblx0XHRcdFx0bGluZUhlaWdodDogJzMwcHgnXG5cblx0XHRcdFx0J0BwYXJlbnQob3JpZW50YXRpb246bGFuZHNjYXBlKSc6XG5cdFx0XHRcdFx0bWFyZ2luQm90dG9tOiA2XG5cblx0XHRcdFx0J0BwYXJlbnQob3JpZW50YXRpb246cG9ydHJhaXQpJzpcblx0XHRcdFx0XHRtYXJnaW5Cb3R0b206IDdcblx0XHRcdFx0XG5cdFx0XHRcdCdAcGFyZW50KHBvc2l0aW9uOnJlbGF0aXZlKSc6XG5cdFx0XHRcdFx0dG9wOiAnMjFweCdcblxuXHRcdFx0XHQnQHBhcmVudChtYXgtd2lkdGg6MzUwKSc6XG5cdFx0XHRcdFx0ekluZGV4OiAzXG5cdFx0XHRcdFx0Zm9udFNpemU6ICczNHB4J1xuXHRcdFx0XHRcblx0XHRcdFx0J0BwYXJlbnQobWF4LXdpZHRoOjUwMCwgbWluLWhlaWdodDo0MDApJzpcblx0XHRcdFx0XHR6SW5kZXg6IDRcblx0XHRcdFx0XHRmb250U2l6ZTogJzI3cHgnXG5cdFx0XHRcdFx0bGluZUhlaWdodDogJzM3cHgnXG5cdFx0XHRcdFxuXHRcdFx0XHQnQHBhcmVudCh6SW5kZXg6NyknOlxuXHRcdFx0XHRcdGxpbmVIZWlnaHQ6ICcxNnB4J1xuXG5cblx0XHRcdHNpbXVsYXRlUGFyZW50KDQwMCwgMzAwKVxuXHRcdFx0ZGl2LmFwcGVuZFRvKHBhcmVudClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3pJbmRleCcpLnRvLmVxdWFsICcyJ1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnd2lkdGgnKS50by5lcXVhbCAnNDAwcHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdoZWlnaHQnKS50by5lcXVhbCAnMzAwcHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250U2l6ZScpLnRvLmVxdWFsICczMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnbGluZUhlaWdodCcpLnRvLmVxdWFsICczMHB4J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnbWFyZ2luQm90dG9tJykudG8uZXF1YWwgJzZweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3RvcCcpLnRvLmVxdWFsICczMHB4J1xuXG5cdFx0XHRwYXJlbnQuc3R5bGUgJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJ1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAndG9wJykudG8uZXF1YWwgJzMwcHgnXG5cblx0XHRcdHNpbXVsYXRlUGFyZW50KClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3RvcCcpLnRvLmVxdWFsICcyMXB4J1xuXG5cdFx0XHRzaW11bGF0ZVBhcmVudCgzNDksIDQyMClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3pJbmRleCcpLnRvLmVxdWFsICc0J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMjdweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2xpbmVIZWlnaHQnKS50by5lcXVhbCAnMzdweCdcblx0XHRcdFxuXHRcdFx0c2ltdWxhdGVQYXJlbnQoMzQ5LCAzOTkpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd6SW5kZXgnKS50by5lcXVhbCAnMydcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwgJzM0cHgnXG5cdFx0XHRcblx0XHRcdHBhcmVudC5zdHlsZSAnekluZGV4JywgJzcnXG5cdFx0XHRzaW11bGF0ZVBhcmVudCgzNDksIDQwMSlcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3pJbmRleCcpLnRvLmVxdWFsICc0J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMjdweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2xpbmVIZWlnaHQnKS50by5lcXVhbCAnMTZweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ29wYWNpdHknKS50by5lcXVhbCAnMSdcblxuXG5cdFx0dGVzdCBcIlBhcmVudCBSZWYgZGltZW5zaW9ucy9zdHlsZXNcIiwgKCktPlxuXHRcdFx0cGFyZW50ID1cblx0XHRcdFx0RG9tLmRpdih7cmVmOidhYmMnfSxcblx0XHRcdFx0XHREb20uZGl2IHtpZDonZGVmJ30sXG5cdFx0XHRcdFx0XHREb20uZGl2IHtyZWY6J2doaSd9XG5cdFx0XHRcdCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdFxuXHRcdFx0ZGl2ID0gRG9tLmRpdiBzdHlsZTpcblx0XHRcdFx0cG9zaXRpb246ICdyZWxhdGl2ZSdcblx0XHRcdFx0ekluZGV4OiAyXG5cdFx0XHRcdHRvcDogJzMwcHgnXG5cdFx0XHRcdHdpZHRoOiAnNDAwcHgnXG5cdFx0XHRcdGhlaWdodDogJzMwMHB4J1xuXHRcdFx0XHRmb250U2l6ZTogJzMwcHgnXG5cdFx0XHRcdGxpbmVIZWlnaHQ6ICczMHB4J1xuXG5cdFx0XHRcdCdAI2FiYyhvcmllbnRhdGlvbjpsYW5kc2NhcGUpJzpcblx0XHRcdFx0XHRmb250V2VpZ2h0OiA2MDBcblxuXHRcdFx0XHQnQCNhYmMob3JpZW50YXRpb246cG9ydHJhaXQpJzpcblx0XHRcdFx0XHRmb250V2VpZ2h0OiA1MDBcblx0XHRcdFx0XG5cdFx0XHRcdCdAI2RlZihwb3NpdGlvbjpyZWxhdGl2ZSknOlxuXHRcdFx0XHRcdHRvcDogJzIwcHgnXG5cblx0XHRcdFx0J0AjZGVmKG1heC13aWR0aDozNTApJzpcblx0XHRcdFx0XHR6SW5kZXg6IDNcblx0XHRcdFx0XHRmb250U2l6ZTogJzMzcHgnXG5cdFx0XHRcdFxuXHRcdFx0XHQnQCNnaGkobWF4LXdpZHRoOjUwMCwgbWluLWhlaWdodDo0MDApJzpcblx0XHRcdFx0XHR6SW5kZXg6IDRcblx0XHRcdFx0XHRmb250U2l6ZTogJzI3cHgnXG5cdFx0XHRcdFx0bGluZUhlaWdodDogJzM3cHgnXG5cdFx0XHRcdFxuXHRcdFx0XHQnQCNhYmMoekluZGV4OjcpJzpcblx0XHRcdFx0XHRsaW5lSGVpZ2h0OiAnMTVweCdcblxuXG5cdFx0XHRwYXJlbnQuc3R5bGUod2lkdGg6NDAwLCBoZWlnaHQ6MzAwKVxuXHRcdFx0cGFyZW50LmNoaWxkLmRlZi5zdHlsZSh3aWR0aDo0MDAsIGhlaWdodDozMDApXG5cdFx0XHRwYXJlbnQuY2hpbGQuZ2hpLnN0eWxlKHdpZHRoOjQwMCwgaGVpZ2h0OjMwMClcblx0XHRcdGRpdi5hcHBlbmRUbyhwYXJlbnQuY2hpbGQuZ2hpKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnekluZGV4JykudG8uZXF1YWwgJzInXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd3aWR0aCcpLnRvLmVxdWFsICc0MDBweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2hlaWdodCcpLnRvLmVxdWFsICczMDBweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwgJzMwcHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdsaW5lSGVpZ2h0JykudG8uZXF1YWwgJzMwcHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250V2VpZ2h0JykudG8uZXF1YWwgJzYwMCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3RvcCcpLnRvLmVxdWFsICczMHB4J1xuXG5cdFx0XHRwYXJlbnQuc3R5bGUod2lkdGg6NDAwLCBoZWlnaHQ6OTAwLCBwb3NpdGlvbjoncmVsYXRpdmUnKVxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSgpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdmb250V2VpZ2h0JykudG8uZXF1YWwgJzUwMCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3RvcCcpLnRvLmVxdWFsICczMHB4J1xuXHRcdFx0XG5cdFx0XHRwYXJlbnQuY2hpbGQuZGVmLnN0eWxlKHBvc2l0aW9uOidyZWxhdGl2ZScpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd0b3AnKS50by5lcXVhbCAnMzBweCdcblxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSgpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd0b3AnKS50by5lcXVhbCAnMjBweCdcblxuXHRcdFx0cGFyZW50LmNoaWxkLmRlZi5zdHlsZSh3aWR0aDozNDksIGhlaWdodDo0MjApXG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3pJbmRleCcpLnRvLmVxdWFsICczJ1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMzNweCdcblx0XHRcdFxuXHRcdFx0cGFyZW50LmNoaWxkLmdoaS5zdHlsZSh3aWR0aDo0NTAsIGhlaWdodDo0MjApXG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ3pJbmRleCcpLnRvLmVxdWFsICc0J1xuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbCAnMjdweCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2xpbmVIZWlnaHQnKS50by5lcXVhbCAnMzdweCdcblx0XHRcdFxuXHRcdFx0cGFyZW50LnN0eWxlKHpJbmRleDo3KVxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSgpXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICd6SW5kZXgnKS50by5lcXVhbCAnNCdcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwgJzI3cHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdsaW5lSGVpZ2h0JykudG8uZXF1YWwgJzE1cHgnXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdvcGFjaXR5JykudG8uZXF1YWwgJzEnXG5cblxuXHRcdHRlc3QgXCJOZXN0ZWQgbWVkaWEgcXVlcmllc1wiLCAoKS0+XG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDEwMDAsIDkwMClcblx0XHRcdGRpdiA9IERvbS5kaXYgc3R5bGU6XG5cdFx0XHRcdHpJbmRleDogMlxuXG5cdFx0XHRcdCRoYXBweTpcblx0XHRcdFx0XHRtYXJnaW5SaWdodDogNVxuXHRcdFx0XHRcdCdAd2luZG93KG9yaWVudGF0aW9uOmxhbmRzY2FwZSknOlxuXHRcdFx0XHRcdFx0bWFyZ2luUmlnaHQ6IDZcblxuXHRcdFx0XHQnQHdpbmRvdyhvcmllbnRhdGlvbjpwb3J0cmFpdCknOlxuXHRcdFx0XHRcdCRyZWxheGVkOlxuXHRcdFx0XHRcdFx0bWFyZ2luUmlnaHQ6IDdcblxuXG5cdFx0XHRkaXYuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdFxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnbWFyZ2luUmlnaHQnKS50by5lcXVhbCAnMHB4J1xuXHRcdFx0XG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ21hcmdpblJpZ2h0JykudG8uZXF1YWwgJzZweCdcblx0XHRcdFxuXHRcdFx0ZGltZW5zaW9ucy5zaW11bGF0ZSg5MDAsIDEwMDApXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdtYXJnaW5SaWdodCcpLnRvLmVxdWFsICc1cHgnXG5cdFx0XHRcblx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoMTAwMCwgOTAwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnbWFyZ2luUmlnaHQnKS50by5lcXVhbCAnNnB4J1xuXG5cblx0XHRcdGRpdi5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cdFx0XHRleHBlY3QoZGl2LnN0eWxlICdtYXJnaW5SaWdodCcpLnRvLmVxdWFsICc2cHgnXG5cdFx0XHRcblx0XHRcdGRpbWVuc2lvbnMuc2ltdWxhdGUoOTAwLCAxMDAwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdHlsZSAnbWFyZ2luUmlnaHQnKS50by5lcXVhbCAnN3B4J1xuXHRcdFx0XG5cdFx0XHRkaW1lbnNpb25zLnNpbXVsYXRlKDEwMDAsIDkwMClcblx0XHRcdGV4cGVjdChkaXYuc3R5bGUgJ21hcmdpblJpZ2h0JykudG8uZXF1YWwgJzZweCdcblxuXG5cblxuXG5cblx0c3VpdGUgXCJUcmF2ZXJzYWxcIiwgKCktPlxuXHRcdHRlc3QgXCJDaGlsZHJlblwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KG51bGwsIERvbS5kaXYoKSwgJ1NvbWUgVGV4dCcpXG5cblx0XHRcdGV4cGVjdChkaXYuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbGVtZW50Q2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5jaGlsZE5vZGVzLmxlbmd0aCkudG8uZXF1YWwoMilcblxuXHRcdFx0ZGl2LmFwcGVuZChEb20uc3BhbigpKVxuXHRcdFx0ZXhwZWN0KGRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3QoZGl2LmVsZW1lbnRDaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QoZGl2LmVsLmNoaWxkTm9kZXMubGVuZ3RoKS50by5lcXVhbCgzKVxuXHRcdFx0XG5cdFx0XHRkaXYuZWwuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoNClcblx0XHRcdGV4cGVjdChkaXYuZWxlbWVudENoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMylcblx0XHRcdGV4cGVjdChkaXYuZWwuY2hpbGROb2Rlcy5sZW5ndGgpLnRvLmVxdWFsKDQpXG5cblx0XHRcdGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG5cdFx0XHRzcGFuQSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKVxuXHRcdFx0c3BhbkIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJylcblx0XHRcdHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnc29tZVRleHROb2RlJylcblx0XHRcdGNvbW1lbnQgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KCdzb21lQ29tbWVudE5vZGUnKVxuXHRcdFx0XG5cdFx0XHRkaXYuYXBwZW5kQ2hpbGQoc3BhbkEpXG5cdFx0XHRkaXYuYXBwZW5kQ2hpbGQoY29tbWVudClcblx0XHRcdGRpdi5hcHBlbmRDaGlsZChzcGFuQilcblx0XHRcdGRpdi5hcHBlbmRDaGlsZCh0ZXh0KVxuXHRcdFx0ZXhwZWN0KGRpdi5jaGlsZE5vZGVzLmxlbmd0aCkudG8uZXF1YWwoNClcblx0XHRcdGV4cGVjdChkaXYuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgyKVxuXG5cdFx0XHRkaXYkID0gRG9tKGRpdilcblx0XHRcdGV4cGVjdChkaXYkLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMylcblx0XHRcdGV4cGVjdChkaXYkLmVsZW1lbnRDaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QoZGl2JC5jaGlsZHJlblswXS5yYXcpLnRvLmVxdWFsKHNwYW5BKVxuXHRcdFx0ZXhwZWN0KGRpdiQuY2hpbGRyZW5bMV0ucmF3KS50by5lcXVhbChzcGFuQilcblx0XHRcdGV4cGVjdChkaXYkLmNoaWxkcmVuWzJdLnJhdykudG8uZXF1YWwodGV4dClcblxuXG5cdFx0dGVzdCBcIlBhcmVudFwiLCAoKS0+XG5cdFx0XHRBID0gRG9tLmRpdihudWxsLCBEb20uZGl2KCksICdTb21lIFRleHQnKVxuXHRcdFx0QiA9IERvbS5kaXYoKVxuXHRcdFx0QyA9IERvbS5kaXYoKVxuXG5cdFx0XHRleHBlY3QoQS5wYXJlbnQpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KEEuY2hpbGRyZW5bMF0ucGFyZW50KS50by5lcXVhbCBBXG5cdFx0XHRleHBlY3QoQS5jaGlsZHJlblswXS5lbC5wYXJlbnROb2RlKS50by5lcXVhbCBBLmVsXG5cblx0XHRcdEIuYXBwZW5kKEEpXG5cdFx0XHRleHBlY3QoQS5wYXJlbnQpLnRvLmVxdWFsIEJcblx0XHRcdGV4cGVjdChBLmNoaWxkcmVuWzBdLnBhcmVudCkudG8uZXF1YWwgQVxuXHRcdFx0ZXhwZWN0KEEuY2hpbGRyZW5bMF0uZWwucGFyZW50Tm9kZSkudG8uZXF1YWwgQS5lbFxuXHRcdFx0ZXhwZWN0KEIuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KEIuY2hpbGRyZW5bMF0pLnRvLmVxdWFsKEEpXG5cblx0XHRcdEMuYXBwZW5kKEEpXG5cdFx0XHRleHBlY3QoQS5wYXJlbnQpLnRvLmVxdWFsIENcblx0XHRcdGV4cGVjdChBLmNoaWxkcmVuWzBdLnBhcmVudCkudG8uZXF1YWwgQVxuXHRcdFx0ZXhwZWN0KEEuY2hpbGRyZW5bMF0uZWwucGFyZW50Tm9kZSkudG8uZXF1YWwgQS5lbFxuXHRcdFx0ZXhwZWN0KEIuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgwKVxuXHRcdFx0ZXhwZWN0KEMuY2hpbGRyZW5bMF0pLnRvLmVxdWFsKEEpXG5cblxuXHRcdHRlc3QgXCJQYXJlbnRzXCIsICgpLT5cblx0XHRcdEEgPSBEb20uZGl2KCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdEIgPSBEb20uZGl2KCkuYXBwZW5kVG8oQSlcblx0XHRcdEMgPSBEb20uZGl2KCkuYXBwZW5kVG8oQilcblxuXHRcdFx0ZXhwZWN0KEEucGFyZW50LmVsKS50by5lcXVhbChzYW5kYm94KVxuXHRcdFx0ZXhwZWN0KEIucGFyZW50KS50by5lcXVhbChBKVxuXHRcdFx0ZXhwZWN0KEMucGFyZW50KS50by5lcXVhbChCKVxuXG5cdFx0XHRleHBlY3QoQS5wYXJlbnRzLmxlbmd0aCkudG8uZXF1YWwoQi5wYXJlbnRzLmxlbmd0aC0xKVxuXHRcdFx0ZXhwZWN0KEIucGFyZW50cy5sZW5ndGgpLnRvLmVxdWFsKEMucGFyZW50cy5sZW5ndGgtMSlcblx0XHRcdGV4cGVjdChCLnBhcmVudHNbMF0pLnRvLmVxdWFsKEEpXG5cdFx0XHRleHBlY3QoQy5wYXJlbnRzWzBdKS50by5lcXVhbChCKVxuXHRcdFx0ZXhwZWN0KEMucGFyZW50cy5sZW5ndGgpLnRvLmVxdWFsKDUpXG5cdFx0XHRleHBlY3QoQy5wYXJlbnRzLnNsaWNlKC0xKVswXS5lbCkudG8uZXF1YWwoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KVxuXG5cblx0XHRzdWl0ZSBcIlBhcmVudCBNYXRjaGluZ1wiLCAoKS0+XG5cdFx0XHR0ZWFyZG93biAoKS0+IEBlbHMuQS5kZXRhY2goKVxuXHRcdFx0c3VpdGVTZXR1cCAoKS0+XG5cdFx0XHRcdEEgPSBEb20uc2VjdGlvbihyZWY6J0EnKVxuXHRcdFx0XHRCID0gRG9tLmRpdihyZWY6J0InKS5hcHBlbmRUbyhBKVxuXHRcdFx0XHRDID0gRG9tLmRpdihyZWY6J0MnKS5hcHBlbmRUbyhCKVxuXHRcdFx0XHREID0gRG9tLnNwYW4ocmVmOidEJykuYXBwZW5kVG8oQylcblx0XHRcdFx0QGVscyA9IHtBLEIsQyxEfVxuXHRcdFx0XHRcblx0XHRcdHRlc3QgXCJmdW5jdGlvbiBmaWx0ZXJcIiwgKCktPlxuXHRcdFx0XHR7QSxCLEMsRH0gPSBAZWxzXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudHMpLnRvLmVxbCBbQyxCLEFdXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudE1hdGNoaW5nKG51bGwpKS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudE1hdGNoaW5nKEIpKS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudE1hdGNoaW5nICgpLT4gZmFsc2UpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdFx0ZXhwZWN0KEQucGFyZW50TWF0Y2hpbmcgKGVsKS0+IGVsIGlzIEIpLnRvLmVxdWFsKEIpXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudE1hdGNoaW5nIChlbCktPiBlbCBpcyBBKS50by5lcXVhbChBKVxuXHRcdFx0XHRleHBlY3QoRC5wYXJlbnRNYXRjaGluZyAoZWwpLT4gZWwgaXMgQykudG8uZXF1YWwoQylcblxuXHRcdFx0XHRBLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudE1hdGNoaW5nIChlbCktPiBlbC5yYXcgaXMgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS50by5lcXVhbChEb20oZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSlcblxuXHRcdFx0dGVzdCBcInJlZiBmaWx0ZXJcIiwgKCktPlxuXHRcdFx0XHR7QSxCLEMsRH0gPSBAZWxzXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudHMpLnRvLmVxbCBbQyxCLEFdXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudE1hdGNoaW5nICdiYWRSZWYnKS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudE1hdGNoaW5nICdCJykudG8uZXF1YWwoQilcblx0XHRcdFx0ZXhwZWN0KEQucGFyZW50TWF0Y2hpbmcgJ0EnKS50by5lcXVhbChBKVxuXHRcdFx0XHRleHBlY3QoRC5wYXJlbnRNYXRjaGluZyAnQycpLnRvLmVxdWFsKEMpXG5cblxuXHRcdHN1aXRlIFwiUGFyZW50cyBVbnRpbFwiLCAoKS0+XG5cdFx0XHRzdWl0ZVNldHVwICgpLT5cblx0XHRcdFx0QSA9IERvbS5zZWN0aW9uKHJlZjonQScpXG5cdFx0XHRcdEIgPSBEb20uZGl2KHJlZjonQicpLmFwcGVuZFRvKEEpXG5cdFx0XHRcdEMgPSBEb20uZGl2KHJlZjonQycpLmFwcGVuZFRvKEIpXG5cdFx0XHRcdEQgPSBEb20uc3BhbihyZWY6J0QnKS5hcHBlbmRUbyhDKVxuXHRcdFx0XHRAZWxzID0ge0EsQixDLER9XG5cdFx0XHRcblx0XHRcdHRlc3QgXCJmdW5jdGlvbiBmaWx0ZXJcIiwgKCktPlxuXHRcdFx0XHR7QSxCLEMsRH0gPSBAZWxzXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudHMpLnRvLmVxbCBbQyxCLEFdXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudHNVbnRpbChudWxsKSkudG8uZXFsIFtDLEIsQV1cblx0XHRcdFx0ZXhwZWN0KEQucGFyZW50c1VudGlsKCkpLnRvLmVxbCBbQyxCLEFdXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudHNVbnRpbCAoZWwpLT4gZWwgaXMgQSkudG8uZXFsIFtDLEJdXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudHNVbnRpbCAoZWwpLT4gZWwgaXMgQikudG8uZXFsIFtDXVxuXHRcdFx0XHRleHBlY3QoRC5wYXJlbnRzVW50aWwgKGVsKS0+IGZhbHNlKS50by5lcWwgW0MsQixBXVxuXHRcdFx0XG5cblx0XHRcdHRlc3QgXCJyZWYgZmlsdGVyXCIsICgpLT4gXG5cdFx0XHRcdHtBLEIsQyxEfSA9IEBlbHNcblx0XHRcdFx0ZXhwZWN0KEQucGFyZW50c1VudGlsICdBJykudG8uZXFsIFtDLEJdXG5cdFx0XHRcdGV4cGVjdChELnBhcmVudHNVbnRpbCAnQicpLnRvLmVxbCBbQ11cblx0XHRcdFx0ZXhwZWN0KEQucGFyZW50c1VudGlsICdiYWRSZWYnKS50by5lcWwgW0MsQixBXVxuXG5cblx0XHR0ZXN0IFwiTmV4dFwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KG51bGwsIEE9RG9tLmRpdigpLCBCPURvbS5kaXYoKSwgQz1Eb20uZGl2KCksIEQ9RG9tLmRpdigpLCBFPURvbS5kaXYoKSlcblxuXHRcdFx0ZXhwZWN0KEEubmV4dCkudG8uZXF1YWwoQilcblx0XHRcdGV4cGVjdChDLm5leHQpLnRvLmVxdWFsKEQpXG5cdFx0XHRleHBlY3QoRS5uZXh0KS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRleHBlY3QoQi5uZXh0QWxsKS50by5lcWwoW0MsRCxFXSlcblxuXHRcdFxuXHRcdHRlc3QgXCJOZXh0IEVsZW1lbnRcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLmRpdihudWxsLCBBPURvbS5kaXYoKSwgQj1Eb20udGV4dCgpLCBDPURvbS5kaXYoKSwgRD1Eb20udGV4dCgpLCBFPURvbS5kaXYoKSlcblxuXHRcdFx0ZXhwZWN0KEEubmV4dCkudG8uZXF1YWwoQilcblx0XHRcdGV4cGVjdChBLm5leHRFbCkudG8uZXF1YWwoQylcblx0XHRcdGV4cGVjdChCLm5leHRFbCkudG8uZXF1YWwoQylcblx0XHRcdGV4cGVjdChDLm5leHRFbCkudG8uZXF1YWwoRSlcblx0XHRcdGV4cGVjdChFLm5leHRFbCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KEEubmV4dEVsQWxsKS50by5lcWwoW0MsRV0pXG5cblxuXHRcdHRlc3QgXCJQcmV2XCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYobnVsbCwgQT1Eb20uZGl2KCksIEI9RG9tLmRpdigpLCBDPURvbS5kaXYoKSwgRD1Eb20uZGl2KCksIEU9RG9tLmRpdigpKVxuXG5cdFx0XHRleHBlY3QoRS5wcmV2KS50by5lcXVhbChEKVxuXHRcdFx0ZXhwZWN0KEMucHJldikudG8uZXF1YWwoQilcblx0XHRcdGV4cGVjdChBLnByZXYpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChELnByZXZBbGwpLnRvLmVxbChbQyxCLEFdKVxuXG5cdFx0XG5cdFx0dGVzdCBcIlByZXYgRWxlbWVudFwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KG51bGwsIEE9RG9tLmRpdigpLCBCPURvbS50ZXh0KCksIEM9RG9tLmRpdigpLCBEPURvbS50ZXh0KCksIEU9RG9tLmRpdigpKVxuXG5cdFx0XHRleHBlY3QoRS5wcmV2KS50by5lcXVhbChEKVxuXHRcdFx0ZXhwZWN0KEUucHJldkVsKS50by5lcXVhbChDKVxuXHRcdFx0ZXhwZWN0KEQucHJldkVsKS50by5lcXVhbChDKVxuXHRcdFx0ZXhwZWN0KEMucHJldkVsKS50by5lcXVhbChBKVxuXHRcdFx0ZXhwZWN0KEEucHJldkVsKS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRleHBlY3QoRS5wcmV2RWxBbGwpLnRvLmVxbChbQyxBXSlcblxuXG5cdFx0dGVzdCBcIlNpYmxpbmdzXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYobnVsbCwgQT1Eb20uZGl2KCksIEI9RG9tLnRleHQoKSwgQz1Eb20uZGl2KCksIEQ9RG9tLnRleHQoKSwgRT1Eb20uZGl2KCkpXG5cblx0XHRcdGV4cGVjdChDLnNpYmxpbmdzKS50by5lcWwoQy5wcmV2QWxsLnJldmVyc2UoKS5jb25jYXQoQy5uZXh0QWxsKSlcblx0XHRcdGV4cGVjdChDLnNpYmxpbmdzKS50by5lcWwoW0EsQixELEVdKVxuXHRcdFx0ZXhwZWN0KEMuZWxlbWVudFNpYmxpbmdzKS50by5lcWwoW0EsRV0pXG5cdFx0XHRleHBlY3QoQi5lbGVtZW50U2libGluZ3MpLnRvLmVxbChbQSxDLEVdKVxuXG5cblx0XHR0ZXN0IFwiRmlyc3QvTGFzdCBDaGlsZFwiLCAoKS0+XG5cdFx0XHRtYWluID0gRE9NLmRpdihpZDonbWFpbicpXG5cdFx0XHRkaXZBID0gRE9NLmRpdihpZDonZGl2QScpLmFwcGVuZFRvKG1haW4pXG5cdFx0XHRkaXZCID0gRE9NLmRpdihpZDonZGl2QicpLmFwcGVuZFRvKG1haW4pXG5cdFx0XHRkaXZDID0gRE9NLmRpdihpZDonZGl2QycpLmFwcGVuZFRvKG1haW4pXG5cdFx0XHRkaXZCQSA9IERPTS5kaXYoaWQ6J2RpdkJBJykuYXBwZW5kVG8oZGl2Qilcblx0XHRcdGRpdkJCID0gRE9NLmRpdihpZDonZGl2QkInKS5hcHBlbmRUbyhkaXZCKVxuXG5cdFx0XHRleHBlY3QobWFpbi5maXJzdENoaWxkKS50by5lcXVhbCBkaXZBXG5cdFx0XHRleHBlY3QobWFpbi5sYXN0Q2hpbGQpLnRvLmVxdWFsIGRpdkNcblx0XHRcdGV4cGVjdChkaXZBLmZpcnN0Q2hpbGQpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KGRpdkEubGFzdENoaWxkKS50by5lcXVhbCB1bmRlZmluZWRcblx0XHRcdGV4cGVjdChkaXZCLmZpcnN0Q2hpbGQpLnRvLmVxdWFsIGRpdkJBXG5cdFx0XHRleHBlY3QoZGl2Qi5sYXN0Q2hpbGQpLnRvLmVxdWFsIGRpdkJCXG5cblxuXHRcdHRlc3QgXCJDaGlsZCAoYnkgcmVmKVwiLCAoKS0+XG5cdFx0XHRkaXZBID0gXG5cdFx0XHRcdERvbS5kaXYge2lkOidkaXZBJ30sXG5cdFx0XHRcdFx0RG9tLmRpdiB7aWQ6J2NoaWxkQSd9LFxuXHRcdFx0XHRcdFx0RG9tLnNwYW4ge3JlZjonY2hpbGRBXzEnfVxuXHRcdFx0XHRcdFx0RG9tLmRpdiB7cmVmOidjaGlsZEFfMicsIGlkOidjaGlsZEFfMid9XG5cdFx0XHRcdFx0RG9tLmRpdiB7fSxcblx0XHRcdFx0XHRcdERvbS5zcGFuIHtyZWY6J2NoaWxkQl8xJ31cblx0XHRcdFx0XHRcdERvbS50ZXh0IHtpZDonY2hpbGRCXzInfSwgJ1RoZSBUZXh0J1xuXG5cblx0XHRcdGRpdkIgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFsnZGl2Jywge2lkOidkaXZCJ30sXG5cdFx0XHRcdFx0WydkaXYnLCB7aWQ6J2NoaWxkQScsIHN0eWxlOntjb2xvcjoncGluayd9fSxcblx0XHRcdFx0XHRcdFsnc3BhbicsIHtyZWY6J2NoaWxkQV8xJ31dXG5cdFx0XHRcdFx0XHRbJ2RpdicsIHtyZWY6J2NoaWxkQV8zJywgaWQ6J2NoaWxkQV8yJ31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFsnZGl2JywgbnVsbCwgXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7cmVmOidjaGlsZEJfMSd9XVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0XVxuXHRcdFx0KS5zcGF3bigpXG5cblx0XHRcdGRpdkMgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFsnZGl2JywgcmVmOidkaXZDJyxcblx0XHRcdFx0XHRbJ2RpdicsXHRyZWY6J2NoaWxkQScsXG5cdFx0XHRcdFx0XHRbJ2RpdicsIHJlZjonZGl2QiddXG5cdFx0XHRcdFx0XHRbJ2RpdicsIHJlZjonZGl2QyddXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFsnZGl2JyxcdHJlZjonY2hpbGRCJyxcblx0XHRcdFx0XHRcdFsnZGl2JywgcmVmOidkaXZCJ11cblx0XHRcdFx0XHRcdFsnZGl2JywgcmVmOidkaXZDJ11cblx0XHRcdFx0XHRcdFsnZGl2JywgcmVmOidkaXZEJyxcblx0XHRcdFx0XHRcdFx0WydkaXYnLCByZWY6J2NoaWxkQiddXG5cdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRdXG5cdFx0XHQpLnNwYXduKClcblxuXHRcdFx0XG5cdFx0XHRleHBlY3QoZGl2QS5jaGlsZC5jaGlsZEEpLnRvLmVxdWFsKGRpdkEuY2hpbGRyZW5bMF0pXG5cdFx0XHRleHBlY3QoZGl2QS5jaGlsZC5jaGlsZEFfMSkudG8uZXF1YWwoZGl2QS5jaGlsZHJlblswXS5jaGlsZHJlblswXSlcblx0XHRcdGV4cGVjdChkaXZBLmNoaWxkLmNoaWxkQV8yKS50by5lcXVhbChkaXZBLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdKVxuXHRcdFx0ZXhwZWN0KGRpdkEuY2hpbGQuY2hpbGRBXzMpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChkaXZBLmNoaWxkLmNoaWxkQikudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KGRpdkEuY2hpbGQuY2hpbGRCXzEpLnRvLmVxdWFsKGRpdkEuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF0pXG5cdFx0XHRleHBlY3QoZGl2QS5jaGlsZC5jaGlsZEJfMikudG8uZXF1YWwoZGl2QS5jaGlsZHJlblsxXS5jaGlsZHJlblsxXSlcblx0XHRcdGV4cGVjdChkaXZBLmNoaWxkLmNoaWxkQl8yLnR5cGUpLnRvLmVxdWFsKCd0ZXh0JylcblxuXHRcdFx0XG5cdFx0XHRleHBlY3QoZGl2Qi5jaGlsZC5jaGlsZEEpLnRvLmVxdWFsKGRpdkIuY2hpbGRyZW5bMF0pXG5cdFx0XHRleHBlY3QoZGl2Qi5jaGlsZC5jaGlsZEFfMSkudG8uZXF1YWwoZGl2Qi5jaGlsZHJlblswXS5jaGlsZHJlblswXSlcblx0XHRcdGV4cGVjdChkaXZCLmNoaWxkLmNoaWxkQV8yKS50by5lcXVhbChkaXZCLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdKVxuXHRcdFx0ZXhwZWN0KGRpdkIuY2hpbGQuY2hpbGRBXzMpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChkaXZCLmNoaWxkLmNoaWxkQikudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KGRpdkIuY2hpbGQuY2hpbGRCXzEpLnRvLmVxdWFsKGRpdkIuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF0pXG5cdFx0XHRleHBlY3QoZGl2Qi5jaGlsZC5jaGlsZEJfMikudG8uZXF1YWwoZGl2Qi5jaGlsZHJlblsxXS5jaGlsZHJlblsxXSlcblx0XHRcdGV4cGVjdChkaXZCLmNoaWxkLmNoaWxkQS5zdHlsZSgnY29sb3InKSkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2Qi5jaGlsZC5jaGlsZEEuc3R5bGVTYWZlKCdjb2xvcicpKS5ub3QudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3QoZGl2Qi5jaGlsZC5jaGlsZEEuc3R5bGVTYWZlKCdjb2xvcicpLmxlbmd0aCA+PSA0KS50by5iZS50cnVlXG5cblxuXHRcdFx0ZXhwZWN0KGRpdkEuY2hpbGQuY2hpbGRBLnJhdy5nZXRBdHRyaWJ1dGUoJ2lkJykpLnRvLmVxdWFsKCdjaGlsZEEnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuY2hpbGQuY2hpbGRBLnJhdy5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmJykpLnRvLmVxdWFsKCdjaGlsZEEnKVxuXHRcdFx0ZXhwZWN0KGRpdkEuY2hpbGQuY2hpbGRBXzEucmF3LmdldEF0dHJpYnV0ZSgnaWQnKSkudG8uZXF1YWwobnVsbClcblx0XHRcdGV4cGVjdChkaXZBLmNoaWxkLmNoaWxkQV8xLnJhdy5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVmJykpLnRvLmVxdWFsKCdjaGlsZEFfMScpXG5cdFx0XHRleHBlY3QoZGl2QS5jaGlsZC5jaGlsZEFfMi5yYXcuZ2V0QXR0cmlidXRlKCdpZCcpKS50by5lcXVhbCgnY2hpbGRBXzInKVxuXHRcdFx0ZXhwZWN0KGRpdkEuY2hpbGQuY2hpbGRBXzIucmF3LmdldEF0dHJpYnV0ZSgnZGF0YS1yZWYnKSkudG8uZXF1YWwoJ2NoaWxkQV8yJylcblxuXHRcdFx0ZXhwZWN0KGRpdkMuY2hpbGQuY2hpbGRBKS50by5lcXVhbChkaXZDLmNoaWxkcmVuWzBdKVxuXHRcdFx0ZXhwZWN0KGRpdkMuY2hpbGQuY2hpbGRCKS50by5lcXVhbChkaXZDLmNoaWxkcmVuWzFdKVxuXHRcdFx0ZXhwZWN0KGRpdkMuY2hpbGQuZGl2QikudG8uZXF1YWwoZGl2Qy5jaGlsZHJlblswXS5jaGlsZHJlblswXSlcblx0XHRcdGV4cGVjdChkaXZDLmNoaWxkLmRpdkMpLnRvLmVxdWFsKGRpdkMpXG5cdFx0XHRleHBlY3QoZGl2Qy5jaGlsZC5kaXZEKS50by5lcXVhbChkaXZDLmNoaWxkcmVuWzFdLmNoaWxkcmVuWzJdKVxuXHRcdFx0ZXhwZWN0KGRpdkMuY2hpbGRyZW5bMF0uY2hpbGQuZGl2QikudG8uZXF1YWwoZGl2Qy5jaGlsZHJlblswXS5jaGlsZHJlblswXSlcblx0XHRcdGV4cGVjdChkaXZDLmNoaWxkcmVuWzBdLmNoaWxkLmRpdkMpLnRvLmVxdWFsKGRpdkMuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMV0pXG5cdFx0XHRleHBlY3QoZGl2Qy5jaGlsZHJlblsxXS5jaGlsZC5kaXZCKS50by5lcXVhbChkaXZDLmNoaWxkcmVuWzFdLmNoaWxkcmVuWzBdKVxuXHRcdFx0ZXhwZWN0KGRpdkMuY2hpbGRyZW5bMV0uY2hpbGQuZGl2QykudG8uZXF1YWwoZGl2Qy5jaGlsZHJlblsxXS5jaGlsZHJlblsxXSlcblx0XHRcdGV4cGVjdChkaXZDLmNoaWxkcmVuWzFdLmNoaWxkLmRpdkQpLnRvLmVxdWFsKGRpdkMuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMl0pXG5cdFx0XHRleHBlY3QoZGl2Qy5jaGlsZHJlblsxXS5jaGlsZC5jaGlsZEIpLnRvLmVxdWFsKGRpdkMuY2hpbGRyZW5bMV0pXG5cblx0XHRcdHNhbmRCb3ggPSBEb20oc2FuZGJveClcblx0XHRcdGV4cGVjdChzYW5kQm94LmNoaWxkLmNoaWxkQSkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KHNhbmRCb3guY2hpbGQuY2hpbGRCXzIpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChzYW5kQm94LmNoaWxkLmRpdkEpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdFxuXHRcdFx0c2FuZEJveC5hcHBlbmQoZGl2QSlcblx0XHRcdGV4cGVjdChzYW5kQm94LmNoaWxkLmNoaWxkQSkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KHNhbmRCb3guY2hpbGQuY2hpbGRCXzIpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChzYW5kQm94LmNoaWxkLmRpdkEpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChzYW5kQm94LmNoaWxkZi5kaXZBKS50by5lcXVhbChkaXZBKVxuXHRcdFx0ZXhwZWN0KHNhbmRCb3guY2hpbGQuY2hpbGRBKS50by5lcXVhbChkaXZBLmNoaWxkcmVuWzBdKVxuXHRcdFx0ZXhwZWN0KHNhbmRCb3guY2hpbGQuY2hpbGRCXzIpLnRvLmVxdWFsKGRpdkEuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMV0pXG5cdFx0XHRleHBlY3Qoc2FuZEJveC5jaGlsZC5kaXZBKS50by5lcXVhbChkaXZBKVxuXG5cdFx0XHRuZXdDaGlsZCA9IERvbS5kaXYocmVmOiduZXdDaGlsZCcpXG5cdFx0XHRuZXdDaGlsZENoaWxkID0gRG9tLmRpdihyZWY6J25ld0NoaWxkQ2hpbGQnKVxuXHRcdFx0ZXhwZWN0KG5ld0NoaWxkLmNoaWxkLm5ld0NoaWxkQ2hpbGQpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChuZXdDaGlsZENoaWxkLmNoaWxkLm5ld0NoaWxkQ2hpbGQpLnRvLmVxdWFsKG5ld0NoaWxkQ2hpbGQpXG5cdFx0XHRleHBlY3QoT2JqZWN0LmtleXMobmV3Q2hpbGRDaGlsZC5jaGlsZCkubGVuZ3RoKS50by5lcXVhbCgxKVxuXG5cdFx0XHRuZXdDaGlsZENoaWxkLmFwcGVuZFRvKG5ld0NoaWxkKVxuXHRcdFx0ZXhwZWN0KG5ld0NoaWxkLmNoaWxkLm5ld0NoaWxkQ2hpbGQpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChuZXdDaGlsZC5jaGlsZGYubmV3Q2hpbGRDaGlsZCkudG8uZXF1YWwobmV3Q2hpbGRDaGlsZClcblx0XHRcdGV4cGVjdChuZXdDaGlsZC5jaGlsZC5uZXdDaGlsZENoaWxkKS50by5lcXVhbChuZXdDaGlsZENoaWxkKVxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKG5ld0NoaWxkQ2hpbGQuY2hpbGQpLmxlbmd0aCkudG8uZXF1YWwoMSlcblxuXHRcdFx0bmV3UGFyZW50ID0gRG9tLmRpdihyZWY6J25ld1BhcmVudCcpXG5cdFx0XHRuZXdDaGlsZC5hcHBlbmRUbyhuZXdQYXJlbnQpXG5cdFx0XHRleHBlY3QobmV3UGFyZW50LmNoaWxkLm5ld0NoaWxkQ2hpbGQpLnRvLmVxdWFsKG5ld0NoaWxkQ2hpbGQpXG5cblxuXHRcdHRlc3QgXCJJbmRleFwiLCAoKS0+XG5cdFx0XHRzZWN0aW9uID1cblx0XHRcdFx0RG9tLnNlY3Rpb24obnVsbCxcblx0XHRcdFx0XHRjaGlsZEEgPSBEb20uZGl2KClcblx0XHRcdFx0XHRjaGlsZEIgPSBEb20uZGl2KClcblx0XHRcdFx0XHRjaGlsZEMgPSBEb20uc3BhbigpXG5cdFx0XHRcdFx0Y2hpbGREID0gRG9tLnRleHQoKVxuXHRcdFx0XHRcdGNoaWxkRSA9IERvbS5zcGFuKClcblx0XHRcdFx0XHRjaGlsZEYgPSBEb20uZGl2KClcblx0XHRcdFx0KVxuXG5cdFx0XHRleHBlY3QoY2hpbGRCLmluZGV4KS50by5lcXVhbCAxXG5cdFx0XHRleHBlY3QoY2hpbGRELmluZGV4KS50by5lcXVhbCAzXG5cdFx0XHRleHBlY3QoY2hpbGRGLmluZGV4KS50by5lcXVhbCA1XG5cblx0XHRcdGNoaWxkQy5kZXRhY2goKVxuXHRcdFx0ZXhwZWN0KGNoaWxkQi5pbmRleCkudG8uZXF1YWwgMVxuXHRcdFx0ZXhwZWN0KGNoaWxkRC5pbmRleCkudG8uZXF1YWwgMlxuXHRcdFx0ZXhwZWN0KGNoaWxkRi5pbmRleCkudG8uZXF1YWwgNFxuXHRcdFx0ZXhwZWN0KGNoaWxkQy5pbmRleCkudG8uZXF1YWwgbnVsbFxuXG5cblx0XHR0ZXN0IFwiSW5kZXggKGJ5IHR5cGUpXCIsICgpLT5cblx0XHRcdHNlY3Rpb24gPVxuXHRcdFx0XHREb20uc2VjdGlvbihudWxsLFxuXHRcdFx0XHRcdGNoaWxkQSA9IERvbS5kaXYoKVxuXHRcdFx0XHRcdGNoaWxkQiA9IERvbS5kaXYoKVxuXHRcdFx0XHRcdGNoaWxkQyA9IERvbS5zcGFuKClcblx0XHRcdFx0XHRjaGlsZEQgPSBEb20udGV4dCgpXG5cdFx0XHRcdFx0Y2hpbGRFID0gRG9tLnNwYW4oKVxuXHRcdFx0XHRcdGNoaWxkRiA9IERvbS50ZXh0KClcblx0XHRcdFx0XHRjaGlsZEcgPSBEb20uZGl2KClcblx0XHRcdFx0KVxuXG5cdFx0XHRleHBlY3QoY2hpbGRCLmluZGV4VHlwZSkudG8uZXF1YWwgMVxuXHRcdFx0ZXhwZWN0KGNoaWxkRC5pbmRleFR5cGUpLnRvLmVxdWFsIDBcblx0XHRcdGV4cGVjdChjaGlsZEYuaW5kZXhUeXBlKS50by5lcXVhbCAxXG5cdFx0XHRleHBlY3QoY2hpbGRHLmluZGV4VHlwZSkudG8uZXF1YWwgMlxuXG5cdFx0XHRjaGlsZEMuZGV0YWNoKClcblx0XHRcdGV4cGVjdChjaGlsZEIuaW5kZXhUeXBlKS50by5lcXVhbCAxXG5cdFx0XHRleHBlY3QoY2hpbGRELmluZGV4VHlwZSkudG8uZXF1YWwgMFxuXHRcdFx0ZXhwZWN0KGNoaWxkRi5pbmRleFR5cGUpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChjaGlsZEcuaW5kZXhUeXBlKS50by5lcXVhbCAyXG5cblx0XHRcdGNoaWxkQS5kZXRhY2goKVxuXHRcdFx0ZXhwZWN0KGNoaWxkQi5pbmRleFR5cGUpLnRvLmVxdWFsIDBcblx0XHRcdGV4cGVjdChjaGlsZEQuaW5kZXhUeXBlKS50by5lcXVhbCAwXG5cdFx0XHRleHBlY3QoY2hpbGRGLmluZGV4VHlwZSkudG8uZXF1YWwgMVxuXHRcdFx0ZXhwZWN0KGNoaWxkRy5pbmRleFR5cGUpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChjaGlsZEEuaW5kZXhUeXBlKS50by5lcXVhbCBudWxsXG5cdFx0XHRleHBlY3QoY2hpbGRDLmluZGV4VHlwZSkudG8uZXF1YWwgbnVsbFxuXG5cblx0XHR0ZXN0IFwiSW5kZXggKGJ5IHJlZilcIiwgKCktPlxuXHRcdFx0c2VjdGlvbiA9XG5cdFx0XHRcdERvbS5zZWN0aW9uKG51bGwsXG5cdFx0XHRcdFx0Y2hpbGRBID0gRG9tLmRpdihyZWY6J2FiYycpXG5cdFx0XHRcdFx0Y2hpbGRCID0gRG9tLmRpdihyZWY6J2FiYycpXG5cdFx0XHRcdFx0Y2hpbGRDID0gRG9tLnNwYW4ocmVmOidkZWYnKVxuXHRcdFx0XHRcdGNoaWxkRCA9IERvbS50ZXh0KHJlZjonYWJjJylcblx0XHRcdFx0XHRjaGlsZEUgPSBEb20uc3BhbihyZWY6J2FiYycpXG5cdFx0XHRcdFx0Y2hpbGRGID0gRG9tLnRleHQocmVmOidkZWYnKVxuXHRcdFx0XHRcdGNoaWxkRyA9IERvbS5kaXYocmVmOidhYmMnKVxuXHRcdFx0XHQpXG5cblx0XHRcdGV4cGVjdChjaGlsZEIuaW5kZXhSZWYpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChjaGlsZEQuaW5kZXhSZWYpLnRvLmVxdWFsIDJcblx0XHRcdGV4cGVjdChjaGlsZEYuaW5kZXhSZWYpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChjaGlsZEcuaW5kZXhSZWYpLnRvLmVxdWFsIDRcblxuXHRcdFx0Y2hpbGRDLmRldGFjaCgpXG5cdFx0XHRleHBlY3QoY2hpbGRCLmluZGV4UmVmKS50by5lcXVhbCAxXG5cdFx0XHRleHBlY3QoY2hpbGRELmluZGV4UmVmKS50by5lcXVhbCAyXG5cdFx0XHRleHBlY3QoY2hpbGRGLmluZGV4UmVmKS50by5lcXVhbCAwXG5cdFx0XHRleHBlY3QoY2hpbGRHLmluZGV4UmVmKS50by5lcXVhbCA0XG5cblx0XHRcdGNoaWxkQS5kZXRhY2goKVxuXHRcdFx0ZXhwZWN0KGNoaWxkQi5pbmRleFJlZikudG8uZXF1YWwgMFxuXHRcdFx0ZXhwZWN0KGNoaWxkRC5pbmRleFJlZikudG8uZXF1YWwgMVxuXHRcdFx0ZXhwZWN0KGNoaWxkRi5pbmRleFJlZikudG8uZXF1YWwgMFxuXHRcdFx0ZXhwZWN0KGNoaWxkRy5pbmRleFJlZikudG8uZXF1YWwgM1xuXHRcdFx0ZXhwZWN0KGNoaWxkQS5pbmRleFJlZikudG8uZXF1YWwgbnVsbFxuXHRcdFx0ZXhwZWN0KGNoaWxkQy5pbmRleFJlZikudG8uZXF1YWwgbnVsbFxuXG5cblx0XHR0ZXN0IFwiUXVlcnlcIiwgKCktPlxuXHRcdFx0ZGl2ID0gRG9tLnRlbXBsYXRlKFxuXHRcdFx0XHRbJ2RpdicsIHtjbGFzczonZGl2LW9uZScsIGF0dHJzOm5hbWU6J2FiYzEyMyd9LFxuXHRcdFx0XHRcdFsnZGl2Jywge2NsYXNzOidjaGlsZEEnLCBzdHlsZTp7Y29sb3I6J3BpbmsnfX0sXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7Y2xhc3M6J2NoaWxkQV8xJ31dXG5cdFx0XHRcdFx0XHRbJ2RpdicsIHtjbGFzczonY2hpbGRBXzEnfV1cblx0XHRcdFx0XHRcdFsnc3BhbicsIHtjbGFzczonY2hpbGRBXzEnfV1cblx0XHRcdFx0XHRcdFsnZGl2Jywge2NsYXNzOidjaGlsZEFfMid9XVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0XHRbJ2RpdicsIGNsYXNzTmFtZTonY2hpbGRCJywgXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7Y2xhc3M6J2NoaWxkQl8xJ31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFsnc2VjdGlvbicsIGNsYXNzTmFtZTonY2hpbGRCJywgXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7Y2xhc3M6J2NoaWxkQl8xJ31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRdXG5cdFx0XHQpLnNwYXduKCkuYXBwZW5kVG8oc2FuZEJveCA9IERvbShzYW5kYm94KSlcblxuXHRcdFx0ZXhwZWN0KGRpdi5xdWVyeSAnLmNoaWxkQScpLnRvLmVxdWFsKGRpdi5jaGlsZHJlblswXSlcblx0XHRcdGV4cGVjdChkaXYucXVlcnkgJy5jaGlsZEInKS50by5lcXVhbChkaXYuY2hpbGRyZW5bMV0pXG5cdFx0XHRleHBlY3QoZGl2LnF1ZXJ5ICcuY2hpbGRCXzEnKS50by5lcXVhbChkaXYuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF0pXG5cdFx0XHRleHBlY3QoZGl2LnF1ZXJ5ICcuY2hpbGRBXzEnKS50by5lcXVhbChkaXYuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0pXG5cdFx0XHRleHBlY3QoZGl2LnF1ZXJ5ICcuY2hpbGRBXzInKS50by5lcXVhbChkaXYuY2hpbGRyZW5bMF0uY2hpbGRyZW5bM10pXG5cdFx0XHRleHBlY3Qoc2FuZEJveC5xdWVyeSAnLmRpdi1vbmUnKS50by5lcXVhbChkaXYpXG5cdFx0XHRleHBlY3Qoc2FuZEJveC5xdWVyeSAnLmNoaWxkQl8xJykudG8uZXF1YWwoZGl2LmNoaWxkcmVuWzFdLmNoaWxkcmVuWzBdKVxuXHRcdFx0ZXhwZWN0KHNhbmRCb3gucXVlcnkgJ2RpdltuYW1lPVwiYWJjMTIzXCJdJykudG8uZXF1YWwoZGl2KVxuXHRcdFx0ZXhwZWN0KHNhbmRCb3gucXVlcnkgJ3NwYW5bbmFtZT1cImFiYzEyM1wiXScpLnRvLmVxdWFsKHVuZGVmaW5lZClcblxuXG5cdFx0dGVzdCBcIlF1ZXJ5QWxsXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS50ZW1wbGF0ZShcblx0XHRcdFx0WydkaXYnLCB7Y2xhc3M6J2Rpdi1vbmUnLCBhdHRyczpuYW1lOidhYmMxMjMnfSxcblx0XHRcdFx0XHRbJ2RpdicsIHtjbGFzczonY2hpbGRBJywgc3R5bGU6e2NvbG9yOidwaW5rJ319LFxuXHRcdFx0XHRcdFx0WydzcGFuJywge2NsYXNzOidjaGlsZEFfMSd9XVxuXHRcdFx0XHRcdFx0WydkaXYnLCB7Y2xhc3M6J2NoaWxkQV8xJ31dXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7Y2xhc3M6J2NoaWxkQV8xJ31dXG5cdFx0XHRcdFx0XHRbJ2RpdicsIHtjbGFzczonY2hpbGRBXzInfV1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0WydkaXYnLCBjbGFzc05hbWU6J2NoaWxkQicsIFxuXHRcdFx0XHRcdFx0WydzcGFuJywge2NsYXNzOidjaGlsZEJfMSd9XVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0XHRbJ3NlY3Rpb24nLCBjbGFzc05hbWU6J2NoaWxkQicsIFxuXHRcdFx0XHRcdFx0WydzcGFuJywge2NsYXNzOidjaGlsZEJfMSd9XVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0XVxuXHRcdFx0KS5zcGF3bigpLmFwcGVuZFRvKHNhbmRCb3ggPSBEb20oc2FuZGJveCkpXG5cblx0XHRcdGV4cGVjdChkaXYucXVlcnlBbGwoJy5jaGlsZEEnKS5lbGVtZW50cykudG8uZXFsKFtkaXYuY2hpbGRyZW5bMF1dKVxuXHRcdFx0ZXhwZWN0KGRpdi5xdWVyeUFsbCgnLmNoaWxkQicpLmVsZW1lbnRzKS50by5lcWwoW2Rpdi5jaGlsZHJlblsxXSwgZGl2LmNoaWxkcmVuWzJdXSlcblx0XHRcdGV4cGVjdChkaXYucXVlcnlBbGwoJy5jaGlsZEJfMScpLmVsZW1lbnRzKS50by5lcWwoW2Rpdi5jaGlsZHJlblsxXS5jaGlsZHJlblswXSwgZGl2LmNoaWxkcmVuWzJdLmNoaWxkcmVuWzBdXSlcblx0XHRcdGV4cGVjdChkaXYucXVlcnlBbGwoJy5jaGlsZEFfMScpLmVsZW1lbnRzKS50by5lcWwoW2Rpdi5jaGlsZHJlblswXS5jaGlsZHJlblswXSwgZGl2LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdLCBkaXYuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMl1dKVxuXHRcdFx0ZXhwZWN0KGRpdi5xdWVyeUFsbCgnLmNoaWxkQV8yJykuZWxlbWVudHMpLnRvLmVxbChbZGl2LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzNdXSlcblx0XHRcdGV4cGVjdChzYW5kQm94LnF1ZXJ5QWxsKCcuZGl2LW9uZScpLmVsZW1lbnRzKS50by5lcWwoW2Rpdl0pXG5cdFx0XHRleHBlY3Qoc2FuZEJveC5xdWVyeUFsbCgnLmNoaWxkQl8xJykuZWxlbWVudHMpLnRvLmVxbChbZGl2LmNoaWxkcmVuWzFdLmNoaWxkcmVuWzBdLCBkaXYuY2hpbGRyZW5bMl0uY2hpbGRyZW5bMF1dKVxuXHRcdFx0ZXhwZWN0KHNhbmRCb3gucXVlcnlBbGwoJ2RpdltuYW1lPVwiYWJjMTIzXCJdJykuZWxlbWVudHMpLnRvLmVxbChbZGl2XSlcblx0XHRcdGV4cGVjdChzYW5kQm94LnF1ZXJ5QWxsKCdzcGFuW25hbWU9XCJhYmMxMjNcIl0nKS5lbGVtZW50cykudG8uZXFsKFtdKVxuXHRcdFx0ZXhwZWN0KGRpdi50ZXh0KS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChzYW5kQm94LnF1ZXJ5QWxsKCcuY2hpbGRCXzEnKS50ZXh0KCdhYmMxMjMnKS5lbGVtZW50cykudG8uZXFsKFtkaXYuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF0sIGRpdi5jaGlsZHJlblsyXS5jaGlsZHJlblswXV0pXG5cdFx0XHRleHBlY3QoZGl2LnRleHQpLnRvLmVxdWFsKCdhYmMxMjNhYmMxMjMnKVxuXG5cblx0XHR0ZXN0IFwiUXVlcnkvUXVlcnlBbGwgc2hvcnRjdXRzXCIsICgpLT5cblx0XHRcdGV4cGVjdChEb20ucXVlcnkoJ2hlYWQnKSkudG8uZXF1YWwoRG9tKGRvY3VtZW50KS5xdWVyeSgnaGVhZCcpKVxuXHRcdFx0ZXhwZWN0KERvbS5xdWVyeSgnYm9keScpKS50by5lcXVhbChEb20oZG9jdW1lbnQpLnF1ZXJ5KCdib2R5JykpXG5cdFx0XHRcblx0XHRcdGFsbEEgPSBEb20ucXVlcnlBbGwoJ3NlY3Rpb24nKS5lbGVtZW50c1xuXHRcdFx0YWxsQiA9IERvbShkb2N1bWVudCkucXVlcnlBbGwoJ3NlY3Rpb24nKS5lbGVtZW50c1xuXHRcdFx0ZXhwZWN0KGFsbEEubGVuZ3RoKS50by5lcXVhbChhbGxCLmxlbmd0aClcblx0XHRcdGZvciBlbCxpbmRleCBpbiBhbGxBXG5cdFx0XHRcdGV4cGVjdChhbGxBW2luZGV4XSkudG8uZXF1YWwoYWxsQltpbmRleF0pXG5cdFx0XHRyZXR1cm5cblxuXG5cblx0c3VpdGUgXCJNYW5pcHVsYXRpb25cIiwgKCktPlxuXHRcdHRlc3QgXCIuYXBwZW5kKClcIiwgKCktPlxuXHRcdFx0QSA9IERvbS5kaXYoKVxuXHRcdFx0QiA9IERvbS5kaXYoKVxuXHRcdFx0QyA9IERvbS50ZXh0KClcblx0XHRcdEQgPSBEb20uZGl2KClcblx0XHRcdE1haW5BID0gRG9tLmRpdihudWxsLCBBLCBCLCBDLCBEKVxuXHRcdFx0TWFpbkIgPSBEb20uZGl2KClcblxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluQSkoQSwgQiwgQywgRClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkIpKClcblxuXHRcdFx0TWFpbkIuYXBwZW5kKEEpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW5BKShCLCBDLCBEKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluQikoQSlcblxuXHRcdFx0Qy5hcHBlbmRUbyhNYWluQilcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkEpKEIsIEQpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW5CKShBLCBDKVxuXG5cblxuXHRcdHRlc3QgXCIucHJlcGVuZCgpXCIsICgpLT5cblx0XHRcdEEgPSBEb20uZGl2KClcblx0XHRcdEIgPSBEb20uZGl2KClcblx0XHRcdEMgPSBEb20udGV4dCgpXG5cdFx0XHREID0gRG9tLmRpdigpXG5cdFx0XHRNYWluQSA9IERvbS5kaXYobnVsbCwgQSwgQiwgQywgRClcblx0XHRcdE1haW5CID0gRG9tLmRpdigpXG5cblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkEpKEEsIEIsIEMsIEQpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW5CKSgpXG5cblx0XHRcdE1haW5CLnByZXBlbmQoQSlcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkEpKEIsIEMsIEQpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW5CKShBKVxuXG5cdFx0XHRDLnByZXBlbmRUbyhNYWluQilcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkEpKEIsIEQpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW5CKShDLCBBKVxuXG5cblx0XHR0ZXN0IFwiLmFmdGVyKClcIiwgKCktPlxuXHRcdFx0QSA9IERvbS5kaXYoKVxuXHRcdFx0QiA9IERvbS5kaXYoKVxuXHRcdFx0QyA9IERvbS50ZXh0KClcblx0XHRcdEQgPSBEb20uZGl2KClcblx0XHRcdE1haW5BID0gRG9tLmRpdihudWxsLCBBLCBCLCBDLCBEKVxuXHRcdFx0TWFpbkIgPSBEb20uZGl2KClcblxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluQSkoQSwgQiwgQywgRClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkIpKClcblxuXHRcdFx0TWFpbkIuYXBwZW5kKEIpXG5cdFx0XHRCLmFmdGVyKEEpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW5BKShDLCBEKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluQikoQiwgQSlcblxuXHRcdFx0Qy5pbnNlcnRBZnRlcihCKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluQSkoRClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkIpKEIsIEMsIEEpXG5cblxuXHRcdHRlc3QgXCIuYmVmb3JlKClcIiwgKCktPlxuXHRcdFx0QSA9IERvbS5kaXYoKVxuXHRcdFx0QiA9IERvbS5kaXYoKVxuXHRcdFx0QyA9IERvbS50ZXh0KClcblx0XHRcdEQgPSBEb20uZGl2KClcblx0XHRcdE1haW5BID0gRG9tLmRpdihudWxsLCBBLCBCLCBDLCBEKVxuXHRcdFx0TWFpbkIgPSBEb20uZGl2KClcblxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluQSkoQSwgQiwgQywgRClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkIpKClcblxuXHRcdFx0TWFpbkIuYXBwZW5kKEIpXG5cdFx0XHRCLmJlZm9yZShBKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluQSkoQywgRClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbkIpKEEsIEIpXG5cblx0XHRcdEMuaW5zZXJ0QmVmb3JlKEIpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW5BKShEKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluQikoQSwgQywgQilcblxuXG5cdFx0dGVzdCBcIi5kZXRhY2goKVwiLCAoKS0+XG5cdFx0XHRlbWl0Q291bnQgPSAwXG5cdFx0XHRkaXYgPSBEb20uZGl2KG51bGwsICdJbm5lciBUZXh0IEhlcmUnKVxuXHRcdFx0ZGl2Lm9uICdiZWVwJywgKCktPiBlbWl0Q291bnQrK1xuXHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRkaXYuc3RhdGUgJ3JlbGF4ZWQnLCBvblxuXG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkubm90LnRvLmV4aXN0XG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCgwKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnaGFwcHknKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdyZWxheGVkJykudG8uYmUudHJ1ZVxuXHRcdFx0XG5cdFx0XHRkaXYuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGRpdi5lbWl0KCdiZWVwJylcblx0XHRcdGV4cGVjdChzYW5kYm94LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChkaXYucGFyZW50LmVsKS50by5lcXVhbChzYW5kYm94KVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2hhcHB5JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAncmVsYXhlZCcpLnRvLmJlLnRydWVcblxuXHRcdFx0ZGl2LmRldGFjaCgpXG5cdFx0XHRkaXYuZW1pdCgnYmVlcCcpXG5cdFx0XHRleHBlY3Qoc2FuZGJveC5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDApXG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkubm90LnRvLmV4aXN0XG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnaGFwcHknKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdyZWxheGVkJykudG8uYmUudHJ1ZVxuXG5cblx0XHR0ZXN0IFwiLnJlbW92ZSgpXCIsICgpLT5cblx0XHRcdGVtaXRDb3VudCA9IDBcblx0XHRcdGRpdiA9IERvbS5kaXYobnVsbCwgJ0lubmVyIFRleHQgSGVyZScpXG5cdFx0XHRkaXYub24gJ2JlZXAnLCAoKS0+IGVtaXRDb3VudCsrXG5cdFx0XHRkaXYuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdGRpdi5zdGF0ZSAncmVsYXhlZCcsIG9uXG5cblx0XHRcdGV4cGVjdChkaXYucGFyZW50KS5ub3QudG8uZXhpc3Rcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsKDApXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ3JlbGF4ZWQnKS50by5iZS50cnVlXG5cdFx0XHRcblx0XHRcdGRpdi5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0ZGl2LmVtaXQoJ2JlZXAnKVxuXHRcdFx0ZXhwZWN0KHNhbmRib3guY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KGRpdi5wYXJlbnQuZWwpLnRvLmVxdWFsKHNhbmRib3gpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnaGFwcHknKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdyZWxheGVkJykudG8uYmUudHJ1ZVxuXG5cdFx0XHRkaXYucmVtb3ZlKClcblx0XHRcdGRpdi5lbWl0KCdiZWVwJylcblx0XHRcdGV4cGVjdChzYW5kYm94LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMClcblx0XHRcdGV4cGVjdChkaXYucGFyZW50KS5ub3QudG8uZXhpc3Rcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdoYXBweScpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdyZWxheGVkJykudG8uYmUuZmFsc2VcblxuXG5cdFx0dGVzdCBcIi5lbXB0eSgpXCIsICgpLT5cblx0XHRcdE1haW4gPSBEb20uZGl2KClcblx0XHRcdEEgPSBEb20uZGl2KCkuYXBwZW5kVG8oTWFpbilcblx0XHRcdEIgPSBEb20uZGl2KCkuYXBwZW5kVG8oTWFpbilcblx0XHRcdEEuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdEIuc3RhdGUgJ2hhcHB5Jywgb25cblxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKShBLCBCKVxuXHRcdFx0ZXhwZWN0KEEuc3RhdGUgJ2hhcHB5JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KEIuc3RhdGUgJ2hhcHB5JykudG8uYmUudHJ1ZVxuXG5cdFx0XHRNYWluLmVtcHR5KClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbikoKVxuXHRcdFx0ZXhwZWN0KEEucGFyZW50KS50by5lcXVhbCh1bmRlZmluZWQpXG5cdFx0XHRleHBlY3QoQi5wYXJlbnQpLnRvLmVxdWFsKHVuZGVmaW5lZClcblx0XHRcdGV4cGVjdChBLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChCLnN0YXRlICdoYXBweScpLnRvLmJlLnRydWVcblxuXG5cdFx0dGVzdCBcIi53cmFwKClcIiwgKCktPlxuXHRcdFx0TWFpbiA9IERvbS5kaXYoKVxuXHRcdFx0QSA9IERvbS5kaXYoKS5hcHBlbmRUbyhNYWluKVxuXHRcdFx0QiA9IERvbS5kaXYoKS5hcHBlbmRUbyhNYWluKVxuXHRcdFx0QyA9IERvbS5kaXYoKVxuXHRcdFx0d3JhcEEgPSBEb20uc2VjdGlvbigpXG5cdFx0XHR3cmFwQiA9IERvbS5zZWN0aW9uKClcblx0XHRcdHdyYXBDID0gRG9tLnNlY3Rpb24oKVxuXHRcdFx0QS5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0Qi5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0Qy5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0d3JhcEEuc3RhdGUgJ3JlbGF4ZWQnLCBvblxuXHRcdFx0d3JhcEIuc3RhdGUgJ3JlbGF4ZWQnLCBvblxuXHRcdFx0d3JhcEMuc3RhdGUgJ3JlbGF4ZWQnLCBvblxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKShBLCBCKVxuXHRcdFx0XG5cdFx0XHRBLndyYXAod3JhcEEpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW4pKHdyYXBBLCBCKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZSh3cmFwQSkoQSlcblx0XHRcdFxuXHRcdFx0Qi53cmFwKHdyYXBCKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKSh3cmFwQSwgd3JhcEIpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKHdyYXBBKShBKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZSh3cmFwQikoQilcblx0XHRcdFxuXHRcdFx0Qi53cmFwKHdyYXBBKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKSh3cmFwQSwgd3JhcEIpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKHdyYXBBKShBLCBCKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZSh3cmFwQikoKVxuXHRcdFx0XG5cdFx0XHR3cmFwQy5hcHBlbmRUbyh3cmFwQilcblx0XHRcdEMud3JhcCh3cmFwQylcblx0XHRcdEMud3JhcCgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW4pKHdyYXBBLCB3cmFwQilcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUod3JhcEEpKEEsIEIpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKHdyYXBCKSh3cmFwQylcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUod3JhcEMpKEMpXG5cdFx0XHRcblx0XHRcdEMud3JhcChDKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKSh3cmFwQSwgd3JhcEIpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKHdyYXBBKShBLCBCKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZSh3cmFwQikod3JhcEMpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKHdyYXBDKShDKVxuXG5cdFx0XHRleHBlY3QoQS5zdGF0ZSAnaGFwcHknKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3QoQi5zdGF0ZSAnaGFwcHknKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3QoQy5zdGF0ZSAnaGFwcHknKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3Qod3JhcEEuc3RhdGUgJ3JlbGF4ZWQnKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3Qod3JhcEIuc3RhdGUgJ3JlbGF4ZWQnKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3Qod3JhcEMuc3RhdGUgJ3JlbGF4ZWQnKS50by5iZS50cnVlXG5cblxuXHRcdHRlc3QgXCIudW53cmFwKClcIiwgKCktPlxuXHRcdFx0TWFpbiA9IERvbS5kaXYoKVxuXHRcdFx0QSA9IERvbS5kaXYoKS5wcmVwZW5kVG8oTWFpbilcblx0XHRcdEIgPSBEb20uZGl2KCkuYXBwZW5kVG8oQSlcblx0XHRcdEMgPSBEb20uZGl2KCkuYXBwZW5kVG8oQSlcblx0XHRcdEQgPSBEb20uZGl2KCkuYXBwZW5kVG8oQylcblx0XHRcdEUgPSBEb20uZGl2KCkuYXBwZW5kVG8oRClcblx0XHRcdEEuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdEIuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdEMuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdEQuc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdEUuc3RhdGUgJ2hhcHB5Jywgb25cblxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKShBKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShBKShCLCBDKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShCKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEMpKEQpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEQpKEUpXG5cblx0XHRcdEUudW53cmFwKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbikoQSlcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQSkoQiwgQylcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQikoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShDKShFKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShEKSgpXG5cblx0XHRcdEIudW53cmFwKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbikoQiwgQylcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQSkoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShCKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEMpKEUpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEQpKClcblxuXHRcdFx0RS51bndyYXAoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKShCLCBFKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShBKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEIpKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQykoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShEKSgpXG5cblx0XHRcdEEuaW5zZXJ0QWZ0ZXIoQilcblx0XHRcdEMuYXBwZW5kVG8oQSlcblx0XHRcdEQuYXBwZW5kVG8oQSlcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbikoQiwgQSwgRSlcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQSkoQywgRClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQikoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShDKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEQpKClcblxuXHRcdFx0RC51bndyYXAoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKShCLCBDLCBELCBFKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShBKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEIpKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQykoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShEKSgpXG5cblxuXG5cdFx0dGVzdCBcIi5yZXBsYWNlKClcIiwgKCktPlxuXHRcdFx0TWFpbiA9IERvbS5kaXYoKVxuXHRcdFx0QSA9IERvbS5kaXYoKS5hcHBlbmRUbyhNYWluKVxuXHRcdFx0QiA9IERvbS5kaXYoKS5hcHBlbmRUbyhNYWluKVxuXHRcdFx0QyA9IERvbS5kaXYoKS5hcHBlbmRUbyhBKVxuXHRcdFx0RCA9IERvbS5kaXYoKS5hcHBlbmRUbyhBKVxuXHRcdFx0RSA9IERvbS5kaXYoKS5hcHBlbmRUbyhEKVxuXHRcdFx0XG5cdFx0XHRBLnJlcGxhY2UoKTsgRS5yZXBsYWNlKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbikoQSwgQilcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQSkoQywgRClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQikoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShDKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEQpKEUpXG5cdFx0XHRcblx0XHRcdEMucmVwbGFjZShFKS5hcHBlbmRUbyhCKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKShBLCBCKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShBKShFLCBEKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShCKShDKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShDKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEQpKClcblx0XHRcdFxuXHRcdFx0RC5yZXBsYWNlKEUpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW4pKEEsIEIpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEEpKEUpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEIpKEMpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEMpKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoRCkoKVxuXHRcdFx0XG5cdFx0XHRCLnJlcGxhY2UoQylcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoTWFpbikoQSwgQylcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQSkoRSlcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQikoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShDKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEQpKClcblx0XHRcdFxuXHRcdFx0QS5yZXBsYWNlKEQpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKE1haW4pKEQsIEMpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEEpKEUpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEIpKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoQykoKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShEKSgpXG5cdFx0XHRcblx0XHRcdEIucmVwbGFjZShEKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShNYWluKShDKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShBKShFKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShCKSgpXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKEMpKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoRCkoKVxuXG5cblx0XHR0ZXN0IFwiLmNsb25lKClcIiwgKCktPlxuXHRcdFx0ZW1pdENvdW50ID0gMFxuXHRcdFx0c2FuZEJveCA9IERvbShzYW5kYm94KVxuXHRcdFx0b3B0cyA9IHtzdHlsZTogJGJhc2U6e3dpZHRoOiczNHB4J30sICRoYXBweTp7aGVpZ2h0Oic5OXB4J30sICRyZWxheGVkOntvcGFjaXR5OicwLjUnfX1cblx0XHRcdEEgPSBEb20uZGl2KG9wdHMsICdTb21lIElubmVyIFRleHQnKS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0QS5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0QS5vbiAncHJpdmF0ZUV2ZW50JywgKCktPiBlbWl0Q291bnQrK1xuXHRcdFx0Y2hpbGRBID0gRG9tLmRpdigpLmFwcGVuZFRvKEEpXG5cdFx0XHRjaGlsZEIgPSBEb20uc3BhbigpLmFwcGVuZFRvKEEpXG5cdFx0XHRCID0gQS5jbG9uZSgpXG5cblx0XHRcdEEuc3RhdGUgJ3JlbGF4ZWQnLCBvblxuXHRcdFx0QS5lbWl0KCdwcml2YXRlRXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChBLnBhcmVudCkudG8uZXF1YWwoc2FuZEJveClcblx0XHRcdGV4cGVjdChBLmNzcyAnd2lkdGgnKS50by5lcXVhbCgnMzRweCcpXG5cdFx0XHRleHBlY3QoQS5jc3MgJ2hlaWdodCcpLnRvLmVxdWFsKCc5OXB4Jylcblx0XHRcdGV4cGVjdChBLmNzcyAnb3BhY2l0eScpLnRvLmVxdWFsKCcwLjUnKVxuXHRcdFx0ZXhwZWN0KEEuc2libGluZ3MubGVuZ3RoKS50by5lcXVhbCgwKVxuXHRcdFx0ZXhwZWN0KEEuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgzKVxuXHRcdFx0ZXhwZWN0KEEuY2hpbGRyZW5bMF0uZWwudGV4dENvbnRlbnQpLnRvLmVxdWFsICdTb21lIElubmVyIFRleHQnXG5cdFx0XHRleHBlY3QoQS5jaGlsZHJlblsxXSkudG8uZXF1YWwoY2hpbGRBKVxuXHRcdFx0ZXhwZWN0KEEuY2hpbGRyZW5bMl0pLnRvLmVxdWFsKGNoaWxkQilcblx0XHRcdGV4cGVjdChCKS5ub3QudG8uZXF1YWwoQSlcblx0XHRcdGV4cGVjdChCLnBhcmVudCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0c2FuZEJveC5hcHBlbmQoQilcblxuXHRcdFx0ZXhwZWN0KEIucGFyZW50KS50by5lcXVhbChzYW5kQm94KVxuXHRcdFx0ZXhwZWN0KEIuY3NzICd3aWR0aCcpLnRvLmVxdWFsKCczNHB4Jylcblx0XHRcdGV4cGVjdChCLmNzcyAnaGVpZ2h0JykudG8uZXF1YWwoJzk5cHgnKVxuXHRcdFx0ZXhwZWN0KEIuY3NzICdvcGFjaXR5JykudG8uZXF1YWwoJzEnKVxuXHRcdFx0ZXhwZWN0KEIuc2libGluZ3MubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KEIuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgzKVxuXHRcdFx0ZXhwZWN0KEIuY2hpbGRyZW5bMF0uZWwudGV4dENvbnRlbnQpLnRvLmVxdWFsICdTb21lIElubmVyIFRleHQnXG5cdFx0XHRleHBlY3QoQi5jaGlsZHJlblswXSkubm90LnRvLmVxdWFsKEEuY2hpbGRyZW5bMF0pXG5cdFx0XHRleHBlY3QoQi5jaGlsZHJlblsxXSkubm90LnRvLmVxdWFsKGNoaWxkQSlcblx0XHRcdGV4cGVjdChCLmNoaWxkcmVuWzJdKS5ub3QudG8uZXF1YWwoY2hpbGRCKVxuXHRcdFx0ZXhwZWN0KEIuc3RhdGUgJ2hhcHB5JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KEIuc3RhdGUgJ3JlbGF4ZWQnKS50by5iZS5mYWxzZVxuXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCgxKVxuXHRcdFx0Qi5lbWl0KCdwcml2YXRlRXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwoMilcblx0XHRcdFxuXHRcdFx0QS5vZmYoKVxuXHRcdFx0QS5lbWl0KCdwcml2YXRlRXZlbnQnKVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwoMilcblx0XHRcdEIuZW1pdCgncHJpdmF0ZUV2ZW50Jylcblx0XHRcdGV4cGVjdChlbWl0Q291bnQpLnRvLmVxdWFsKDMpXG5cblxuXHRcdHRlc3QgXCIucHJvcCgpIC0gZWxlbWVudCBwcm9wZXJ0eSBnZXR0ZXIvc2V0dGVyXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXHRcdFx0XG5cdFx0XHRleHBlY3QoZGl2LnByb3AgJ215UHJvcCcpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KGRpdi5wcm9wICdteVByb3AnLCAxOTIpLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi5wcm9wICdteVByb3AnKS50by5lcXVhbCAxOTJcblx0XHRcdGV4cGVjdChkaXYucHJvcCAnbXlQcm9wJywgJzE5MicpLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi5wcm9wICdteVByb3AnKS50by5lcXVhbCAnMTkyJ1xuXHRcdFx0ZXhwZWN0KGRpdi5wcm9wICdhbm90aGVyUHJvcCcsIFsxLDIsM10pLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi5wcm9wICdhbm90aGVyUHJvcCcpLnRvLmVxbCBbMSwyLDNdXG5cdFx0XHRleHBlY3QoZGl2LmVsLm15UHJvcCkudG8uZXF1YWwgJzE5Midcblx0XHRcdGV4cGVjdChkaXYuZWwuYW5vdGhlclByb3ApLnRvLmVxbCBbMSwyLDNdIFxuXG5cdFx0XHRkaXYuZWwubGFzdFByb3AgPSA5OTk5XG5cdFx0XHRleHBlY3QoZGl2LmVsLmxhc3RQcm9wKS50by5lcXVhbCA5OTk5XG5cdFx0XHRleHBlY3QoZGl2LnByb3AgJ2xhc3RQcm9wJykudG8uZXF1YWwgOTk5OVxuXG5cdFx0XHRleHBlY3QoT2JqZWN0LmtleXMoZGl2LmVsKSkubm90LnRvLmNvbnRhaW4oJ3Byb21pc2VJc0xhc3QnKVxuXHRcdFx0XG5cdFx0XHRkaXYucHJvcCAncHJvbWlzZUlzTGFzdCcsICdvdmVyOWsnXG5cdFx0XHRleHBlY3QoT2JqZWN0LmtleXMoZGl2LmVsKSkudG8uY29udGFpbigncHJvbWlzZUlzTGFzdCcpXG5cdFx0XHRcblx0XHRcdGRpdi5wcm9wICdwcm9taXNlSXNMYXN0JywgdW5kZWZpbmVkXG5cdFx0XHRleHBlY3QoT2JqZWN0LmtleXMoZGl2LmVsKSkudG8uY29udGFpbigncHJvbWlzZUlzTGFzdCcpXG5cdFx0XHRcblx0XHRcdGRpdi5wcm9wICdwcm9taXNlSXNMYXN0JywgbnVsbFxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKGRpdi5lbCkpLnRvLmNvbnRhaW4oJ3Byb21pc2VJc0xhc3QnKVxuXG5cdFx0XHRkaXYucHJvcCB7YWJjOjEyMywgZGVmOjQ1Nn1cblx0XHRcdGV4cGVjdChkaXYuZWwuYWJjKS50by5lcXVhbCAxMjNcblx0XHRcdGV4cGVjdChkaXYuZWwuZGVmKS50by5lcXVhbCA0NTZcblxuXG5cdFx0dGVzdCBcIi5hdHRyKCkgLSBlbGVtZW50IGF0dHJpYnV0ZSBnZXR0ZXIvc2V0dGVyXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXHRcdFx0XG5cdFx0XHRleHBlY3QoZGl2LmF0dHIgJ215QXR0cicpLnRvLmVxdWFsIG51bGxcblx0XHRcdGV4cGVjdChkaXYuYXR0ciAnbXlBdHRyJywgMTkyKS50by5lcXVhbCBkaXZcblx0XHRcdGV4cGVjdChkaXYuYXR0ciAnbXlBdHRyJykudG8uZXF1YWwgJzE5Midcblx0XHRcdGV4cGVjdChkaXYuYXR0ciAnbXlBdHRyJywgJzE5MicpLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi5hdHRyICdteUF0dHInKS50by5lcXVhbCAnMTkyJ1xuXHRcdFx0ZXhwZWN0KGRpdi5hdHRyICdhbm90aGVyQXR0cicsIFsxLDIsM10pLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi5hdHRyICdhbm90aGVyQXR0cicpLnRvLmVxdWFsICcxLDIsMydcblx0XHRcdGV4cGVjdChkaXYuZWwuZ2V0QXR0cmlidXRlICdteUF0dHInKS50by5lcXVhbCAnMTkyJ1xuXHRcdFx0ZXhwZWN0KGRpdi5lbC5nZXRBdHRyaWJ1dGUgJ2Fub3RoZXJBdHRyJykudG8uZXFsICcxLDIsMydcblxuXHRcdFx0ZGl2LmVsLnNldEF0dHJpYnV0ZSAnbGFzdEF0dHInLCA5OTk5XG5cdFx0XHRleHBlY3QoZGl2LmVsLmdldEF0dHJpYnV0ZSAnbGFzdEF0dHInKS50by5lcXVhbCAnOTk5OSdcblx0XHRcdGV4cGVjdChkaXYuYXR0ciAnbGFzdEF0dHInKS50by5lcXVhbCAnOTk5OSdcblxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5nZXRBdHRyaWJ1dGUgJ3Byb21pc2VJc0xhc3QnKS50by5lcXVhbCBudWxsXG5cdFx0XHRcblx0XHRcdGRpdi5hdHRyICdwcm9taXNlSXNMYXN0JywgJ292ZXI5aydcblx0XHRcdGV4cGVjdChkaXYuZWwuZ2V0QXR0cmlidXRlICdwcm9taXNlSXNMYXN0JykudG8uZXF1YWwgJ292ZXI5aydcblx0XHRcdFxuXHRcdFx0ZGl2LmF0dHIgJ3Byb21pc2VJc0xhc3QnXG5cdFx0XHRleHBlY3QoZGl2LmVsLmdldEF0dHJpYnV0ZSAncHJvbWlzZUlzTGFzdCcpLnRvLmVxdWFsICdvdmVyOWsnXG5cdFx0XHRcblx0XHRcdGRpdi5hdHRyICdwcm9taXNlSXNMYXN0JywgbnVsbFxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5nZXRBdHRyaWJ1dGUgJ3Byb21pc2VJc0xhc3QnKS50by5lcXVhbCBudWxsXG5cblx0XHRcdGRpdi5hdHRyIHthYmM6MTIzLCBkZWY6NDU2fVxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5nZXRBdHRyaWJ1dGUgJ2FiYycpLnRvLmVxdWFsICcxMjMnXG5cdFx0XHRleHBlY3QoZGl2LmVsLmdldEF0dHJpYnV0ZSAnZGVmJykudG8uZXF1YWwgJzQ1NidcblxuXHRcdFx0ZGl2LmF0dHIge2FiYzoxMjMsIGRlZjpudWxsfVxuXHRcdFx0ZXhwZWN0KGRpdi5lbC5nZXRBdHRyaWJ1dGUgJ2FiYycpLnRvLmVxdWFsICcxMjMnXG5cdFx0XHRleHBlY3QoZGl2LmVsLmdldEF0dHJpYnV0ZSAnZGVmJykudG8uZXF1YWwgbnVsbFxuXG5cblx0XHR0ZXN0IFwiLmh0bWwgLSBpbm5lckhUTUwgZ2V0dGVyL3NldHRlclwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KG51bGwsIERvbS5kaXYoKSwgJ1NvbWUgdGV4dCcsIERvbS5zcGFuKCksIERvbS5kaXYoKSlcblxuXHRcdFx0ZXhwZWN0KGRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDQpXG5cdFx0XHRleHBlY3QoZGl2Lmh0bWwpLnRvLmVxdWFsKGRpdi5lbC5pbm5lckhUTUwpXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoNClcblxuXHRcdFx0ZGl2Lmh0bWwgPSAnPHNlY3Rpb24gSUQ9XCJ0ZXN0XCI+PC9zZWN0aW9uPidcblx0XHRcdGV4cGVjdChkaXYuaHRtbCkudG8uZXF1YWwoJzxzZWN0aW9uIGlkPVwidGVzdFwiPjwvc2VjdGlvbj4nKVxuXHRcdFx0ZXhwZWN0KGRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuWzBdLmVsLmlkKS50by5lcXVhbCgndGVzdCcpXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuWzBdLmVsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpLnRvLmVxdWFsKCdzZWN0aW9uJylcblxuXG5cdFx0dGVzdCBcIi50ZXh0IC0gdGV4dENvbnRlbnQgZ2V0dGVyL3NldHRlclwiLCAoKS0+XG5cdFx0XHRkaXYgPSBEb20uZGl2KG51bGwsICdTb21lIHRleHQnLCBEb20uc3BhbihudWxsLCAnSW5uZXIgVGV4dCcpKVxuXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMilcblx0XHRcdGV4cGVjdChkaXYudGV4dCkudG8uZXF1YWwoZGl2LmVsLnRleHRDb250ZW50KVxuXHRcdFx0ZXhwZWN0KGRpdi50ZXh0KS50by5lcXVhbCgnU29tZSB0ZXh0SW5uZXIgVGV4dCcpXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMilcblxuXHRcdFx0ZGl2LnRleHQgPSAnbmV3VGV4dCdcblx0XHRcdGV4cGVjdChkaXYudGV4dCkudG8uZXF1YWwoJ25ld1RleHQnKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbC50ZXh0Q29udGVudCkudG8uZXF1YWwoJ25ld1RleHQnKVxuXHRcdFx0ZXhwZWN0KGRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuWzBdLmVsLm5vZGVUeXBlKS50by5lcXVhbCgzKVxuXG5cblx0XHR0ZXN0IFwiLmFkZENsYXNzXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYgY2xhc3M6J3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgICAgYW5ub3lpbmctXy1zZWxlY3RvciAnXG5cblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgICAgYW5ub3lpbmctXy1zZWxlY3RvciAnXG5cdFx0XHRcblx0XHRcdGRpdi5hZGRDbGFzcygnbmV3LXNlbGVjdG9yJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3RvciBuZXctc2VsZWN0b3InXG5cdFx0XHRcblx0XHRcdGRpdi5hZGRDbGFzcygnbmV3LXNlbGVjdG9yJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3RvciBuZXctc2VsZWN0b3InXG5cdFx0XHRcblx0XHRcdGRpdi5yYXcuY2xhc3NOYW1lID0gZGl2LnJhdy5jbGFzc05hbWUucmVwbGFjZSAnbmV3LXNlbGVjdG9yJywgJyAnXG5cdFx0XHRleHBlY3QoZGl2LnJhdy5jbGFzc05hbWUpLnRvLmVxdWFsICdzb21lLXNlbGVjdG9yIGFub3RoZXJTZWxlY3RvciAucGVyaW9kIGFubm95aW5nLV8tc2VsZWN0b3IgICdcblx0XHRcdFxuXHRcdFx0ZGl2LmFkZENsYXNzKCduZXctc2VsZWN0b3InKVxuXHRcdFx0ZXhwZWN0KGRpdi5yYXcuY2xhc3NOYW1lKS50by5lcXVhbCAnc29tZS1zZWxlY3RvciBhbm90aGVyU2VsZWN0b3IgLnBlcmlvZCBhbm5veWluZy1fLXNlbGVjdG9yIG5ldy1zZWxlY3Rvcidcblx0XHRcdFxuXHRcdFx0ZGl2LmFkZENsYXNzKCcucGVyaW9kJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3RvciBuZXctc2VsZWN0b3InXG5cdFx0XHRcblx0XHRcdGRpdi5hZGRDbGFzcygncGVyaW9kJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3RvciBuZXctc2VsZWN0b3IgcGVyaW9kJ1xuXG5cblx0XHR0ZXN0IFwiLnJlbW92ZUNsYXNzXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYgY2xhc3M6J3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgICAgYW5ub3lpbmctXy1zZWxlY3RvciAnXG5cblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgICAgYW5ub3lpbmctXy1zZWxlY3RvciAnXG5cdFx0XHRcblx0XHRcdGRpdi5hZGRDbGFzcygnbmV3LXNlbGVjdG9yJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3RvciBuZXctc2VsZWN0b3InXG5cblx0XHRcdGRpdi5yZW1vdmVDbGFzcygnbmV3LXNlbGVjdG9yJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3RvcidcblxuXHRcdFx0ZGl2LnJlbW92ZUNsYXNzKCduZXctc2VsZWN0b3InKVxuXHRcdFx0ZXhwZWN0KGRpdi5yYXcuY2xhc3NOYW1lKS50by5lcXVhbCAnc29tZS1zZWxlY3RvciBhbm90aGVyU2VsZWN0b3IgLnBlcmlvZCBhbm5veWluZy1fLXNlbGVjdG9yJ1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRkaXYucmVtb3ZlQ2xhc3MoJ3NvbWUtc2VsZWN0b3InKVxuXHRcdFx0ZXhwZWN0KGRpdi5yYXcuY2xhc3NOYW1lKS50by5lcXVhbCAnYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3Rvcidcblx0XHRcdFx0XHRcdFxuXHRcdFx0ZGl2LnJlbW92ZUNsYXNzKCdwZXJpb2QnKVxuXHRcdFx0ZXhwZWN0KGRpdi5yYXcuY2xhc3NOYW1lKS50by5lcXVhbCAnYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3Rvcidcblx0XHRcdFx0XHRcdFxuXHRcdFx0ZGl2LnJlbW92ZUNsYXNzKCcucGVyaW9kJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ2Fub3RoZXJTZWxlY3RvciBhbm5veWluZy1fLXNlbGVjdG9yJ1xuXG5cblx0XHR0ZXN0IFwiLnRvZ2dsZUNsYXNzXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYgY2xhc3M6J3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgICAgYW5ub3lpbmctXy1zZWxlY3RvciAnXG5cblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgICAgYW5ub3lpbmctXy1zZWxlY3RvciAnXG5cdFx0XHRcblx0XHRcdGRpdi50b2dnbGVDbGFzcygnbmV3LXNlbGVjdG9yJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3RvciBuZXctc2VsZWN0b3InXG5cblx0XHRcdGRpdi50b2dnbGVDbGFzcygnbmV3LXNlbGVjdG9yJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ3NvbWUtc2VsZWN0b3IgYW5vdGhlclNlbGVjdG9yIC5wZXJpb2QgYW5ub3lpbmctXy1zZWxlY3RvcidcblxuXHRcdFx0ZGl2LnRvZ2dsZUNsYXNzKCduZXctc2VsZWN0b3InKVxuXHRcdFx0ZXhwZWN0KGRpdi5yYXcuY2xhc3NOYW1lKS50by5lcXVhbCAnc29tZS1zZWxlY3RvciBhbm90aGVyU2VsZWN0b3IgLnBlcmlvZCBhbm5veWluZy1fLXNlbGVjdG9yIG5ldy1zZWxlY3Rvcidcblx0XHRcdFx0XHRcdFxuXHRcdFx0ZGl2LnRvZ2dsZUNsYXNzKCduZXctc2VsZWN0b3InKVxuXHRcdFx0ZGl2LnRvZ2dsZUNsYXNzKCdzb21lLXNlbGVjdG9yJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ2Fub3RoZXJTZWxlY3RvciAucGVyaW9kIGFubm95aW5nLV8tc2VsZWN0b3InXG5cdFx0XHRcdFx0XHRcblx0XHRcdGRpdi50b2dnbGVDbGFzcygnc29tZS1zZWxlY3RvcicpXG5cdFx0XHRleHBlY3QoZGl2LnJhdy5jbGFzc05hbWUpLnRvLmVxdWFsICdhbm90aGVyU2VsZWN0b3IgLnBlcmlvZCBhbm5veWluZy1fLXNlbGVjdG9yIHNvbWUtc2VsZWN0b3InXG5cdFx0XHRcdFx0XHRcblx0XHRcdGRpdi50b2dnbGVDbGFzcygncGVyaW9kJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ2Fub3RoZXJTZWxlY3RvciAucGVyaW9kIGFubm95aW5nLV8tc2VsZWN0b3Igc29tZS1zZWxlY3RvciBwZXJpb2QnXG5cdFx0XHRcdFx0XHRcblx0XHRcdGRpdi50b2dnbGVDbGFzcygnLnBlcmlvZCcpXG5cdFx0XHRleHBlY3QoZGl2LnJhdy5jbGFzc05hbWUpLnRvLmVxdWFsICdhbm90aGVyU2VsZWN0b3IgYW5ub3lpbmctXy1zZWxlY3RvciBzb21lLXNlbGVjdG9yIHBlcmlvZCdcblx0XHRcdFx0XHRcdFxuXHRcdFx0ZGl2LnRvZ2dsZUNsYXNzKCdhbm5veWluZy1fLXNlbGVjdG9yJylcblx0XHRcdGV4cGVjdChkaXYucmF3LmNsYXNzTmFtZSkudG8uZXF1YWwgJ2Fub3RoZXJTZWxlY3RvciBzb21lLXNlbGVjdG9yIHBlcmlvZCdcblxuXG5cdFx0dGVzdCBcIi5zZXRSZWZcIiwgKCktPlxuXHRcdFx0ZWwgPSBET00uZGl2KHJlZjonbmFtZTEnKVxuXHRcdFx0ZXhwZWN0KGVsLnJlZikudG8uZXF1YWwgJ25hbWUxJ1xuXHRcdFx0ZXhwZWN0KGVsLm9wdGlvbnMucmVmKS50by5lcXVhbCAnbmFtZTEnXG5cdFx0XHRleHBlY3QoZWwuYXR0ciAnZGF0YS1yZWYnKS50by5lcXVhbCAnbmFtZTEnXG5cblx0XHRcdGVsLnNldFJlZiAnbmFtZTInXG5cdFx0XHRleHBlY3QoZWwucmVmKS50by5lcXVhbCAnbmFtZTInXG5cdFx0XHRleHBlY3QoZWwub3B0aW9ucy5yZWYpLnRvLmVxdWFsICduYW1lMidcblx0XHRcdGV4cGVjdChlbC5hdHRyICdkYXRhLXJlZicpLnRvLmVxdWFsICduYW1lMidcblxuXG5cblxuXHRcdHRlc3QgXCJBcHBlbmRpbmcvcHJlcGVuZGluZyBlbGVtZW50cyB0byBhIHRleHQgbm9kZSBzaG91bGQgZG8gbm90aGluZ1wiLCAoKS0+XG5cdFx0XHR0ZXh0ID0gRG9tLnRleHQoJ2FiYzEyMycpXG5cdFx0XHRleHBlY3QodGV4dC50ZXh0KS50by5lcXVhbCgnYWJjMTIzJylcblx0XHRcdGV4cGVjdCh0ZXh0LnJhdy5jaGlsZE5vZGVzLmxlbmd0aCkudG8uZXF1YWwoMClcblxuXHRcdFx0dGV4dC5hcHBlbmQoRG9tLnRleHQoJ2RlZicpKVxuXHRcdFx0ZXhwZWN0KHRleHQudGV4dCkudG8uZXF1YWwoJ2FiYzEyMycpXG5cdFx0XHRleHBlY3QodGV4dC5yYXcuY2hpbGROb2Rlcy5sZW5ndGgpLnRvLmVxdWFsKDApXG5cblx0XHRcdHRleHQucHJlcGVuZChEb20uZGl2KG51bGwsICdkZWYnKSlcblx0XHRcdGV4cGVjdCh0ZXh0LnRleHQpLnRvLmVxdWFsKCdhYmMxMjMnKVxuXHRcdFx0ZXhwZWN0KHRleHQucmF3LmNoaWxkTm9kZXMubGVuZ3RoKS50by5lcXVhbCgwKVxuXHRcdFx0XG5cdFx0XHRkaXYgPSBEb20uZGl2KG51bGwsICc0NTYnKVxuXHRcdFx0ZGl2LmFwcGVuZFRvKHRleHQpXG5cdFx0XHRleHBlY3QodGV4dC50ZXh0KS50by5lcXVhbCgnYWJjMTIzJylcblx0XHRcdGV4cGVjdCh0ZXh0LnJhdy5jaGlsZE5vZGVzLmxlbmd0aCkudG8uZXF1YWwoMClcblx0XHRcdGV4cGVjdChkaXYucGFyZW50KS50by5lcXVhbCh1bmRlZmluZWQpXG5cblxuXG5cblx0c3VpdGUgXCJCYXRjaFwiLCAoKS0+XG5cdFx0dGVzdCBcIkRvbS5iYXRjaCgpIHRha2VzIGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgZWxlbWVudHMgb3IgUXVpY2tEb20gZWxlbWVudHMgYW5kIHJldmVhbHMgdGhlIFF1aWNrRWxlbWVudCBBUEkgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIGZvciBlYWNoIGVsZW1lbnRcIiwgKCktPlxuXHRcdFx0c2FuZEJveCA9IERvbShzYW5kYm94KVxuXHRcdFx0ZGl2ID0gRG9tLmRpdigpXG5cdFx0XHRBID0gRG9tLmRpdigpLmFwcGVuZFRvKGRpdilcblx0XHRcdEIgPSBEb20uc2VjdGlvbigpLmFwcGVuZFRvKGRpdilcblx0XHRcdEMgPSBEb20uZGl2KCkuYXBwZW5kVG8oZGl2KVxuXG5cdFx0XHRjaGVja0NoaWxkU3RydWN0dXJlKHNhbmRCb3gpKClcblx0XHRcdGNoZWNrQ2hpbGRTdHJ1Y3R1cmUoZGl2KShBLCBCLCBDKVxuXG5cdFx0XHREb20uYmF0Y2goW0EsQixDXSlcblx0XHRcdFx0LmFwcGVuZFRvKHNhbmRCb3gpXG5cdFx0XHRcdC5zdHlsZSAnb3BhY2l0eScsIDAuNVxuXHRcdFx0XHQuY3NzIHtoZWlnaHQ6MzAsIGJhY2tncm91bmRDb2xvcjoncGluayd9XG5cdFx0XHRcdC5hcHBlbmQgJ1NvbWUgSW5uZXIgVGV4dCdcblxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShzYW5kQm94KShBLCBCLCBDKVxuXHRcdFx0Y2hlY2tDaGlsZFN0cnVjdHVyZShkaXYpKClcblxuXHRcdFx0ZXhwZWN0KGdldENvbXB1dGVkU3R5bGUoQS5lbCkub3BhY2l0eSkudG8uZXF1YWwoJzAuNScpXG5cdFx0XHRleHBlY3QoZ2V0Q29tcHV0ZWRTdHlsZShDLmVsKS5vcGFjaXR5KS50by5lcXVhbCgnMC41Jylcblx0XHRcdGV4cGVjdChnZXRDb21wdXRlZFN0eWxlKEIuZWwpLmhlaWdodCkudG8uZXF1YWwoJzMwcHgnKVxuXHRcdFx0ZXhwZWN0KEEuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KEIuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KEMuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KEIuY2hpbGRyZW5bMF0uZWwudGV4dENvbnRlbnQpLnRvLmVxdWFsKCdTb21lIElubmVyIFRleHQnKVxuXG5cblx0XHR0ZXN0IFwiSWYgYSB0cnV0aHkgdmFsdWUgaXMgcGFzc2VkIGFzIHRoZSAybmQgYXJnIG9mIERvbS5iYXRjaCgpLCBhbiBhcnJheSB3aWxsIGJlIHJldHVybmVkIGZvciB0aGUgZmlyc3QgbWV0aG9kIGludm9rZWQgY29udGFpbmluZyB0aGUgcmVzdWx0IGZvciBlYWNoIGVsZW1lbnQgcHJvdmlkZWRcIiwgKCktPlxuXHRcdFx0c2FuZEJveCA9IERvbShzYW5kYm94KVxuXHRcdFx0QSA9IERvbS5kaXYoKS5hcHBlbmRUbyhzYW5kQm94KVxuXHRcdFx0QiA9IERvbS5zZWN0aW9uKCkuYXBwZW5kVG8oc2FuZEJveClcblx0XHRcdEMgPSBEb20uZGl2KCkuYXBwZW5kVG8oc2FuZEJveClcblxuXHRcdFx0YmF0Y2gxID0gRG9tLmJhdGNoKFtBLEIsQ10pXG5cdFx0XHRiYXRjaDIgPSBEb20uYmF0Y2goW0EsQixDXSwgdHJ1ZSlcblxuXHRcdFx0ZXhwZWN0KGJhdGNoMS5zdHlsZSgnd2lkdGgnKSkudG8uZXF1YWwoYmF0Y2gxKVxuXHRcdFx0ZXhwZWN0KGJhdGNoMS5zdHlsZSgnd2lkdGgnLCA0NykpLnRvLmVxdWFsKGJhdGNoMSlcblx0XHRcdGV4cGVjdChiYXRjaDIuc3R5bGUoJ3dpZHRoJykpLnRvLmVxbChbJzQ3cHgnLCAnNDdweCcsICc0N3B4J10pXG5cdFx0XHRleHBlY3QoYmF0Y2gyLnN0eWxlKCd3aWR0aCcsIDMzKSkudG8uZXFsKFtBLEIsQ10pXG5cdFx0XHRleHBlY3QoYmF0Y2gyLnN0eWxlKCd3aWR0aCcpKS50by5lcWwoWyczM3B4JywgJzMzcHgnLCAnMzNweCddKVxuXG5cblx0XHR0ZXN0IFwiSWYgdGhlIC5yZXR1cm4oKSBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgYmF0Y2ggaW5zdGFuY2UsIGl0IHdpbGwgcmV0dXJuIHRoZSByZXN1bHQgc2V0IGZyb20gdGhlIGxhc3QgbWV0aG9kIGludm9jYXRpb25cIiwgKCktPlxuXHRcdFx0c2FuZEJveCA9IERvbShzYW5kYm94KVxuXHRcdFx0ZGl2ID0gRG9tLmRpdigpXG5cdFx0XHRBID0gRG9tLmRpdigpLmFwcGVuZFRvKGRpdilcblx0XHRcdEIgPSBEb20uc2VjdGlvbigpLmFwcGVuZFRvKGRpdilcblx0XHRcdEMgPSBEb20uZGl2KCkuYXBwZW5kVG8oZGl2KVxuXHRcdFx0XG5cdFx0XHRyZXN1bHQgPSBEb20uYmF0Y2goW0EsQixDXSlcblx0XHRcdFx0LmFwcGVuZFRvKHNhbmRCb3gpXG5cdFx0XHRcdC5zdHlsZSAnb3BhY2l0eScsIDAuNVxuXHRcdFx0XHQuY3NzIHtoZWlnaHQ6MzAsIGJhY2tncm91bmRDb2xvcjoncGluayd9XG5cdFx0XHRcdC5hcHBlbmQgJ1NvbWUgSW5uZXIgVGV4dCdcblx0XHRcdFx0LnN0eWxlICdvcGFjaXR5J1xuXHRcdFx0XHQucmV0dXJuKClcblxuXHRcdFx0ZXhwZWN0KHJlc3VsdCkudG8uZXFsIFsnMC41JywnMC41JywnMC41J11cblx0XHRcdGV4cGVjdChEb20uYmF0Y2goW0EsQixDXSkuY3NzKCd3aWR0aCcsICczOHB4JykuY3NzKCd3aWR0aCcpLnJldHVybigpKS50by5lcWwgWyczOHB4JywnMzhweCcsJzM4cHgnXVxuXG5cblx0XHR0ZXN0IFwiSWYgdGhlIC5yZXR1cm4oKSBtZXRob2QgaXMgaW52b2tlZCB3aXRoIGEgdHJ1dGh5IGFyZ3VtZW50LCBpdCB3aWxsIGNhdXNlIHRoZSBuZXh0IG1ldGhvZCBpbnZvY2F0aW9uIHRvIHJldHVybiB0aGUgcmVzdWx0cyBvZiB0aGUgaW52b2NhdGlvbiBmb3IgZWFjaCBlbGVtZW50IHByb3ZpZGVkXCIsICgpLT5cblx0XHRcdHNhbmRCb3ggPSBEb20oc2FuZGJveClcblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXHRcdFx0QSA9IERvbS5kaXYoKS5hcHBlbmRUbyhkaXYpXG5cdFx0XHRCID0gRG9tLnNlY3Rpb24oKS5hcHBlbmRUbyhkaXYpXG5cdFx0XHRDID0gRG9tLmRpdigpLmFwcGVuZFRvKGRpdilcblx0XHRcdFxuXHRcdFx0cmVzdWx0ID0gRG9tLmJhdGNoKFtBLEIsQ10pXG5cdFx0XHRcdC5hcHBlbmRUbyhzYW5kQm94KVxuXHRcdFx0XHQuc3R5bGUgJ29wYWNpdHknLCAwLjVcblx0XHRcdFx0LmNzcyB7aGVpZ2h0OjMwLCBiYWNrZ3JvdW5kQ29sb3I6J3BpbmsnfVxuXHRcdFx0XHQuYXBwZW5kICdTb21lIElubmVyIFRleHQnXG5cdFx0XHRcdC5yZXR1cm4odHJ1ZSlcblx0XHRcdFx0LnN0eWxlICdvcGFjaXR5J1xuXG5cdFx0XHRleHBlY3QocmVzdWx0KS50by5lcWwgWycwLjUnLCcwLjUnLCcwLjUnXVxuXHRcdFx0ZXhwZWN0KERvbS5iYXRjaChbQSxCLENdKS5jc3MoJ3dpZHRoJywgJzM4cHgnKS5jc3MoJ2hlaWdodCcsICcyOHB4JykucmV0dXJuKHRydWUpLmNzcygnd2lkdGgnKSkudG8uZXFsIFsnMzhweCcsJzM4cHgnLCczOHB4J11cblxuXG5cdFx0dGVzdCBcIkludm9raW5nIHRoZSAucmV2ZXJzZSgpIG1ldGhvZCBvbiB0aGUgYmF0Y2ggaW5zdGFuY2Ugd2lsbCByZXZlcnNlIHRoZSBlbGVtZW50cyBhcnJheSBpbiB0aGUgYmF0Y2ggYW5kIHRodXMgdGhlIGV4ZWN1dGlvbiBvcmRlclwiLCAoKS0+XG5cdFx0XHRBID0gRG9tLmRpdihudWxsLCAnQUFBJykuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdEIgPSBEb20uZGl2KG51bGwsICdCQkInKS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0QyA9IERvbS5kaXYobnVsbCwgJ0NDQycpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRhcnIgPSBbQSxCLENdXG5cdFx0XHRleHBlY3QoRG9tLmJhdGNoKGFycikuZWxlbWVudHMpLm5vdC50by5lcXVhbChhcnIpXG5cdFx0XHRleHBlY3QoRG9tLmJhdGNoKGFycikuZWxlbWVudHMpLnRvLmVxbCBbQSxCLENdXG5cdFx0XHRleHBlY3QoRG9tLmJhdGNoKGFycikucmV2ZXJzZSgpLmVsZW1lbnRzKS50by5lcWwgW0MsQixBXVxuXHRcdFx0ZXhwZWN0KERvbS5iYXRjaChhcnIsMSkudGV4dCgpKS50by5lcWwgWydBQUEnLCdCQkInLCdDQ0MnXVxuXHRcdFx0ZXhwZWN0KERvbS5iYXRjaChhcnIsMSkucmV2ZXJzZSgpLnRleHQoKSkudG8uZXFsIFsnQ0NDJywnQkJCJywnQUFBJ11cblx0XHRcdGV4cGVjdChEb20uYmF0Y2goYXJyLDEpLnJldmVyc2UoKS50ZXh0KCkpLnRvLmVxbCBbJ0NDQycsJ0JCQicsJ0FBQSddXG5cdFx0XHRleHBlY3QoRG9tLmJhdGNoKGFyciwxKS5yZXZlcnNlKCkucmV2ZXJzZSgpLnRleHQoKSkudG8uZXFsIFsnQUFBJywnQkJCJywnQ0NDJ11cblxuXG5cdFx0dGVzdCBcIkJhdGNoLnRleHQvLmh0bWwgYXJlIG1ldGhvZHMgaW5zdGVhZCBvZiBnZXR0ZXJzL3NldHRlcnNcIiwgKCktPlxuXHRcdFx0ZGl2QSA9IERvbS5kaXYobnVsbCwgJ1RoZSBkaXZBJylcblx0XHRcdGRpdkIgPSBEb20uZGl2KG51bGwsICdUaGUgZGl2QicpXG5cdFx0XHRiYXRjaCA9IERvbS5iYXRjaChbZGl2QSwgZGl2Ql0sIHRydWUpXG5cblx0XHRcdGV4cGVjdChiYXRjaC5odG1sKCkpLnRvLmVxbCBbJ1RoZSBkaXZBJywgJ1RoZSBkaXZCJ11cblx0XHRcdGV4cGVjdChiYXRjaC50ZXh0KCkpLnRvLmVxbCBbJ1RoZSBkaXZBJywgJ1RoZSBkaXZCJ11cblx0XHRcdFxuXHRcdFx0YmF0Y2guaHRtbCgnPHNwYW4+VGhlIGRpdjwvc3Bhbj4nKVxuXHRcdFx0ZXhwZWN0KGJhdGNoLmh0bWwoKSkudG8uZXFsIFsnPHNwYW4+VGhlIGRpdjwvc3Bhbj4nLCAnPHNwYW4+VGhlIGRpdjwvc3Bhbj4nXVxuXHRcdFx0ZXhwZWN0KGJhdGNoLnRleHQoKSkudG8uZXFsIFsnVGhlIGRpdicsICdUaGUgZGl2J11cblxuXHRcdFx0YmF0Y2gudGV4dCgnVEhFIERJVicpXG5cdFx0XHRleHBlY3QoYmF0Y2guaHRtbCgpKS50by5lcWwgWydUSEUgRElWJywgJ1RIRSBESVYnXVxuXHRcdFx0ZXhwZWN0KGJhdGNoLnRleHQoKSkudG8uZXFsIFsnVEhFIERJVicsICdUSEUgRElWJ11cblxuXG5cblx0c3VpdGUgXCJUZW1wbGF0ZXNcIiwgKCktPlxuXHRcdHRlc3QgXCJBIHJldXNhYmxlIHRlbXBsYXRlIGNhbiBiZSBnZW5lcmF0ZWQgdmlhIFF1aWNrRG9tLnRlbXBsYXRlKClcIiwgKCktPlxuXHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoWydzcGFuJywgaWQ6J3RoZVNwYW4nXSlcblxuXHRcdFx0ZXhwZWN0KHR5cGVvZiB0ZW1wbGF0ZSkudG8uZXF1YWwoJ29iamVjdCcpXG5cdFx0XHRleHBlY3QodGVtcGxhdGUudHlwZSkudG8uZXF1YWwoJ3NwYW4nKVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLm9wdGlvbnMpLnRvLmVxbChpZDondGhlU3BhbicpXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuY2hpbGRyZW4pLnRvLmVxbChbXSlcblxuXG5cdFx0dGVzdCBcIlRlbXBsYXRlcyBjYW4gYmUgdHVybmVkIGludG8gUXVpY2tEb20gaW5zdGFuY2VzIHZpYSB0ZW1wbGF0ZS5zcGF3bigpIG9yIGJ5IHBhc3NpbmcgYXMgYXJnIHRvIFF1aWNrRG9tXCIsICgpLT5cblx0XHRcdHRlbXBsYXRlID0gRG9tLnRlbXBsYXRlKFsnZGl2JywgY2xhc3NOYW1lOidzb21lLWRpdicsICdTb21lIElubmVyIFRleHQnXSlcblx0XHRcdHNwYXduQSA9IHRlbXBsYXRlLnNwYXduKClcblx0XHRcdHNwYXduQS5zdGF0ZSAnaGFwcHknLCBvblxuXHRcdFx0c3Bhd25CID0gRG9tKHRlbXBsYXRlKVxuXG5cdFx0XHRleHBlY3Qoc3Bhd25BLmVsKS50by5iZS5pbnN0YW5jZU9mKEhUTUxEaXZFbGVtZW50KVxuXHRcdFx0ZXhwZWN0KHNwYXduQi5lbCkudG8uYmUuaW5zdGFuY2VPZihIVE1MRGl2RWxlbWVudClcblx0XHRcdGV4cGVjdChzcGF3bkEpLm5vdC50by5lcXVhbChzcGF3bkIpXG5cdFx0XHRleHBlY3Qoc3Bhd25BLmVsKS5ub3QudG8uZXF1YWwoc3Bhd25CLmVsKVxuXHRcdFx0ZXhwZWN0KHNwYXduQS5zdGF0ZSAnaGFwcHknKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3Qoc3Bhd25CLnN0YXRlICdoYXBweScpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3Qoc3Bhd25BLmVsLnRleHRDb250ZW50KS50by5lcXVhbCgnU29tZSBJbm5lciBUZXh0Jylcblx0XHRcdGV4cGVjdChzcGF3bkIuZWwudGV4dENvbnRlbnQpLnRvLmVxdWFsKCdTb21lIElubmVyIFRleHQnKVxuXHRcdFx0ZXhwZWN0KHNwYXduQS5lbC5jbGFzc05hbWUpLnRvLmVxdWFsKCdzb21lLWRpdicpXG5cblxuXHRcdHRlc3QgXCJUZW1wbGF0ZXMgY2FuIGJlIGNyZWF0ZWQgZnJvbSBRdWlja0VsZW1lbnQgaW5zdGFuY2VzXCIsICgpLT5cblx0XHRcdHNlY3Rpb24gPSBEb20uc2VjdGlvbihjbGFzc05hbWU6J3NpbmdsZVNlY3Rpb24nLCAnU29tZSBJbm5lciBUZXh0Jylcblx0XHRcdHNlY3Rpb24uc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdHNlY3Rpb25UZW1wbGF0ZSA9IHNlY3Rpb24udG9UZW1wbGF0ZSgpXG5cdFx0XHR0ZW1wbGF0ZVNwYXduID0gc2VjdGlvblRlbXBsYXRlLnNwYXduKClcblxuXHRcdFx0ZXhwZWN0KHNlY3Rpb25UZW1wbGF0ZSkubm90LnRvLmVxdWFsKHNlY3Rpb24pXG5cdFx0XHRleHBlY3QodGVtcGxhdGVTcGF3bi5lbCkubm90LnRvLmVxdWFsKHNlY3Rpb24uZWwpXG5cdFx0XHRleHBlY3QodGVtcGxhdGVTcGF3bi5lbC5jbGFzc05hbWUpLnRvLmVxdWFsKCdzaW5nbGVTZWN0aW9uJylcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZVNwYXduLnRleHQpLnRvLmVxdWFsKCdTb21lIElubmVyIFRleHQnKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24uc3RhdGUgJ2hhcHB5JykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlU3Bhd24uc3RhdGUgJ2hhcHB5JykudG8uYmUuZmFsc2VcblxuXG5cdFx0dGVzdCBcIlRlbXBsYXRlcyBjYW4gYmUgY3JlYXRlZCBmcm9tIERPTSBFbGVtZW50c1wiLCAoKS0+XG5cdFx0XHRzZWN0aW9uRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJylcblx0XHRcdHNlY3Rpb25FbC5jbGFzc05hbWUgPSAnc2luZ2xlU2VjdGlvbidcblx0XHRcdHNlY3Rpb25FbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSAnU29tZSBJbm5lciBUZXh0Jylcblx0XHRcdHNlY3Rpb25UZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZShzZWN0aW9uRWwpXG5cdFx0XHR0ZW1wbGF0ZVNwYXduID0gc2VjdGlvblRlbXBsYXRlLnNwYXduKClcblxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlU3Bhd24uZWwpLm5vdC50by5lcXVhbChzZWN0aW9uRWwpXG5cdFx0XHRleHBlY3QodGVtcGxhdGVTcGF3bi5lbC5jbGFzc05hbWUpLnRvLmVxdWFsKCdzaW5nbGVTZWN0aW9uJylcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZVNwYXduLnRleHQpLnRvLmVxdWFsKCdTb21lIElubmVyIFRleHQnKVxuXG5cblx0XHR0ZXN0IFwiVGVtcGxhdGVzIGNhbiBiZSBleHRlbmRlZCB2aWEgdGVtcGxhdGUuZXh0ZW5kXCIsICgpLT5cblx0XHRcdHRlbXBsYXRlID0gRG9tLnRlbXBsYXRlKFsnZGl2JywgY2xhc3NOYW1lOidzb21lLWRpdicsICdTb21lIElubmVyIFRleHQnXSlcblx0XHRcdHRlbXBsYXRlQ29weUEgPSB0ZW1wbGF0ZS5leHRlbmQge3R5cGU6J3NwYW4nLCBvcHRpb25zOntjbGFzc05hbWU6J3NvbWUtc3Bhbid9LCBjaGlsZHJlbjpbXX1cblx0XHRcdHRlbXBsYXRlQ29weUIgPSB0ZW1wbGF0ZS5leHRlbmQge29wdGlvbnM6e2lkOid0aGVNYWluRGl2J30sIGNoaWxkcmVuOlsnVGhlIE90aGVyIElubmVyIFRleHQnXX1cblx0XHRcdHRlbXBsYXRlQ29weUMgPSB0ZW1wbGF0ZS5leHRlbmQoXG5cdFx0XHRcdFsnc2VjdGlvbidcblx0XHRcdFx0XHRjbGFzc05hbWU6J3NvbWUtc2VjdGlvbidcblx0XHRcdFx0XHRbJ2RpdicsIG51bGwsICdWZXJ5ICddXG5cdFx0XHRcdFx0WydkaXYnLCBudWxsXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7c3R5bGU6Zm9udFdlaWdodDo1MDB9LCdOZXN0ZWQgJ11cblx0XHRcdFx0XHRcdCdJbm5lciBUZXh0J1xuXHRcdFx0XHRcdF1cblx0XHRcdFx0XVxuXHRcdFx0KVxuXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5QSkubm90LnRvLmVxdWFsKHRlbXBsYXRlKVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weUIpLm5vdC50by5lcXVhbCh0ZW1wbGF0ZSlcblx0XHRcdHNwYXduID0gdGVtcGxhdGUuc3Bhd24oKVxuXHRcdFx0c3Bhd25BID0gdGVtcGxhdGVDb3B5QS5zcGF3bigpXG5cdFx0XHRzcGF3bkIgPSB0ZW1wbGF0ZUNvcHlCLnNwYXduKClcblx0XHRcdHNwYXduQyA9IHRlbXBsYXRlQ29weUMuc3Bhd24oKVxuXG5cdFx0XHRleHBlY3Qoc3Bhd24uZWwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkudG8uZXF1YWwoJ2RpdicpXG5cdFx0XHRleHBlY3Qoc3Bhd24uZWwuY2xhc3NOYW1lKS50by5lcXVhbCgnc29tZS1kaXYnKVxuXHRcdFx0ZXhwZWN0KHNwYXduLmVsLmlkKS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChzcGF3bi50ZXh0KS50by5lcXVhbCgnU29tZSBJbm5lciBUZXh0JylcblxuXHRcdFx0ZXhwZWN0KHNwYXduQS5lbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKS50by5lcXVhbCgnc3BhbicpXG5cdFx0XHRleHBlY3Qoc3Bhd25BLmVsLmNsYXNzTmFtZSkudG8uZXF1YWwoJ3NvbWUtc3BhbicpXG5cdFx0XHRleHBlY3Qoc3Bhd25BLmVsLmlkKS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChzcGF3bkEudGV4dCkudG8uZXF1YWwoJ1NvbWUgSW5uZXIgVGV4dCcpXG5cblx0XHRcdGV4cGVjdChzcGF3bkIuZWwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkudG8uZXF1YWwoJ2RpdicpXG5cdFx0XHRleHBlY3Qoc3Bhd25CLmVsLmNsYXNzTmFtZSkudG8uZXF1YWwoJ3NvbWUtZGl2Jylcblx0XHRcdGV4cGVjdChzcGF3bkIuZWwuaWQpLnRvLmVxdWFsKCd0aGVNYWluRGl2Jylcblx0XHRcdGV4cGVjdChzcGF3bkIudGV4dCkudG8uZXF1YWwoJ1RoZSBPdGhlciBJbm5lciBUZXh0JylcblxuXHRcdFx0ZXhwZWN0KHNwYXduQy5lbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKS50by5lcXVhbCgnc2VjdGlvbicpXG5cdFx0XHRleHBlY3Qoc3Bhd25DLmVsLmNsYXNzTmFtZSkudG8uZXF1YWwoJ3NvbWUtc2VjdGlvbicpXG5cdFx0XHRleHBlY3Qoc3Bhd25DLmVsLmlkKS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChzcGF3bkMudGV4dCkudG8uZXF1YWwoJ1ZlcnkgTmVzdGVkIElubmVyIFRleHQnKVxuXG5cblx0XHR0ZXN0IFwiVGVtcGxhdGVzIGNhbiBiZSBzcGF3bmVkIHZpYSBleHRlbmRlZCBjb25maWcgYnkgcGFzc2luZyBhIG5ldyBjb25maWcgb2JqZWN0IHRvIHRlbXBsYXRlLnNwYXduKClcIiwgKCktPlxuXHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFsnZGl2JywgY2xhc3NOYW1lOidzb21lLWRpdicsXG5cdFx0XHRcdFx0J1NvbWUgSW5uZXIgVGV4dCcsXG5cdFx0XHRcdFx0WydzdHJvbmcnLCB7Y2xhc3NOYW1lOidoaWdobGlnaHRlZCcsIHN0eWxlOntvcGFjaXR5OjAuOX19LCAnIC0gQm9sZGVkIFRleHQnXVxuXHRcdFx0XHRdXG5cdFx0XHQpXG5cdFx0XHRzcGF3blJhdyA9IHRlbXBsYXRlLnNwYXduKCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdHNwYXduQSA9IHRlbXBsYXRlLnNwYXduKHR5cGU6J3NlY3Rpb24nLCBvcHRpb25zOntjbGFzc05hbWU6J3NvbWUtc2VjdGlvbicsIHN0eWxlOntvcGFjaXR5OjAuN319KS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0c3Bhd25CID0gdGVtcGxhdGUuc3Bhd24oXG5cdFx0XHRcdG9wdGlvbnM6XG5cdFx0XHRcdFx0Y2xhc3NOYW1lOiAnbWFpbi1kaXYnXG5cdFx0XHRcdFx0aWQ6ICd0aGVNYWluRGl2J1xuXHRcdFx0XHRcdHN0eWxlOiBvcGFjaXR5OiAwLjVcblx0XHRcdFx0Y2hpbGRyZW46IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR0eXBlOiAnc3Bhbidcblx0XHRcdFx0XHRcdGNoaWxkcmVuOiBbXG5cdFx0XHRcdFx0XHRcdHR5cGU6J3RleHQnXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnM6IHt0ZXh0OiAnTWFpbiBJbm5lciBUZXh0J31cblx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0dHlwZTogJ2InXG5cdFx0XHRcdFx0XHRvcHRpb25zOlxuXHRcdFx0XHRcdFx0XHRjbGFzc05hbWU6ICdzdXBlci1oaWdobGlnaHRlZCdcblx0XHRcdFx0XHRcdFx0c3R5bGU6IG9wYWNpdHk6ICcwLjInXG5cdFx0XHRcdFx0XHRjaGlsZHJlbjogW1xuXHRcdFx0XHRcdFx0XHRvcHRpb25zOiB7dGV4dDogJyAtIFZlcnkgQm9sZGVkIFRleHQnfVxuXHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHR0eXBlOiAndGV4dCdcblx0XHRcdFx0XHRcdG9wdGlvbnM6IHt0ZXh0OiAnICsgT3RoZXIgVGV4dCd9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRdXG5cdFx0XHQpLmFwcGVuZFRvKHNhbmRib3gpXG5cblx0XHRcdGV4cGVjdChzcGF3blJhdy5lbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKS50by5lcXVhbCgnZGl2Jylcblx0XHRcdGV4cGVjdChzcGF3blJhdy5lbC5jbGFzc05hbWUpLnRvLmVxdWFsKCdzb21lLWRpdicpXG5cdFx0XHRleHBlY3Qoc3Bhd25SYXcuZWwuaWQpLnRvLmVxdWFsKCcnKVxuXHRcdFx0ZXhwZWN0KHNwYXduUmF3LnRleHQpLnRvLmVxdWFsKCdTb21lIElubmVyIFRleHQgLSBCb2xkZWQgVGV4dCcpXG5cdFx0XHRleHBlY3Qoc3Bhd25SYXcuZWwpLnRvLmhhdmUuc3R5bGUoJ29wYWNpdHknLCcxJylcblx0XHRcdGV4cGVjdChzcGF3blJhdy5lbC5jaGlsZE5vZGVzLmxlbmd0aCkudG8uZXF1YWwoMilcblx0XHRcdGV4cGVjdChzcGF3blJhdy5lbC5jaGlsZE5vZGVzWzBdLm5vZGVOYW1lKS50by5lcXVhbCgnI3RleHQnKVxuXHRcdFx0ZXhwZWN0KHNwYXduUmF3LmVsLmNoaWxkTm9kZXNbMV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkudG8uZXF1YWwoJ3N0cm9uZycpXG5cdFx0XHRleHBlY3Qoc3Bhd25SYXcuZWwuY2hpbGROb2Rlc1sxXS5jbGFzc05hbWUpLnRvLmluY2x1ZGUoJ2hpZ2hsaWdodGVkJylcblx0XHRcdGV4cGVjdChzcGF3blJhdy5lbC5jaGlsZE5vZGVzWzFdKS50by5oYXZlLnN0eWxlKCdvcGFjaXR5JywgJzAuOScpXG5cblx0XHRcdGV4cGVjdChzcGF3bkEuZWwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkudG8uZXF1YWwoJ3NlY3Rpb24nKVxuXHRcdFx0ZXhwZWN0KHNwYXduQS5lbC5jbGFzc05hbWUpLnRvLmluY2x1ZGUoJ3NvbWUtc2VjdGlvbicpXG5cdFx0XHRleHBlY3Qoc3Bhd25BLmVsLmlkKS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChzcGF3bkEudGV4dCkudG8uZXF1YWwoJ1NvbWUgSW5uZXIgVGV4dCAtIEJvbGRlZCBUZXh0Jylcblx0XHRcdGV4cGVjdChzcGF3bkEuZWwpLnRvLmhhdmUuc3R5bGUoJ29wYWNpdHknLCcwLjcnKVxuXHRcdFx0ZXhwZWN0KHNwYXduQS5lbC5jaGlsZE5vZGVzLmxlbmd0aCkudG8uZXF1YWwoMilcblx0XHRcdGV4cGVjdChzcGF3bkEuZWwuY2hpbGROb2Rlc1swXS5ub2RlTmFtZSkudG8uZXF1YWwoJyN0ZXh0Jylcblx0XHRcdGV4cGVjdChzcGF3bkEuZWwuY2hpbGROb2Rlc1sxXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKS50by5lcXVhbCgnc3Ryb25nJylcblx0XHRcdGV4cGVjdChzcGF3bkEuZWwuY2hpbGROb2Rlc1sxXS5jbGFzc05hbWUpLnRvLmluY2x1ZGUoJ2hpZ2hsaWdodGVkJylcblx0XHRcdGV4cGVjdChzcGF3bkEuZWwuY2hpbGROb2Rlc1sxXSkudG8uaGF2ZS5zdHlsZSgnb3BhY2l0eScsICcwLjknKVxuXG5cdFx0XHRleHBlY3Qoc3Bhd25CLmVsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpLnRvLmVxdWFsKCdkaXYnKVxuXHRcdFx0ZXhwZWN0KHNwYXduQi5lbC5jbGFzc05hbWUpLnRvLmluY2x1ZGUoJ21haW4tZGl2Jylcblx0XHRcdGV4cGVjdChzcGF3bkIuZWwuaWQpLnRvLmVxdWFsKCd0aGVNYWluRGl2Jylcblx0XHRcdGV4cGVjdChzcGF3bkIudGV4dCkudG8uZXF1YWwoJ01haW4gSW5uZXIgVGV4dCAtIFZlcnkgQm9sZGVkIFRleHQgKyBPdGhlciBUZXh0Jylcblx0XHRcdGV4cGVjdChzcGF3bkIuZWwpLnRvLmhhdmUuc3R5bGUoJ29wYWNpdHknLCcwLjUnKVxuXHRcdFx0ZXhwZWN0KHNwYXduQi5lbC5jaGlsZE5vZGVzLmxlbmd0aCkudG8uZXF1YWwoMylcblx0XHRcdGV4cGVjdChzcGF3bkIuZWwuY2hpbGROb2Rlc1swXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKS50by5lcXVhbCgnc3BhbicpXG5cdFx0XHRleHBlY3Qoc3Bhd25CLmVsLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3Qoc3Bhd25CLmVsLmNoaWxkTm9kZXNbMV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkudG8uZXF1YWwoJ2InKVxuXHRcdFx0ZXhwZWN0KHNwYXduQi5lbC5jaGlsZE5vZGVzWzFdLmNsYXNzTmFtZSkudG8uaW5jbHVkZSgnc3VwZXItaGlnaGxpZ2h0ZWQnKVxuXHRcdFx0ZXhwZWN0KHNwYXduQi5lbC5jaGlsZE5vZGVzWzFdKS50by5oYXZlLnN0eWxlKCdvcGFjaXR5JywgJzAuMicpXG5cblxuXHRcdHRlc3QgXCJUZW1wbGF0ZS5leHRlbmQvc3Bhd24oKSBjYW4gYWNjZXB0IGEgdGVtcGxhdGUgdHJlZSBhcnJheVwiLCAoKS0+XG5cdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZSBbJ2RpdicsIHN0eWxlOnsnb3BhY2l0eSc6MC41fSwgWydzcGFuJywgbnVsbCwgJ3RleHQgb2Ygc3BhbiddLCBbJ2RpdicsIG51bGwsICd0ZXh0IG9mIGRpdiddXVxuXHRcdFx0Y2xvbmVBID0gdGVtcGxhdGUuZXh0ZW5kKFsnc2VjdGlvbicsIHN0eWxlOnsnb3BhY2l0eSc6MC44fV0pXG5cdFx0XHRjbG9uZUIgPSB0ZW1wbGF0ZS5leHRlbmQoWydzcGFuJywgbnVsbCwgWydkaXYnXV0pXG5cdFx0XHRjbG9uZUMgPSB0ZW1wbGF0ZS5leHRlbmQoWydzZWN0aW9uJywge2NsYXNzTmFtZTondGhlLXNlY3Rpb24nLCBzdHlsZTp7Y29sb3I6J2JsdWUnfX0sIFsnc2VjdGlvbicsIG51bGwsICd0ZXh0IG9mIHN1YnNlY3Rpb24nXSwgJ2p1c3QgYSB0ZXh0IG5vZGUnXSlcblx0XHRcdHNwYXduID0gdGVtcGxhdGUuc3Bhd24oWydzcGFuJywgc3R5bGU6eyd3aWR0aCc6MTkwLCAnb3BhY2l0eSc6MC40fSwgJ3NvIG5pY2UnXSkuYXBwZW5kVG8oc2FuZGJveClcblxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLnR5cGUpLnRvLmVxdWFsICdkaXYnXG5cdFx0XHRleHBlY3QodGVtcGxhdGUub3B0aW9ucykudG8uZXFsIHtzdHlsZTp7J29wYWNpdHknOjAuNX19XG5cdFx0XHRleHBlY3QodGVtcGxhdGUuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCAyXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuY2hpbGRyZW5bMF0udHlwZSkudG8uZXF1YWwgJ3NwYW4nXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuY2hpbGRyZW5bMF0uY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCAxXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0ub3B0aW9ucy50ZXh0KS50by5lcXVhbCAndGV4dCBvZiBzcGFuJ1xuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLmNoaWxkcmVuWzFdLnR5cGUpLnRvLmVxdWFsICdkaXYnXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuY2hpbGRyZW5bMV0uY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCAxXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF0ub3B0aW9ucy50ZXh0KS50by5lcXVhbCAndGV4dCBvZiBkaXYnXG5cblx0XHRcdGV4cGVjdChjbG9uZUEudHlwZSkudG8uZXF1YWwgJ3NlY3Rpb24nXG5cdFx0XHRleHBlY3QoY2xvbmVBLm9wdGlvbnMpLnRvLmVxbCB7c3R5bGU6eydvcGFjaXR5JzowLjh9fVxuXHRcdFx0ZXhwZWN0KGNsb25lQS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsIDJcblx0XHRcdGV4cGVjdChjbG9uZUEuY2hpbGRyZW5bMF0udHlwZSkudG8uZXF1YWwgJ3NwYW4nXG5cdFx0XHRleHBlY3QoY2xvbmVBLmNoaWxkcmVuWzBdLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwgMVxuXHRcdFx0ZXhwZWN0KGNsb25lQS5jaGlsZHJlblswXS5jaGlsZHJlblswXS5vcHRpb25zLnRleHQpLnRvLmVxdWFsICd0ZXh0IG9mIHNwYW4nXG5cdFx0XHRleHBlY3QoY2xvbmVBLmNoaWxkcmVuWzFdLnR5cGUpLnRvLmVxdWFsICdkaXYnXG5cdFx0XHRleHBlY3QoY2xvbmVBLmNoaWxkcmVuWzFdLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwgMVxuXHRcdFx0ZXhwZWN0KGNsb25lQS5jaGlsZHJlblsxXS5jaGlsZHJlblswXS5vcHRpb25zLnRleHQpLnRvLmVxdWFsICd0ZXh0IG9mIGRpdidcblxuXHRcdFx0ZXhwZWN0KGNsb25lQi50eXBlKS50by5lcXVhbCAnc3Bhbidcblx0XHRcdGV4cGVjdChjbG9uZUIub3B0aW9ucykudG8uZXFsIHtzdHlsZTp7J29wYWNpdHknOjAuNX19XG5cdFx0XHRleHBlY3QoY2xvbmVCLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwgMlxuXHRcdFx0ZXhwZWN0KGNsb25lQi5jaGlsZHJlblswXS50eXBlKS50by5lcXVhbCAnZGl2J1xuXHRcdFx0ZXhwZWN0KGNsb25lQi5jaGlsZHJlblswXS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChjbG9uZUIuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0ub3B0aW9ucy50ZXh0KS50by5lcXVhbCAndGV4dCBvZiBzcGFuJ1xuXHRcdFx0ZXhwZWN0KGNsb25lQi5jaGlsZHJlblsxXS50eXBlKS50by5lcXVhbCAnZGl2J1xuXHRcdFx0ZXhwZWN0KGNsb25lQi5jaGlsZHJlblsxXS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChjbG9uZUIuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF0ub3B0aW9ucy50ZXh0KS50by5lcXVhbCAndGV4dCBvZiBkaXYnXG5cblx0XHRcdGV4cGVjdChjbG9uZUMudHlwZSkudG8uZXF1YWwgJ3NlY3Rpb24nXG5cdFx0XHRleHBlY3QoY2xvbmVDLm9wdGlvbnMpLnRvLmVxbCB7Y2xhc3NOYW1lOid0aGUtc2VjdGlvbicsIHN0eWxlOnsnb3BhY2l0eSc6MC41LCAnY29sb3InOidibHVlJ319XG5cdFx0XHRleHBlY3QoY2xvbmVDLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwgMlxuXHRcdFx0ZXhwZWN0KGNsb25lQy5jaGlsZHJlblswXS50eXBlKS50by5lcXVhbCAnc2VjdGlvbidcblx0XHRcdGV4cGVjdChjbG9uZUMuY2hpbGRyZW5bMF0uY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCAxXG5cdFx0XHRleHBlY3QoY2xvbmVDLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLm9wdGlvbnMudGV4dCkudG8uZXF1YWwgJ3RleHQgb2Ygc3Vic2VjdGlvbidcblx0XHRcdGV4cGVjdChjbG9uZUMuY2hpbGRyZW5bMV0udHlwZSkudG8uZXF1YWwgJ3RleHQnXG5cdFx0XHRleHBlY3QoY2xvbmVDLmNoaWxkcmVuWzFdLm9wdGlvbnMudGV4dCkudG8uZXF1YWwgJ2p1c3QgYSB0ZXh0IG5vZGUnXG5cblx0XHRcdHNwYXduLnN0eWxlICdkaXNwbGF5JywgJ2Jsb2NrJ1xuXHRcdFx0ZXhwZWN0KHNwYXduLmVsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpLnRvLmVxdWFsICdzcGFuJ1xuXHRcdFx0ZXhwZWN0KHNwYXduLmVsKS50by5oYXZlLnN0eWxlICdvcGFjaXR5JywgJzAuNCdcblx0XHRcdGV4cGVjdChzcGF3bi5lbCkudG8uaGF2ZS5zdHlsZSAnd2lkdGgnLCAnMTkwcHgnXG5cdFx0XHRleHBlY3Qoc3Bhd24uZWwuY2hpbGROb2Rlcy5sZW5ndGgpLnRvLmVxdWFsIDJcblx0XHRcdGV4cGVjdChzcGF3bi5lbC5jaGlsZE5vZGVzWzBdLm5vZGVUeXBlKS50by5lcXVhbCAzXG5cdFx0XHRleHBlY3Qoc3Bhd24uZWwuY2hpbGROb2Rlc1swXS50ZXh0Q29udGVudCkudG8uZXF1YWwgJ3NvIG5pY2UnXG5cdFx0XHRleHBlY3Qoc3Bhd24uZWwuY2hpbGROb2Rlc1sxXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKS50by5lcXVhbCAnZGl2J1xuXHRcdFx0ZXhwZWN0KHNwYXduLmVsLmNoaWxkTm9kZXNbMV0udGV4dENvbnRlbnQpLnRvLmVxdWFsICd0ZXh0IG9mIGRpdidcblxuXHRcdFx0IyBleHBlY3QgKCktPlxuXHRcdFx0IyBcdERvbS50ZW1wbGF0ZShbJ2RpdiddKS5leHRlbmQoWydzcGFuJywgbnVsbCwgWydkaXYnLCBudWxsLCBbJ3NlY3Rpb24nXV1dKVxuXHRcdFx0IyAubm90LnRvLnRocm93KClcblxuXG5cdFx0dGVzdCBcIlRlbXBsYXRlLmV4dGVuZC9zcGF3bigpIGNhbiBhY2NlcHQgb3RoZXIgdGVtcGxhdGUgaW5zdGFuY2VzIGFzIGNoaWxkcmVuIHdoaWNoIHdpbGwgcmVwbGFjZSBleGlzdGluZyBjaGlsZHJlblwiLCAoKS0+XG5cdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZSBbJ2RpdicsIG51bGwsIFsnc3BhbicsIHtzdHlsZTpvcGFjaXR5OjAuNX1dLCAnb3JpZ2luYWwgdGV4dCddXG5cdFx0XHRjaGlsZEEgPSBEb20udGVtcGxhdGUgWydkaXYnLCB7c3R5bGU6Zm9udEZhbWlseToncGluayd9XVxuXHRcdFx0Y2hpbGRCID0gRG9tLnRlbXBsYXRlICdyZXBsYWNlZCB0ZXh0J1xuXHRcdFx0Y2hpbGRDID0gRG9tLnRlbXBsYXRlIFsnc2VjdGlvbiddXG5cdFx0XHR0ZW1wbGF0ZUNvcHkgPSB0ZW1wbGF0ZS5leHRlbmQoWydzcGFuJywge3N0eWxlOmZvbnRTaXplOic3N3B4J30sIGNoaWxkQSwgY2hpbGRCLCBjaGlsZENdKVxuXHRcdFx0c3Bhd25lZEEgPSB0ZW1wbGF0ZS5zcGF3bigpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRzcGF3bmVkQiA9IHRlbXBsYXRlQ29weS5zcGF3bigpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRzcGF3bmVkQyA9IHRlbXBsYXRlLnNwYXduKFsnc3BhbicsIHtzdHlsZTpmb250U2l6ZTonNzdweCd9LCBjaGlsZEEsIGNoaWxkQiwgY2hpbGRDXSkuYXBwZW5kVG8oc2FuZGJveClcblxuXHRcdFx0ZXhwZWN0KHNwYXduZWRBLnR5cGUpLnRvLmVxdWFsKCdkaXYnKVxuXHRcdFx0ZXhwZWN0KHNwYXduZWRBLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMilcblx0XHRcdGV4cGVjdChzcGF3bmVkQS5jaGlsZHJlblswXS50eXBlKS50by5lcXVhbCgnc3BhbicpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEEuY2hpbGRyZW5bMF0ucmF3KS50by5oYXZlLnN0eWxlKCdvcGFjaXR5JywgJzAuNScpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEEuY2hpbGRyZW5bMF0ucmF3KS50by5oYXZlLnN0eWxlKCdmb250RmFtaWx5JywgJycpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEEuY2hpbGRyZW5bMV0udHlwZSkudG8uZXF1YWwoJ3RleHQnKVxuXHRcdFx0ZXhwZWN0KHNwYXduZWRBLnRleHQpLnRvLmVxdWFsKCdvcmlnaW5hbCB0ZXh0JylcblxuXHRcdFx0ZXhwZWN0KHNwYXduZWRCLnR5cGUpLnRvLmVxdWFsKCdzcGFuJylcblx0XHRcdGV4cGVjdChzcGF3bmVkQi5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEIuY2hpbGRyZW5bMF0udHlwZSkudG8uZXF1YWwoJ2RpdicpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEIuY2hpbGRyZW5bMF0ucmF3KS50by5oYXZlLnN0eWxlKCdvcGFjaXR5JywgJycpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEIuY2hpbGRyZW5bMF0ucmF3KS50by5oYXZlLnN0eWxlKCdmb250RmFtaWx5JywgJ3BpbmsnKVxuXHRcdFx0ZXhwZWN0KHNwYXduZWRCLmNoaWxkcmVuWzFdLnR5cGUpLnRvLmVxdWFsKCd0ZXh0Jylcblx0XHRcdGV4cGVjdChzcGF3bmVkQi50ZXh0KS50by5lcXVhbCgncmVwbGFjZWQgdGV4dCcpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEIuY2hpbGRyZW5bMl0udHlwZSkudG8uZXF1YWwoJ3NlY3Rpb24nKVxuXHRcdFx0ZXhwZWN0KHNwYXduZWRCLnJhdykudG8uaGF2ZS5zdHlsZSgnZm9udFNpemUnLCAnNzdweCcpXG5cblx0XHRcdGV4cGVjdChzcGF3bmVkQy50eXBlKS50by5lcXVhbCgnc3BhbicpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEMuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgzKVxuXHRcdFx0ZXhwZWN0KHNwYXduZWRDLmNoaWxkcmVuWzBdLnR5cGUpLnRvLmVxdWFsKCdkaXYnKVxuXHRcdFx0ZXhwZWN0KHNwYXduZWRDLmNoaWxkcmVuWzBdLnJhdykudG8uaGF2ZS5zdHlsZSgnb3BhY2l0eScsICcnKVxuXHRcdFx0ZXhwZWN0KHNwYXduZWRDLmNoaWxkcmVuWzBdLnJhdykudG8uaGF2ZS5zdHlsZSgnZm9udEZhbWlseScsICdwaW5rJylcblx0XHRcdGV4cGVjdChzcGF3bmVkQy5jaGlsZHJlblsxXS50eXBlKS50by5lcXVhbCgndGV4dCcpXG5cdFx0XHRleHBlY3Qoc3Bhd25lZEMudGV4dCkudG8uZXF1YWwoJ3JlcGxhY2VkIHRleHQnKVxuXHRcdFx0ZXhwZWN0KHNwYXduZWRDLmNoaWxkcmVuWzJdLnR5cGUpLnRvLmVxdWFsKCdzZWN0aW9uJylcblx0XHRcdGV4cGVjdChzcGF3bmVkQy5yYXcpLnRvLmhhdmUuc3R5bGUoJ2ZvbnRTaXplJywgJzc3cHgnKVxuXG5cblx0XHR0ZXN0IFwiVGVtcGxhdGUuZXh0ZW5kL3NwYXduKCkgd2lsbCBjb25zaWRlciB0aGUgcGFzc2VkIG9iamVjdCBhcyB0aGUgb3B0aW9ucyBvYmplY3QgaWYgaXQgZG9lc24ndCBjb250YWluIHRlbXBsYXRlLXJlbGF0ZWQgcHJvcHNcIiwgKCktPlxuXHRcdFx0dGVtcGxhdGUgPSBET00udGVtcGxhdGUoXG5cdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdGRlZmF1bHRzOiB0ZXh0OiAnZGVmYXVsdCdcblx0XHRcdFx0XHRjb21wdXRlcnM6IHRleHQ6ICh0ZXh0KS0+IEB0ZXh0ID0gdGV4dFxuXHRcdFx0XHRcdFxuXHRcdFx0XHRcdFsnc3BhbicsIHJlZjondGhlU3BhbiddXG5cdFx0XHRcdF1cblx0XHRcdClcblxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLm9wdGlvbnMuc3R5bGUpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLm9wdGlvbnMubGFiZWwpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLmV4dGVuZChvcHRpb25zOmxhYmVsOidhYmMxMjMnKS5vcHRpb25zLmxhYmVsKS50by5lcXVhbCAnYWJjMTIzJ1xuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLmV4dGVuZChsYWJlbDonZGVmNDU2Jykub3B0aW9ucy5sYWJlbCkudG8uZXF1YWwgJ2RlZjQ1Nidcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZS5leHRlbmQoc3R5bGU6J2RlZjQ1NicpLm9wdGlvbnMuc3R5bGUpLnRvLmVxdWFsICdkZWY0NTYnXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuZXh0ZW5kKHN0eWxlOidkZWY0NTYnLCB0eXBlOidzZWN0aW9uJykub3B0aW9ucy5zdHlsZSkudG8uZXF1YWwgdW5kZWZpbmVkXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuZXh0ZW5kKGNoaWxkcmVuOnRoZVNwYW46c3R5bGU6J2doaTc4OScpLmNoaWxkLnRoZVNwYW4ub3B0aW9ucy5zdHlsZSkudG8uZXF1YWwgJ2doaTc4OSdcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZS5leHRlbmQoY2hpbGRyZW46W2RlZmF1bHRzOidnaGk3ODknXSkuY2hpbGQudGhlU3Bhbi5vcHRpb25zLmRlZmF1bHRzKS50by5lcXVhbCAnZ2hpNzg5J1xuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLnNwYXduKGNoaWxkcmVuOnRoZVNwYW46Y2xhc3NOYW1lOidHSEk3ODknKS5jaGlsZC50aGVTcGFuLnJhdy5jbGFzc05hbWUpLnRvLmVxdWFsICdHSEk3ODknXG5cdFx0XHRleHBlY3QodGVtcGxhdGUuc3Bhd24oKS50ZXh0KS50by5lcXVhbCAnZGVmYXVsdCdcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZS5zcGF3bihkZWZhdWx0czp0ZXh0OidkaWZmJykudGV4dCkudG8uZXF1YWwgJ2RpZmYnXG5cblxuXHRcdHRlc3QgXCJUZW1wbGF0ZXMgY2FuIGhhdmUgb3RoZXIgdGVtcGxhdGVzIGFzIHRoZWlyIGNoaWxkcmVuXCIsICgpLT5cblx0XHRcdGhlYWRlclRlbXBsYXRlID0gRG9tLnRlbXBsYXRlIFsnaGVhZGVyJywge3N0eWxlOidoZWlnaHQnOicyMDBweCd9LFxuXHRcdFx0XHRbJ3NwYW4nLCB7c3R5bGU6J3RleHRBbGlnbic6J2NlbnRlcid9LCAnVGhpcyBpcyBib2xkZWQgdGV4dCddXG5cdFx0XHRcdCcgd2hpbGUgdGhpcyBpcyBub3QnXG5cdFx0XHRdXG5cdFx0XHRoZWFkZXJUZW1wbGF0ZUNsb25lID0gRG9tLnRlbXBsYXRlKGhlYWRlclRlbXBsYXRlKVxuXHRcdFx0c2VjdGlvblRlbXBsYXRlID0gRG9tLnRlbXBsYXRlIFsnc2VjdGlvbicsIG51bGwsIGhlYWRlclRlbXBsYXRlXVxuXHRcdFx0c2VjdGlvbiA9IHNlY3Rpb25UZW1wbGF0ZS5zcGF3bigpLmFwcGVuZFRvKHNhbmRib3gpXG5cblx0XHRcdGV4cGVjdChoZWFkZXJUZW1wbGF0ZUNsb25lKS50by5lcXVhbChoZWFkZXJUZW1wbGF0ZSlcblx0XHRcdGV4cGVjdChzZWN0aW9uVGVtcGxhdGUuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb25UZW1wbGF0ZS5jaGlsZHJlblswXSkudG8uZXF1YWwoaGVhZGVyVGVtcGxhdGUpXG5cdFx0XHRleHBlY3Qoc2VjdGlvblRlbXBsYXRlLmNoaWxkcmVuWzBdLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMilcblx0XHRcdGV4cGVjdChzZWN0aW9uLmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChzZWN0aW9uLmNoaWxkcmVuWzBdLnR5cGUpLnRvLmVxdWFsKCdoZWFkZXInKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24uY2hpbGRyZW5bMF0uY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24udGV4dCkudG8uZXF1YWwoJ1RoaXMgaXMgYm9sZGVkIHRleHQgd2hpbGUgdGhpcyBpcyBub3QnKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uc3R5bGUoJ3RleHRBbGlnbicpKS50by5lcXVhbCgnY2VudGVyJylcblxuXG5cdFx0dGVzdCBcIkEgZ2xvYmFsIG9wdGlvbnMgb2JqZWN0IGNhbiBiZSBwYXNzZWQgYXMgdGhlIDJuZCBhcmcgdG8gdGVtcGxhdGUuZXh0ZW5kL3NwYXduKCkgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCB0ZW1wbGF0ZXMsIHNwYXducywgJiB0aGVpciBjaGlsZHJlblwiLCAoKS0+XG5cdFx0XHRvYmogPSBteUhlaWdodDonMTUwcHgnXG5cdFx0XHRvYmoub2JqID0gb2JqXG5cdFx0XHRkeW5hbWljSGVpZ2h0U3R5bGUgPSAnaGVpZ2h0JzogKHJlbGF0ZWQpLT4gZXhwZWN0KHJlbGF0ZWQpLnRvLmVxdWFsKG9iaik7IHJlbGF0ZWQubXlIZWlnaHRcblx0XHRcdFxuXHRcdFx0aGVhZGVyVGVtcGxhdGUgPSBEb20udGVtcGxhdGUgWydoZWFkZXInLCB7c3R5bGU6J3dpZHRoJzonMjNweCd9LFxuXHRcdFx0XHRbJ2RpdicsIHtzdHlsZTond2lkdGgnOicyM3B4J30sICdUaGlzIGlzIGJvbGRlZCB0ZXh0J11cblx0XHRcdFx0JyB3aGlsZSB0aGlzIGlzIG5vdCdcblx0XHRcdF1cblx0XHRcdHNlY3Rpb25UZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZSBbJ3NlY3Rpb24nLCB7c3R5bGU6J3dpZHRoJzonMjNweCd9LCBoZWFkZXJUZW1wbGF0ZV1cblx0XHRcdHNlY3Rpb24gPSBzZWN0aW9uVGVtcGxhdGUuc3Bhd24oe29wdGlvbnM6e3JlbGF0ZWQ6d2luZG93fX0sIHtyZWxhdGVkOm9iaiwgc3R5bGU6ZHluYW1pY0hlaWdodFN0eWxlfSkuYXBwZW5kVG8oc2FuZGJveClcblxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24ucmF3LnN0eWxlLmhlaWdodCkudG8uZXF1YWwoJzE1MHB4Jylcblx0XHRcdGV4cGVjdChzZWN0aW9uLmNoaWxkcmVuWzBdLnJhdy5zdHlsZS5oZWlnaHQpLnRvLmVxdWFsKCcxNTBweCcpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblswXS5jaGlsZHJlblswXS5yYXcuc3R5bGUuaGVpZ2h0KS50by5lcXVhbCgnMTUwcHgnKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24ucmF3LnN0eWxlLndpZHRoKS50by5lcXVhbCgnJylcblx0XHRcdGV4cGVjdChzZWN0aW9uLmNoaWxkcmVuWzBdLnJhdy5zdHlsZS53aWR0aCkudG8uZXF1YWwoJycpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblswXS5jaGlsZHJlblswXS5yYXcuc3R5bGUud2lkdGgpLnRvLmVxdWFsKCcnKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24uY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgxKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb24uY2hpbGRyZW5bMF0udHlwZSkudG8uZXF1YWwoJ2hlYWRlcicpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi5jaGlsZHJlblswXS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbi50ZXh0KS50by5lcXVhbCgnVGhpcyBpcyBib2xkZWQgdGV4dCB3aGlsZSB0aGlzIGlzIG5vdCcpXG5cblxuXHRcdHRlc3QgXCJUZW1wbGF0ZSBjaGlsZHJlbiBjYW4gYmUgbmF2aWdhdGVkIGJ5IHJlZiB1c2luZyB0aGUgLmNoaWxkIHByb3BlcnR5XCIsICgpLT5cblx0XHRcdHRlbXBsYXRlID0gXG5cdFx0XHRcdERvbS50ZW1wbGF0ZSBbJ2RpdicsIHtpZDonZGl2QSd9LFxuXHRcdFx0XHRcdFsnZGl2Jywge2lkOidjaGlsZEEnfSxcblx0XHRcdFx0XHRcdFsnc3BhbicsIHtyZWY6J2NoaWxkQV8xJ31dXG5cdFx0XHRcdFx0XHRbJ2RpdicsIHtyZWY6J2NoaWxkQV8yJywgaWQ6J2NoaWxkQV8yJ31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFsnZGl2JywgbnVsbCwgXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7cmVmOidjaGlsZEJfMSd9XVxuXHRcdFx0XHRcdFx0Wyd0ZXh0Jywge2lkOidjaGlsZEJfMicsIHRleHQ6J1RoZSBUZXh0J31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRdXG5cblx0XHRcdGV4cGVjdCh0eXBlb2YgdGVtcGxhdGUuY2hpbGQpLnRvLmVxdWFsICdvYmplY3QnXG5cdFx0XHRleHBlY3QoT2JqZWN0LmtleXModGVtcGxhdGUuY2hpbGQpLmxlbmd0aCkudG8uZXF1YWwoNilcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZS5jaGlsZC5kaXZBKS50by5lcXVhbCB0ZW1wbGF0ZVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLmNoaWxkLmNoaWxkQS50eXBlKS50by5lcXVhbCAnZGl2J1xuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlLmNoaWxkLmNoaWxkQSkudG8uZXF1YWwgdGVtcGxhdGUuY2hpbGRyZW5bMF1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZS5jaGlsZC5jaGlsZEFfMSkudG8uZXF1YWwgdGVtcGxhdGUuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZS5jaGlsZC5jaGlsZEFfMikudG8uZXF1YWwgdGVtcGxhdGUuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMV1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZS5jaGlsZC5jaGlsZEJfMSkudG8uZXF1YWwgdGVtcGxhdGUuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZS5jaGlsZC5jaGlsZEJfMikudG8uZXF1YWwgdGVtcGxhdGUuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMV1cblxuXHRcdFx0cmVuZGVyZWQgPSB0ZW1wbGF0ZS5zcGF3bigpXG5cdFx0XHRleHBlY3QocmVuZGVyZWQuY2hpbGQuY2hpbGRCXzIpLnRvLmVxdWFsIHJlbmRlcmVkLmNoaWxkcmVuWzFdLmNoaWxkcmVuWzFdXG5cdFx0XHRleHBlY3QocmVuZGVyZWQudGV4dCkudG8uZXF1YWwoJ1RoZSBUZXh0JylcblxuXG5cdFx0dGVzdCBcIlRlbXBsYXRlJ3MgY2hpbGRyZW4gY2FuIGJlIGV4dGVuZC9zcGF3bmVkIHdpdGggYSB7cmVmOm5ld0NoaWxkfSBtYXAgaW5zdGVhZCBvZiBhIHBvc2l0aW9uYWwgYXJyYXlcIiwgKCktPlxuXHRcdFx0dGVtcGxhdGVNYWluID0gXG5cdFx0XHRcdERvbS50ZW1wbGF0ZSBbJ2RpdicsIHtpZDonZGl2QSd9LFxuXHRcdFx0XHRcdFsnZGl2Jywge2lkOidjaGlsZEEnfSxcblx0XHRcdFx0XHRcdFsnc3BhbicsIHtyZWY6J2NoaWxkQV8xJ31dXG5cdFx0XHRcdFx0XHRbJ2RpdicsIHtyZWY6J2NoaWxkQV8yJywgaWQ6J2NoaWxkQV8yJ31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFsnZGl2JywgbnVsbCwgXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7cmVmOidjaGlsZEJfMSd9XVxuXHRcdFx0XHRcdFx0Wyd0ZXh0Jywge2lkOidjaGlsZEJfMicsIHRleHQ6J1RoZSBUZXh0J31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRdXG5cdFx0XHR0ZW1wbGF0ZUNvcHkgPSB0ZW1wbGF0ZU1haW4uZXh0ZW5kIFsnc2VjdGlvbicsIG51bGwsIFxuXHRcdFx0XHRjaGlsZEE6XG5cdFx0XHRcdFx0dHlwZTogJ2Zvcm0nXG5cdFx0XHRcdFx0b3B0aW9uczpcblx0XHRcdFx0XHRcdHN0eWxlOiBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJ1xuXHRcdFx0XHRjaGlsZEFfMjpcblx0XHRcdFx0XHRbJ2EnLCB7aWQ6J0NISUxEYV8yJywgaHJlZjonaHR0cDovL2dvb2dsZS5jb20nfSxcblx0XHRcdFx0XHRcdFsndGV4dCcsIHtyZWY6J2NoaWxkQV8yXzEnLCB0ZXh0OidOZXcgVGV4dCd9XVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0Y2hpbGRDOlxuXHRcdFx0XHRcdFsnZGl2JywgcmVmOidjaGlsZEQnXVxuXHRcdFx0XSwge3ZhbHVlOid0aGVWYWx1ZSd9XG5cdFx0XHRcblx0XHRcdHRlbXBsYXRlQ29weTIgPSB0ZW1wbGF0ZU1haW4uZXh0ZW5kIGNoaWxkcmVuOlxuXHRcdFx0XHRjaGlsZEE6XG5cdFx0XHRcdFx0Y2hpbGRyZW46IG5ld0NoaWxkOiBbJ2RpdiddXG5cdFx0XHRcdGNoaWxkQV8yOlxuXHRcdFx0XHRcdFsnYScsIHtpZDonQ0hJTERhXzInLCBocmVmOidodHRwOi8vZ29vZ2xlLmNvbSd9LFxuXHRcdFx0XHRcdFx0Wyd0ZXh0Jywge3JlZjonY2hpbGRBXzJfMScsIHRleHQ6J05ldyBUZXh0J31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRjaGlsZEM6XG5cdFx0XHRcdFx0WydkaXYnLCByZWY6J2NoaWxkRCddXG5cblx0XHRcdGV4cGVjdCh0eXBlb2YgdGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQV8yXzEpLm5vdC50by5lcXVhbCAndW5kZWZpbmVkJ1xuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHRlbXBsYXRlTWFpbi5jaGlsZCkubGVuZ3RoKS50by5lcXVhbCg2KVxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHRlbXBsYXRlQ29weS5jaGlsZCkubGVuZ3RoKS50by5lcXVhbCg4KVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmRpdkEpLnRvLmVxdWFsIHRlbXBsYXRlQ29weVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEEpLnRvLmVxdWFsIHRlbXBsYXRlQ29weS5jaGlsZHJlblswXVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEEudHlwZSkudG8uZXF1YWwgJ2Zvcm0nXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQV8xKS50by5lcXVhbCB0ZW1wbGF0ZUNvcHkuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGRBXzIpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5DSElMRGFfMikudG8uZXF1YWwgdGVtcGxhdGVDb3B5LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzFdXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQV8yXzEpLnRvLmVxdWFsIHRlbXBsYXRlQ29weS5jaGlsZHJlblswXS5jaGlsZHJlblsxXS5jaGlsZHJlblswXVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEFfMl8xLm9wdGlvbnMudGV4dCkudG8uZXF1YWwgJ05ldyBUZXh0J1xuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEJfMSkudG8uZXF1YWwgdGVtcGxhdGVDb3B5LmNoaWxkcmVuWzFdLmNoaWxkcmVuWzBdXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQl8yKS50by5lcXVhbCB0ZW1wbGF0ZUNvcHkuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMV1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGRDKS50by5lcXVhbCB1bmRlZmluZWRcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGREKS50by5lcXVhbCB0ZW1wbGF0ZUNvcHkuY2hpbGRyZW5bMl1cblxuXHRcdFx0cmVuZGVyZWQgPSB0ZW1wbGF0ZUNvcHkuc3Bhd24oKS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHJlbmRlcmVkLmNoaWxkKS5sZW5ndGgpLnRvLmVxdWFsKDgpXG5cdFx0XHRleHBlY3QocmVuZGVyZWQuY2hpbGQuY2hpbGRCXzIpLnRvLmVxdWFsIHJlbmRlcmVkLmNoaWxkcmVuWzFdLmNoaWxkcmVuWzFdXG5cdFx0XHRleHBlY3QocmVuZGVyZWQuY2hpbGQuY2hpbGRBLnJhdykudG8uaGF2ZS5zdHlsZSAnZGlzcGxheScsICdpbmxpbmUtYmxvY2snXG5cdFx0XHRleHBlY3QocmVuZGVyZWQuY2hpbGQuQ0hJTERhXzIucHJvcCgnaHJlZicpKS50by5jb250YWluICdodHRwOi8vZ29vZ2xlLmNvbSdcblx0XHRcdGV4cGVjdChyZW5kZXJlZC5jaGlsZC5jaGlsZEJfMS5wcm9wKCd2YWx1ZScpKS50by5lcXVhbCgndGhlVmFsdWUnKVxuXHRcdFx0ZXhwZWN0KHJlbmRlcmVkLmNoaWxkLmNoaWxkRC5hdHRyKCdkYXRhLXJlZicpKS50by5lcXVhbCgnY2hpbGREJylcblxuXG5cdFx0dGVzdCBcIlRlbXBsYXRlcyBjYW4gYmUgcGFzc2VkIGFzIHJlcGxhY2VtZW50L25ldyBjaGlsZHJlbiBpbiB7cmVmOm5ld0NoaWxkfSBleHRlbnNpb24gbWFwc1wiLCAoKS0+XG5cdFx0XHRjaGlsZEEgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFsnZGl2Jywge2lkOidjaGlsZEEnfSxcblx0XHRcdFx0XHRbJ3NwYW4nLCB7cmVmOidjaGlsZEFfMSd9XVxuXHRcdFx0XHRcdFsnZGl2Jywge3JlZjonY2hpbGRBXzInLCBpZDonY2hpbGRBXzInfV1cblx0XHRcdFx0XVxuXHRcdFx0KVxuXHRcdFx0Y2hpbGRCID0gRG9tLnRlbXBsYXRlKFxuXHRcdFx0XHRbJ2RpdicsIHJlZjonY2hpbGRCJywgXG5cdFx0XHRcdFx0WydzcGFuJywge3JlZjonY2hpbGRCXzEnfV1cblx0XHRcdFx0XHRbJ3RleHQnLCB7aWQ6J2NoaWxkQl8yJywgdGV4dDonVGhlIFRleHQnfV1cblx0XHRcdFx0XVxuXHRcdFx0KVxuXHRcdFx0Y2hpbGRDID0gRG9tLnRlbXBsYXRlKFxuXHRcdFx0XHRbJ2RpdicsIHtpZDonY2hpbGRDJ30sIFxuXHRcdFx0XHRcdFsnc3BhbicsIHtyZWY6J2NoaWxkQ18xJ31dXG5cdFx0XHRcdFx0Wyd0ZXh0Jywge2lkOidjaGlsZENfMicsIHRleHQ6J1RoZSBUZXh0J31dXG5cdFx0XHRcdF1cblx0XHRcdClcblx0XHRcdHRlbXBsYXRlTWFpbiA9IFxuXHRcdFx0XHREb20udGVtcGxhdGUgWydkaXYnLCB7aWQ6J2RpdkEnfSxcblx0XHRcdFx0XHRjaGlsZEEsXG5cdFx0XHRcdFx0Y2hpbGRCXG5cdFx0XHRcdF1cblx0XHRcdHRlbXBsYXRlQ29weSA9IHRlbXBsYXRlTWFpbi5leHRlbmQgWydzZWN0aW9uJywgbnVsbCwgXG5cdFx0XHRcdGNoaWxkQTogdHlwZTogJ2Zvcm0nXG5cdFx0XHRcdGNoaWxkQjogY2hpbGRCLmV4dGVuZChyZWY6J0NoaWxkQicpXG5cdFx0XHRcdGNoaWxkQzogY2hpbGRDLmV4dGVuZChyZWY6J0NoaWxkQycpXG5cdFx0XHRdLCB7dmFsdWU6J3RoZVZhbHVlJ31cblxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHRlbXBsYXRlTWFpbi5jaGlsZCkubGVuZ3RoKS50by5lcXVhbCg3KVxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHRlbXBsYXRlQ29weS5jaGlsZCkubGVuZ3RoKS50by5lcXVhbCgxMClcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZU1haW4uY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgyKVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDMpXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmRpdkEpLnRvLmVxdWFsIHRlbXBsYXRlQ29weVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEEpLnRvLmVxdWFsIHRlbXBsYXRlQ29weS5jaGlsZHJlblswXVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEEudHlwZSkudG8uZXF1YWwgJ2Zvcm0nXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLkNoaWxkQikudG8uZXF1YWwgdGVtcGxhdGVDb3B5LmNoaWxkcmVuWzFdXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQl8xKS50by5lcXVhbCB0ZW1wbGF0ZUNvcHkuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGRCXzIpLnRvLmVxdWFsIHRlbXBsYXRlQ29weS5jaGlsZHJlblsxXS5jaGlsZHJlblsxXVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlTWFpbi5jaGlsZC5jaGlsZEMpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEMpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5DaGlsZEMpLnRvLmVxdWFsIHRlbXBsYXRlQ29weS5jaGlsZHJlblsyXVxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHRlbXBsYXRlTWFpbi5zcGF3bigpLmNoaWxkKS5sZW5ndGgpLnRvLmVxdWFsKDcpXG5cdFx0XHRleHBlY3QoT2JqZWN0LmtleXModGVtcGxhdGVDb3B5LnNwYXduKCkuY2hpbGQpLmxlbmd0aCkudG8uZXF1YWwoMTApXG5cblxuXHRcdHRlc3QgXCJyZWYtY2hpbGRyZW4gbWFwcyBzaG91bGRuJ3QgYmUgbW9kaWZpZWQgYnkgdGhlIHRlbXBsYXRlIGV4dGVuZGVyXCIsICgpLT5cblx0XHRcdGNvbmZpZyA9IGNoaWxkcmVuOiBjaGlsZEFfMToge3R5cGU6J2RpdicsIG9wdGlvbnM6IHtzdHlsZToge2Rpc3BsYXk6J25vbmUnfX19XG5cdFx0XHR0ZW1wbGF0ZUEgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFsnZGl2Jywge3JlZjonZGl2QSd9XG5cdFx0XHRcdFx0WydkaXYnLCB7cmVmOidjaGlsZEEnfVxuXHRcdFx0XHRcdFx0WydzcGFuJywge3JlZjonY2hpbGRBXzEnfV1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdF1cblx0XHRcdClcblx0XHRcdHRlbXBsYXRlQS5jaGlsZC5jaGlsZEFfMVxuXHRcdFx0dGVtcGxhdGVCID0gdGVtcGxhdGVBLmV4dGVuZCgpXG5cdFx0XHR0ZW1wbGF0ZUMgPSB0ZW1wbGF0ZUEuZXh0ZW5kKGNvbmZpZylcblx0XHRcdHRlbXBsYXRlRCA9IHRlbXBsYXRlQS5leHRlbmQoY29uZmlnKVxuXHRcdFx0c3Bhd25BID0gdGVtcGxhdGVBLnNwYXduKCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdHNwYXduQiA9IHRlbXBsYXRlQi5zcGF3bigpLmFwcGVuZFRvKHNhbmRib3gpXG5cdFx0XHRzcGF3bkMgPSB0ZW1wbGF0ZUMuc3Bhd24oKS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0c3Bhd25EID0gdGVtcGxhdGVELnNwYXduKCkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdGV4cGVjdChzcGF3bkEuY2hpbGQuY2hpbGRBXzEudHlwZSkudG8uZXF1YWwgJ3NwYW4nXG5cdFx0XHRleHBlY3Qoc3Bhd25BLmNoaWxkLmNoaWxkQV8xLnN0eWxlICdkaXNwbGF5JykudG8uZXF1YWwgJ2lubGluZSdcblx0XHRcdGV4cGVjdChzcGF3bkIuY2hpbGQuY2hpbGRBXzEudHlwZSkudG8uZXF1YWwgJ3NwYW4nXG5cdFx0XHRleHBlY3Qoc3Bhd25CLmNoaWxkLmNoaWxkQV8xLnN0eWxlICdkaXNwbGF5JykudG8uZXF1YWwgJ2lubGluZSdcblx0XHRcdGV4cGVjdChzcGF3bkMuY2hpbGQuY2hpbGRBXzEudHlwZSkudG8uZXF1YWwgJ2Rpdidcblx0XHRcdGV4cGVjdChzcGF3bkMuY2hpbGQuY2hpbGRBXzEuc3R5bGUgJ2Rpc3BsYXknKS50by5lcXVhbCAnbm9uZSdcblx0XHRcdGV4cGVjdChzcGF3bkQuY2hpbGQuY2hpbGRBXzEudHlwZSkudG8uZXF1YWwgJ2Rpdidcblx0XHRcdGV4cGVjdChzcGF3bkQuY2hpbGQuY2hpbGRBXzEuc3R5bGUgJ2Rpc3BsYXknKS50by5lcXVhbCAnbm9uZSdcblxuXHRcdHRlc3QgXCJOdWxsIHZhbHVlcyBpbiByZWYtY2hpbGRyZW4gbWFwIHdpbGwgcmVtb3ZlIHRoZSBjaGlsZCBmcm9tIHRoZSB0ZW1wbGF0ZVwiLCAoKS0+XG5cdFx0XHR0ZW1wbGF0ZU1haW4gPSBcblx0XHRcdFx0RG9tLnRlbXBsYXRlIFsnZGl2Jywge2lkOidkaXZBJ30sXG5cdFx0XHRcdFx0WydkaXYnLCB7aWQ6J2NoaWxkQSd9LFxuXHRcdFx0XHRcdFx0WydzcGFuJywge3JlZjonY2hpbGRBXzEnfV1cblx0XHRcdFx0XHRcdFsnZGl2Jywge3JlZjonY2hpbGRBXzInLCBpZDonY2hpbGRBXzInfV1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0WydkaXYnLCB7cmVmOidjaGlsZEInfSwgXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7cmVmOidjaGlsZEJfMSd9XVxuXHRcdFx0XHRcdFx0Wyd0ZXh0Jywge2lkOidjaGlsZEJfMicsIHRleHQ6J1RoZSBUZXh0J31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFsnZGl2Jywge2lkOidjaGlsZEMnfSwgXG5cdFx0XHRcdFx0XHRbJ3NwYW4nLCB7cmVmOidjaGlsZENfMSd9XVxuXHRcdFx0XHRcdFx0Wyd0ZXh0Jywge2lkOidjaGlsZENfMicsIHRleHQ6J1RoZSBUZXh0J31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRdXG5cdFx0XHR0ZW1wbGF0ZUNvcHkgPSB0ZW1wbGF0ZU1haW4uZXh0ZW5kIFsnc2VjdGlvbicsIG51bGwsIFxuXHRcdFx0XHRjaGlsZEE6XG5cdFx0XHRcdFx0dHlwZTogJ2Zvcm0nXG5cdFx0XHRcdFx0b3B0aW9uczpcblx0XHRcdFx0XHRcdHN0eWxlOiBkaXNwbGF5OiAnaW5saW5lLWJsb2NrJ1xuXG5cdFx0XHRcdGNoaWxkQV8xOiBudWxsXG5cdFx0XHRcdGNoaWxkQV8yOlxuXHRcdFx0XHRcdFsnYScsIHtpZDonQ0hJTERhXzInLCBocmVmOidodHRwOi8vZ29vZ2xlLmNvbSd9LFxuXHRcdFx0XHRcdFx0Wyd0ZXh0Jywge3JlZjonY2hpbGRBXzJfMScsIHRleHQ6J05ldyBUZXh0J31dXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHRjaGlsZEJfMTogbnVsbFxuXHRcdFx0XHRjaGlsZEM6IG51bGxcblx0XHRcdF1cblxuXHRcdFx0ZXhwZWN0KHR5cGVvZiB0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGRBXzJfMSkubm90LnRvLmVxdWFsICd1bmRlZmluZWQnXG5cdFx0XHRleHBlY3QoT2JqZWN0LmtleXModGVtcGxhdGVNYWluLmNoaWxkKS5sZW5ndGgpLnRvLmVxdWFsKDEwKVxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHRlbXBsYXRlQ29weS5jaGlsZCkubGVuZ3RoKS50by5lcXVhbCg2KVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDIpXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmRpdkEpLnRvLmVxdWFsIHRlbXBsYXRlQ29weVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEEpLnRvLmVxdWFsIHRlbXBsYXRlQ29weS5jaGlsZHJlblswXVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEEudHlwZSkudG8uZXF1YWwgJ2Zvcm0nXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKDEpXG5cdFx0XHRleHBlY3QodGVtcGxhdGVNYWluLmNoaWxkLmNoaWxkQV8xKS50by5lcXVhbCB0ZW1wbGF0ZU1haW4uY2hpbGQuY2hpbGRBXzFcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGRBXzEpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQ29weS5jaGlsZC5jaGlsZEFfMikudG8uZXF1YWwgdW5kZWZpbmVkXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLkNISUxEYV8yKS50by5lcXVhbCB0ZW1wbGF0ZUNvcHkuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGRBXzJfMSkudG8uZXF1YWwgdGVtcGxhdGVDb3B5LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQV8yXzEub3B0aW9ucy50ZXh0KS50by5lcXVhbCAnTmV3IFRleHQnXG5cdFx0XHRleHBlY3QodGVtcGxhdGVDb3B5LmNoaWxkLmNoaWxkQl8xKS50by5lcXVhbCB1bmRlZmluZWRcblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGRCXzIpLnRvLmVxdWFsIHRlbXBsYXRlQ29weS5jaGlsZHJlblsxXS5jaGlsZHJlblswXVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlTWFpbi5jaGlsZC5jaGlsZEJfMSkudG8uZXF1YWwgdGVtcGxhdGVNYWluLmNoaWxkcmVuWzFdLmNoaWxkcmVuWzBdXG5cdFx0XHRleHBlY3QodGVtcGxhdGVNYWluLmNoaWxkLmNoaWxkQl8yKS50by5lcXVhbCB0ZW1wbGF0ZU1haW4uY2hpbGRyZW5bMV0uY2hpbGRyZW5bMV1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZU1haW4uY2hpbGQuY2hpbGRDKS50by5lcXVhbCB0ZW1wbGF0ZU1haW4uY2hpbGRyZW5bMl1cblx0XHRcdGV4cGVjdCh0ZW1wbGF0ZUNvcHkuY2hpbGQuY2hpbGRDKS50by5lcXVhbCB1bmRlZmluZWRcblxuXG5cdFx0dGVzdCBcIk51bGwgdmFsdWVzIGluIG9wdGlvbnMgb2JqZWN0IHdpbGwgZGVsZXRlIGtleXMgZHVyaW5nIHRlbXBsYXRlIGV4dGVuc2lvblwiLCAoKS0+XG5cdFx0XHR0ZW1wbGF0ZUEgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdHJlZjogJ3RoZURpdidcblx0XHRcdFx0XHRjb21wdXRlcnM6XG5cdFx0XHRcdFx0XHR2YWx1ZUE6ICgpLT4gMVxuXHRcdFx0XHRcdFx0dmFsdWVCOiAoKS0+IDJcblx0XHRcdFx0XHRcblx0XHRcdFx0XHRzdHlsZTpcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiAncmVsYXRpdmUnXG5cdFx0XHRcdFx0XHR3aWR0aDogMTAwXG5cdFx0XHRcdFx0XHRoZWlnaHQ6IDEwMFxuXHRcdFx0XHRcdFx0JGFjdGl2ZTpcblx0XHRcdFx0XHRcdFx0d2lkdGg6IDIwMFxuXHRcdFx0XHRcdFx0XHRoZWlnaHQ6IDIwMFxuXHRcdFx0XHRdXG5cdFx0XHQpXG5cdFx0XHR0ZW1wbGF0ZUIgPSB0ZW1wbGF0ZUEuZXh0ZW5kKFxuXHRcdFx0XHRvcHRpb25zOlxuXHRcdFx0XHRcdHJlZjogbnVsbFxuXHRcdFx0XHRcdGNvbXB1dGVyczpcblx0XHRcdFx0XHRcdHZhbHVlQTogbnVsbFxuXHRcdFx0XHRcdFx0dmFsdWVCOiAoKS0+IDNcblxuXHRcdFx0XHRcdHN0eWxlOlxuXHRcdFx0XHRcdFx0aGVpZ2h0OiBudWxsXG5cdFx0XHRcdFx0XHRvcGFjaXR5OiAxXG5cdFx0XHRcdFx0XHQkYWN0aXZlOlxuXHRcdFx0XHRcdFx0XHR3aWR0aDogbnVsbFxuXHRcdFx0KVxuXG5cdFx0XHRzcGF3bkEgPSB0ZW1wbGF0ZUEuc3Bhd24oKVxuXHRcdFx0c3Bhd25CID0gdGVtcGxhdGVCLnNwYXduKClcblxuXHRcdFx0ZXhwZWN0KHNwYXduQS5yZWYpLnRvLmVxdWFsICd0aGVEaXYnXG5cdFx0XHRleHBlY3Qoc3Bhd25CLnJlZikudG8uZXF1YWwgdW5kZWZpbmVkXG5cdFx0XHRleHBlY3QodHlwZW9mIHNwYXduQS5vcHRpb25zLmNvbXB1dGVycy52YWx1ZUEpLnRvLmVxdWFsICdmdW5jdGlvbidcblx0XHRcdGV4cGVjdCh0eXBlb2Ygc3Bhd25CLm9wdGlvbnMuY29tcHV0ZXJzLnZhbHVlQSkudG8uZXF1YWwgJ3VuZGVmaW5lZCdcblx0XHRcdGV4cGVjdCh0eXBlb2Ygc3Bhd25BLm9wdGlvbnMuY29tcHV0ZXJzLnZhbHVlQikudG8uZXF1YWwgJ2Z1bmN0aW9uJ1xuXHRcdFx0ZXhwZWN0KHR5cGVvZiBzcGF3bkIub3B0aW9ucy5jb21wdXRlcnMudmFsdWVCKS50by5lcXVhbCAnZnVuY3Rpb24nXG5cdFx0XHRleHBlY3Qoc3Bhd25BLm9wdGlvbnMuY29tcHV0ZXJzLnZhbHVlQigpKS50by5lcXVhbCAyXG5cdFx0XHRleHBlY3Qoc3Bhd25CLm9wdGlvbnMuY29tcHV0ZXJzLnZhbHVlQigpKS50by5lcXVhbCAzXG5cdFx0XHRleHBlY3Qoc3Bhd25BLm9wdGlvbnMuc3R5bGUucG9zaXRpb24pLnRvLmVxdWFsICdyZWxhdGl2ZSdcblx0XHRcdGV4cGVjdChzcGF3bkIub3B0aW9ucy5zdHlsZS5wb3NpdGlvbikudG8uZXF1YWwgJ3JlbGF0aXZlJ1xuXHRcdFx0ZXhwZWN0KHNwYXduQS5vcHRpb25zLnN0eWxlLndpZHRoKS50by5lcXVhbCAxMDBcblx0XHRcdGV4cGVjdChzcGF3bkIub3B0aW9ucy5zdHlsZS53aWR0aCkudG8uZXF1YWwgMTAwXG5cdFx0XHRleHBlY3Qoc3Bhd25BLm9wdGlvbnMuc3R5bGUuaGVpZ2h0KS50by5lcXVhbCAxMDBcblx0XHRcdGV4cGVjdChzcGF3bkIub3B0aW9ucy5zdHlsZS5oZWlnaHQpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KHNwYXduQS5vcHRpb25zLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KHNwYXduQi5vcHRpb25zLnN0eWxlLm9wYWNpdHkpLnRvLmVxdWFsIDFcblx0XHRcdGV4cGVjdChzcGF3bkEub3B0aW9ucy5zdHlsZS4kYWN0aXZlLndpZHRoKS50by5lcXVhbCAyMDBcblx0XHRcdGV4cGVjdChzcGF3bkIub3B0aW9ucy5zdHlsZS4kYWN0aXZlLndpZHRoKS50by5lcXVhbCB1bmRlZmluZWRcblx0XHRcdGV4cGVjdChzcGF3bkEub3B0aW9ucy5zdHlsZS4kYWN0aXZlLmhlaWdodCkudG8uZXF1YWwgMjAwXG5cdFx0XHRleHBlY3Qoc3Bhd25CLm9wdGlvbnMuc3R5bGUuJGFjdGl2ZS5oZWlnaHQpLnRvLmVxdWFsIDIwMFxuXG5cblx0XHR0ZXN0IFwiV2hlbiBzcGF3bmluZyBlbGVtZW50cyB0aGUgb3B0aW9ucyBvYmplY3QgcGFzc2VkIHRvIHRoZSBzcGF3bnMgc2hvdWxkIGJlIGEgY2xvbmUgb2YgdGhlIHRlbXBsYXRlJ3Mgb3B0aW9uc1wiLCAoKS0+XG5cdFx0XHR0ZW1wbGF0ZUEgPSBEb20udGVtcGxhdGUgWydkaXYnLCBzdHlsZTp7ZGlzcGxheTonYmxvY2snfV1cblx0XHRcdHRlbXBsYXRlQiA9IERvbS50ZW1wbGF0ZSBbJ2RpdicsIHN0eWxlOntkaXNwbGF5OidibG9jayd9XVxuXHRcdFx0c3Bhd25BID0gdGVtcGxhdGVBLnNwYXduKHJlZjonYScpICMgUGFzc2VkIG9wdGlvbnMgdG8gbWVyZ2Ugd2l0aCBvcmlnXG5cdFx0XHRzcGF3bkIgPSB0ZW1wbGF0ZUEuc3Bhd24oKVxuXG5cdFx0XHRleHBlY3Qoc3Bhd25BLm9wdGlvbnMpLm5vdC50by5lcXVhbCh0ZW1wbGF0ZUEub3B0aW9ucylcblx0XHRcdGV4cGVjdChzcGF3bkEub3B0aW9ucy5zdHlsZSkubm90LnRvLmVxdWFsKHRlbXBsYXRlQS5vcHRpb25zLnN0eWxlKVxuXHRcdFx0ZXhwZWN0KHRlbXBsYXRlQS5vcHRpb25zLnN0eWxlLiRiYXNlKS50by5lcXVhbCh1bmRlZmluZWQpXG5cblx0XHRcdGV4cGVjdChzcGF3bkIub3B0aW9ucykubm90LnRvLmVxdWFsKHRlbXBsYXRlQi5vcHRpb25zKVxuXHRcdFx0ZXhwZWN0KHNwYXduQi5vcHRpb25zLnN0eWxlKS5ub3QudG8uZXF1YWwodGVtcGxhdGVCLm9wdGlvbnMuc3R5bGUpXG5cdFx0XHRleHBlY3QodGVtcGxhdGVCLm9wdGlvbnMuc3R5bGUuJGJhc2UpLnRvLmVxdWFsKHVuZGVmaW5lZClcblxuXG5cdFx0dGVzdCBcIlRlbXBsYXRlcyB3aWxsIGJlIHNwYXduZWQgd2hlbiBhcHBlbmRlZCB0byBET00gZWxlbWVudHNcIiwgKCktPlxuXHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoWydzcGFuJywge3JlZjondGhlU3Bhbid9LCAnc29tZVRleHQnXSlcblx0XHRcdGRpdiA9IERvbS5kaXYobnVsbCwgJ2xhYmVsOiAnKVxuXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwgMVxuXHRcdFx0ZXhwZWN0KGRpdi50ZXh0KS50by5lcXVhbCAnbGFiZWw6ICdcblx0XHRcdGRpdi5hcHBlbmQgdGVtcGxhdGVcblx0XHRcdGV4cGVjdChkaXYuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCAyXG5cdFx0XHRleHBlY3QoZGl2LnRleHQpLnRvLmVxdWFsICdsYWJlbDogc29tZVRleHQnXG5cdFx0XHRkaXYucHJlcGVuZCB0ZW1wbGF0ZVxuXHRcdFx0ZXhwZWN0KGRpdi5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsIDNcblx0XHRcdGV4cGVjdChkaXYudGV4dCkudG8uZXF1YWwgJ3NvbWVUZXh0bGFiZWw6IHNvbWVUZXh0J1xuXG5cblx0XHRzdWl0ZSBcIkRhdGEgY29tcHV0ZXJzXCIsICgpLT5cblx0XHRcdHRlc3QgXCJUZW1wbGF0ZXMgYWNjZXB0IG9wdGlvbnMuY29tcHV0ZXJzIGZuIG1hcCB3aGljaCB3aWxsIGJlIGludm9rZWQgd2l0aCBwcm92aWRlZCBvcHRpb25zLmRhdGEgdXBvbiBzcGF3bmluZ1wiLCAoKS0+XG5cdFx0XHRcdHJlY2VpdmVkRGF0YSA9IG51bGxcblx0XHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRjb21wdXRlcnM6ICdzb21lTGFiZWwnOiAoZGF0YSktPiByZWNlaXZlZERhdGEgPSBkYXRhIG9yICdub3RoaW5nJ1xuXHRcdFx0XHRcdF1cblx0XHRcdFx0KVxuXG5cdFx0XHRcdGV4cGVjdChyZWNlaXZlZERhdGEpLnRvLmVxdWFsKG51bGwpXG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKClcblx0XHRcdFx0ZXhwZWN0KHJlY2VpdmVkRGF0YSkudG8uZXF1YWwobnVsbClcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKHtkYXRhOidzb21lTGFiZWwnOid3b3Jrcyd9KVxuXHRcdFx0XHRleHBlY3QocmVjZWl2ZWREYXRhKS50by5lcXVhbCgnd29ya3MnKVxuXG5cblx0XHRcdHRlc3QgXCJDb21wdXRlcnMgd2lsbCBiZSBoYXZlIHRoZSBzcGF3bmVkIFF1aWNrRWxlbWVudCBpbnN0YW5jZSBhcyB0aGVpciBjb250ZXh0XCIsICgpLT5cblx0XHRcdFx0Y29udGV4dCA9IG51bGxcblx0XHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRjb21wdXRlcnM6ICdzb21lTGFiZWwnOiAoZGF0YSktPiBjb250ZXh0ID0gdGhpc1xuXHRcdFx0XHRcdF1cblx0XHRcdFx0KVxuXG5cdFx0XHRcdGV4cGVjdChjb250ZXh0KS50by5lcXVhbChudWxsKVxuXHRcdFx0XHR0ZW1wbGF0ZS5zcGF3bigpXG5cdFx0XHRcdGV4cGVjdChjb250ZXh0KS50by5lcXVhbChudWxsKVxuXHRcdFx0XHRcblx0XHRcdFx0aW5zdGFuY2UgPSB0ZW1wbGF0ZS5zcGF3bih7ZGF0YTonc29tZUxhYmVsJzp1bmRlZmluZWR9KVxuXHRcdFx0XHRleHBlY3QoY29udGV4dCkudG8uZXF1YWwoaW5zdGFuY2UpXG5cblxuXHRcdFx0dGVzdCBcIlZhbHVlcyBzcGVjaWZpZWQgaW4gb3B0aW9ucy5kZWZhdWx0cyB3aWxsIGJlIHVzZWQgaWYgbm90IHNwZWNpZmllZCBpbiBvcHRpb25zLmRhdGEgdXBvbiBzcGF3bmluZ1wiLCAoKS0+XG5cdFx0XHRcdHJlc3VsdHMgPSB7fVxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdGNvbXB1dGVyczpcblx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogKGRhdGEpLT4gcmVzdWx0cy5maXJzdCA9IGRhdGEudG9Mb3dlckNhc2UoKVxuXHRcdFx0XHRcdFx0XHQnc2Vjb25kJzogKGRhdGEpLT4gcmVzdWx0cy5zZWNvbmQgPSBkYXRhLnRvTG93ZXJDYXNlKClcblx0XHRcdFx0XHRcdFx0J3RoaXJkJzogKGRhdGEpLT4gcmVzdWx0cy50aGlyZCA9IGRhdGEudG9Mb3dlckNhc2UoKVxuXHRcdFx0XHRcdFx0ZGVmYXVsdHM6XG5cdFx0XHRcdFx0XHRcdCdmaXJzdCc6ICdmaXJzdFZhbHVlIGhlcmUnXG5cdFx0XHRcdFx0XHRcdCd0aGlyZCc6ICd0aGlyZFZhbHVlIGhlcmUnXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHQpXG5cdFx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsKHt9KVxuXHRcdFx0XHR0ZW1wbGF0ZS5zcGF3bigpXG5cdFx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsKHtmaXJzdDonZmlyc3R2YWx1ZSBoZXJlJywgdGhpcmQ6J3RoaXJkdmFsdWUgaGVyZSd9KVxuXHRcdFx0XHRcblx0XHRcdFx0aW5zdGFuY2UgPSB0ZW1wbGF0ZS5zcGF3bih7ZGF0YTondGhpcmQnOidjdXN0b212YWx1ZSBoZXJlJ30pXG5cdFx0XHRcdGV4cGVjdChyZXN1bHRzKS50by5kZWVwLmVxdWFsKHtmaXJzdDonZmlyc3R2YWx1ZSBoZXJlJywgdGhpcmQ6J2N1c3RvbXZhbHVlIGhlcmUnfSlcblxuXG5cdFx0XHR0ZXN0IFwiVmFsdWVzIGNhbiBiZSBvZiBhbnkgdHlwZVwiLCAoKS0+XG5cdFx0XHRcdHJlc3VsdHMgPSB7fVxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdGNvbXB1dGVyczpcblx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogKGRhdGEpLT4gcmVzdWx0cy5maXJzdCA9IGRhdGFcblx0XHRcdFx0XHRcdFx0J3NlY29uZCc6IChkYXRhKS0+IHJlc3VsdHMuc2Vjb25kID0gZGF0YVxuXHRcdFx0XHRcdFx0XHQndGhpcmQnOiAoZGF0YSktPiByZXN1bHRzLnRoaXJkID0gZGF0YVxuXHRcdFx0XHRcdFx0XHQnZm91cnRoJzogKGRhdGEpLT4gcmVzdWx0cy5mb3VydGggPSBkYXRhXG5cdFx0XHRcdFx0XHRcdCdmaWZ0aCc6IChkYXRhKS0+IHJlc3VsdHMuZmlmdGggPSBkYXRhXG5cdFx0XHRcdFx0XHRcdCdzaXh0aCc6IChkYXRhKS0+IHJlc3VsdHMuc2l4dGggPSBkYXRhXG5cdFx0XHRcdFx0XHRkZWZhdWx0czpcblx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogWydhYmMnLCAnMTIzJ11cblx0XHRcdFx0XHRcdFx0J3RoaXJkJzoge2E6MSwgYjoxMn1cblx0XHRcdFx0XHRcdFx0J3NpeHRoJzogOTk5XG5cdFx0XHRcdFx0XVxuXHRcdFx0XHQpXG5cblx0XHRcdFx0XG5cdFx0XHRcdGluc3RhbmNlID0gdGVtcGxhdGUuc3Bhd24oZGF0YTpcblx0XHRcdFx0XHQnc2Vjb25kJzogbnVsbFxuXHRcdFx0XHRcdCdmb3VydGgnOiAxOVxuXHRcdFx0XHRcdCdmaWZ0aCc6IGZhbHNlXG5cdFx0XHRcdFx0J3NpeHRoJzogdW5kZWZpbmVkXG5cdFx0XHRcdClcblx0XHRcdFx0ZXhwZWN0KHJlc3VsdHMpLnRvLmRlZXAuZXF1YWxcblx0XHRcdFx0XHRmaXJzdDogWydhYmMnLCAnMTIzJ11cblx0XHRcdFx0XHRzZWNvbmQ6IG51bGxcblx0XHRcdFx0XHR0aGlyZDoge2E6MSwgYjoxMn1cblx0XHRcdFx0XHRmb3VydGg6IDE5XG5cdFx0XHRcdFx0ZmlmdGg6IGZhbHNlXG5cdFx0XHRcdFx0c2l4dGg6IHVuZGVmaW5lZFxuXG5cdFx0XHRcdGV4cGVjdChPYmplY3Qua2V5cyhyZXN1bHRzKS5sZW5ndGgpLnRvLmVxdWFsKDYpXG5cblxuXHRcdFx0dGVzdCBcIlZhbHVlcyBpbiBvcHRpb25zLmRhdGEgdGhhdCBkbyBub3QgaGF2ZSBhIG1hdGNoaW5nIGNvbXB1dGVyIHdpbGwgYmUgc2tpcHBlZFwiLCAoKS0+XG5cdFx0XHRcdHJlc3VsdHMgPSB7fVxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdGNvbXB1dGVyczpcblx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogKGRhdGEpLT4gcmVzdWx0cy5maXJzdCA9IGRhdGFcblx0XHRcdFx0XHRcdFx0J3NlY29uZCc6IChkYXRhKS0+IHJlc3VsdHMuc2Vjb25kID0gZGF0YVxuXHRcdFx0XHRcdFx0XHQndGhpcmQnOiAoZGF0YSktPiByZXN1bHRzLnRoaXJkID0gZGF0YVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0KVxuXG5cdFx0XHRcdFxuXHRcdFx0XHRpbnN0YW5jZSA9IHRlbXBsYXRlLnNwYXduKGRhdGE6XG5cdFx0XHRcdFx0J2ZpcnN0JzogJ2ZpcnN0IHZhbHVlJ1xuXHRcdFx0XHRcdCdzZWNvbmQnOiAnc2Vjb25kIHZhbHVlJ1xuXHRcdFx0XHRcdCd0aGlyZCc6ICd0aGlyZCB2YWx1ZSdcblx0XHRcdFx0XHQnZm91cnRoJzogJ2ZvdXJ0aCB2YWx1ZSdcblx0XHRcdFx0KVxuXHRcdFx0XHRleHBlY3QocmVzdWx0cykudG8uZGVlcC5lcXVhbFxuXHRcdFx0XHRcdCdmaXJzdCc6ICdmaXJzdCB2YWx1ZSdcblx0XHRcdFx0XHQnc2Vjb25kJzogJ3NlY29uZCB2YWx1ZSdcblx0XHRcdFx0XHQndGhpcmQnOiAndGhpcmQgdmFsdWUnXG5cblx0XHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHJlc3VsdHMpLmxlbmd0aCkudG8uZXF1YWwoMylcblxuXG5cdFx0XHR0ZXN0IFwiQ29tcHV0ZXJzIGluIHRlbXBsYXRlIGNoaWxkcmVuIHdpbGwgcmVjZWl2ZSB0aGUgcGFyZW50J3Mgb3B0aW9ucy5kYXRhXCIsICgpLT5cblx0XHRcdFx0cmVzdWx0cyA9IHBhcmVudDp7fSwgY2hpbGRBOnt9LCBjaGlsZEI6e30sIGNoaWxkQzp7fVxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdGNvbXB1dGVyczpcblx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogKGRhdGEpLT4gcmVzdWx0cy5wYXJlbnQuZmlyc3QgPSBkYXRhXG5cdFx0XHRcdFx0XHRcdCdzZWNvbmQnOiAoZGF0YSktPiByZXN1bHRzLnBhcmVudC5zZWNvbmQgPSBkYXRhXG5cdFx0XHRcdFx0XHRcdCd0aGlyZCc6IChkYXRhKS0+IHJlc3VsdHMucGFyZW50LnRoaXJkID0gZGF0YVxuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdFx0Y29tcHV0ZXJzOlxuXHRcdFx0XHRcdFx0XHRcdCdmaXJzdCc6IChkYXRhKS0+IHJlc3VsdHMuY2hpbGRBLmZpcnN0ID0gZGF0YVxuXHRcdFx0XHRcdFx0XHRcdCdzZWNvbmQnOiAoZGF0YSktPiByZXN1bHRzLmNoaWxkQS5zZWNvbmQgPSBkYXRhXG5cdFx0XHRcdFx0XHRcdFx0J3RoaXJkJzogKGRhdGEpLT4gcmVzdWx0cy5jaGlsZEEudGhpcmQgPSBkYXRhXG5cdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRbJ2RpdicsIG51bGwsXG5cdFx0XHRcdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdFx0XHRcdGNvbXB1dGVyczpcblx0XHRcdFx0XHRcdFx0XHRcdCdmaXJzdCc6IChkYXRhKS0+IHJlc3VsdHMuY2hpbGRCLmZpcnN0ID0gZGF0YVxuXHRcdFx0XHRcdFx0XHRcdFx0J2ZvdXJ0aCc6IChkYXRhKS0+IHJlc3VsdHMuY2hpbGRCLmZvdXJ0aCA9IGRhdGFcblx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdFx0XHRjb21wdXRlcnM6XG5cdFx0XHRcdFx0XHRcdFx0XHQnZmlyc3QnOiAoZGF0YSktPiByZXN1bHRzLmNoaWxkQy5maXJzdCA9IGRhdGFcblx0XHRcdFx0XHRcdFx0XHRcdCdzaXh0aCc6IChkYXRhKS0+IHJlc3VsdHMuY2hpbGRDLnNpeHRoID0gZGF0YVxuXHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHQpXG5cblx0XHRcdFx0XG5cdFx0XHRcdGluc3RhbmNlID0gdGVtcGxhdGUuc3Bhd24oZGF0YTpcblx0XHRcdFx0XHQnZmlyc3QnOiAnZmlyc3QgdmFsdWUnXG5cdFx0XHRcdFx0J3NlY29uZCc6ICdzZWNvbmQgdmFsdWUnXG5cdFx0XHRcdFx0J3RoaXJkJzogJ3RoaXJkIHZhbHVlJ1xuXHRcdFx0XHRcdCdmb3VydGgnOiAnZm91cnRoIHZhbHVlJ1xuXHRcdFx0XHQpXG5cdFx0XHRcdGV4cGVjdChyZXN1bHRzLnBhcmVudCkudG8uZGVlcC5lcXVhbFxuXHRcdFx0XHRcdCdmaXJzdCc6ICdmaXJzdCB2YWx1ZSdcblx0XHRcdFx0XHQnc2Vjb25kJzogJ3NlY29uZCB2YWx1ZSdcblx0XHRcdFx0XHQndGhpcmQnOiAndGhpcmQgdmFsdWUnXG5cdFx0XHRcdFxuXHRcdFx0XHRleHBlY3QocmVzdWx0cy5jaGlsZEEpLnRvLmRlZXAuZXF1YWxcblx0XHRcdFx0XHQnZmlyc3QnOiAnZmlyc3QgdmFsdWUnXG5cdFx0XHRcdFx0J3NlY29uZCc6ICdzZWNvbmQgdmFsdWUnXG5cdFx0XHRcdFx0J3RoaXJkJzogJ3RoaXJkIHZhbHVlJ1xuXHRcdFx0XHRcblx0XHRcdFx0ZXhwZWN0KHJlc3VsdHMuY2hpbGRCKS50by5kZWVwLmVxdWFsXG5cdFx0XHRcdFx0J2ZpcnN0JzogJ2ZpcnN0IHZhbHVlJ1xuXHRcdFx0XHRcdCdmb3VydGgnOiAnZm91cnRoIHZhbHVlJ1xuXHRcdFx0XHRcblx0XHRcdFx0ZXhwZWN0KHJlc3VsdHMuY2hpbGRDKS50by5kZWVwLmVxdWFsXG5cdFx0XHRcdFx0J2ZpcnN0JzogJ2ZpcnN0IHZhbHVlJ1xuXG5cblx0XHRcdHRlc3QgXCJQYXJlbnQgZGVmYXVsdHMgd2lsbCBub3QgYmUgcGFzc2VkIHRvIGNoaWxkcmVuXCIsICgpLT5cblx0XHRcdFx0cmVzdWx0cyA9IHBhcmVudDp7fSwgY2hpbGQ6e31cblx0XHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRjb21wdXRlcnM6XG5cdFx0XHRcdFx0XHRcdCdmaXJzdCc6IChkYXRhKS0+IHJlc3VsdHMucGFyZW50LmZpcnN0ID0gZGF0YVxuXHRcdFx0XHRcdFx0XHQnc2Vjb25kJzogKGRhdGEpLT4gcmVzdWx0cy5wYXJlbnQuc2Vjb25kID0gZGF0YVxuXHRcdFx0XHRcdFx0XHQndGhpcmQnOiAoZGF0YSktPiByZXN1bHRzLnBhcmVudC50aGlyZCA9IGRhdGFcblx0XHRcdFx0XHRcdGRlZmF1bHRzOlxuXHRcdFx0XHRcdFx0XHQnc2Vjb25kJzogJ3NlY29uZCB2YWx1ZSdcblx0XHRcdFx0XHRcdFx0J2ZvdXJ0aCc6ICdmb3VydGggdmFsdWUnXG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdFx0XHRjb21wdXRlcnM6XG5cdFx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogKGRhdGEpLT4gcmVzdWx0cy5jaGlsZC5maXJzdCA9IGRhdGFcblx0XHRcdFx0XHRcdFx0XHQnc2Vjb25kJzogKGRhdGEpLT4gcmVzdWx0cy5jaGlsZC5zZWNvbmQgPSBkYXRhXG5cdFx0XHRcdFx0XHRcdFx0J3RoaXJkJzogKGRhdGEpLT4gcmVzdWx0cy5jaGlsZC50aGlyZCA9IGRhdGFcblx0XHRcdFx0XHRcdFx0XHQnZm91cnRoJzogKGRhdGEpLT4gcmVzdWx0cy5jaGlsZC5mb3VydGggPSBkYXRhXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRzOlxuXHRcdFx0XHRcdFx0XHRcdCdmaXJzdCc6ICdmaXJzdCB2YWx1ZSdcblx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdClcblx0XHRcdFx0XG5cdFx0XHRcdGluc3RhbmNlID0gdGVtcGxhdGUuc3Bhd24oZGF0YTpcblx0XHRcdFx0XHQndGhpcmQnOiAndGhpcmQgdmFsdWUnXG5cdFx0XHRcdClcblx0XHRcdFx0ZXhwZWN0KHJlc3VsdHMucGFyZW50KS50by5kZWVwLmVxdWFsXG5cdFx0XHRcdFx0J3NlY29uZCc6ICdzZWNvbmQgdmFsdWUnXG5cdFx0XHRcdFx0J3RoaXJkJzogJ3RoaXJkIHZhbHVlJ1xuXHRcdFx0XHRcblx0XHRcdFx0ZXhwZWN0KHJlc3VsdHMuY2hpbGQpLnRvLmRlZXAuZXF1YWxcblx0XHRcdFx0XHQnZmlyc3QnOiAnZmlyc3QgdmFsdWUnXG5cdFx0XHRcdFx0J3RoaXJkJzogJ3RoaXJkIHZhbHVlJ1xuXG5cblx0XHRcdHRlc3QgXCJEZWZhdWx0cyBzaG91bGQgb25seSBiZSBhcHBsaWVkIG9uY2VcIiwgKCktPlxuXHRcdFx0XHRjb3VudCA9IHBhcmVudDowLCBjaGlsZDowLCBjaGlsZENoaWxkOjBcblx0XHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRyZWY6ICdwYXJlbnQnXG5cdFx0XHRcdFx0XHRjb21wdXRlcnM6XG5cdFx0XHRcdFx0XHRcdCdmaXJzdCc6IChkYXRhKS0+IGNvdW50LnBhcmVudCsrXG5cdFx0XHRcdFx0XHRkZWZhdWx0czpcblx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogJ2ZpcnN0IHZhbHVlJ1xuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdFx0cmVmOiAnY2hpbGQnXG5cdFx0XHRcdFx0XHRcdGNvbXB1dGVyczpcblx0XHRcdFx0XHRcdFx0XHQnZmlyc3QnOiAoZGF0YSktPiBjb3VudC5wYXJlbnQrK1xuXHRcdFx0XHRcdFx0XHRcdCdzZWNvbmQnOiAoZGF0YSktPiBjb3VudC5jaGlsZCsrXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHRzOlxuXHRcdFx0XHRcdFx0XHRcdCdzZWNvbmQnOiAnc2Vjb25kIHZhbHVlJ1xuXHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRcdFx0cmVmOiAnY2hpbGQnXG5cdFx0XHRcdFx0XHRcdFx0Y29tcHV0ZXJzOlxuXHRcdFx0XHRcdFx0XHRcdFx0J2ZvdXJ0aCc6IChkYXRhKS0+IGNvdW50LmNoaWxkQ2hpbGQrK1xuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRzOlxuXHRcdFx0XHRcdFx0XHRcdFx0J2ZvdXJ0aCc6ICdmb3VydGggdmFsdWUnXG5cdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdClcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKGRhdGE6J3RoaXJkJzondGhpcmQgdmFsdWUnKVxuXHRcdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCBwYXJlbnQ6MSwgY2hpbGQ6MSwgY2hpbGRDaGlsZDoxXG5cdFx0XHRcdFxuXHRcdFx0XHR0ZW1wbGF0ZS5zcGF3bigpXG5cdFx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIHBhcmVudDoyLCBjaGlsZDoyLCBjaGlsZENoaWxkOjJcblxuXG5cdFx0XHR0ZXN0IFwiRGF0YS9kZWZhdWx0cyBzaG91bGQgYmUgYXBwbGllZCBldmVuIHdoZW4gcGFyZW50IGRvZXNuJ3QgaGF2ZSBjb21wdXRlcnNcIiwgKCktPlxuXHRcdFx0XHRjb3VudCA9IDBcblx0XHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFx0WydkaXYnLCBudWxsLFxuXHRcdFx0XHRcdFx0WydzZWN0aW9uJywgbnVsbCxcblx0XHRcdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRcdFx0Y29tcHV0ZXJzOlxuXHRcdFx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogKGRhdGEpLT4gY291bnQrK1xuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRzOlxuXHRcdFx0XHRcdFx0XHRcdFx0J2ZpcnN0JzogJ2ZpcnN0IHZhbHVlJ1xuXHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHQpXG5cdFx0XHRcdFxuXHRcdFx0XHR0ZW1wbGF0ZS5zcGF3bihkYXRhOidmaXJzdCc6J3NlY29uZCB2YWx1ZScpXG5cdFx0XHRcdGV4cGVjdChjb3VudCkudG8uZXF1YWwoMSlcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKClcblx0XHRcdFx0ZXhwZWN0KGNvdW50KS50by5lcXVhbCgyKVxuXG5cblx0XHRcdHRlc3QgXCJEYXRhIGNhbiBiZSByZS1hcHBsaWVkIHZpYSAuYXBwbHlEYXRhKGRhdGEpXCIsICgpLT5cblx0XHRcdFx0cmVzdWx0cyA9IHt9OyBjb3VudCA9IHthOjAsIGI6MCwgYzowLCBkOjAsIGU6MCwgZjowfVxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdGNvbXB1dGVyczpcblx0XHRcdFx0XHRcdFx0J2EnOiAoZGF0YSktPiByZXN1bHRzLmEgPSBkYXRhO1x0Y291bnQuYSsrXG5cdFx0XHRcdFx0XHRcdCdiJzogKGRhdGEpLT4gcmVzdWx0cy5iID0gZGF0YTtcdGNvdW50LmIrK1xuXHRcdFx0XHRcdFx0XHQnYyc6IChkYXRhKS0+IHJlc3VsdHMuYyA9IGRhdGE7XHRjb3VudC5jKytcblx0XHRcdFx0XHRcdFx0J2QnOiAoZGF0YSktPiByZXN1bHRzLmQgPSBkYXRhO1x0Y291bnQuZCsrXG5cdFx0XHRcdFx0XHRcdCdlJzogKGRhdGEpLT4gcmVzdWx0cy5lID0gZGF0YTtcdGNvdW50LmUrK1xuXHRcdFx0XHRcdFx0XHQnZic6IChkYXRhKS0+IHJlc3VsdHMuZiA9IGRhdGE7XHRjb3VudC5mKytcblx0XHRcdFx0XHRcdGRlZmF1bHRzOlxuXHRcdFx0XHRcdFx0XHQnYSc6IDFcblx0XHRcdFx0XHRcdFx0J2MnOiAzXG5cdFx0XHRcdFx0XHRcdCdmJzogNlxuXHRcdFx0XHRcdF1cblx0XHRcdFx0KVxuXG5cdFx0XHRcdFxuXHRcdFx0XHRpbnN0YW5jZSA9IHRlbXBsYXRlLnNwYXduKGRhdGE6IHtiOjIsIGQ6NCwgZTo1LCBmOjZ9KVxuXHRcdFx0XHRleHBlY3QocmVzdWx0cykudG8uZGVlcC5lcXVhbCB7YToxLCBiOjIsIGM6MywgZDo0LCBlOjUsIGY6Nn1cblx0XHRcdFx0ZXhwZWN0KGNvdW50KS50by5kZWVwLmVxdWFsIHthOjEsIGI6MSwgYzoxLCBkOjEsIGU6MSwgZjoxfVxuXG5cdFx0XHRcdGluc3RhbmNlLmFwcGx5RGF0YShhOjExLCBiOjIyLCBkOjQ0LCBlOjU1KVxuXHRcdFx0XHRleHBlY3QocmVzdWx0cykudG8uZGVlcC5lcXVhbCB7YToxMSwgYjoyMiwgYzozLCBkOjQ0LCBlOjU1LCBmOjZ9XG5cdFx0XHRcdGV4cGVjdChjb3VudCkudG8uZGVlcC5lcXVhbCB7YToyLCBiOjIsIGM6MiwgZDoyLCBlOjIsIGY6Mn1cblxuXG5cdFx0XHR0ZXN0IFwiVGhlICdfaW5pdCcgY29tcHV0ZXIgd2lsbCBiZSBydW4gYnkgZGVmYXVsdCBvbiB0ZW1wbGF0ZSBzcGF3biByZWdhcmRsZXNzIG9mIGRhdGFcIiwgKCktPlxuXHRcdFx0XHRjb3VudCA9IHt9XG5cdFx0XHRcdHRlbXBsYXRlID0gRG9tLnRlbXBsYXRlKFxuXHRcdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdFx0cmVmOiAnZGl2QSdcblx0XHRcdFx0XHRcdGNvbXB1dGVyczogX2luaXQ6ICgpLT4gY291bnRbQHJlZl0/PTA7IGNvdW50W0ByZWZdKytcblx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRcdHJlZjogJ2RpdkInXG5cdFx0XHRcdFx0XHRcdGRhdGE6IGZpcnN0OiAnMSdcblx0XHRcdFx0XHRcdFx0Y29tcHV0ZXJzOiBfaW5pdDogKCktPiBjb3VudFtAcmVmXT89MDsgY291bnRbQHJlZl0rK1xuXHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdFx0cmVmOiAnZGl2Qydcblx0XHRcdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRcdFx0cmVmOiAnZGl2RCdcblx0XHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdFx0XHRcdHJlZjogJ2RpdkUnXG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wdXRlcnM6IF9pbml0OiAoKS0+IGNvdW50W0ByZWZdPz0wOyBjb3VudFtAcmVmXSsrXG5cdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHQpXG5cdFx0XHRcdFxuXHRcdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCB7fVxuXHRcdFx0XHR0ZW1wbGF0ZS5zcGF3bigpXG5cdFx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIGRpdkE6MSwgZGl2QjoxLCBkaXZFOjFcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKClcblx0XHRcdFx0ZXhwZWN0KGNvdW50KS50by5lcWwgZGl2QToyLCBkaXZCOjIsIGRpdkU6MlxuXHRcdFx0XHRcblx0XHRcdFx0dGVtcGxhdGUuY2hpbGQuZGl2Qi5zcGF3bihkYXRhOnNlY29uZDonMicpXG5cdFx0XHRcdGV4cGVjdChjb3VudCkudG8uZXFsIGRpdkE6MiwgZGl2QjozLCBkaXZFOjJcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlLmNoaWxkLmRpdkMuc3Bhd24oKVxuXHRcdFx0XHRleHBlY3QoY291bnQpLnRvLmVxbCBkaXZBOjIsIGRpdkI6MywgZGl2RTozXG5cdFx0XHRcdFxuXHRcdFx0XHR0ZW1wbGF0ZS5jaGlsZC5kaXZDLnNwYXduKClcblx0XHRcdFx0ZXhwZWN0KGNvdW50KS50by5lcWwgZGl2QToyLCBkaXZCOjMsIGRpdkU6NFxuXG5cblx0XHRcdHRlc3QgXCJUaGUgJ19pbml0JyBjb21wdXRlciB3aWxsIGJlIHBhc3NlZCBhbGwgb2YgdGhlIGRhdGEgdGhlIHRlbXBsYXRlIHNwYXduIHJlY2VpdmVzXCIsICgpLT5cblx0XHRcdFx0cmVzdWx0ID0gZGl2QTp7fSwgZGl2Qjp7fVxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdHJlZjogJ2RpdkEnXG5cdFx0XHRcdFx0XHRjb21wdXRlcnM6XG5cdFx0XHRcdFx0XHRcdGhyZWY6IChocmVmKS0+IHJlc3VsdFtAcmVmXS5ocmVmID0gaHJlZlxuXHRcdFx0XHRcdFx0XHRuYW1lOiAobmFtZSktPiByZXN1bHRbQHJlZl0ubmFtZSA9IG5hbWVcblx0XHRcdFx0XHRcdFx0X2luaXQ6ICgpLT4gcmVzdWx0W0ByZWZdLl9pbml0ID0gYXJndW1lbnRzWzBdXG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdFx0XHRyZWY6ICdkaXZQcm94eSdcblx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdFx0XHRcdHJlZjogJ2RpdkInXG5cdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdHM6IGZpcnN0OiAnMSdcblx0XHRcdFx0XHRcdFx0XHRjb21wdXRlcnM6XG5cdFx0XHRcdFx0XHRcdFx0XHRocmVmOiAoaHJlZiktPiByZXN1bHRbQHJlZl0uaHJlZiA9IGhyZWZcblx0XHRcdFx0XHRcdFx0XHRcdG5hbWU6IChuYW1lKS0+IHJlc3VsdFtAcmVmXS5uYW1lID0gbmFtZVxuXHRcdFx0XHRcdFx0XHRcdFx0X2luaXQ6ICgpLT4gcmVzdWx0W0ByZWZdLl9pbml0ID0gYXJndW1lbnRzWzBdXG5cdFx0XHRcdFx0XHRcdF1cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdClcblx0XHRcdFx0ZXhwZWN0ZWQgPSBcblx0XHRcdFx0XHRocmVmOiAnYWJjJ1xuXHRcdFx0XHRcdG5hbWU6ICcxMjMnXG5cdFx0XHRcdFx0X2luaXQ6IHtocmVmOidhYmMnLCBuYW1lOicxMjMnLCB2YWx1ZTonZGVmJywgc2l6ZTonNDU2J31cblx0XHRcdFx0XG5cdFx0XHRcdFxuXHRcdFx0XHRleHBlY3QocmVzdWx0KS50by5lcWwgZGl2QTp7fSwgZGl2Qjp7fVxuXHRcdFx0XHRcblx0XHRcdFx0dGVtcGxhdGUuc3Bhd24oZGF0YTp7aHJlZjonYWJjJywgbmFtZTonMTIzJywgdmFsdWU6J2RlZicsIHNpemU6JzQ1Nid9KVxuXHRcdFx0XHRleHBlY3QocmVzdWx0KS50by5lcWwge2RpdkE6ZXhwZWN0ZWQsIGRpdkI6ZXhwZWN0ZWR9XG5cdFx0XHRcdFxuXHRcdFx0XHRkZWxldGUgcmVzdWx0LmRpdkFcblx0XHRcdFx0ZGl2QjogbnVsbFxuXHRcdFx0XHR0ZW1wbGF0ZS5jaGlsZC5kaXZCLnNwYXduKGRhdGE6e2hyZWY6J2FiYycsIG5hbWU6JzEyMycsIHZhbHVlOidkZWYnLCBzaXplOic0NTYnfSlcblx0XHRcdFx0ZXhwZWN0KHJlc3VsdCkudG8uZXFsIHtkaXZCOmV4cGVjdGVkfVxuXG5cblx0XHRcdHRlc3QgXCJEYXRhIGNhbiBiZSBzcGVjaWZpZWQgdmlhIG9wdGlvbnMgb2JqZWN0XCIsICgpLT5cblx0XHRcdFx0cmVjZWl2ZWREYXRhID0gbnVsbFxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERvbS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdGNvbXB1dGVyczogJ3NvbWVMYWJlbCc6IChkYXRhKS0+IHJlY2VpdmVkRGF0YSA9IGRhdGEgb3IgJ25vdGhpbmcnXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHQpXG5cdFx0XHRcdHRlbXBsYXRlQ29weSA9IHRlbXBsYXRlLmV4dGVuZChvcHRpb25zOmRhdGE6eydzb21lTGFiZWwnOid3b3Jrcyd9KVxuXG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKClcblx0XHRcdFx0ZXhwZWN0KHJlY2VpdmVkRGF0YSkudG8uZXF1YWwobnVsbClcblx0XHRcdFx0dGVtcGxhdGVDb3B5LnNwYXduKClcblx0XHRcdFx0ZXhwZWN0KHJlY2VpdmVkRGF0YSkudG8uZXF1YWwoJ3dvcmtzJylcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKG9wdGlvbnM6ZGF0YTp7J3NvbWVMYWJlbCc6J2Fsc28gd29ya3MnfSlcblx0XHRcdFx0ZXhwZWN0KHJlY2VpdmVkRGF0YSkudG8uZXF1YWwoJ2Fsc28gd29ya3MnKVxuXG5cblx0XHRcdHRlc3QgXCJEYXRhIHNwZWNpZmllZCBpbiBjaGlsZHJlbidzIG9wdGlvbnMgb2JqZWN0IHdpbGwgYmUgbWVyZ2VkIHdpdGggdGhlIHBhcmVudCdzIGRhdGFcIiwgKCktPlxuXHRcdFx0XHRyZWNlaXZlZERhdGEgPSBhYmM6bnVsbCwgZGVmOm51bGxcblx0XHRcdFx0dGVtcGxhdGUgPSBEb20udGVtcGxhdGUoXG5cdFx0XHRcdFx0WydkaXYnLCBudWxsXG5cblx0XHRcdFx0XHRcdFsnc3Bhbidcblx0XHRcdFx0XHRcdFx0ZGF0YTogYWJjOiAxMjNcblx0XHRcdFx0XHRcdFx0Y29tcHV0ZXJzOlxuXHRcdFx0XHRcdFx0XHRcdCdhYmMnOiAoZGF0YSktPiByZWNlaXZlZERhdGEuYWJjID0gZGF0YSBvciAnbm90aGluZydcblx0XHRcdFx0XHRcdFx0XHQnZGVmJzogKGRhdGEpLT4gcmVjZWl2ZWREYXRhLmRlZiA9IGRhdGEgb3IgJ25vdGhpbmcnXG5cdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XVxuXHRcdFx0XHQpXG5cdFx0XHRcdHRlbXBsYXRlQ29weSA9IHRlbXBsYXRlLmV4dGVuZChvcHRpb25zOmRhdGE6e2RlZjo0NTZ9KVxuXG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKClcblx0XHRcdFx0ZXhwZWN0KHJlY2VpdmVkRGF0YSkudG8uZXFsKGFiYzoxMjMsIGRlZjpudWxsKVxuXHRcdFx0XHRyZWNlaXZlZERhdGEgPSBhYmM6bnVsbCwgZGVmOm51bGxcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlQ29weS5zcGF3bigpXG5cdFx0XHRcdGV4cGVjdChyZWNlaXZlZERhdGEpLnRvLmVxbChhYmM6MTIzLCBkZWY6NDU2KVxuXHRcdFx0XHRyZWNlaXZlZERhdGEgPSBhYmM6bnVsbCwgZGVmOm51bGxcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKG9wdGlvbnM6ZGF0YTp7ZGVmOjc4OX0pXG5cdFx0XHRcdGV4cGVjdChyZWNlaXZlZERhdGEpLnRvLmVxbChhYmM6MTIzLCBkZWY6Nzg5KVxuXHRcdFx0XHRyZWNlaXZlZERhdGEgPSBhYmM6bnVsbCwgZGVmOm51bGxcblx0XHRcdFx0XG5cdFx0XHRcdHRlbXBsYXRlLnNwYXduKG9wdGlvbnM6ZGF0YTp7YWJjOjc4OX0pXG5cdFx0XHRcdGV4cGVjdChyZWNlaXZlZERhdGEpLnRvLmVxbChhYmM6Nzg5LCBkZWY6bnVsbClcblxuXG5cdFx0XHR0ZXN0IFwiRGF0YSB3b24ndCBiZSBwYXNzZWQgdG8gY2hpbGRyZW4gaWYgb3B0aW9ucy5wYXNzRGF0YVRvQ2hpbGRyZW4gaXMgZmFsc2VcIiwgKCktPlxuXHRcdFx0XHRyZWNlaXZlZERhdGEgPSBwYXJlbnQ6bnVsbCwgY2hpbGQ6bnVsbFxuXHRcdFx0XHR0ZW1wbGF0ZTEgPSBET00udGVtcGxhdGUoXG5cdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRjb21wdXRlcnM6IGFiYzogKGRhdGEpLT4gcmVjZWl2ZWREYXRhLnBhcmVudCA9IGRhdGFcblxuXHRcdFx0XHRcdFx0WydzcGFuJ1xuXHRcdFx0XHRcdFx0XHRjb21wdXRlcnM6IGFiYzogKGRhdGEpLT4gcmVjZWl2ZWREYXRhLmNoaWxkID0gZGF0YVxuXHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0KVxuXHRcdFx0XHR0ZW1wbGF0ZTIgPSB0ZW1wbGF0ZTEuZXh0ZW5kKHBhc3NEYXRhVG9DaGlsZHJlbjpmYWxzZSlcblx0XHRcdFx0XG5cdFx0XHRcdGV4cGVjdChyZWNlaXZlZERhdGEpLnRvLmVxbCBwYXJlbnQ6bnVsbCwgY2hpbGQ6bnVsbFxuXHRcdFx0XHRcblx0XHRcdFx0ZWwxID0gdGVtcGxhdGUxLnNwYXduKGRhdGE6e2FiYzoxMjN9KVxuXHRcdFx0XHRleHBlY3QocmVjZWl2ZWREYXRhKS50by5lcWwgcGFyZW50OjEyMywgY2hpbGQ6MTIzXG5cblx0XHRcdFx0cmVjZWl2ZWREYXRhID0gcGFyZW50Om51bGwsIGNoaWxkOm51bGxcblx0XHRcdFx0ZWwyID0gdGVtcGxhdGUyLnNwYXduKGRhdGE6e2FiYzoxMjN9KVxuXHRcdFx0XHRleHBlY3QocmVjZWl2ZWREYXRhKS50by5lcWwgcGFyZW50OjEyMywgY2hpbGQ6bnVsbFxuXHRcdFx0XHRcblx0XHRcdFx0cmVjZWl2ZWREYXRhID0gcGFyZW50Om51bGwsIGNoaWxkOm51bGxcblx0XHRcdFx0ZWwxLmFwcGx5RGF0YSh7YWJjOjQ1Nn0pXG5cdFx0XHRcdGV4cGVjdChyZWNlaXZlZERhdGEpLnRvLmVxbCBwYXJlbnQ6NDU2LCBjaGlsZDo0NTZcblx0XHRcdFx0XG5cdFx0XHRcdHJlY2VpdmVkRGF0YSA9IHBhcmVudDpudWxsLCBjaGlsZDpudWxsXG5cdFx0XHRcdGVsMi5hcHBseURhdGEoe2FiYzo0NTZ9KVxuXHRcdFx0XHRleHBlY3QocmVjZWl2ZWREYXRhKS50by5lcWwgcGFyZW50OjQ1NiwgY2hpbGQ6bnVsbFxuXHRcdFx0XHRcblx0XHRcdFx0ZWwyLmxhc3RDaGlsZC5hcHBseURhdGEoe2FiYzo3ODl9KVxuXHRcdFx0XHRleHBlY3QocmVjZWl2ZWREYXRhKS50by5lcWwgcGFyZW50OjQ1NiwgY2hpbGQ6Nzg5XG5cblxuXHRcdFx0dGVzdCBcIkRhdGEgc2hvdWxkIGJlIGludm9rZWQgZm9yIHBhcmVudHMgYWZ0ZXIgaW52b2tlZCBjaGlsZHJlblwiLCAoKS0+XG5cdFx0XHRcdGhpc3RvcnkgPSBbXVxuXHRcdFx0XHRjb21wdXRlcnMgPSBcblx0XHRcdFx0XHRfaW5pdDogKCktPiBoaXN0b3J5LnB1c2goQHJlZilcblx0XHRcdFx0XHRhYmM6ICgpLT4gaGlzdG9yeS5wdXNoKEByZWYpXG5cdFx0XHRcdFxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERPTS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdHtjb21wdXRlcnMsIGlkOidwYXJlbnQnfVxuXHRcdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRcdHtjb21wdXRlcnMsIGlkOidjaGlsZDEnfVxuXHRcdFx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdFx0XHR7Y29tcHV0ZXJzLCBpZDonY2hpbGQyJ31cblx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0WydkaXYnXG5cdFx0XHRcdFx0XHRcdHtjb21wdXRlcnMsIGlkOidjaGlsZDMnfVxuXHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0KVxuXHRcdFx0XHRleHBlY3QoaGlzdG9yeSkudG8uZXFsIFtdXG5cdFx0XHRcdGVsID0gdGVtcGxhdGUuc3Bhd24oKVxuXHRcdFx0XHRleHBlY3QoaGlzdG9yeSkudG8uZXFsIFsnY2hpbGQyJywgJ2NoaWxkMScsICdjaGlsZDMnLCAncGFyZW50J11cblxuXHRcdFx0XHRoaXN0b3J5Lmxlbmd0aCA9IDBcblx0XHRcdFx0ZWwuYXBwbHlEYXRhKGFiYzoxMjMpXG5cdFx0XHRcdGV4cGVjdChoaXN0b3J5KS50by5lcWwgWydjaGlsZDInLCAnY2hpbGQxJywgJ2NoaWxkMycsICdwYXJlbnQnXVxuXG5cblx0XHRcdHRlc3QgXCJDb21wdXRlcnMgd2lsbCBiZSBpbnZva2VkIG9ubHkgb25lIHRpbWUgcGVyIGVsZW1lbnQgaWYgb3B0aW9ucy5pbnZva2VDb21wdXRlcnNPbmNlIGlzIG9uXCIsICgpLT5cblx0XHRcdFx0aGlzdG9yeSA9IFtdXG5cdFx0XHRcdGNvbXB1dGVycyA9ICBhYmM6ICgpLT4gaGlzdG9yeS5wdXNoKEByZWYpXG5cdFx0XHRcdFxuXHRcdFx0XHR0ZW1wbGF0ZSA9IERPTS50ZW1wbGF0ZShcblx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdHtjb21wdXRlcnMsIGlkOidwYXJlbnQnLCBpbnZva2VDb21wdXRlcnNPbmNlOnRydWV9XG5cdFx0XHRcdFx0XHRbJ2Rpdidcblx0XHRcdFx0XHRcdFx0e2NvbXB1dGVycywgaWQ6J2NoaWxkMSd9XG5cdFx0XHRcdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdFx0XHRcdHtjb21wdXRlcnMsIGlkOidjaGlsZDInLCBpbnZva2VDb21wdXRlcnNPbmNlOnRydWV9XG5cdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFsnZGl2J1xuXHRcdFx0XHRcdFx0XHR7Y29tcHV0ZXJzLCBpZDonY2hpbGQzJ31cblx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRdXG5cdFx0XHRcdClcblx0XHRcdFx0ZXhwZWN0KGhpc3RvcnkpLnRvLmVxbCBbXVxuXHRcdFx0XHRlbCA9IHRlbXBsYXRlLnNwYXduKGRhdGE6YWJjOjEyMylcblx0XHRcdFx0ZXhwZWN0KGhpc3RvcnkpLnRvLmVxbCBbJ2NoaWxkMicsICdjaGlsZDEnLCAnY2hpbGQzJywgJ3BhcmVudCddXG5cblx0XHRcdFx0aGlzdG9yeS5sZW5ndGggPSAwXG5cdFx0XHRcdGVsLmFwcGx5RGF0YShhYmM6MTIzKVxuXHRcdFx0XHRleHBlY3QoaGlzdG9yeSkudG8uZXFsIFsnY2hpbGQxJywgJ2NoaWxkMyddXG5cblx0XHRcdFx0aGlzdG9yeS5sZW5ndGggPSAwXG5cdFx0XHRcdGVsLmFwcGx5RGF0YShhYmM6NDU2KVxuXHRcdFx0XHRleHBlY3QoaGlzdG9yeSkudG8uZXFsIFsnY2hpbGQxJywgJ2NoaWxkMyddXG5cblxuXG5cdHN1aXRlIFwiTWlzY1wiLCAoKS0+XG5cdFx0dGVzdCBcIlF1aWNrRG9tLmlzVGVtcGxhdGVcIiwgKCktPlxuXHRcdFx0ZXhwZWN0KERvbS5pc1RlbXBsYXRlIERvbS50ZW1wbGF0ZShbJ2RpdiddKSkudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KERvbS5pc1RlbXBsYXRlIERvbS5kaXYoKSkudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChEb20uaXNUZW1wbGF0ZSBEb20uZGl2KClbMF0pLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzVGVtcGxhdGUge30pLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzVGVtcGxhdGUgJ3N0cmluZycpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzVGVtcGxhdGUgNSkudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChEb20uaXNUZW1wbGF0ZSBmYWxzZSkudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChEb20uaXNUZW1wbGF0ZSB0cnVlKS50by5iZS5mYWxzZVxuXHRcdFxuXG5cdFx0dGVzdCBcIlF1aWNrRG9tLmlzUXVpY2tFbFwiLCAoKS0+XG5cdFx0XHRleHBlY3QoRG9tLmlzUXVpY2tFbCBEb20udGVtcGxhdGUoWydkaXYnXSkpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzUXVpY2tFbCBEb20uZGl2KCkpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChEb20uaXNRdWlja0VsIERvbS50ZXh0KCkpLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChEb20uaXNRdWlja0VsIERvbS5kaXYoKVswXSkudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChEb20uaXNRdWlja0VsIHt9KS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KERvbS5pc1F1aWNrRWwgJ3N0cmluZycpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzUXVpY2tFbCA1KS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KERvbS5pc1F1aWNrRWwgZmFsc2UpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzUXVpY2tFbCB0cnVlKS50by5iZS5mYWxzZVxuXHRcdFxuXG5cdFx0dGVzdCBcIlF1aWNrRG9tLmlzRWxcIiwgKCktPlxuXHRcdFx0ZXhwZWN0KERvbS5pc0VsIERvbS50ZW1wbGF0ZShbJ2RpdiddKSkudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChEb20uaXNFbCBEb20uZGl2KCkpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzRWwgRG9tLnRleHQoKSkudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChEb20uaXNFbCBEb20uZGl2KClbMF0pLnRvLmJlLnRydWVcblx0XHRcdGV4cGVjdChEb20uaXNFbCBEb20udGV4dCgpWzBdKS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KERvbS5pc0VsIHt9KS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KERvbS5pc0VsICdzdHJpbmcnKS50by5iZS5mYWxzZVxuXHRcdFx0ZXhwZWN0KERvbS5pc0VsIDUpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzRWwgZmFsc2UpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoRG9tLmlzRWwgdHJ1ZSkudG8uYmUuZmFsc2Vcblx0XHRcblxuXHRcdHRlc3QgXCJTdHJpbmdpZmljYXRpb25cIiwgKCktPlxuXHRcdFx0c2VjdGlvbiA9IERvbShcblx0XHRcdFx0WydzZWN0aW9uJyx7XG5cdFx0XHRcdFx0aWQ6ICd0aGVTZWN0aW9uJ1xuXHRcdFx0XHRcdGNsYXNzTmFtZTogJ3RoZVNlY3Rpb25DbGFzcydcblx0XHRcdFx0XHRzdHlsZTpcblx0XHRcdFx0XHRcdCdwb3NpdGlvbic6ICdyZWxhdGl2ZSdcblx0XHRcdFx0XHRcdCdvcGFjaXR5JzogMC41XG5cdFx0XHRcdFx0XHQnZm9udFNpemUnOiAoKS0+ICcyOXB4J1xuXHRcdFx0XHRcdFx0JGhhcHB5OlxuXHRcdFx0XHRcdFx0XHRmb250U2l6ZTogJzExcHgnXG5cdFx0XHRcdFx0XHRcdCRyZWxheGVkOlxuXHRcdFx0XHRcdFx0XHRcdGZvbnRTaXplOiAnOHB4J1xuXHRcdFx0XHR9XG5cdFx0XHRcdFx0WydkaXYnLCB7aWQ6J2NoaWxkQScsIHN0eWxlOnBvc2l0aW9uOidyZWxhdGl2ZSd9LCAnY2hpbGRBLWlubmVydGV4dCddXG5cdFx0XHRcdFx0J3NlY3Rpb24taW5uZXJ0ZXh0J1xuXHRcdFx0XHRcdFsnc3BhbicsIHtpZDonY2hpbGRCJywgcmVmOidjaGlsZEItcmVmIScsIHN0eWxlOnBvc2l0aW9uOidhYnNvbHV0ZSd9XG5cdFx0XHRcdFx0XHQnY2hpbGRCLWlubmVydGV4dCdcblx0XHRcdFx0XHRcdFsndGV4dCcsIHt0ZXh0OidjaGlsZEItaW5uZXJ0ZXh0IDInfV1cblx0XHRcdFx0XHRcdFsnYScsIHt1cmw6J2h0dHBzOi8vZ29vZ2xlLmNvbSd9XVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0XVxuXHRcdFx0KS5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0d2luZG93LnN0cmluZ2lmaWVkID0gSlNPTi5zdHJpbmdpZnkoc2VjdGlvbiwgbnVsbCwgMilcblx0XHRcdHNlY3Rpb25Db3B5ID0gRG9tKEpTT04ucGFyc2Uoc3RyaW5naWZpZWQpKS5hcHBlbmRUbyhzYW5kYm94KVxuXG5cdFx0XHRleHBlY3Qoc2VjdGlvbkNvcHkudHlwZSkudG8uZXF1YWwoc2VjdGlvbi50eXBlKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb25Db3B5LnJlZikudG8uZXF1YWwoc2VjdGlvbi5yZWYpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbkNvcHkuZWwuaWQpLnRvLmVxdWFsKHNlY3Rpb24uZWwuaWQpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbkNvcHkuZWwuY2xhc3NOYW1lKS50by5lcXVhbChzZWN0aW9uLmVsLmNsYXNzTmFtZSlcblx0XHRcdGV4cGVjdChzZWN0aW9uQ29weS5zdHlsZSAncG9zaXRpb24nKS50by5lcXVhbChzZWN0aW9uLnN0eWxlICdwb3NpdGlvbicpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbkNvcHkuc3R5bGUgJ29wYWNpdHknKS50by5lcXVhbChzZWN0aW9uLnN0eWxlICdvcGFjaXR5Jylcblx0XHRcdGV4cGVjdChzZWN0aW9uQ29weS5zdHlsZSAnZm9udFNpemUnKS5ub3QudG8uZXF1YWwoc2VjdGlvbi5zdHlsZSAnZm9udFNpemUnKVxuXHRcdFx0XG5cdFx0XHRzZWN0aW9uLnN0eWxlICdmb250U2l6ZScsIG51bGxcblx0XHRcdHNlY3Rpb24uc3RhdGUgJ2hhcHB5Jywgb25cblx0XHRcdHNlY3Rpb25Db3B5LnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRleHBlY3Qoc2VjdGlvbkNvcHkuc3R5bGUgJ2ZvbnRTaXplJykudG8uZXF1YWwoc2VjdGlvbi5zdHlsZSAnZm9udFNpemUnKVxuXHRcdFx0XG5cdFx0XHRzZWN0aW9uLnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdHNlY3Rpb25Db3B5LnN0YXRlICdyZWxheGVkJywgb25cblx0XHRcdGV4cGVjdChzZWN0aW9uQ29weS5zdHlsZSAnZm9udFNpemUnKS50by5lcXVhbChzZWN0aW9uLnN0eWxlICdmb250U2l6ZScpXG5cdFx0XHRcblx0XHRcdGV4cGVjdChzZWN0aW9uQ29weS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsKHNlY3Rpb24uY2hpbGRyZW4ubGVuZ3RoKVxuXHRcdFx0ZXhwZWN0KE9iamVjdC5rZXlzKHNlY3Rpb25Db3B5LmNoaWxkKS5sZW5ndGgpLnRvLmVxdWFsKE9iamVjdC5rZXlzKHNlY3Rpb24uY2hpbGQpLmxlbmd0aClcblx0XHRcdGV4cGVjdChzZWN0aW9uQ29weS50ZXh0KS50by5lcXVhbChzZWN0aW9uLnRleHQpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbkNvcHkuaHRtbCkudG8uZXF1YWwoc2VjdGlvbi5odG1sKVxuXHRcdFx0ZXhwZWN0KHNlY3Rpb25Db3B5LmNoaWxkcmVuWzBdLnN0eWxlICdwb3NpdGlvbicpLnRvLmVxdWFsKHNlY3Rpb24uY2hpbGRyZW5bMF0uc3R5bGUgJ3Bvc2l0aW9uJylcblx0XHRcdGV4cGVjdChzZWN0aW9uQ29weS5jaGlsZHJlblsyXS5zdHlsZSAncG9zaXRpb24nKS50by5lcXVhbChzZWN0aW9uLmNoaWxkcmVuWzJdLnN0eWxlICdwb3NpdGlvbicpXG5cdFx0XHRleHBlY3Qoc2VjdGlvbkNvcHkuY2hpbGRyZW5bMl0ucmVmKS50by5lcXVhbChzZWN0aW9uLmNoaWxkcmVuWzJdLnJlZilcblxuXG5cdFx0dGVzdCBcIkNoYWluaW5nXCIsICgpLT5cblx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXHRcdFx0Y2hhaW5SZXN1bHQgPSBkaXZcblx0XHRcdFx0LnN0YXRlKCdhYmMnLCBvbilcblx0XHRcdFx0LnJlc2V0U3RhdGUoKVxuXHRcdFx0XHQuc3R5bGUoKVxuXHRcdFx0XHQuY3NzKCd3aWR0aCcsIDEyKVxuXHRcdFx0XHQuYXR0cigndGVzdCcsIDEyMylcblx0XHRcdFx0LnByb3AoJ2Fub3RoZXJUZXN0JywgMTIzKVxuXHRcdFx0XHQudXBkYXRlU3RhdGVTdHlsZXMoe2hlaWdodDo1MH0pXG5cdFx0XHRcdC51cGRhdGVTdGF0ZVRleHRzKHskYmFzZTonYWJjJ30pXG5cdFx0XHRcdC5hcHBlbmQoKVxuXHRcdFx0XHQuYXBwZW5kVG8oKVxuXHRcdFx0XHQucHJlcGVuZCgpXG5cdFx0XHRcdC5wcmVwZW5kVG8oKVxuXHRcdFx0XHQuYmVmb3JlKClcblx0XHRcdFx0LmFmdGVyKClcblx0XHRcdFx0Lmluc2VydEJlZm9yZSgpXG5cdFx0XHRcdC5pbnNlcnRBZnRlcigpXG5cdFx0XHRcdC5kZXRhY2goKVxuXHRcdFx0XHQud3JhcChEb20uc2VjdGlvbigpKVxuXHRcdFx0XHQudW53cmFwKClcblx0XHRcdFx0LndyYXAoRG9tLmhlYWRlcigpKVxuXHRcdFx0XHQucmVwbGFjZSgpXG5cdFx0XHRcdC5hcHBlbmRUbyhzYW5kYm94KVxuXHRcdFx0XHQud3JhcChoZWFkPURvbS5oZWFkZXIoKSlcblx0XHRcdFx0Lm9uKCdhYmMnLCAoKS0+KVxuXHRcdFx0XHQuZW1pdCgnYWJjJylcblx0XHRcdFx0Lm9mZignYWJjJylcblx0XHRcdFx0Lm9mZigpXG5cblx0XHRcdGV4cGVjdChjaGFpblJlc3VsdCkudG8uZXF1YWwoZGl2KVxuXHRcdFx0ZXhwZWN0KHNhbmRib3guY2hpbGRyZW5bMF0pLnRvLmVxdWFsKGhlYWQuZWwpXG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkudG8uZXF1YWwoaGVhZClcblx0XHRcdGV4cGVjdChkaXYuY3NzICd3aWR0aCcpLnRvLmVxdWFsKCcxMnB4JylcblxuXG5cdFx0dGVzdCBcIkludmFsaWQgQXJndW1lbnRzXCIsICgpLT5cblx0XHRcdHRleHQgPSBEb20udGV4dCgnc29tZVRleHQnLCB7bG9zdE9wdHM6dHJ1ZX0pXG5cdFx0XHRkaXYgPSBEb20uZGl2KHtsb3N0T3B0czp0cnVlfSlcblxuXHRcdFx0ZXhwZWN0KERvbSgpKS50by5lcXVhbCB1bmRlZmluZWRcblx0XHRcdGV4cGVjdChEb20obnVsbCkpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KERvbSh7fSkpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KGRpdi51cGRhdGVPcHRpb25zKCkpLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KHRleHQub3B0aW9ucy5sb3N0T3B0cykudG8uZXF1YWwgdW5kZWZpbmVkXG5cdFx0XHRleHBlY3QoZGl2Lm9wdGlvbnMubG9zdE9wdHMpLnRvLmVxdWFsIHRydWVcblx0XHRcdGV4cGVjdChkaXYub24oKSkudG8uZXF1YWwgZGl2XG5cdFx0XHRleHBlY3QoZGl2Lm9uKCdhYmMnKSkudG8uZXF1YWwgZGl2XG5cdFx0XHRleHBlY3QoZGl2Lm9uKCdhYmMnLCB7fSkpLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi5vbmNlKCdhYmMnKSkudG8uZXF1YWwgZGl2XG5cdFx0XHRleHBlY3QoZGl2Lm9mZignc29tZXRoaW5nRmFrZScpKS50by5lcXVhbCBkaXZcblxuXHRcdFx0ZW1pdENvdW50ID0gMDsgZGl2Lm9uICdzb21ldGhpbmcnLCBjYj0oKS0+IGVtaXRDb3VudCsrXG5cdFx0XHRleHBlY3QoZGl2LmVtaXQoJycpKS50by5lcXVhbChkaXYpXG5cdFx0XHRleHBlY3QoZGl2LmVtaXQoKSkudG8uZXF1YWwoZGl2KVxuXHRcdFx0ZXhwZWN0KGRpdi5lbWl0UHJpdmF0ZSgnbm9uZScpKS50by5lcXVhbChkaXYpXG5cdFx0XHRleHBlY3QoZGl2LmVtaXRQcml2YXRlKCcnKSkudG8uZXF1YWwoZGl2KVxuXHRcdFx0ZXhwZWN0KGRpdi5lbWl0UHJpdmF0ZSgpKS50by5lcXVhbChkaXYpXG5cdFx0XHRleHBlY3QoZW1pdENvdW50KS50by5lcXVhbCgwKVxuXHRcdFx0ZXhwZWN0KGRpdi5lbWl0KCdzb21ldGhpbmcnKSkudG8uZXF1YWwoZGl2KVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwoMSlcblx0XHRcdGV4cGVjdChkaXYub2ZmKCdzb21ldGhpbmcnLCAoKS0+KSkudG8uZXF1YWwoZGl2KVxuXHRcdFx0ZXhwZWN0KGRpdi5lbWl0KCdzb21ldGhpbmcnKSkudG8uZXF1YWwoZGl2KVxuXHRcdFx0ZXhwZWN0KGVtaXRDb3VudCkudG8uZXF1YWwoMilcblxuXHRcdFx0ZGl2LmNzcyhudWxsLCAnMTI5Jylcblx0XHRcdGV4cGVjdChkaXYuZWwuc3R5bGUubnVsbCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlKCkpLnRvLmVxbCBbXVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZShudWxsLCBvbikpLnRvLmVxdWFsIHVuZGVmaW5lZFxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSgxMjMsIG9uKSkudG8uZXF1YWwgdW5kZWZpbmVkXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdiYXNlJywgb24pLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnYmFzZScpLnRvLmJlLmZhbHNlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICckd2hhdGV2cycsIG9uKS50by5lcXVhbCBkaXZcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ3doYXRldnMnKS50by5iZS50cnVlXG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdhbm90aGVyJykudG8uYmUuZmFsc2Vcblx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2Fub3RoZXInLCBvbikudG8uZXF1YWwgZGl2XG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdhbm90aGVyJykudG8uYmUudHJ1ZVxuXHRcdFx0ZXhwZWN0KGRpdi5zdGF0ZSAnYW5vdGhlcicsIHVuZGVmaW5lZCkudG8uZXF1YWwgZGl2XG5cdFx0XHRleHBlY3QoZGl2LnN0YXRlICdhbm90aGVyJykudG8uYmUuZmFsc2VcblxuXHRcdFx0ZXhwZWN0KGRpdi51cGRhdGVTdGF0ZVN0eWxlcyB7JGJhc2U6e3dpZHRoOjF9fSkudG8uZXF1YWwgZGl2XG5cdFx0XHRleHBlY3QoZGl2LnVwZGF0ZVN0YXRlU3R5bGVzIG51bGwpLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi51cGRhdGVTdGF0ZVRleHRzIHskYmFzZTonYWJjJ30pLnRvLmVxdWFsIGRpdlxuXHRcdFx0ZXhwZWN0KGRpdi51cGRhdGVTdGF0ZVRleHRzIG51bGwpLnRvLmVxdWFsIGRpdlxuXG5cdFx0XHRkaXYuYXBwZW5kVG8oRG9tIHNhbmRib3gpXG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkudG8uZXF1YWwoRG9tIHNhbmRib3gpXG5cblx0XHRcdGRpdi5hcHBlbmQodHJ1ZSlcblx0XHRcdGV4cGVjdChkaXYuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgwKVxuXHRcdFx0ZGl2LmFwcGVuZFRvKGRvY3VtZW50KVxuXHRcdFx0ZXhwZWN0KGRpdi5wYXJlbnQpLnRvLmVxdWFsKERvbSBzYW5kYm94KVxuXHRcdFx0ZGl2LnByZXBlbmQodHJ1ZSlcblx0XHRcdGV4cGVjdChkaXYuY2hpbGRyZW4ubGVuZ3RoKS50by5lcXVhbCgwKVxuXHRcdFx0ZGl2LnByZXBlbmRUbyh0cnVlKVxuXHRcdFx0ZXhwZWN0KGRpdi5wYXJlbnQpLnRvLmVxdWFsKERvbSBzYW5kYm94KVxuXHRcdFx0ZGl2LmFmdGVyKHRydWUpXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMClcblx0XHRcdGRpdi5pbnNlcnRBZnRlcigxMjMpXG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkudG8uZXF1YWwoRG9tIHNhbmRib3gpXG5cdFx0XHRkaXYuYmVmb3JlKHRydWUpXG5cdFx0XHRleHBlY3QoZGl2LmNoaWxkcmVuLmxlbmd0aCkudG8uZXF1YWwoMClcblx0XHRcdGRpdi5pbnNlcnRCZWZvcmUoMTIzKVxuXHRcdFx0ZXhwZWN0KGRpdi5wYXJlbnQpLnRvLmVxdWFsKERvbSBzYW5kYm94KVxuXHRcdFx0ZGl2LndyYXAoMTIzKVxuXHRcdFx0ZXhwZWN0KGRpdi5wYXJlbnQpLnRvLmVxdWFsKERvbSBzYW5kYm94KVxuXHRcdFx0ZGl2LnJlcGxhY2UoMTIzKVxuXHRcdFx0ZXhwZWN0KGRpdi5wYXJlbnQpLnRvLmVxdWFsKERvbSBzYW5kYm94KVxuXHRcdFx0ZGl2LmRldGFjaCgpXG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZGl2LnVud3JhcCgpXG5cdFx0XHRleHBlY3QoZGl2LnBhcmVudCkudG8uZXF1YWwodW5kZWZpbmVkKVxuXHRcdFx0ZXhwZWN0KERvbShzYW5kYm94KS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsIDBcblxuXHRcdFx0ZGl2LmFwcGVuZFRvKERvbSBzYW5kYm94KVxuXHRcdFx0ZXhwZWN0KERvbShzYW5kYm94KS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsIDFcblx0XHRcdGlmIERvbShzYW5kYm94KS5fcmVtb3ZlQ2hpbGRcblx0XHRcdFx0RG9tKHNhbmRib3gpLl9yZW1vdmVDaGlsZCh0ZXh0KVxuXHRcdFx0XHREb20oc2FuZGJveCkuX3JlbW92ZUNoaWxkKERvbS5kaXYoKSlcblx0XHRcdFx0ZXhwZWN0KERvbShzYW5kYm94KS5jaGlsZHJlbi5sZW5ndGgpLnRvLmVxdWFsIDFcblxuXHRcdFx0ZXhwZWN0ICgpLT4gRG9tLmJhdGNoKClcblx0XHRcdFx0LnRvLnRocm93KClcblx0XHRcdFxuXHRcdFx0ZXhwZWN0ICgpLT4gRG9tLmJhdGNoKHt9KVxuXHRcdFx0XHQudG8udGhyb3coKVxuXHRcdFx0XG5cdFx0XHRleHBlY3QgKCktPiBEb20uYmF0Y2goNTQzMilcblx0XHRcdFx0LnRvLnRocm93KClcblx0XHRcdFxuXHRcdFx0ZXhwZWN0ICgpLT4gRG9tLmJhdGNoKFtdKVxuXHRcdFx0XHQudG8udGhyb3coKVxuXHRcdFx0XG5cdFx0XHRleHBlY3QgKCktPiBEb20uYmF0Y2goWzEyXSkuYXBwZW5kKERvbS5kaXYoKSlcblx0XHRcdFx0LnRvLnRocm93KClcblx0XHRcdFxuXHRcdFx0ZXhwZWN0ICgpLT4gRG9tLmJhdGNoKFsxMl0pXG5cdFx0XHRcdC5ub3QudG8udGhyb3coKVxuXHRcdFx0XG5cdFx0XHQjIGV4cGVjdCAoKS0+IERvbS5iYXRjaCgkKCdkaXYnKSlcblx0XHRcdCMgXHQubm90LnRvLnRocm93KClcblxuXHRcdFx0ZXhwZWN0ICgpLT4gRG9tLnRlbXBsYXRlKClcblx0XHRcdFx0LnRvLnRocm93KClcblxuXHRcdFx0ZXhwZWN0ICgpLT4gRG9tLnRlbXBsYXRlKG51bGwpXG5cdFx0XHRcdC50by50aHJvdygpXG5cblx0XHRcdGV4cGVjdCAoKS0+IERvbS50ZW1wbGF0ZSh7fSlcblx0XHRcdFx0LnRvLnRocm93KClcblxuXHRcdFx0ZXhwZWN0ICgpLT4gRG9tLnRlbXBsYXRlKFs4NDgyLCB7Y2xhc3NOYW1lOid0J31dKVxuXHRcdFx0XHQudG8udGhyb3coKVxuXG5cdFx0XHRleHBlY3QgKCktPiBEb20udGVtcGxhdGUoWydkaXYnLCAnc29tZVN0cmluZyddKVxuXHRcdFx0XHQudG8udGhyb3coKVxuXG5cdFx0XHRleHBlY3QgKCktPiBEb20udGVtcGxhdGUoWydkaXYnLCBudWxsLCAnU29tZSBJbm5lciBUZXh0J10pXG5cdFx0XHRcdC5ub3QudG8udGhyb3coKVxuXG5cdFx0XHRleHBlY3QgKCktPiBEb20uZGl2KHN0eWxlOntvcGFjaXR5OjAuNSwgJ0BhYmMobWF4LXdpZHRoOjM5MCknOntvcGFjaXR5OjF9fSkuYXBwZW5kVG8oc2FuZGJveClcblx0XHRcdFx0Lm5vdC50by50aHJvdygpXG5cblx0XHRcdGV4cGVjdCgoKS0+XG5cdFx0XHRcdGRpdiA9IERvbS5kaXYoKVxuXHRcdFx0XHRkaXYucGlwZVN0YXRlKGRpdilcblx0XHRcdFx0ZGl2LnN0YXRlICdoYXBweScsIG9uXG5cdFx0XHRcdGV4cGVjdChkaXYuc3RhdGUgJ2hhcHB5JykudG8uZXF1YWwgb25cblx0XHRcdCkubm90LnRvLnRocm93KClcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbkhUTUxFbGVtZW50OjpvbkV2ZW50ID0gKGV2ZW50TmFtZSwgY2FsbGJhY2spLT5cblx0aWYgQGFkZEV2ZW50TGlzdGVuZXJcblx0XHRAYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKVxuXHRlbHNlXG5cdFx0QGF0dGFjaEV2ZW50KFwib24je2V2ZW50TmFtZX1cIiwgY2FsbGJhY2spXG5cblxuSFRNTEVsZW1lbnQ6OnJlbW92ZUV2ZW50ID0gKGV2ZW50TmFtZSwgY2FsbGJhY2spLT5cblx0aWYgQHJlbW92ZUV2ZW50TGlzdGVuZXJcblx0XHRAcmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKVxuXHRlbHNlXG5cdFx0QGRldGFjaEV2ZW50KFwib24je2V2ZW50TmFtZX1cIiwgY2FsbGJhY2spXG5cblxuSFRNTEVsZW1lbnQ6OmVtaXRFdmVudCA9IChldmVudE5hbWUpLT5cblx0ZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKVxuXHRldmVudC5pbml0RXZlbnQoZXZlbnROYW1lLCB0cnVlLCBmYWxzZSlcblx0QGRpc3BhdGNoRXZlbnQoZXZlbnQpXG5cblxuaWYgSFRNTEVsZW1lbnQubmFtZSBpc250ICdIVE1MRWxlbWVudCdcblx0SFRNTEVsZW1lbnQubmFtZSA9ICdIVE1MRWxlbWVudCdcblx0VGV4dC5uYW1lID0gJ1RleHQnXG5cdG5vbkVsZW1lbnRTdWZmaXggPSBbXG5cdFx0J09wdGlvbnNDb2xsZWN0aW9uJ1xuXHRcdCdGb3JtQ29udHJvbHNDb2xsZWN0aW9uJ1xuXHRcdCdEb2N1bWVudCdcblx0XHQnQ29sbGVjdGlvbidcblx0XHQnQWxsQ29sbGVjdGlvbidcblx0XVxuXHRlbGVtZW50U3VmZml4ID0gW1xuXHRcdFwiVmlkZW9cIixcIlVua25vd25cIixcIlVMaXN0XCIsXCJUcmFja1wiLFwiVGl0bGVcIixcblx0XHRcIlRleHRBcmVhXCIsXCJUZW1wbGF0ZVwiLFwiVGFibGVTZWN0aW9uXCIsXCJUYWJsZVJvd1wiLFxuXHRcdFwiVGFibGVcIixcIlRhYmxlQ29sXCIsXCJUYWJsZUNlbGxcIixcIlRhYmxlQ2FwdGlvblwiLFxuXHRcdFwiU3R5bGVcIixcIlNwYW5cIixcIlNvdXJjZVwiLFwiU2xvdFwiLFwiU2hhZG93XCIsXCJTZWxlY3RcIixcblx0XHRcIlNjcmlwdFwiLFwiUXVvdGVcIixcIlByb2dyZXNzXCIsXCJQcmVcIixcIlBpY3R1cmVcIixcblx0XHRcIlBhcmFtXCIsXCJQYXJhZ3JhcGhcIixcIk91dHB1dFwiLFwiT3B0aW9uXCIsXCJPcHRHcm91cFwiLFxuXHRcdFwiT2JqZWN0XCIsXCJPTGlzdFwiLFwiTW9kXCIsXCJNZXRlclwiLFwiTWV0YVwiLFwiTWVudVwiLFxuXHRcdFwiTWVkaWFcIixcIk1hcnF1ZWVcIixcIk1hcFwiLFwiTGlua1wiLFwiTGVnZW5kXCIsXCJMYWJlbFwiLFxuXHRcdFwiTElcIixcIklucHV0XCIsXCJJbWFnZVwiLFwiSUZyYW1lXCIsXCJIdG1sXCIsXCJIZWFkaW5nXCIsXG5cdFx0XCJIZWFkXCIsXCJIUlwiLFwiRnJhbWVTZXRcIixcIkZyYW1lXCIsXCJGb3JtXCIsXCJGb250XCIsXG5cdFx0XCJGaWVsZFNldFwiLFwiRW1iZWRcIixcIkRpdlwiLFwiRGlyZWN0b3J5XCIsXCJEaWFsb2dcIixcblx0XHRcIkRldGFpbHNcIixcIkRhdGFMaXN0XCIsXCJETGlzdFwiLFwiQ29udGVudFwiLFwiQ2FudmFzXCIsXG5cdFx0XCJCdXR0b25cIixcIkJvZHlcIixcIkJhc2VcIixcIkJSXCIsXCJBdWRpb1wiLFwiQXJlYVwiLFwiQW5jaG9yXCJcblx0XVxuXG5cdGZvciBjcmVhdG9yIGluIG5vbkVsZW1lbnRTdWZmaXhcblx0XHR3aW5kb3dbXCJIVE1MI3tjcmVhdG9yfVwiXT8ubmFtZSA9IFwiSFRNTCN7Y3JlYXRvcn1cIlxuXG5cdGZvciBjcmVhdG9yIGluIGVsZW1lbnRTdWZmaXhcblx0XHR3aW5kb3dbXCJIVE1MI3tjcmVhdG9yfUVsZW1lbnRcIl0/Lm5hbWUgPSBcIkhUTUwje2NyZWF0b3J9RWxlbWVudFwiXG5cblx0d2luZG93LlNWR0VsZW1lbnQ/Lm5hbWUgPSAnU1ZHRWxlbWVudCdcblx0d2luZG93LlNWR1NWR0VsZW1lbnQ/Lm5hbWUgPSAnU1ZHU1ZHRWxlbWVudCdcblx0d2luZG93LlNWR1BvbHlsaW5lRWxlbWVudD8ubmFtZSA9ICdTVkdQb2x5bGluZUVsZW1lbnQnXG5cbndpbmRvdy5DbGllbnRSZWN0ID89IERPTVJlY3RcblxuXG5cblxuIiwie1xuICBcIm5hbWVcIjogXCJxdWlja2RvbVwiLFxuICBcInZlcnNpb25cIjogXCIxLjAuODlcIixcbiAgXCJkZXNjcmlwdGlvblwiOiBcIkZhc3QgJiBsaWdodCBET00gZWxlbWVudCBtYW5hZ2VtZW50IHN1cHBvcnRpbmcganF1ZXJ5LWxpa2UgbWV0aG9kcywgdGVtcGxhdGVzLCAmIHN0YXRlLWJhc2VkIHN0eWxpbmdcIixcbiAgXCJtYWluXCI6IFwiZGlzdC9xdWlja2RvbS5qc1wiLFxuICBcImJyb3dzZXJcIjoge1xuICAgIFwiLi9kZWJ1Z1wiOiBcImRpc3QvcXVpY2tkb20uZGVidWcuanNcIixcbiAgICBcIi4vZGlzdC9xdWlja2RvbS5qc1wiOiBcInNyYy9pbmRleC5jb2ZmZWVcIlxuICB9LFxuICBcImJyb3dzZXJpZnlcIjoge1xuICAgIFwidHJhbnNmb3JtXCI6IFtcbiAgICAgIFwic2ltcGx5aW1wb3J0L2NvbXBhdFwiXG4gICAgXVxuICB9LFxuICBcInNpbXBseWltcG9ydFwiOiB7XG4gICAgXCJmaW5hbFRyYW5zZm9ybVwiOiBbXG4gICAgICBbXG4gICAgICAgIFwiYmFiZWxpZnlcIixcbiAgICAgICAge1xuICAgICAgICAgIFwicHJlc2V0c1wiOiBbXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFwiQGJhYmVsL3ByZXNldC1lbnZcIixcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwibW9kdWxlc1wiOiBmYWxzZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCIuY29uZmlnL3RyYW5zZm9ybXMvbWluaWZ5LXN1cGVyXCIsXG4gICAgICBcIi5jb25maWcvdHJhbnNmb3Jtcy9taW5pZnktcmVuYW1lXCIsXG4gICAgICBcIi5jb25maWcvdHJhbnNmb3Jtcy9taW5pZnktc2ltcGxlXCJcbiAgICBdXG4gIH0sXG4gIFwiZGlyZWN0b3JpZXNcIjoge1xuICAgIFwidGVzdFwiOiBcInRlc3RcIlxuICB9LFxuICBcInNjcmlwdHNcIjoge1xuICAgIFwicG9zdHZlcnNpb25cIjogXCJucG0gcnVuIGJ1aWxkICYmIGdpdCBhZGQgLiAmJiBnaXQgY29tbWl0IC1hIC1tICdbQnVpbGRdJ1wiLFxuICAgIFwicHJlcHVibGlzaE9ubHlcIjogXCJucG0gcnVuIHRlc3Q6dHJhdmlzXCIsXG4gICAgXCJwb3N0cHVibGlzaFwiOiBcImdpdCBwdXNoXCIsXG4gICAgXCJ3YXRjaFwiOiBcImNha2UgLWQgd2F0Y2hcIixcbiAgICBcImJ1aWxkXCI6IFwiY2FrZSAtZCBidWlsZCAmJiBjYWtlIGJ1aWxkICYmIGNha2UgbWVhc3VyZSAmJiBjcCAtciBidWlsZC8qIGRpc3QvXCIsXG4gICAgXCJ0ZXN0XCI6IFwibnBtIHJ1biB0ZXN0OmJyb3dzZXIgLXMgfHwgdHJ1ZVwiLFxuICAgIFwidGVzdDp0cmF2aXNcIjogXCJucG0gcnVuIHRlc3Q6YnJvd3NlciAtcyAmJiBucG0gcnVuIHRlc3Q6bWluaWZpZWQgLXNcIixcbiAgICBcInRlc3Q6bG9jYWxcIjogXCJvcGVuIHRlc3QvdGVzdHJ1bm5lci5odG1sXCIsXG4gICAgXCJ0ZXN0Om1pbmlmaWVkXCI6IFwibWluaWZpZWQ9MSBucG0gcnVuIHRlc3Q6YnJvd3NlciAtcyB8fCB0cnVlXCIsXG4gICAgXCJ0ZXN0Omthcm1hXCI6IFwiY2FrZSBpbnN0YWxsOnRlc3Q7ICAga2FybWEgc3RhcnQgLmNvbmZpZy9rYXJtYS5jb25mLmNvZmZlZVwiLFxuICAgIFwidGVzdDpicm93c2VyXCI6IFwiY2FrZSBpbnN0YWxsOnRlc3Q7IGthcm1hIHN0YXJ0IC0tc2luZ2xlLXJ1biAtLWJyb3dzZXJzIEVsZWN0cm9uIC5jb25maWcva2FybWEuY29uZi5jb2ZmZWVcIixcbiAgICBcInRlc3Q6Y2hyb21lXCI6IFwiY2FrZSBpbnN0YWxsOnRlc3Q7ICBrYXJtYSBzdGFydCAtLXNpbmdsZS1ydW4gLS1icm93c2VycyBDaHJvbWUgLmNvbmZpZy9rYXJtYS5jb25mLmNvZmZlZVwiLFxuICAgIFwidGVzdDpmaXJlZm94XCI6IFwiY2FrZSBpbnN0YWxsOnRlc3Q7IGthcm1hIHN0YXJ0IC0tc2luZ2xlLXJ1biAtLWJyb3dzZXJzIEZpcmVmb3ggLmNvbmZpZy9rYXJtYS5jb25mLmNvZmZlZVwiLFxuICAgIFwidGVzdDpzYWZhcmlcIjogXCJjYWtlIGluc3RhbGw6dGVzdDsgIGthcm1hIHN0YXJ0IC0tc2luZ2xlLXJ1biAtLWJyb3dzZXJzIFNhZmFyaSAuY29uZmlnL2thcm1hLmNvbmYuY29mZmVlXCIsXG4gICAgXCJ0ZXN0OnNhdWNlXCI6IFwiY2FrZSBpbnN0YWxsOnRlc3Q7ICAgc2F1Y2U9MSBrYXJtYSBzdGFydCAuY29uZmlnL2thcm1hLmNvbmYuY29mZmVlXCIsXG4gICAgXCJjb3ZlcmFnZVwiOiBcImNha2UgaW5zdGFsbDpjb3ZlcmFnZTsgbnBtIHJ1biBjb3ZlcmFnZTpydW4gJiYgbnBtIHJ1biBjb3ZlcmFnZTpiYWRnZVwiLFxuICAgIFwiY292ZXJhZ2U6cnVuXCI6IFwiY292ZXJhZ2U9dHJ1ZSBucG0gcnVuIHRlc3Q6ZWxlY3Ryb25cIixcbiAgICBcImNvdmVyYWdlOmJhZGdlXCI6IFwiYmFkZ2UtZ2VuIC1kIC4vLmNvbmZpZy9iYWRnZXMvY292ZXJhZ2VcIixcbiAgICBcImNvdmVyYWdlOnNob3dcIjogXCJvcGVuIGNvdmVyYWdlL2xjb3YtcmVwb3J0L2luZGV4Lmh0bWxcIlxuICB9LFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9kYW5pZWxrYWxlbi9xdWlja2RvbS5naXRcIlxuICB9LFxuICBcImF1dGhvclwiOiBcImRhbmllbGthbGVuXCIsXG4gIFwibGljZW5zZVwiOiBcIklTQ1wiLFxuICBcImJ1Z3NcIjoge1xuICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2RhbmllbGthbGVuL3F1aWNrZG9tL2lzc3Vlc1wiXG4gIH0sXG4gIFwiaG9tZXBhZ2VcIjogXCJodHRwczovL2dpdGh1Yi5jb20vZGFuaWVsa2FsZW4vcXVpY2tkb20jcmVhZG1lXCIsXG4gIFwiZGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcIkBkYW5pZWxrYWxlbi9pc1wiOiBcIl4yLjAuMFwiLFxuICAgIFwicXVpY2tjc3NcIjogXCJeMS4zLjRcIixcbiAgICBcInNtYXJ0LWV4dGVuZFwiOiBcIl4xLjcuM1wiXG4gIH0sXG4gIFwiZGV2RGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImJsdWViaXJkXCI6IFwiXjMuNS4wXCIsXG4gICAgXCJjaGFsa1wiOiBcIl4yLjAuMVwiLFxuICAgIFwiY29mZmVlLXNjcmlwdFwiOiBcIl4xLjEyLjZcIixcbiAgICBcImV4ZWNhXCI6IFwiXjAuNy4wXCIsXG4gICAgXCJmcy1qZXRwYWNrXCI6IFwiXjAuMTMuM1wiLFxuICAgIFwicHJvbWlzZS1icmVha1wiOiBcIl4wLjEuMlwiLFxuICAgIFwic2VtdmVyXCI6IFwiXjUuMy4wXCJcbiAgfVxufVxuIiwib3JpZ0Rlc2NyaXB0b3JzID0gXG5cdCdpbm5lcldpZHRoJzogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdpbm5lcldpZHRoJylcblx0J2lubmVySGVpZ2h0JzogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdpbm5lckhlaWdodCcpXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3ICgpLT5cblx0b3ZlcndyaXR0ZW4gPSBmYWxzZVxuXHRjdXJyZW50ID0gd2lkdGg6d2luZG93LmlubmVyV2lkdGgsIGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHRcblx0XG5cdGdldFJlYWwgPSAoZGltZW5zaW9uKS0+XG5cdFx0ZGltZW5zaW9uID0gJ2lubmVyJytkaW1lbnNpb24ucmVwbGFjZSAvXFxiLi8sIChsZXR0ZXIpLT4gbGV0dGVyLnRvVXBwZXJDYXNlKClcblx0XHRvcmlnRGVzY3JpcHRvcnNbZGltZW5zaW9uXS5nZXQuY2FsbCh3aW5kb3cpXG5cblx0b3ZlcndyaXRlID0gKCktPiB1bmxlc3Mgb3ZlcndyaXR0ZW5cblx0XHRvdmVyd3JpdHRlbiA9IHRydWVcblx0XHRcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkgd2luZG93LCAnaW5uZXJXaWR0aCcsXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWVcblx0XHRcdGdldDogKCktPiBjdXJyZW50LndpZHRoXG5cdFx0XHRzZXQ6IChuZXdWYWx1ZSktPiBjdXJyZW50LndpZHRoID0gbmV3VmFsdWVcblx0XHRcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkgd2luZG93LCAnaW5uZXJIZWlnaHQnLFxuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHRnZXQ6ICgpLT4gY3VycmVudC5oZWlnaHRcblx0XHRcdHNldDogKG5ld1ZhbHVlKS0+IGN1cnJlbnQuaGVpZ2h0ID0gbmV3VmFsdWVcblx0XG5cblx0QHNpbXVsYXRlID0gKHdpZHRoLCBoZWlnaHQpLT5cblx0XHRjdXJyZW50LndpZHRoID0gd2lkdGggaWYgd2lkdGhcblx0XHRjdXJyZW50LmhlaWdodCA9IGhlaWdodCBpZiBoZWlnaHRcblx0XHRcblx0XHRvdmVyd3JpdGUoKVxuXHRcdGV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jylcblx0XHRldmVudC5pbml0RXZlbnQoJ3Jlc2l6ZScsIHRydWUsIGZhbHNlKVxuXHRcdHdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuXG5cblx0QHJlc3RvcmUgPSAoKS0+XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5IHdpbmRvdywgJ2lubmVyV2lkdGgnLCBvcmlnRGVzY3JpcHRvcnMuaW5uZXJXaWR0aFxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB3aW5kb3csICdpbm5lckhlaWdodCcsIG9yaWdEZXNjcmlwdG9ycy5pbm5lckhlaWdodFxuXG5cblx0cmV0dXJuIEAiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2NoYWknKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gY2hhaVN0eWxlXG5cbmZ1bmN0aW9uIGNoYWlTdHlsZShjaGFpLCB1dGlscykge1xuICBjb25zdCB7QXNzZXJ0aW9ufSA9IGNoYWlcbiAgY29uc3Qge2ZsYWd9ID0gdXRpbHNcbiAgbGV0IHNhbXBsZURpdiwgc2FtcGxlU3R5bGUsIHNhbXBsZUlmcmFtZVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ3N0eWxlJywgZnVuY3Rpb24ocHJvcGVydHksIHZhbHVlID0gJycpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG4gICAgdmFsdWUgPSB2YWx1ZS50cmltKClcblxuICAgIGNvbnN0IGlzTm9uQ29sb3JzID0gc3R5bGVbcHJvcGVydHldID09PSAncmdiYSgwLCAwLCAwLCAwKScgLy8gd2Via2l0XG4gICAgICB8fCBzdHlsZVtwcm9wZXJ0eV0gPT09ICd0cmFuc3BhcmVudCcgLy8gZmlyZWZveFxuXG4gICAgY29uc3QgcHJvcGVydHlWYWx1ZSA9IGlzTm9uQ29sb3JzXG4gICAgICA/ICcnXG4gICAgICA6IHN0eWxlW3Byb3BlcnR5XVxuXG4gICAgY29uc3QgYXNzZXJ0aW9uID0gdmFsdWVcbiAgICAgID8gY29tcGFyZUNTU1ZhbHVlKHByb3BlcnR5VmFsdWUsIHZhbHVlKVxuICAgICAgOiBCb29sZWFuKHByb3BlcnR5VmFsdWUpXG5cbiAgICBjb25zdCBlbGVtZW50VGFnID0gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKClcblxuICAgIGNvbnN0IHRocm93TWVzc2FnZSA9IGBleHBlY3QgJHtlbGVtZW50VGFnfSB0byBoYXZlIHske3Byb3BlcnR5fTogJHt2YWx1ZX19LCBpcyByZWNlaXZpbmcgeyR7cHJvcGVydHl9OiAke3Byb3BlcnR5VmFsdWV9fWBcbiAgICBjb25zdCB0aHJvd01lc3NhZ2VOZWdhdGl2ZSA9IGBleHBlY3QgJHtlbGVtZW50VGFnfSB0byBub3QgaGF2ZSB7JHtwcm9wZXJ0eX06ICR7dmFsdWV9fSwgaXMgcmVjZWl2aW5nIHske3Byb3BlcnR5fTogJHtwcm9wZXJ0eVZhbHVlfX1gXG5cbiAgICB0aGlzLmFzc2VydChhc3NlcnRpb24sIHRocm93TWVzc2FnZSwgdGhyb3dNZXNzYWdlTmVnYXRpdmUsIHZhbHVlKVxuXG4gICAgZnVuY3Rpb24gY29tcGFyZUNTU1ZhbHVlKGNvbXB1dGVkLCBleHBlY3RlZCkge1xuICAgICAgY29uc3QgcHJvcGVydHlIaWZlbkNhc2UgPSBwcm9wZXJ0eS5yZXBsYWNlKC9bQS1aXS9nLCAobWF0Y2gpID0+ICctJyArIG1hdGNoLnRvTG93ZXJDYXNlKCkpXG4gICAgICBpZiAoIXNhbXBsZURpdikge1xuICAgICAgICBzYW1wbGVJZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKVxuICAgICAgICBzYW1wbGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxuICAgICAgICBzYW1wbGVTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHNhbXBsZURpdilcblxuICAgICAgICBzYW1wbGVJZnJhbWUuYXBwZW5kQ2hpbGQoc2FtcGxlRGl2KVxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNhbXBsZUlmcmFtZSlcbiAgICAgIH1cbiAgICAgIHNhbXBsZURpdi5zdHlsZS5mb250U2l6ZSA9IHN0eWxlLmZvbnRTaXplXG4gICAgICBzYW1wbGVEaXYuc3R5bGUuc2V0UHJvcGVydHkocHJvcGVydHlIaWZlbkNhc2UsIGV4cGVjdGVkLCAnaW1wb3J0YW50JylcbiAgICAgIGNvbnN0IHZhbHVlID0gc2FtcGxlU3R5bGVbcHJvcGVydHldXG5cbiAgICAgIGNvbnN0IGhhc0F1dG9WYWx1ZSA9IHZhbHVlLmluY2x1ZGVzKCdhdXRvJylcbiAgICAgIGNvbnN0IHJlZyA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXhwKHZhbHVlKS5yZXBsYWNlKC9hdXRvL2csICcoXFxcXGQrKC5cXFxcZCspP3B4fGF1dG8pJykpXG4gICAgICBzYW1wbGVEaXYuc3R5bGUuZm9udFNpemUgPSBudWxsXG4gICAgICBzYW1wbGVEaXYuc3R5bGVbcHJvcGVydHlIaWZlbkNhc2VdID0gbnVsbFxuXG4gICAgICByZXR1cm4gaGFzQXV0b1ZhbHVlXG4gICAgICAgID8gcmVnLnRlc3QoY29tcHV0ZWQpXG4gICAgICAgIDogY29tcHV0ZWQgPT09IHZhbHVlXG4gICAgfVxuICB9KVxufVxuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vYmVuamFtaW5nci9SZWdFeHAuZXNjYXBlL2Jsb2IvbWFzdGVyL3BvbHlmaWxsLmpzXG5mdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWUpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKS5yZXBsYWNlKC9bXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpXG59XG4iLCIvKiFcbiAqIGNoYWlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG52YXIgdXNlZCA9IFtdO1xuXG4vKiFcbiAqIENoYWkgdmVyc2lvblxuICovXG5cbmV4cG9ydHMudmVyc2lvbiA9ICc0LjEuMic7XG5cbi8qIVxuICogQXNzZXJ0aW9uIEVycm9yXG4gKi9cblxuZXhwb3J0cy5Bc3NlcnRpb25FcnJvciA9IHJlcXVpcmUoJ2Fzc2VydGlvbi1lcnJvcicpO1xuXG4vKiFcbiAqIFV0aWxzIGZvciBwbHVnaW5zIChub3QgZXhwb3J0ZWQpXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL2NoYWkvdXRpbHMnKTtcblxuLyoqXG4gKiAjIC51c2UoZnVuY3Rpb24pXG4gKlxuICogUHJvdmlkZXMgYSB3YXkgdG8gZXh0ZW5kIHRoZSBpbnRlcm5hbHMgb2YgQ2hhaS5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufVxuICogQHJldHVybnMge3RoaXN9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLnVzZSA9IGZ1bmN0aW9uIChmbikge1xuICBpZiAoIX51c2VkLmluZGV4T2YoZm4pKSB7XG4gICAgZm4oZXhwb3J0cywgdXRpbCk7XG4gICAgdXNlZC5wdXNoKGZuKTtcbiAgfVxuXG4gIHJldHVybiBleHBvcnRzO1xufTtcblxuLyohXG4gKiBVdGlsaXR5IEZ1bmN0aW9uc1xuICovXG5cbmV4cG9ydHMudXRpbCA9IHV0aWw7XG5cbi8qIVxuICogQ29uZmlndXJhdGlvblxuICovXG5cbnZhciBjb25maWcgPSByZXF1aXJlKCcuL2NoYWkvY29uZmlnJyk7XG5leHBvcnRzLmNvbmZpZyA9IGNvbmZpZztcblxuLyohXG4gKiBQcmltYXJ5IGBBc3NlcnRpb25gIHByb3RvdHlwZVxuICovXG5cbnZhciBhc3NlcnRpb24gPSByZXF1aXJlKCcuL2NoYWkvYXNzZXJ0aW9uJyk7XG5leHBvcnRzLnVzZShhc3NlcnRpb24pO1xuXG4vKiFcbiAqIENvcmUgQXNzZXJ0aW9uc1xuICovXG5cbnZhciBjb3JlID0gcmVxdWlyZSgnLi9jaGFpL2NvcmUvYXNzZXJ0aW9ucycpO1xuZXhwb3J0cy51c2UoY29yZSk7XG5cbi8qIVxuICogRXhwZWN0IGludGVyZmFjZVxuICovXG5cbnZhciBleHBlY3QgPSByZXF1aXJlKCcuL2NoYWkvaW50ZXJmYWNlL2V4cGVjdCcpO1xuZXhwb3J0cy51c2UoZXhwZWN0KTtcblxuLyohXG4gKiBTaG91bGQgaW50ZXJmYWNlXG4gKi9cblxudmFyIHNob3VsZCA9IHJlcXVpcmUoJy4vY2hhaS9pbnRlcmZhY2Uvc2hvdWxkJyk7XG5leHBvcnRzLnVzZShzaG91bGQpO1xuXG4vKiFcbiAqIEFzc2VydCBpbnRlcmZhY2VcbiAqL1xuXG52YXIgYXNzZXJ0ID0gcmVxdWlyZSgnLi9jaGFpL2ludGVyZmFjZS9hc3NlcnQnKTtcbmV4cG9ydHMudXNlKGFzc2VydCk7XG4iLCIvKiFcbiAqIGFzc2VydGlvbi1lcnJvclxuICogQ29weXJpZ2h0KGMpIDIwMTMgSmFrZSBMdWVyIDxqYWtlQHF1YWxpYW5jeS5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKiFcbiAqIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogb25lIG9iamVjdCB0byBhbm90aGVyIGV4Y2x1ZGluZyBhbnkgb3JpZ2luYWxseVxuICogbGlzdGVkLiBSZXR1cm5lZCBmdW5jdGlvbiB3aWxsIGNyZWF0ZSBhIG5ldyBge31gLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBleGNsdWRlZCBwcm9wZXJ0aWVzIC4uLlxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cblxuZnVuY3Rpb24gZXhjbHVkZSAoKSB7XG4gIHZhciBleGNsdWRlcyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcblxuICBmdW5jdGlvbiBleGNsdWRlUHJvcHMgKHJlcywgb2JqKSB7XG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmICghfmV4Y2x1ZGVzLmluZGV4T2Yoa2V5KSkgcmVzW2tleV0gPSBvYmpba2V5XTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBleHRlbmRFeGNsdWRlICgpIHtcbiAgICB2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICAgICAgLCBpID0gMFxuICAgICAgLCByZXMgPSB7fTtcblxuICAgIGZvciAoOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhjbHVkZVByb3BzKHJlcywgYXJnc1tpXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcbn07XG5cbi8qIVxuICogUHJpbWFyeSBFeHBvcnRzXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBBc3NlcnRpb25FcnJvcjtcblxuLyoqXG4gKiAjIyMgQXNzZXJ0aW9uRXJyb3JcbiAqXG4gKiBBbiBleHRlbnNpb24gb2YgdGhlIEphdmFTY3JpcHQgYEVycm9yYCBjb25zdHJ1Y3RvciBmb3JcbiAqIGFzc2VydGlvbiBhbmQgdmFsaWRhdGlvbiBzY2VuYXJpb3MuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wZXJ0aWVzIHRvIGluY2x1ZGUgKG9wdGlvbmFsKVxuICogQHBhcmFtIHtjYWxsZWV9IHN0YXJ0IHN0YWNrIGZ1bmN0aW9uIChvcHRpb25hbClcbiAqL1xuXG5mdW5jdGlvbiBBc3NlcnRpb25FcnJvciAobWVzc2FnZSwgX3Byb3BzLCBzc2YpIHtcbiAgdmFyIGV4dGVuZCA9IGV4Y2x1ZGUoJ25hbWUnLCAnbWVzc2FnZScsICdzdGFjaycsICdjb25zdHJ1Y3RvcicsICd0b0pTT04nKVxuICAgICwgcHJvcHMgPSBleHRlbmQoX3Byb3BzIHx8IHt9KTtcblxuICAvLyBkZWZhdWx0IHZhbHVlc1xuICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdVbnNwZWNpZmllZCBBc3NlcnRpb25FcnJvcic7XG4gIHRoaXMuc2hvd0RpZmYgPSBmYWxzZTtcblxuICAvLyBjb3B5IGZyb20gcHJvcGVydGllc1xuICBmb3IgKHZhciBrZXkgaW4gcHJvcHMpIHtcbiAgICB0aGlzW2tleV0gPSBwcm9wc1trZXldO1xuICB9XG5cbiAgLy8gY2FwdHVyZSBzdGFjayB0cmFjZVxuICBzc2YgPSBzc2YgfHwgYXJndW1lbnRzLmNhbGxlZTtcbiAgaWYgKHNzZiAmJiBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHNzZik7XG4gIH0gZWxzZSB7XG4gICAgdHJ5IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgdGhpcy5zdGFjayA9IGUuc3RhY2s7XG4gICAgfVxuICB9XG59XG5cbi8qIVxuICogSW5oZXJpdCBmcm9tIEVycm9yLnByb3RvdHlwZVxuICovXG5cbkFzc2VydGlvbkVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcblxuLyohXG4gKiBTdGF0aWNhbGx5IHNldCBuYW1lXG4gKi9cblxuQXNzZXJ0aW9uRXJyb3IucHJvdG90eXBlLm5hbWUgPSAnQXNzZXJ0aW9uRXJyb3InO1xuXG4vKiFcbiAqIEVuc3VyZSBjb3JyZWN0IGNvbnN0cnVjdG9yXG4gKi9cblxuQXNzZXJ0aW9uRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXNzZXJ0aW9uRXJyb3I7XG5cbi8qKlxuICogQWxsb3cgZXJyb3JzIHRvIGJlIGNvbnZlcnRlZCB0byBKU09OIGZvciBzdGF0aWMgdHJhbnNmZXIuXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlIHN0YWNrIChkZWZhdWx0OiBgdHJ1ZWApXG4gKiBAcmV0dXJuIHtPYmplY3R9IG9iamVjdCB0aGF0IGNhbiBiZSBgSlNPTi5zdHJpbmdpZnlgXG4gKi9cblxuQXNzZXJ0aW9uRXJyb3IucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIChzdGFjaykge1xuICB2YXIgZXh0ZW5kID0gZXhjbHVkZSgnY29uc3RydWN0b3InLCAndG9KU09OJywgJ3N0YWNrJylcbiAgICAsIHByb3BzID0gZXh0ZW5kKHsgbmFtZTogdGhpcy5uYW1lIH0sIHRoaXMpO1xuXG4gIC8vIGluY2x1ZGUgc3RhY2sgaWYgZXhpc3RzIGFuZCBub3QgdHVybmVkIG9mZlxuICBpZiAoZmFsc2UgIT09IHN0YWNrICYmIHRoaXMuc3RhY2spIHtcbiAgICBwcm9wcy5zdGFjayA9IHRoaXMuc3RhY2s7XG4gIH1cblxuICByZXR1cm4gcHJvcHM7XG59O1xuIiwiLyohXG4gKiBjaGFpXG4gKiBDb3B5cmlnaHQoYykgMjAxMSBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qIVxuICogRGVwZW5kZW5jaWVzIHRoYXQgYXJlIHVzZWQgZm9yIG11bHRpcGxlIGV4cG9ydHMgYXJlIHJlcXVpcmVkIGhlcmUgb25seSBvbmNlXG4gKi9cblxudmFyIHBhdGh2YWwgPSByZXF1aXJlKCdwYXRodmFsJyk7XG5cbi8qIVxuICogdGVzdCB1dGlsaXR5XG4gKi9cblxuZXhwb3J0cy50ZXN0ID0gcmVxdWlyZSgnLi90ZXN0Jyk7XG5cbi8qIVxuICogdHlwZSB1dGlsaXR5XG4gKi9cblxuZXhwb3J0cy50eXBlID0gcmVxdWlyZSgndHlwZS1kZXRlY3QnKTtcblxuLyohXG4gKiBleHBlY3RUeXBlcyB1dGlsaXR5XG4gKi9cbmV4cG9ydHMuZXhwZWN0VHlwZXMgPSByZXF1aXJlKCcuL2V4cGVjdFR5cGVzJyk7XG5cbi8qIVxuICogbWVzc2FnZSB1dGlsaXR5XG4gKi9cblxuZXhwb3J0cy5nZXRNZXNzYWdlID0gcmVxdWlyZSgnLi9nZXRNZXNzYWdlJyk7XG5cbi8qIVxuICogYWN0dWFsIHV0aWxpdHlcbiAqL1xuXG5leHBvcnRzLmdldEFjdHVhbCA9IHJlcXVpcmUoJy4vZ2V0QWN0dWFsJyk7XG5cbi8qIVxuICogSW5zcGVjdCB1dGlsXG4gKi9cblxuZXhwb3J0cy5pbnNwZWN0ID0gcmVxdWlyZSgnLi9pbnNwZWN0Jyk7XG5cbi8qIVxuICogT2JqZWN0IERpc3BsYXkgdXRpbFxuICovXG5cbmV4cG9ydHMub2JqRGlzcGxheSA9IHJlcXVpcmUoJy4vb2JqRGlzcGxheScpO1xuXG4vKiFcbiAqIEZsYWcgdXRpbGl0eVxuICovXG5cbmV4cG9ydHMuZmxhZyA9IHJlcXVpcmUoJy4vZmxhZycpO1xuXG4vKiFcbiAqIEZsYWcgdHJhbnNmZXJyaW5nIHV0aWxpdHlcbiAqL1xuXG5leHBvcnRzLnRyYW5zZmVyRmxhZ3MgPSByZXF1aXJlKCcuL3RyYW5zZmVyRmxhZ3MnKTtcblxuLyohXG4gKiBEZWVwIGVxdWFsIHV0aWxpdHlcbiAqL1xuXG5leHBvcnRzLmVxbCA9IHJlcXVpcmUoJ2RlZXAtZXFsJyk7XG5cbi8qIVxuICogRGVlcCBwYXRoIGluZm9cbiAqL1xuXG5leHBvcnRzLmdldFBhdGhJbmZvID0gcGF0aHZhbC5nZXRQYXRoSW5mbztcblxuLyohXG4gKiBDaGVjayBpZiBhIHByb3BlcnR5IGV4aXN0c1xuICovXG5cbmV4cG9ydHMuaGFzUHJvcGVydHkgPSBwYXRodmFsLmhhc1Byb3BlcnR5O1xuXG4vKiFcbiAqIEZ1bmN0aW9uIG5hbWVcbiAqL1xuXG5leHBvcnRzLmdldE5hbWUgPSByZXF1aXJlKCdnZXQtZnVuYy1uYW1lJyk7XG5cbi8qIVxuICogYWRkIFByb3BlcnR5XG4gKi9cblxuZXhwb3J0cy5hZGRQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vYWRkUHJvcGVydHknKTtcblxuLyohXG4gKiBhZGQgTWV0aG9kXG4gKi9cblxuZXhwb3J0cy5hZGRNZXRob2QgPSByZXF1aXJlKCcuL2FkZE1ldGhvZCcpO1xuXG4vKiFcbiAqIG92ZXJ3cml0ZSBQcm9wZXJ0eVxuICovXG5cbmV4cG9ydHMub3ZlcndyaXRlUHJvcGVydHkgPSByZXF1aXJlKCcuL292ZXJ3cml0ZVByb3BlcnR5Jyk7XG5cbi8qIVxuICogb3ZlcndyaXRlIE1ldGhvZFxuICovXG5cbmV4cG9ydHMub3ZlcndyaXRlTWV0aG9kID0gcmVxdWlyZSgnLi9vdmVyd3JpdGVNZXRob2QnKTtcblxuLyohXG4gKiBBZGQgYSBjaGFpbmFibGUgbWV0aG9kXG4gKi9cblxuZXhwb3J0cy5hZGRDaGFpbmFibGVNZXRob2QgPSByZXF1aXJlKCcuL2FkZENoYWluYWJsZU1ldGhvZCcpO1xuXG4vKiFcbiAqIE92ZXJ3cml0ZSBjaGFpbmFibGUgbWV0aG9kXG4gKi9cblxuZXhwb3J0cy5vdmVyd3JpdGVDaGFpbmFibGVNZXRob2QgPSByZXF1aXJlKCcuL292ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCcpO1xuXG4vKiFcbiAqIENvbXBhcmUgYnkgaW5zcGVjdCBtZXRob2RcbiAqL1xuXG5leHBvcnRzLmNvbXBhcmVCeUluc3BlY3QgPSByZXF1aXJlKCcuL2NvbXBhcmVCeUluc3BlY3QnKTtcblxuLyohXG4gKiBHZXQgb3duIGVudW1lcmFibGUgcHJvcGVydHkgc3ltYm9scyBtZXRob2RcbiAqL1xuXG5leHBvcnRzLmdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMgPSByZXF1aXJlKCcuL2dldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMnKTtcblxuLyohXG4gKiBHZXQgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBtZXRob2RcbiAqL1xuXG5leHBvcnRzLmdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi9nZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcycpO1xuXG4vKiFcbiAqIENoZWNrcyBlcnJvciBhZ2FpbnN0IGEgZ2l2ZW4gc2V0IG9mIGNyaXRlcmlhXG4gKi9cblxuZXhwb3J0cy5jaGVja0Vycm9yID0gcmVxdWlyZSgnY2hlY2stZXJyb3InKTtcblxuLyohXG4gKiBQcm94aWZ5IHV0aWxcbiAqL1xuXG5leHBvcnRzLnByb3hpZnkgPSByZXF1aXJlKCcuL3Byb3hpZnknKTtcblxuLyohXG4gKiBhZGRMZW5ndGhHdWFyZCB1dGlsXG4gKi9cblxuZXhwb3J0cy5hZGRMZW5ndGhHdWFyZCA9IHJlcXVpcmUoJy4vYWRkTGVuZ3RoR3VhcmQnKTtcblxuLyohXG4gKiBpc1Byb3h5RW5hYmxlZCBoZWxwZXJcbiAqL1xuXG5leHBvcnRzLmlzUHJveHlFbmFibGVkID0gcmVxdWlyZSgnLi9pc1Byb3h5RW5hYmxlZCcpO1xuXG4vKiFcbiAqIGlzTmFOIG1ldGhvZFxuICovXG5cbmV4cG9ydHMuaXNOYU4gPSByZXF1aXJlKCcuL2lzTmFOJyk7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcblxuICAvKipcbiAgICogIyMjIGNvbmZpZy5pbmNsdWRlU3RhY2tcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGluZmx1ZW5jZXMgd2hldGhlciBzdGFjayB0cmFjZVxuICAgKiBpcyBpbmNsdWRlZCBpbiBBc3NlcnRpb24gZXJyb3IgbWVzc2FnZS4gRGVmYXVsdCBvZiBmYWxzZVxuICAgKiBzdXBwcmVzc2VzIHN0YWNrIHRyYWNlIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgKlxuICAgKiAgICAgY2hhaS5jb25maWcuaW5jbHVkZVN0YWNrID0gdHJ1ZTsgIC8vIGVuYWJsZSBzdGFjayBvbiBlcnJvclxuICAgKlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGluY2x1ZGVTdGFjazogZmFsc2UsXG5cbiAgLyoqXG4gICAqICMjIyBjb25maWcuc2hvd0RpZmZcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGluZmx1ZW5jZXMgd2hldGhlciBvciBub3RcbiAgICogdGhlIGBzaG93RGlmZmAgZmxhZyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHRocm93blxuICAgKiBBc3NlcnRpb25FcnJvcnMuIGBmYWxzZWAgd2lsbCBhbHdheXMgYmUgYGZhbHNlYDsgYHRydWVgXG4gICAqIHdpbGwgYmUgdHJ1ZSB3aGVuIHRoZSBhc3NlcnRpb24gaGFzIHJlcXVlc3RlZCBhIGRpZmZcbiAgICogYmUgc2hvd24uXG4gICAqXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn1cbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgc2hvd0RpZmY6IHRydWUsXG5cbiAgLyoqXG4gICAqICMjIyBjb25maWcudHJ1bmNhdGVUaHJlc2hvbGRcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIHNldHMgbGVuZ3RoIHRocmVzaG9sZCBmb3IgYWN0dWFsIGFuZFxuICAgKiBleHBlY3RlZCB2YWx1ZXMgaW4gYXNzZXJ0aW9uIGVycm9ycy4gSWYgdGhpcyB0aHJlc2hvbGQgaXMgZXhjZWVkZWQsIGZvclxuICAgKiBleGFtcGxlIGZvciBsYXJnZSBkYXRhIHN0cnVjdHVyZXMsIHRoZSB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIHNvbWV0aGluZ1xuICAgKiBsaWtlIGBbIEFycmF5KDMpIF1gIG9yIGB7IE9iamVjdCAocHJvcDEsIHByb3AyKSB9YC5cbiAgICpcbiAgICogU2V0IGl0IHRvIHplcm8gaWYgeW91IHdhbnQgdG8gZGlzYWJsZSB0cnVuY2F0aW5nIGFsdG9nZXRoZXIuXG4gICAqXG4gICAqIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VyZnVsIHdoZW4gZG9pbmcgYXNzZXJ0aW9ucyBvbiBhcnJheXM6IGhhdmluZyB0aGlzXG4gICAqIHNldCB0byBhIHJlYXNvbmFibGUgbGFyZ2UgdmFsdWUgbWFrZXMgdGhlIGZhaWx1cmUgbWVzc2FnZXMgcmVhZGlseVxuICAgKiBpbnNwZWN0YWJsZS5cbiAgICpcbiAgICogICAgIGNoYWkuY29uZmlnLnRydW5jYXRlVGhyZXNob2xkID0gMDsgIC8vIGRpc2FibGUgdHJ1bmNhdGluZ1xuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn1cbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdHJ1bmNhdGVUaHJlc2hvbGQ6IDQwLFxuXG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLnVzZVByb3h5XG4gICAqXG4gICAqIFVzZXIgY29uZmlndXJhYmxlIHByb3BlcnR5LCBkZWZpbmVzIGlmIGNoYWkgd2lsbCB1c2UgYSBQcm94eSB0byB0aHJvd1xuICAgKiBhbiBlcnJvciB3aGVuIGEgbm9uLWV4aXN0ZW50IHByb3BlcnR5IGlzIHJlYWQsIHdoaWNoIHByb3RlY3RzIHVzZXJzXG4gICAqIGZyb20gdHlwb3Mgd2hlbiB1c2luZyBwcm9wZXJ0eS1iYXNlZCBhc3NlcnRpb25zLlxuICAgKlxuICAgKiBTZXQgaXQgdG8gZmFsc2UgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUuXG4gICAqXG4gICAqICAgICBjaGFpLmNvbmZpZy51c2VQcm94eSA9IGZhbHNlOyAgLy8gZGlzYWJsZSB1c2Ugb2YgUHJveHlcbiAgICpcbiAgICogVGhpcyBmZWF0dXJlIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgcmVnYXJkbGVzcyBvZiB0aGlzIGNvbmZpZyB2YWx1ZVxuICAgKiBpbiBlbnZpcm9ubWVudHMgdGhhdCBkb24ndCBzdXBwb3J0IHByb3hpZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn1cbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgdXNlUHJveHk6IHRydWUsXG5cbiAgLyoqXG4gICAqICMjIyBjb25maWcucHJveHlFeGNsdWRlZEtleXNcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGVycm9yIGlmIHRoZXkgZG8gbm90IGV4aXN0IG9uIHRoZSBhc3NlcnRpb24uXG4gICAqIFRoaXMgaXMgb25seSBhcHBsaWVkIGlmIHRoZSBlbnZpcm9ubWVudCBDaGFpIGlzIHJ1bm5pbmcgaW4gc3VwcG9ydHMgcHJveGllcyBhbmRcbiAgICogaWYgdGhlIGB1c2VQcm94eWAgY29uZmlndXJhdGlvbiBzZXR0aW5nIGlzIGVuYWJsZWQuXG4gICAqIEJ5IGRlZmF1bHQsIGB0aGVuYCBhbmQgYGluc3BlY3RgIHdpbGwgbm90IHRocm93IGFuIGVycm9yIGlmIHRoZXkgZG8gbm90IGV4aXN0IG9uIHRoZVxuICAgKiBhc3NlcnRpb24gb2JqZWN0IGJlY2F1c2UgdGhlIGAuaW5zcGVjdGAgcHJvcGVydHkgaXMgcmVhZCBieSBgdXRpbC5pbnNwZWN0YCAoZm9yIGV4YW1wbGUsIHdoZW5cbiAgICogdXNpbmcgYGNvbnNvbGUubG9nYCBvbiB0aGUgYXNzZXJ0aW9uIG9iamVjdCkgYW5kIGAudGhlbmAgaXMgbmVjZXNzYXJ5IGZvciBwcm9taXNlIHR5cGUtY2hlY2tpbmcuXG4gICAqXG4gICAqICAgICAvLyBCeSBkZWZhdWx0IHRoZXNlIGtleXMgd2lsbCBub3QgdGhyb3cgYW4gZXJyb3IgaWYgdGhleSBkbyBub3QgZXhpc3Qgb24gdGhlIGFzc2VydGlvbiBvYmplY3RcbiAgICogICAgIGNoYWkuY29uZmlnLnByb3h5RXhjbHVkZWRLZXlzID0gWyd0aGVuJywgJ2luc3BlY3QnXTtcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX1cbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgcHJveHlFeGNsdWRlZEtleXM6IFsndGhlbicsICdpbnNwZWN0JywgJ3RvSlNPTiddXG59O1xuIiwiLyohXG4gKiBjaGFpXG4gKiBodHRwOi8vY2hhaWpzLmNvbVxuICogQ29weXJpZ2h0KGMpIDIwMTEtMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbnZhciBjb25maWcgPSByZXF1aXJlKCcuL2NvbmZpZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChfY2hhaSwgdXRpbCkge1xuICAvKiFcbiAgICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAgICovXG5cbiAgdmFyIEFzc2VydGlvbkVycm9yID0gX2NoYWkuQXNzZXJ0aW9uRXJyb3JcbiAgICAsIGZsYWcgPSB1dGlsLmZsYWc7XG5cbiAgLyohXG4gICAqIE1vZHVsZSBleHBvcnQuXG4gICAqL1xuXG4gIF9jaGFpLkFzc2VydGlvbiA9IEFzc2VydGlvbjtcblxuICAvKiFcbiAgICogQXNzZXJ0aW9uIENvbnN0cnVjdG9yXG4gICAqXG4gICAqIENyZWF0ZXMgb2JqZWN0IGZvciBjaGFpbmluZy5cbiAgICpcbiAgICogYEFzc2VydGlvbmAgb2JqZWN0cyBjb250YWluIG1ldGFkYXRhIGluIHRoZSBmb3JtIG9mIGZsYWdzLiBUaHJlZSBmbGFncyBjYW5cbiAgICogYmUgYXNzaWduZWQgZHVyaW5nIGluc3RhbnRpYXRpb24gYnkgcGFzc2luZyBhcmd1bWVudHMgdG8gdGhpcyBjb25zdHJ1Y3RvcjpcbiAgICpcbiAgICogLSBgb2JqZWN0YDogVGhpcyBmbGFnIGNvbnRhaW5zIHRoZSB0YXJnZXQgb2YgdGhlIGFzc2VydGlvbi4gRm9yIGV4YW1wbGUsIGluXG4gICAqICAgdGhlIGFzc2VydGlvbiBgZXhwZWN0KG51bUtpdHRlbnMpLnRvLmVxdWFsKDcpO2AsIHRoZSBgb2JqZWN0YCBmbGFnIHdpbGxcbiAgICogICBjb250YWluIGBudW1LaXR0ZW5zYCBzbyB0aGF0IHRoZSBgZXF1YWxgIGFzc2VydGlvbiBjYW4gcmVmZXJlbmNlIGl0IHdoZW5cbiAgICogICBuZWVkZWQuXG4gICAqXG4gICAqIC0gYG1lc3NhZ2VgOiBUaGlzIGZsYWcgY29udGFpbnMgYW4gb3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gYmVcbiAgICogICBwcmVwZW5kZWQgdG8gdGhlIGVycm9yIG1lc3NhZ2UgdGhhdCdzIGdlbmVyYXRlZCBieSB0aGUgYXNzZXJ0aW9uIHdoZW4gaXRcbiAgICogICBmYWlscy5cbiAgICpcbiAgICogLSBgc3NmaWA6IFRoaXMgZmxhZyBzdGFuZHMgZm9yIFwic3RhcnQgc3RhY2sgZnVuY3Rpb24gaW5kaWNhdG9yXCIuIEl0XG4gICAqICAgY29udGFpbnMgYSBmdW5jdGlvbiByZWZlcmVuY2UgdGhhdCBzZXJ2ZXMgYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvclxuICAgKiAgIHJlbW92aW5nIGZyYW1lcyBmcm9tIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgZXJyb3IgdGhhdCdzIGNyZWF0ZWQgYnkgdGhlXG4gICAqICAgYXNzZXJ0aW9uIHdoZW4gaXQgZmFpbHMuIFRoZSBnb2FsIGlzIHRvIHByb3ZpZGUgYSBjbGVhbmVyIHN0YWNrIHRyYWNlIHRvXG4gICAqICAgZW5kIHVzZXJzIGJ5IHJlbW92aW5nIENoYWkncyBpbnRlcm5hbCBmdW5jdGlvbnMuIE5vdGUgdGhhdCBpdCBvbmx5IHdvcmtzXG4gICAqICAgaW4gZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2VgLCBhbmQgb25seSB3aGVuXG4gICAqICAgYENoYWkuY29uZmlnLmluY2x1ZGVTdGFja2AgaGFzbid0IGJlZW4gc2V0IHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIC0gYGxvY2tTc2ZpYDogVGhpcyBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBgc3NmaWAgZmxhZ1xuICAgKiAgIHNob3VsZCByZXRhaW4gaXRzIGN1cnJlbnQgdmFsdWUsIGV2ZW4gYXMgYXNzZXJ0aW9ucyBhcmUgY2hhaW5lZCBvZmYgb2ZcbiAgICogICB0aGlzIG9iamVjdC4gVGhpcyBpcyB1c3VhbGx5IHNldCB0byBgdHJ1ZWAgd2hlbiBjcmVhdGluZyBhIG5ldyBhc3NlcnRpb25cbiAgICogICBmcm9tIHdpdGhpbiBhbm90aGVyIGFzc2VydGlvbi4gSXQncyBhbHNvIHRlbXBvcmFyaWx5IHNldCB0byBgdHJ1ZWAgYmVmb3JlXG4gICAqICAgYW4gb3ZlcndyaXR0ZW4gYXNzZXJ0aW9uIGdldHMgY2FsbGVkIGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iaiB0YXJnZXQgb2YgdGhlIGFzc2VydGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIChvcHRpb25hbCkgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3NmaSAob3B0aW9uYWwpIHN0YXJ0aW5nIHBvaW50IGZvciByZW1vdmluZyBzdGFjayBmcmFtZXNcbiAgICogQHBhcmFtIHtCb29sZWFufSBsb2NrU3NmaSAob3B0aW9uYWwpIHdoZXRoZXIgb3Igbm90IHRoZSBzc2ZpIGZsYWcgaXMgbG9ja2VkXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICBmdW5jdGlvbiBBc3NlcnRpb24gKG9iaiwgbXNnLCBzc2ZpLCBsb2NrU3NmaSkge1xuICAgIGZsYWcodGhpcywgJ3NzZmknLCBzc2ZpIHx8IEFzc2VydGlvbik7XG4gICAgZmxhZyh0aGlzLCAnbG9ja1NzZmknLCBsb2NrU3NmaSk7XG4gICAgZmxhZyh0aGlzLCAnb2JqZWN0Jywgb2JqKTtcbiAgICBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcblxuICAgIHJldHVybiB1dGlsLnByb3hpZnkodGhpcyk7XG4gIH1cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXNzZXJ0aW9uLCAnaW5jbHVkZVN0YWNrJywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0Fzc2VydGlvbi5pbmNsdWRlU3RhY2sgaXMgZGVwcmVjYXRlZCwgdXNlIGNoYWkuY29uZmlnLmluY2x1ZGVTdGFjayBpbnN0ZWFkLicpO1xuICAgICAgcmV0dXJuIGNvbmZpZy5pbmNsdWRlU3RhY2s7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0Fzc2VydGlvbi5pbmNsdWRlU3RhY2sgaXMgZGVwcmVjYXRlZCwgdXNlIGNoYWkuY29uZmlnLmluY2x1ZGVTdGFjayBpbnN0ZWFkLicpO1xuICAgICAgY29uZmlnLmluY2x1ZGVTdGFjayA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFzc2VydGlvbiwgJ3Nob3dEaWZmJywge1xuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0Fzc2VydGlvbi5zaG93RGlmZiBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuc2hvd0RpZmYgaW5zdGVhZC4nKTtcbiAgICAgIHJldHVybiBjb25maWcuc2hvd0RpZmY7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0Fzc2VydGlvbi5zaG93RGlmZiBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuc2hvd0RpZmYgaW5zdGVhZC4nKTtcbiAgICAgIGNvbmZpZy5zaG93RGlmZiA9IHZhbHVlO1xuICAgIH1cbiAgfSk7XG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5ID0gZnVuY3Rpb24gKG5hbWUsIGZuKSB7XG4gICAgdXRpbC5hZGRQcm9wZXJ0eSh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4pO1xuICB9O1xuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QgPSBmdW5jdGlvbiAobmFtZSwgZm4pIHtcbiAgICB1dGlsLmFkZE1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4pO1xuICB9O1xuXG4gIEFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QgPSBmdW5jdGlvbiAobmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpIHtcbiAgICB1dGlsLmFkZENoYWluYWJsZU1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpO1xuICB9O1xuXG4gIEFzc2VydGlvbi5vdmVyd3JpdGVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChuYW1lLCBmbikge1xuICAgIHV0aWwub3ZlcndyaXRlUHJvcGVydHkodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfTtcblxuICBBc3NlcnRpb24ub3ZlcndyaXRlTWV0aG9kID0gZnVuY3Rpb24gKG5hbWUsIGZuKSB7XG4gICAgdXRpbC5vdmVyd3JpdGVNZXRob2QodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfTtcblxuICBBc3NlcnRpb24ub3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kID0gZnVuY3Rpb24gKG5hbWUsIGZuLCBjaGFpbmluZ0JlaGF2aW9yKSB7XG4gICAgdXRpbC5vdmVyd3JpdGVDaGFpbmFibGVNZXRob2QodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuLCBjaGFpbmluZ0JlaGF2aW9yKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5hc3NlcnQoZXhwcmVzc2lvbiwgbWVzc2FnZSwgbmVnYXRlTWVzc2FnZSwgZXhwZWN0ZWQsIGFjdHVhbCwgc2hvd0RpZmYpXG4gICAqXG4gICAqIEV4ZWN1dGVzIGFuIGV4cHJlc3Npb24gYW5kIGNoZWNrIGV4cGVjdGF0aW9ucy4gVGhyb3dzIEFzc2VydGlvbkVycm9yIGZvciByZXBvcnRpbmcgaWYgdGVzdCBkb2Vzbid0IHBhc3MuXG4gICAqXG4gICAqIEBuYW1lIGFzc2VydFxuICAgKiBAcGFyYW0ge1BoaWxvc29waGljYWx9IGV4cHJlc3Npb24gdG8gYmUgdGVzdGVkXG4gICAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBtZXNzYWdlIG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBtZXNzYWdlIHRvIGRpc3BsYXkgaWYgZXhwcmVzc2lvbiBmYWlsc1xuICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gbmVnYXRlZE1lc3NhZ2Ugb3IgZnVuY3Rpb24gdGhhdCByZXR1cm5zIG5lZ2F0ZWRNZXNzYWdlIHRvIGRpc3BsYXkgaWYgbmVnYXRlZCBleHByZXNzaW9uIGZhaWxzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGV4cGVjdGVkIHZhbHVlIChyZW1lbWJlciB0byBjaGVjayBmb3IgbmVnYXRpb24pXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbCAob3B0aW9uYWwpIHdpbGwgZGVmYXVsdCB0byBgdGhpcy5vYmpgXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gc2hvd0RpZmYgKG9wdGlvbmFsKSB3aGVuIHNldCB0byBgdHJ1ZWAsIGFzc2VydCB3aWxsIGRpc3BsYXkgYSBkaWZmIGluIGFkZGl0aW9uIHRvIHRoZSBtZXNzYWdlIGlmIGV4cHJlc3Npb24gZmFpbHNcbiAgICogQGFwaSBwcml2YXRlXG4gICAqL1xuXG4gIEFzc2VydGlvbi5wcm90b3R5cGUuYXNzZXJ0ID0gZnVuY3Rpb24gKGV4cHIsIG1zZywgbmVnYXRlTXNnLCBleHBlY3RlZCwgX2FjdHVhbCwgc2hvd0RpZmYpIHtcbiAgICB2YXIgb2sgPSB1dGlsLnRlc3QodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoZmFsc2UgIT09IHNob3dEaWZmKSBzaG93RGlmZiA9IHRydWU7XG4gICAgaWYgKHVuZGVmaW5lZCA9PT0gZXhwZWN0ZWQgJiYgdW5kZWZpbmVkID09PSBfYWN0dWFsKSBzaG93RGlmZiA9IGZhbHNlO1xuICAgIGlmICh0cnVlICE9PSBjb25maWcuc2hvd0RpZmYpIHNob3dEaWZmID0gZmFsc2U7XG5cbiAgICBpZiAoIW9rKSB7XG4gICAgICBtc2cgPSB1dGlsLmdldE1lc3NhZ2UodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHZhciBhY3R1YWwgPSB1dGlsLmdldEFjdHVhbCh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1zZywge1xuICAgICAgICAgIGFjdHVhbDogYWN0dWFsXG4gICAgICAgICwgZXhwZWN0ZWQ6IGV4cGVjdGVkXG4gICAgICAgICwgc2hvd0RpZmY6IHNob3dEaWZmXG4gICAgICB9LCAoY29uZmlnLmluY2x1ZGVTdGFjaykgPyB0aGlzLmFzc2VydCA6IGZsYWcodGhpcywgJ3NzZmknKSk7XG4gICAgfVxuICB9O1xuXG4gIC8qIVxuICAgKiAjIyMgLl9vYmpcbiAgICpcbiAgICogUXVpY2sgcmVmZXJlbmNlIHRvIHN0b3JlZCBgYWN0dWFsYCB2YWx1ZSBmb3IgcGx1Z2luIGRldmVsb3BlcnMuXG4gICAqXG4gICAqIEBhcGkgcHJpdmF0ZVxuICAgKi9cblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQXNzZXJ0aW9uLnByb3RvdHlwZSwgJ19vYmonLFxuICAgIHsgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmbGFnKHRoaXMsICdvYmplY3QnKTtcbiAgICAgIH1cbiAgICAsIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICBmbGFnKHRoaXMsICdvYmplY3QnLCB2YWwpO1xuICAgICAgfVxuICB9KTtcbn07XG4iLCIvKiFcbiAqIGNoYWlcbiAqIGh0dHA6Ly9jaGFpanMuY29tXG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoY2hhaSwgXykge1xuICB2YXIgQXNzZXJ0aW9uID0gY2hhaS5Bc3NlcnRpb25cbiAgICAsIEFzc2VydGlvbkVycm9yID0gY2hhaS5Bc3NlcnRpb25FcnJvclxuICAgICwgZmxhZyA9IF8uZmxhZztcblxuICAvKipcbiAgICogIyMjIExhbmd1YWdlIENoYWluc1xuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGFyZSBwcm92aWRlZCBhcyBjaGFpbmFibGUgZ2V0dGVycyB0byBpbXByb3ZlIHRoZSByZWFkYWJpbGl0eVxuICAgKiBvZiB5b3VyIGFzc2VydGlvbnMuXG4gICAqXG4gICAqICoqQ2hhaW5zKipcbiAgICpcbiAgICogLSB0b1xuICAgKiAtIGJlXG4gICAqIC0gYmVlblxuICAgKiAtIGlzXG4gICAqIC0gdGhhdFxuICAgKiAtIHdoaWNoXG4gICAqIC0gYW5kXG4gICAqIC0gaGFzXG4gICAqIC0gaGF2ZVxuICAgKiAtIHdpdGhcbiAgICogLSBhdFxuICAgKiAtIG9mXG4gICAqIC0gc2FtZVxuICAgKiAtIGJ1dFxuICAgKiAtIGRvZXNcbiAgICpcbiAgICogQG5hbWUgbGFuZ3VhZ2UgY2hhaW5zXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIFsgJ3RvJywgJ2JlJywgJ2JlZW4nXG4gICwgJ2lzJywgJ2FuZCcsICdoYXMnLCAnaGF2ZSdcbiAgLCAnd2l0aCcsICd0aGF0JywgJ3doaWNoJywgJ2F0J1xuICAsICdvZicsICdzYW1lJywgJ2J1dCcsICdkb2VzJyBdLmZvckVhY2goZnVuY3Rpb24gKGNoYWluKSB7XG4gICAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KGNoYWluKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAubm90XG4gICAqXG4gICAqIE5lZ2F0ZXMgYWxsIGFzc2VydGlvbnMgdGhhdCBmb2xsb3cgaW4gdGhlIGNoYWluLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KGZ1bmN0aW9uICgpIHt9KS50by5ub3QudGhyb3coKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLm5vdC5oYXZlLnByb3BlcnR5KCdiJyk7XG4gICAqICAgICBleHBlY3QoWzEsIDJdKS50by5iZS5hbignYXJyYXknKS50aGF0LmRvZXMubm90LmluY2x1ZGUoMyk7XG4gICAqXG4gICAqIEp1c3QgYmVjYXVzZSB5b3UgY2FuIG5lZ2F0ZSBhbnkgYXNzZXJ0aW9uIHdpdGggYC5ub3RgIGRvZXNuJ3QgbWVhbiB5b3VcbiAgICogc2hvdWxkLiBXaXRoIGdyZWF0IHBvd2VyIGNvbWVzIGdyZWF0IHJlc3BvbnNpYmlsaXR5LiBJdCdzIG9mdGVuIGJlc3QgdG9cbiAgICogYXNzZXJ0IHRoYXQgdGhlIG9uZSBleHBlY3RlZCBvdXRwdXQgd2FzIHByb2R1Y2VkLCByYXRoZXIgdGhhbiBhc3NlcnRpbmdcbiAgICogdGhhdCBvbmUgb2YgY291bnRsZXNzIHVuZXhwZWN0ZWQgb3V0cHV0cyB3YXNuJ3QgcHJvZHVjZWQuIFNlZSBpbmRpdmlkdWFsXG4gICAqIGFzc2VydGlvbnMgZm9yIHNwZWNpZmljIGd1aWRhbmNlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmVxdWFsKDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDIpLnRvLm5vdC5lcXVhbCgxKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEBuYW1lIG5vdFxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ25vdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBmbGFnKHRoaXMsICduZWdhdGUnLCB0cnVlKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcFxuICAgKlxuICAgKiBDYXVzZXMgYWxsIGAuZXF1YWxgLCBgLmluY2x1ZGVgLCBgLm1lbWJlcnNgLCBgLmtleXNgLCBhbmQgYC5wcm9wZXJ0eWBcbiAgICogYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4gdG8gdXNlIGRlZXAgZXF1YWxpdHkgaW5zdGVhZCBvZiBzdHJpY3RcbiAgICogKGA9PT1gKSBlcXVhbGl0eS4gU2VlIHRoZSBgZGVlcC1lcWxgIHByb2plY3QgcGFnZSBmb3IgaW5mbyBvbiB0aGUgZGVlcFxuICAgKiBlcXVhbGl0eSBhbGdvcml0aG06IGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFpanMvZGVlcC1lcWwuXG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgb2JqZWN0IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgZXF1YWxzIGB7YTogMX1gXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5kZWVwLmVxdWFsKHthOiAxfSk7XG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuZXF1YWwoe2E6IDF9KTtcbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBhcnJheSBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGluY2x1ZGVzIGB7YTogMX1gXG4gICAqICAgICBleHBlY3QoW3thOiAxfV0pLnRvLmRlZXAuaW5jbHVkZSh7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KFt7YTogMX1dKS50by5ub3QuaW5jbHVkZSh7YTogMX0pO1xuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IG9iamVjdCBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGluY2x1ZGVzIGB4OiB7YTogMX1gXG4gICAqICAgICBleHBlY3Qoe3g6IHthOiAxfX0pLnRvLmRlZXAuaW5jbHVkZSh7eDoge2E6IDF9fSk7XG4gICAqICAgICBleHBlY3Qoe3g6IHthOiAxfX0pLnRvLm5vdC5pbmNsdWRlKHt4OiB7YTogMX19KTtcbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBhcnJheSBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGhhcyBtZW1iZXIgYHthOiAxfWBcbiAgICogICAgIGV4cGVjdChbe2E6IDF9XSkudG8uaGF2ZS5kZWVwLm1lbWJlcnMoW3thOiAxfV0pO1xuICAgKiAgICAgZXhwZWN0KFt7YTogMX1dKS50by5ub3QuaGF2ZS5tZW1iZXJzKFt7YTogMX1dKTtcbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBzZXQgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBoYXMga2V5IGB7YTogMX1gXG4gICAqICAgICBleHBlY3QobmV3IFNldChbe2E6IDF9XSkpLnRvLmhhdmUuZGVlcC5rZXlzKFt7YTogMX1dKTtcbiAgICogICAgIGV4cGVjdChuZXcgU2V0KFt7YTogMX1dKSkudG8ubm90LmhhdmUua2V5cyhbe2E6IDF9XSk7XG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgb2JqZWN0IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaGFzIHByb3BlcnR5IGB4OiB7YTogMX1gXG4gICAqICAgICBleHBlY3Qoe3g6IHthOiAxfX0pLnRvLmhhdmUuZGVlcC5wcm9wZXJ0eSgneCcsIHthOiAxfSk7XG4gICAqICAgICBleHBlY3Qoe3g6IHthOiAxfX0pLnRvLm5vdC5oYXZlLnByb3BlcnR5KCd4Jywge2E6IDF9KTtcbiAgICpcbiAgICogQG5hbWUgZGVlcFxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ2RlZXAnLCBmdW5jdGlvbiAoKSB7XG4gICAgZmxhZyh0aGlzLCAnZGVlcCcsIHRydWUpO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5uZXN0ZWRcbiAgICpcbiAgICogRW5hYmxlcyBkb3QtIGFuZCBicmFja2V0LW5vdGF0aW9uIGluIGFsbCBgLnByb3BlcnR5YCBhbmQgYC5pbmNsdWRlYFxuICAgKiBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbi5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YToge2I6IFsneCcsICd5J119fSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkoJ2EuYlsxXScpO1xuICAgKiAgICAgZXhwZWN0KHthOiB7YjogWyd4JywgJ3knXX19KS50by5uZXN0ZWQuaW5jbHVkZSh7J2EuYlsxXSc6ICd5J30pO1xuICAgKlxuICAgKiBJZiBgLmAgb3IgYFtdYCBhcmUgcGFydCBvZiBhbiBhY3R1YWwgcHJvcGVydHkgbmFtZSwgdGhleSBjYW4gYmUgZXNjYXBlZCBieVxuICAgKiBhZGRpbmcgdHdvIGJhY2tzbGFzaGVzIGJlZm9yZSB0aGVtLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHsnLmEnOiB7J1tiXSc6ICd4J319KS50by5oYXZlLm5lc3RlZC5wcm9wZXJ0eSgnXFxcXC5hLlxcXFxbYlxcXFxdJyk7XG4gICAqICAgICBleHBlY3QoeycuYSc6IHsnW2JdJzogJ3gnfX0pLnRvLm5lc3RlZC5pbmNsdWRlKHsnXFxcXC5hLlxcXFxbYlxcXFxdJzogJ3gnfSk7XG4gICAqXG4gICAqIGAubmVzdGVkYCBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBgLm93bmAuXG4gICAqXG4gICAqIEBuYW1lIG5lc3RlZFxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ25lc3RlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBmbGFnKHRoaXMsICduZXN0ZWQnLCB0cnVlKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAub3duXG4gICAqXG4gICAqIENhdXNlcyBhbGwgYC5wcm9wZXJ0eWAgYW5kIGAuaW5jbHVkZWAgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW5cbiAgICogdG8gaWdub3JlIGluaGVyaXRlZCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiAgICAgT2JqZWN0LnByb3RvdHlwZS5iID0gMjtcbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUub3duLnByb3BlcnR5KCdhJyk7XG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLnByb3BlcnR5KCdiJykuYnV0Lm5vdC5vd24ucHJvcGVydHkoJ2InKTsgXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5vd24uaW5jbHVkZSh7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaW5jbHVkZSh7YjogMn0pLmJ1dC5ub3Qub3duLmluY2x1ZGUoe2I6IDJ9KTtcbiAgICpcbiAgICogYC5vd25gIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGAubmVzdGVkYC5cbiAgICpcbiAgICogQG5hbWUgb3duXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnb3duJywgZnVuY3Rpb24gKCkge1xuICAgIGZsYWcodGhpcywgJ293bicsIHRydWUpO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5vcmRlcmVkXG4gICAqXG4gICAqIENhdXNlcyBhbGwgYC5tZW1iZXJzYCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0byByZXF1aXJlIHRoYXRcbiAgICogbWVtYmVycyBiZSBpbiB0aGUgc2FtZSBvcmRlci5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMl0pLnRvLmhhdmUub3JkZXJlZC5tZW1iZXJzKFsxLCAyXSlcbiAgICogICAgICAgLmJ1dC5ub3QuaGF2ZS5vcmRlcmVkLm1lbWJlcnMoWzIsIDFdKTtcbiAgICpcbiAgICogV2hlbiBgLmluY2x1ZGVgIGFuZCBgLm9yZGVyZWRgIGFyZSBjb21iaW5lZCwgdGhlIG9yZGVyaW5nIGJlZ2lucyBhdCB0aGVcbiAgICogc3RhcnQgb2YgYm90aCBhcnJheXMuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5pbmNsdWRlLm9yZGVyZWQubWVtYmVycyhbMSwgMl0pXG4gICAqICAgICAgIC5idXQubm90LmluY2x1ZGUub3JkZXJlZC5tZW1iZXJzKFsyLCAzXSk7XG4gICAqXG4gICAqIEBuYW1lIG9yZGVyZWRcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdvcmRlcmVkJywgZnVuY3Rpb24gKCkge1xuICAgIGZsYWcodGhpcywgJ29yZGVyZWQnLCB0cnVlKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuYW55XG4gICAqXG4gICAqIENhdXNlcyBhbGwgYC5rZXlzYCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0byBvbmx5IHJlcXVpcmUgdGhhdFxuICAgKiB0aGUgdGFyZ2V0IGhhdmUgYXQgbGVhc3Qgb25lIG9mIHRoZSBnaXZlbiBrZXlzLiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZlxuICAgKiBgLmFsbGAsIHdoaWNoIHJlcXVpcmVzIHRoYXQgdGhlIHRhcmdldCBoYXZlIGFsbCBvZiB0aGUgZ2l2ZW4ga2V5cy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMn0pLnRvLm5vdC5oYXZlLmFueS5rZXlzKCdjJywgJ2QnKTtcbiAgICpcbiAgICogU2VlIHRoZSBgLmtleXNgIGRvYyBmb3IgZ3VpZGFuY2Ugb24gd2hlbiB0byB1c2UgYC5hbnlgIG9yIGAuYWxsYC5cbiAgICpcbiAgICogQG5hbWUgYW55XG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnYW55JywgZnVuY3Rpb24gKCkge1xuICAgIGZsYWcodGhpcywgJ2FueScsIHRydWUpO1xuICAgIGZsYWcodGhpcywgJ2FsbCcsIGZhbHNlKTtcbiAgfSk7XG5cblxuICAvKipcbiAgICogIyMjIC5hbGxcbiAgICpcbiAgICogQ2F1c2VzIGFsbCBgLmtleXNgIGFzc2VydGlvbnMgdGhhdCBmb2xsb3cgaW4gdGhlIGNoYWluIHRvIHJlcXVpcmUgdGhhdCB0aGVcbiAgICogdGFyZ2V0IGhhdmUgYWxsIG9mIHRoZSBnaXZlbiBrZXlzLiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZiBgLmFueWAsIHdoaWNoXG4gICAqIG9ubHkgcmVxdWlyZXMgdGhhdCB0aGUgdGFyZ2V0IGhhdmUgYXQgbGVhc3Qgb25lIG9mIHRoZSBnaXZlbiBrZXlzLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqIE5vdGUgdGhhdCBgLmFsbGAgaXMgdXNlZCBieSBkZWZhdWx0IHdoZW4gbmVpdGhlciBgLmFsbGAgbm9yIGAuYW55YCBhcmVcbiAgICogYWRkZWQgZWFybGllciBpbiB0aGUgY2hhaW4uIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhZGQgYC5hbGxgIGFueXdheVxuICAgKiBiZWNhdXNlIGl0IGltcHJvdmVzIHJlYWRhYmlsaXR5LlxuICAgKlxuICAgKiBTZWUgdGhlIGAua2V5c2AgZG9jIGZvciBndWlkYW5jZSBvbiB3aGVuIHRvIHVzZSBgLmFueWAgb3IgYC5hbGxgLlxuICAgKlxuICAgKiBAbmFtZSBhbGxcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdhbGwnLCBmdW5jdGlvbiAoKSB7XG4gICAgZmxhZyh0aGlzLCAnYWxsJywgdHJ1ZSk7XG4gICAgZmxhZyh0aGlzLCAnYW55JywgZmFsc2UpO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5hKHR5cGVbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCdzIHR5cGUgaXMgZXF1YWwgdG8gdGhlIGdpdmVuIHN0cmluZyBgdHlwZWAuIFR5cGVzXG4gICAqIGFyZSBjYXNlIGluc2Vuc2l0aXZlLiBTZWUgdGhlIGB0eXBlLWRldGVjdGAgcHJvamVjdCBwYWdlIGZvciBpbmZvIG9uIHRoZVxuICAgKiB0eXBlIGRldGVjdGlvbiBhbGdvcml0aG06IGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFpanMvdHlwZS1kZXRlY3QuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmJlLmEoJ3N0cmluZycpO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uYmUuYW4oJ29iamVjdCcpO1xuICAgKiAgICAgZXhwZWN0KG51bGwpLnRvLmJlLmEoJ251bGwnKTtcbiAgICogICAgIGV4cGVjdCh1bmRlZmluZWQpLnRvLmJlLmFuKCd1bmRlZmluZWQnKTtcbiAgICogICAgIGV4cGVjdChuZXcgRXJyb3IpLnRvLmJlLmFuKCdlcnJvcicpO1xuICAgKiAgICAgZXhwZWN0KFByb21pc2UucmVzb2x2ZSgpKS50by5iZS5hKCdwcm9taXNlJyk7XG4gICAqICAgICBleHBlY3QobmV3IEZsb2F0MzJBcnJheSkudG8uYmUuYSgnZmxvYXQzMmFycmF5Jyk7XG4gICAqICAgICBleHBlY3QoU3ltYm9sKCkpLnRvLmJlLmEoJ3N5bWJvbCcpO1xuICAgKlxuICAgKiBgLmFgIHN1cHBvcnRzIG9iamVjdHMgdGhhdCBoYXZlIGEgY3VzdG9tIHR5cGUgc2V0IHZpYSBgU3ltYm9sLnRvU3RyaW5nVGFnYC5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHtcbiAgICogICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdteUN1c3RvbVR5cGUnXG4gICAqICAgICB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KG15T2JqKS50by5iZS5hKCdteUN1c3RvbVR5cGUnKS5idXQubm90LmFuKCdvYmplY3QnKTtcbiAgICpcbiAgICogSXQncyBvZnRlbiBiZXN0IHRvIHVzZSBgLmFgIHRvIGNoZWNrIGEgdGFyZ2V0J3MgdHlwZSBiZWZvcmUgbWFraW5nIG1vcmVcbiAgICogYXNzZXJ0aW9ucyBvbiB0aGUgc2FtZSB0YXJnZXQuIFRoYXQgd2F5LCB5b3UgYXZvaWQgdW5leHBlY3RlZCBiZWhhdmlvciBmcm9tXG4gICAqIGFueSBhc3NlcnRpb24gdGhhdCBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIHRhcmdldCdzIHR5cGUuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5iZS5hbignYXJyYXknKS50aGF0LmluY2x1ZGVzKDIpO1xuICAgKiAgICAgZXhwZWN0KFtdKS50by5iZS5hbignYXJyYXknKS50aGF0LmlzLmVtcHR5O1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmFgLiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG9cbiAgICogYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCBpcyB0aGUgZXhwZWN0ZWQgdHlwZSwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIHRoYXQgaXRcbiAgICogaXNuJ3Qgb25lIG9mIG1hbnkgdW5leHBlY3RlZCB0eXBlcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uYmUuYSgnc3RyaW5nJyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLm5vdC5iZS5hbignYXJyYXknKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAuYWAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvciBtZXNzYWdlIHRvXG4gICAqIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhcyB0aGUgc2Vjb25kXG4gICAqIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLmEoJ3N0cmluZycsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCgxLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuYSgnc3RyaW5nJyk7XG4gICAqXG4gICAqIGAuYWAgY2FuIGFsc28gYmUgdXNlZCBhcyBhIGxhbmd1YWdlIGNoYWluIHRvIGltcHJvdmUgdGhlIHJlYWRhYmlsaXR5IG9mXG4gICAqIHlvdXIgYXNzZXJ0aW9ucy4gXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2I6IDJ9KS50by5oYXZlLmEucHJvcGVydHkoJ2InKTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuYW5gIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuYWAuXG4gICAqXG4gICAqIEBuYW1lIGFcbiAgICogQGFsaWFzIGFuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhbiAodHlwZSwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgYXJ0aWNsZSA9IH5bICdhJywgJ2UnLCAnaScsICdvJywgJ3UnIF0uaW5kZXhPZih0eXBlLmNoYXJBdCgwKSkgPyAnYW4gJyA6ICdhICc7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgdHlwZSA9PT0gXy50eXBlKG9iaikudG9Mb3dlckNhc2UoKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSAnICsgYXJ0aWNsZSArIHR5cGVcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlICcgKyBhcnRpY2xlICsgdHlwZVxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKCdhbicsIGFuKTtcbiAgQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCgnYScsIGFuKTtcblxuICAvKipcbiAgICogIyMjIC5pbmNsdWRlKHZhbFssIG1zZ10pXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhIHN0cmluZywgYC5pbmNsdWRlYCBhc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHN0cmluZyBgdmFsYFxuICAgKiBpcyBhIHN1YnN0cmluZyBvZiB0aGUgdGFyZ2V0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb29iYXInKS50by5pbmNsdWRlKCdmb28nKTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGFuIGFycmF5LCBgLmluY2x1ZGVgIGFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYHZhbGAgaXMgYVxuICAgKiBtZW1iZXIgb2YgdGhlIHRhcmdldC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmluY2x1ZGUoMik7XG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhbiBvYmplY3QsIGAuaW5jbHVkZWAgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3RcbiAgICogYHZhbGAncyBwcm9wZXJ0aWVzIGFyZSBhIHN1YnNldCBvZiB0aGUgdGFyZ2V0J3MgcHJvcGVydGllcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMiwgYzogM30pLnRvLmluY2x1ZGUoe2E6IDEsIGI6IDJ9KTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGEgU2V0IG9yIFdlYWtTZXQsIGAuaW5jbHVkZWAgYXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBgdmFsYCBpcyBhXG4gICAqIG1lbWJlciBvZiB0aGUgdGFyZ2V0LiBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobSBpcyB1c2VkLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoWzEsIDJdKSkudG8uaW5jbHVkZSgyKTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGEgTWFwLCBgLmluY2x1ZGVgIGFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYHZhbGAgaXMgb25lIG9mXG4gICAqIHRoZSB2YWx1ZXMgb2YgdGhlIHRhcmdldC4gU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG0gaXMgdXNlZC5cbiAgICpcbiAgICogICAgIGV4cGVjdChuZXcgTWFwKFtbJ2EnLCAxXSwgWydiJywgMl1dKSkudG8uaW5jbHVkZSgyKTtcbiAgICpcbiAgICogQmVjYXVzZSBgLmluY2x1ZGVgIGRvZXMgZGlmZmVyZW50IHRoaW5ncyBiYXNlZCBvbiB0aGUgdGFyZ2V0J3MgdHlwZSwgaXQnc1xuICAgKiBpbXBvcnRhbnQgdG8gY2hlY2sgdGhlIHRhcmdldCdzIHR5cGUgYmVmb3JlIHVzaW5nIGAuaW5jbHVkZWAuIFNlZSB0aGUgYC5hYFxuICAgKiBkb2MgZm9yIGluZm8gb24gdGVzdGluZyBhIHRhcmdldCdzIHR5cGUuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5iZS5hbignYXJyYXknKS50aGF0LmluY2x1ZGVzKDIpO1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBzdHJpY3QgKGA9PT1gKSBlcXVhbGl0eSBpcyB1c2VkIHRvIGNvbXBhcmUgYXJyYXkgbWVtYmVycyBhbmRcbiAgICogb2JqZWN0IHByb3BlcnRpZXMuIEFkZCBgLmRlZXBgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIHVzZSBkZWVwIGVxdWFsaXR5XG4gICAqIGluc3RlYWQgKFdlYWtTZXQgdGFyZ2V0cyBhcmUgbm90IHN1cHBvcnRlZCkuIFNlZSB0aGUgYGRlZXAtZXFsYCBwcm9qZWN0XG4gICAqIHBhZ2UgZm9yIGluZm8gb24gdGhlIGRlZXAgZXF1YWxpdHkgYWxnb3JpdGhtOiBodHRwczovL2dpdGh1Yi5jb20vY2hhaWpzL2RlZXAtZXFsLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IGFycmF5IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaW5jbHVkZXMgYHthOiAxfWBcbiAgICogICAgIGV4cGVjdChbe2E6IDF9XSkudG8uZGVlcC5pbmNsdWRlKHthOiAxfSk7XG4gICAqICAgICBleHBlY3QoW3thOiAxfV0pLnRvLm5vdC5pbmNsdWRlKHthOiAxfSk7XG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgb2JqZWN0IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaW5jbHVkZXMgYHg6IHthOiAxfWBcbiAgICogICAgIGV4cGVjdCh7eDoge2E6IDF9fSkudG8uZGVlcC5pbmNsdWRlKHt4OiB7YTogMX19KTtcbiAgICogICAgIGV4cGVjdCh7eDoge2E6IDF9fSkudG8ubm90LmluY2x1ZGUoe3g6IHthOiAxfX0pO1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBhbGwgb2YgdGhlIHRhcmdldCdzIHByb3BlcnRpZXMgYXJlIHNlYXJjaGVkIHdoZW4gd29ya2luZyB3aXRoXG4gICAqIG9iamVjdHMuIFRoaXMgaW5jbHVkZXMgcHJvcGVydGllcyB0aGF0IGFyZSBpbmhlcml0ZWQgYW5kL29yIG5vbi1lbnVtZXJhYmxlLlxuICAgKiBBZGQgYC5vd25gIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIGV4Y2x1ZGUgdGhlIHRhcmdldCdzIGluaGVyaXRlZFxuICAgKiBwcm9wZXJ0aWVzIGZyb20gdGhlIHNlYXJjaC5cbiAgICpcbiAgICogICAgIE9iamVjdC5wcm90b3R5cGUuYiA9IDI7XG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5vd24uaW5jbHVkZSh7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaW5jbHVkZSh7YjogMn0pLmJ1dC5ub3Qub3duLmluY2x1ZGUoe2I6IDJ9KTtcbiAgICpcbiAgICogTm90ZSB0aGF0IGEgdGFyZ2V0IG9iamVjdCBpcyBhbHdheXMgb25seSBzZWFyY2hlZCBmb3IgYHZhbGAncyBvd25cbiAgICogZW51bWVyYWJsZSBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBgLmRlZXBgIGFuZCBgLm93bmAgY2FuIGJlIGNvbWJpbmVkLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiB7YjogMn19KS50by5kZWVwLm93bi5pbmNsdWRlKHthOiB7YjogMn19KTtcbiAgICpcbiAgICogQWRkIGAubmVzdGVkYCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBlbmFibGUgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiB3aGVuXG4gICAqIHJlZmVyZW5jaW5nIG5lc3RlZCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiB7YjogWyd4JywgJ3knXX19KS50by5uZXN0ZWQuaW5jbHVkZSh7J2EuYlsxXSc6ICd5J30pO1xuICAgKlxuICAgKiBJZiBgLmAgb3IgYFtdYCBhcmUgcGFydCBvZiBhbiBhY3R1YWwgcHJvcGVydHkgbmFtZSwgdGhleSBjYW4gYmUgZXNjYXBlZCBieVxuICAgKiBhZGRpbmcgdHdvIGJhY2tzbGFzaGVzIGJlZm9yZSB0aGVtLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHsnLmEnOiB7J1tiXSc6IDJ9fSkudG8ubmVzdGVkLmluY2x1ZGUoeydcXFxcLmEuXFxcXFtiXFxcXF0nOiAyfSk7XG4gICAqXG4gICAqIGAuZGVlcGAgYW5kIGAubmVzdGVkYCBjYW4gYmUgY29tYmluZWQuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IHtiOiBbe2M6IDN9XX19KS50by5kZWVwLm5lc3RlZC5pbmNsdWRlKHsnYS5iWzBdJzoge2M6IDN9fSk7XG4gICAqXG4gICAqIGAub3duYCBhbmQgYC5uZXN0ZWRgIGNhbm5vdCBiZSBjb21iaW5lZC5cbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5pbmNsdWRlYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vYmFyJykudG8ubm90LmluY2x1ZGUoJ3RhY28nKTtcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLm5vdC5pbmNsdWRlKDQpO1xuICAgKiBcbiAgICogSG93ZXZlciwgaXQncyBkYW5nZXJvdXMgdG8gbmVnYXRlIGAuaW5jbHVkZWAgd2hlbiB0aGUgdGFyZ2V0IGlzIGFuIG9iamVjdC5cbiAgICogVGhlIHByb2JsZW0gaXMgdGhhdCBpdCBjcmVhdGVzIHVuY2VydGFpbiBleHBlY3RhdGlvbnMgYnkgYXNzZXJ0aW5nIHRoYXQgdGhlXG4gICAqIHRhcmdldCBvYmplY3QgZG9lc24ndCBoYXZlIGFsbCBvZiBgdmFsYCdzIGtleS92YWx1ZSBwYWlycyBidXQgbWF5IG9yIG1heVxuICAgKiBub3QgaGF2ZSBzb21lIG9mIHRoZW0uIEl0J3Mgb2Z0ZW4gYmVzdCB0byBpZGVudGlmeSB0aGUgZXhhY3Qgb3V0cHV0IHRoYXQnc1xuICAgKiBleHBlY3RlZCwgYW5kIHRoZW4gd3JpdGUgYW4gYXNzZXJ0aW9uIHRoYXQgb25seSBhY2NlcHRzIHRoYXQgZXhhY3Qgb3V0cHV0LlxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgb2JqZWN0IGlzbid0IGV2ZW4gZXhwZWN0ZWQgdG8gaGF2ZSBgdmFsYCdzIGtleXMsIGl0J3NcbiAgICogb2Z0ZW4gYmVzdCB0byBhc3NlcnQgZXhhY3RseSB0aGF0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHtjOiAzfSkudG8ubm90LmhhdmUuYW55LmtleXMoJ2EnLCAnYicpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHtjOiAzfSkudG8ubm90LmluY2x1ZGUoe2E6IDEsIGI6IDJ9KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBvYmplY3QgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBgdmFsYCdzIGtleXMsIGl0J3Mgb2Z0ZW4gYmVzdCB0b1xuICAgKiBhc3NlcnQgdGhhdCBlYWNoIG9mIHRoZSBwcm9wZXJ0aWVzIGhhcyBpdHMgZXhwZWN0ZWQgdmFsdWUsIHJhdGhlciB0aGFuXG4gICAqIGFzc2VydGluZyB0aGF0IGVhY2ggcHJvcGVydHkgZG9lc24ndCBoYXZlIG9uZSBvZiBtYW55IHVuZXhwZWN0ZWQgdmFsdWVzLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAzLCBiOiA0fSkudG8uaW5jbHVkZSh7YTogMywgYjogNH0pOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAzLCBiOiA0fSkudG8ubm90LmluY2x1ZGUoe2E6IDEsIGI6IDJ9KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAuaW5jbHVkZWAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaW5jbHVkZSg0LCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uaW5jbHVkZSg0KTtcbiAgICpcbiAgICogYC5pbmNsdWRlYCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgbGFuZ3VhZ2UgY2hhaW4sIGNhdXNpbmcgYWxsIGAubWVtYmVyc2AgYW5kXG4gICAqIGAua2V5c2AgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4gdG8gcmVxdWlyZSB0aGUgdGFyZ2V0IHRvIGJlIGFcbiAgICogc3VwZXJzZXQgb2YgdGhlIGV4cGVjdGVkIHNldCwgcmF0aGVyIHRoYW4gYW4gaWRlbnRpY2FsIHNldC4gTm90ZSB0aGF0XG4gICAqIGAubWVtYmVyc2AgaWdub3JlcyBkdXBsaWNhdGVzIGluIHRoZSBzdWJzZXQgd2hlbiBgLmluY2x1ZGVgIGlzIGFkZGVkLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IG9iamVjdCdzIGtleXMgYXJlIGEgc3VwZXJzZXQgb2YgWydhJywgJ2InXSBidXQgbm90IGlkZW50aWNhbFxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyLCBjOiAzfSkudG8uaW5jbHVkZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDIsIGM6IDN9KS50by5ub3QuaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgYXJyYXkgaXMgYSBzdXBlcnNldCBvZiBbMSwgMl0gYnV0IG5vdCBpZGVudGljYWxcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmluY2x1ZGUubWVtYmVycyhbMSwgMl0pO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8ubm90LmhhdmUubWVtYmVycyhbMSwgMl0pO1xuICAgKlxuICAgKiAgICAgLy8gRHVwbGljYXRlcyBpbiB0aGUgc3Vic2V0IGFyZSBpZ25vcmVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5pbmNsdWRlLm1lbWJlcnMoWzEsIDIsIDIsIDJdKTtcbiAgICpcbiAgICogTm90ZSB0aGF0IGFkZGluZyBgLmFueWAgZWFybGllciBpbiB0aGUgY2hhaW4gY2F1c2VzIHRoZSBgLmtleXNgIGFzc2VydGlvblxuICAgKiB0byBpZ25vcmUgYC5pbmNsdWRlYC5cbiAgICpcbiAgICogICAgIC8vIEJvdGggYXNzZXJ0aW9ucyBhcmUgaWRlbnRpY2FsXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5pbmNsdWRlLmFueS5rZXlzKCdhJywgJ2InKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUuYW55LmtleXMoJ2EnLCAnYicpO1xuICAgKlxuICAgKiBUaGUgYWxpYXNlcyBgLmluY2x1ZGVzYCwgYC5jb250YWluYCwgYW5kIGAuY29udGFpbnNgIGNhbiBiZSB1c2VkXG4gICAqIGludGVyY2hhbmdlYWJseSB3aXRoIGAuaW5jbHVkZWAuXG4gICAqXG4gICAqIEBuYW1lIGluY2x1ZGVcbiAgICogQGFsaWFzIGNvbnRhaW5cbiAgICogQGFsaWFzIGluY2x1ZGVzXG4gICAqIEBhbGlhcyBjb250YWluc1xuICAgKiBAcGFyYW0ge01peGVkfSB2YWxcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIFNhbWVWYWx1ZVplcm8oYSwgYikge1xuICAgIHJldHVybiAoXy5pc05hTihhKSAmJiBfLmlzTmFOKGIpKSB8fCBhID09PSBiO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5jbHVkZUNoYWluaW5nQmVoYXZpb3IgKCkge1xuICAgIGZsYWcodGhpcywgJ2NvbnRhaW5zJywgdHJ1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpbmNsdWRlICh2YWwsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIFxuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBvYmpUeXBlID0gXy50eXBlKG9iaikudG9Mb3dlckNhc2UoKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIG5lZ2F0ZSA9IGZsYWcodGhpcywgJ25lZ2F0ZScpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJylcbiAgICAgICwgaXNEZWVwID0gZmxhZyh0aGlzLCAnZGVlcCcpXG4gICAgICAsIGRlc2NyaXB0b3IgPSBpc0RlZXAgPyAnZGVlcCAnIDogJyc7XG5cbiAgICBmbGFnTXNnID0gZmxhZ01zZyA/IGZsYWdNc2cgKyAnOiAnIDogJyc7XG5cbiAgICB2YXIgaW5jbHVkZWQgPSBmYWxzZTtcblxuICAgIHN3aXRjaCAob2JqVHlwZSkge1xuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouaW5kZXhPZih2YWwpICE9PSAtMTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3dlYWtzZXQnOlxuICAgICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICAgICAgZmxhZ01zZyArICd1bmFibGUgdG8gdXNlIC5kZWVwLmluY2x1ZGUgd2l0aCBXZWFrU2V0JyxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNzZmlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5jbHVkZWQgPSBvYmouaGFzKHZhbCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdtYXAnOlxuICAgICAgICB2YXIgaXNFcWwgPSBpc0RlZXAgPyBfLmVxbCA6IFNhbWVWYWx1ZVplcm87XG4gICAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgaW5jbHVkZWQgPSBpbmNsdWRlZCB8fCBpc0VxbChpdGVtLCB2YWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3NldCc6XG4gICAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgICBvYmouZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgaW5jbHVkZWQgPSBpbmNsdWRlZCB8fCBfLmVxbChpdGVtLCB2YWwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluY2x1ZGVkID0gb2JqLmhhcyh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgICBpbmNsdWRlZCA9IG9iai5zb21lKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gXy5lcWwoaXRlbSwgdmFsKTtcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluY2x1ZGVkID0gb2JqLmluZGV4T2YodmFsKSAhPT0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIFRoaXMgYmxvY2sgaXMgZm9yIGFzc2VydGluZyBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzIGluIGFuIG9iamVjdC5cbiAgICAgICAgLy8gYF8uZXhwZWN0VHlwZXNgIGlzbid0IHVzZWQgaGVyZSBiZWNhdXNlIGAuaW5jbHVkZWAgc2hvdWxkIHdvcmsgd2l0aFxuICAgICAgICAvLyBvYmplY3RzIHdpdGggYSBjdXN0b20gYEBAdG9TdHJpbmdUYWdgLlxuICAgICAgICBpZiAodmFsICE9PSBPYmplY3QodmFsKSkge1xuICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgICAgIGZsYWdNc2cgKyAnb2JqZWN0IHRlc3RlZCBtdXN0IGJlIGFuIGFycmF5LCBhIG1hcCwgYW4gb2JqZWN0LCdcbiAgICAgICAgICAgICAgKyAnIGEgc2V0LCBhIHN0cmluZywgb3IgYSB3ZWFrc2V0LCBidXQgJyArIG9ialR5cGUgKyAnIGdpdmVuJyxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHNzZmlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByb3BzID0gT2JqZWN0LmtleXModmFsKVxuICAgICAgICAgICwgZmlyc3RFcnIgPSBudWxsXG4gICAgICAgICAgLCBudW1FcnJzID0gMDtcbiAgXG4gICAgICAgIHByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgICB2YXIgcHJvcEFzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24ob2JqKTtcbiAgICAgICAgICBfLnRyYW5zZmVyRmxhZ3ModGhpcywgcHJvcEFzc2VydGlvbiwgdHJ1ZSk7XG4gICAgICAgICAgZmxhZyhwcm9wQXNzZXJ0aW9uLCAnbG9ja1NzZmknLCB0cnVlKTtcbiAgXG4gICAgICAgICAgaWYgKCFuZWdhdGUgfHwgcHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBwcm9wQXNzZXJ0aW9uLnByb3BlcnR5KHByb3AsIHZhbFtwcm9wXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICBcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcHJvcEFzc2VydGlvbi5wcm9wZXJ0eShwcm9wLCB2YWxbcHJvcF0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKCFfLmNoZWNrRXJyb3IuY29tcGF0aWJsZUNvbnN0cnVjdG9yKGVyciwgQXNzZXJ0aW9uRXJyb3IpKSB7XG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaXJzdEVyciA9PT0gbnVsbCkgZmlyc3RFcnIgPSBlcnI7XG4gICAgICAgICAgICBudW1FcnJzKys7XG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aGlzKTtcbiAgXG4gICAgICAgIC8vIFdoZW4gdmFsaWRhdGluZyAubm90LmluY2x1ZGUgd2l0aCBtdWx0aXBsZSBwcm9wZXJ0aWVzLCB3ZSBvbmx5IHdhbnRcbiAgICAgICAgLy8gdG8gdGhyb3cgYW4gYXNzZXJ0aW9uIGVycm9yIGlmIGFsbCBvZiB0aGUgcHJvcGVydGllcyBhcmUgaW5jbHVkZWQsXG4gICAgICAgIC8vIGluIHdoaWNoIGNhc2Ugd2UgdGhyb3cgdGhlIGZpcnN0IHByb3BlcnR5IGFzc2VydGlvbiBlcnJvciB0aGF0IHdlXG4gICAgICAgIC8vIGVuY291bnRlcmVkLlxuICAgICAgICBpZiAobmVnYXRlICYmIHByb3BzLmxlbmd0aCA+IDEgJiYgbnVtRXJycyA9PT0gcHJvcHMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgZmlyc3RFcnI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFzc2VydCBpbmNsdXNpb24gaW4gY29sbGVjdGlvbiBvciBzdWJzdHJpbmcgaW4gYSBzdHJpbmcuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBpbmNsdWRlZFxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byAnICsgZGVzY3JpcHRvciArICdpbmNsdWRlICcgKyBfLmluc3BlY3QodmFsKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgJyArIGRlc2NyaXB0b3IgKyAnaW5jbHVkZSAnICsgXy5pbnNwZWN0KHZhbCkpO1xuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCgnaW5jbHVkZScsIGluY2x1ZGUsIGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yKTtcbiAgQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCgnY29udGFpbicsIGluY2x1ZGUsIGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yKTtcbiAgQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCgnY29udGFpbnMnLCBpbmNsdWRlLCBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcik7XG4gIEFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoJ2luY2x1ZGVzJywgaW5jbHVkZSwgaW5jbHVkZUNoYWluaW5nQmVoYXZpb3IpO1xuXG4gIC8qKlxuICAgKiAjIyMgLm9rXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIGxvb3NlbHkgKGA9PWApIGVxdWFsIHRvIGB0cnVlYC4gSG93ZXZlciwgaXQnc1xuICAgKiBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgc3RyaWN0bHkgKGA9PT1gKSBvciBkZWVwbHkgZXF1YWwgdG9cbiAgICogaXRzIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLm9rOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdCh0cnVlKS50by5iZS50cnVlOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHRydWUpLnRvLmJlLm9rOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5va2AuXG4gICAqXG4gICAqICAgICBleHBlY3QoMCkudG8uZXF1YWwoMCk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMCkudG8ubm90LmJlLm9rOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdChmYWxzZSkudG8uYmUuZmFsc2U7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoZmFsc2UpLnRvLm5vdC5iZS5vazsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QobnVsbCkudG8uYmUubnVsbDsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChudWxsKS50by5ub3QuYmUub2s7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KHVuZGVmaW5lZCkudG8uYmUudW5kZWZpbmVkOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHVuZGVmaW5lZCkudG8ubm90LmJlLm9rOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChmYWxzZSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLm9rO1xuICAgKlxuICAgKiBAbmFtZSBva1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ29rJywgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB0cnV0aHknXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGZhbHN5Jyk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLnRydWVcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgc3RyaWN0bHkgKGA9PT1gKSBlcXVhbCB0byBgdHJ1ZWAuXG4gICAqXG4gICAqICAgICBleHBlY3QodHJ1ZSkudG8uYmUudHJ1ZTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC50cnVlYC4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0XG4gICAqIHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhbiBub3RcbiAgICogZXF1YWwgdG8gYHRydWVgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KGZhbHNlKS50by5iZS5mYWxzZTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChmYWxzZSkudG8ubm90LmJlLnRydWU7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLm5vdC5iZS50cnVlOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChmYWxzZSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLnRydWU7XG4gICAqXG4gICAqIEBuYW1lIHRydWVcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCd0cnVlJywgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICB0cnVlID09PSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB0cnVlJ1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBmYWxzZSdcbiAgICAgICwgZmxhZyh0aGlzLCAnbmVnYXRlJykgPyBmYWxzZSA6IHRydWVcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5mYWxzZVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBzdHJpY3RseSAoYD09PWApIGVxdWFsIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqICAgICBleHBlY3QoZmFsc2UpLnRvLmJlLmZhbHNlO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmZhbHNlYC4gSG93ZXZlciwgaXQncyBvZnRlblxuICAgKiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhblxuICAgKiBub3QgZXF1YWwgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh0cnVlKS50by5iZS50cnVlOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHRydWUpLnRvLm5vdC5iZS5mYWxzZTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8ubm90LmJlLmZhbHNlOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh0cnVlLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuZmFsc2U7XG4gICAqXG4gICAqIEBuYW1lIGZhbHNlXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnZmFsc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIGZhbHNlID09PSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBmYWxzZSdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgdHJ1ZSdcbiAgICAgICwgZmxhZyh0aGlzLCAnbmVnYXRlJykgPyB0cnVlIDogZmFsc2VcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5udWxsXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIHN0cmljdGx5IChgPT09YCkgZXF1YWwgdG8gYG51bGxgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KG51bGwpLnRvLmJlLm51bGw7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAubnVsbGAuIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW4gYmVzdFxuICAgKiB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGlzIGVxdWFsIHRvIGl0cyBleHBlY3RlZCB2YWx1ZSwgcmF0aGVyIHRoYW4gbm90XG4gICAqIGVxdWFsIHRvIGBudWxsYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5lcXVhbCgxKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuYmUubnVsbDsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoNDIsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5udWxsO1xuICAgKlxuICAgKiBAbmFtZSBudWxsXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnbnVsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgbnVsbCA9PT0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgbnVsbCdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIG51bGwnXG4gICAgKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAudW5kZWZpbmVkXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIHN0cmljdGx5IChgPT09YCkgZXF1YWwgdG8gYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqICAgICBleHBlY3QodW5kZWZpbmVkKS50by5iZS51bmRlZmluZWQ7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAudW5kZWZpbmVkYC4gSG93ZXZlciwgaXQncyBvZnRlblxuICAgKiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhblxuICAgKiBub3QgZXF1YWwgdG8gYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8ubm90LmJlLnVuZGVmaW5lZDsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoNDIsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS51bmRlZmluZWQ7XG4gICAqXG4gICAqIEBuYW1lIHVuZGVmaW5lZFxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ3VuZGVmaW5lZCcsIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgdW5kZWZpbmVkID09PSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB1bmRlZmluZWQnXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSB1bmRlZmluZWQnXG4gICAgKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuTmFOXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIGV4YWN0bHkgYE5hTmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoTmFOKS50by5iZS5OYU47XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuTmFOYC4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0XG4gICAqIHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhbiBub3RcbiAgICogZXF1YWwgdG8gYE5hTmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmVxdWFsKCdmb28nKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8ubm90LmJlLk5hTjsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoNDIsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5OYU47XG4gICAqXG4gICAqIEBuYW1lIE5hTlxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ05hTicsIGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgXy5pc05hTihmbGFnKHRoaXMsICdvYmplY3QnKSlcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBOYU4nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIE5hTidcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5leGlzdFxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBub3Qgc3RyaWN0bHkgKGA9PT1gKSBlcXVhbCB0byBlaXRoZXIgYG51bGxgIG9yXG4gICAqIGB1bmRlZmluZWRgLiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCBpcyBlcXVhbCB0b1xuICAgKiBpdHMgZXhwZWN0ZWQgdmFsdWUuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8uZXhpc3Q7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KDApLnRvLmVxdWFsKDApOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDApLnRvLmV4aXN0OyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5leGlzdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QobnVsbCkudG8uYmUubnVsbDsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChudWxsKS50by5ub3QuZXhpc3Q7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KHVuZGVmaW5lZCkudG8uYmUudW5kZWZpbmVkOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHVuZGVmaW5lZCkudG8ubm90LmV4aXN0OyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChudWxsLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uZXhpc3Q7XG4gICAqXG4gICAqIEBuYW1lIGV4aXN0XG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnZXhpc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHZhbCA9IGZsYWcodGhpcywgJ29iamVjdCcpO1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB1bmRlZmluZWRcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gZXhpc3QnXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBleGlzdCdcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5lbXB0eVxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgYSBzdHJpbmcgb3IgYXJyYXksIGAuZW1wdHlgIGFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0J3NcbiAgICogYGxlbmd0aGAgcHJvcGVydHkgaXMgc3RyaWN0bHkgKGA9PT1gKSBlcXVhbCB0byBgMGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoW10pLnRvLmJlLmVtcHR5O1xuICAgKiAgICAgZXhwZWN0KCcnKS50by5iZS5lbXB0eTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGEgbWFwIG9yIHNldCwgYC5lbXB0eWAgYXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQncyBgc2l6ZWBcbiAgICogcHJvcGVydHkgaXMgc3RyaWN0bHkgZXF1YWwgdG8gYDBgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoKSkudG8uYmUuZW1wdHk7XG4gICAqICAgICBleHBlY3QobmV3IE1hcCgpKS50by5iZS5lbXB0eTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGEgbm9uLWZ1bmN0aW9uIG9iamVjdCwgYC5lbXB0eWAgYXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXRcbiAgICogZG9lc24ndCBoYXZlIGFueSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzLiBQcm9wZXJ0aWVzIHdpdGggU3ltYm9sLWJhc2VkXG4gICAqIGtleXMgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIGNvdW50LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHt9KS50by5iZS5lbXB0eTtcbiAgICpcbiAgICogQmVjYXVzZSBgLmVtcHR5YCBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIHRhcmdldCdzIHR5cGUsIGl0J3NcbiAgICogaW1wb3J0YW50IHRvIGNoZWNrIHRoZSB0YXJnZXQncyB0eXBlIGJlZm9yZSB1c2luZyBgLmVtcHR5YC4gU2VlIHRoZSBgLmFgXG4gICAqIGRvYyBmb3IgaW5mbyBvbiB0ZXN0aW5nIGEgdGFyZ2V0J3MgdHlwZS5cbiAgICpcbiAgICogICAgIGV4cGVjdChbXSkudG8uYmUuYW4oJ2FycmF5JykudGhhdC5pcy5lbXB0eTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5lbXB0eWAuIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW5cbiAgICogYmVzdCB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGNvbnRhaW5zIGl0cyBleHBlY3RlZCBudW1iZXIgb2YgdmFsdWVzLFxuICAgKiByYXRoZXIgdGhhbiBhc3NlcnRpbmcgdGhhdCBpdCdzIG5vdCBlbXB0eS5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5ub3QuYmUuZW1wdHk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoWzEsIDIsIDNdKSkudG8uaGF2ZS5wcm9wZXJ0eSgnc2l6ZScsIDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoWzEsIDIsIDNdKSkudG8ubm90LmJlLmVtcHR5OyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdChPYmplY3Qua2V5cyh7YTogMX0pKS50by5oYXZlLmxlbmd0aE9mKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8ubm90LmJlLmVtcHR5OyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10sICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5lbXB0eTtcbiAgICpcbiAgICogQG5hbWUgZW1wdHlcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdlbXB0eScsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIGl0ZW1zQ291bnQ7XG5cbiAgICBmbGFnTXNnID0gZmxhZ01zZyA/IGZsYWdNc2cgKyAnOiAnIDogJyc7XG5cbiAgICBzd2l0Y2ggKF8udHlwZSh2YWwpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIGNhc2UgJ2FycmF5JzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIGl0ZW1zQ291bnQgPSB2YWwubGVuZ3RoO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21hcCc6XG4gICAgICBjYXNlICdzZXQnOlxuICAgICAgICBpdGVtc0NvdW50ID0gdmFsLnNpemU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2Vha21hcCc6XG4gICAgICBjYXNlICd3ZWFrc2V0JzpcbiAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICAgIGZsYWdNc2cgKyAnLmVtcHR5IHdhcyBwYXNzZWQgYSB3ZWFrIGNvbGxlY3Rpb24nLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgIHZhciBtc2cgPSBmbGFnTXNnICsgJy5lbXB0eSB3YXMgcGFzc2VkIGEgZnVuY3Rpb24gJyArIF8uZ2V0TmFtZSh2YWwpO1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IobXNnLnRyaW0oKSwgdW5kZWZpbmVkLCBzc2ZpKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmICh2YWwgIT09IE9iamVjdCh2YWwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICAgICAgZmxhZ01zZyArICcuZW1wdHkgd2FzIHBhc3NlZCBub24tc3RyaW5nIHByaW1pdGl2ZSAnICsgXy5pbnNwZWN0KHZhbCksXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBzc2ZpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpdGVtc0NvdW50ID0gT2JqZWN0LmtleXModmFsKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIDAgPT09IGl0ZW1zQ291bnRcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgZW1wdHknXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBlbXB0eSdcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5hcmd1bWVudHNcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LlxuICAgKlxuICAgKiAgICAgZnVuY3Rpb24gdGVzdCAoKSB7XG4gICAqICAgICAgIGV4cGVjdChhcmd1bWVudHMpLnRvLmJlLmFyZ3VtZW50cztcbiAgICogICAgIH1cbiAgICpcbiAgICogICAgIHRlc3QoKTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5hcmd1bWVudHNgLiBIb3dldmVyLCBpdCdzIG9mdGVuXG4gICAqIGJlc3QgdG8gYXNzZXJ0IHdoaWNoIHR5cGUgdGhlIHRhcmdldCBpcyBleHBlY3RlZCB0byBiZSwgcmF0aGVyIHRoYW5cbiAgICogYXNzZXJ0aW5nIHRoYXQgaXRzIG5vdCBhbiBgYXJndW1lbnRzYCBvYmplY3QuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmJlLmEoJ3N0cmluZycpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5ub3QuYmUuYXJndW1lbnRzOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7fSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLmFyZ3VtZW50cztcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuQXJndW1lbnRzYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLmFyZ3VtZW50c2AuXG4gICAqXG4gICAqIEBuYW1lIGFyZ3VtZW50c1xuICAgKiBAYWxpYXMgQXJndW1lbnRzXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGNoZWNrQXJndW1lbnRzICgpIHtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgdHlwZSA9IF8udHlwZShvYmopO1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAnQXJndW1lbnRzJyA9PT0gdHlwZVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhcmd1bWVudHMgYnV0IGdvdCAnICsgdHlwZVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgYXJndW1lbnRzJ1xuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ2FyZ3VtZW50cycsIGNoZWNrQXJndW1lbnRzKTtcbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdBcmd1bWVudHMnLCBjaGVja0FyZ3VtZW50cyk7XG5cbiAgLyoqXG4gICAqICMjIyAuZXF1YWwodmFsWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgc3RyaWN0bHkgKGA9PT1gKSBlcXVhbCB0byB0aGUgZ2l2ZW4gYHZhbGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7XG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmVxdWFsKCdmb28nKTtcbiAgICogXG4gICAqIEFkZCBgLmRlZXBgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIHVzZSBkZWVwIGVxdWFsaXR5IGluc3RlYWQuIFNlZSB0aGVcbiAgICogYGRlZXAtZXFsYCBwcm9qZWN0IHBhZ2UgZm9yIGluZm8gb24gdGhlIGRlZXAgZXF1YWxpdHkgYWxnb3JpdGhtOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vY2hhaWpzL2RlZXAtZXFsLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IG9iamVjdCBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGVxdWFscyBge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uZGVlcC5lcXVhbCh7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8ubm90LmVxdWFsKHthOiAxfSk7XG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgYXJyYXkgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBlcXVhbHMgYFsxLCAyXWBcbiAgICogICAgIGV4cGVjdChbMSwgMl0pLnRvLmRlZXAuZXF1YWwoWzEsIDJdKTtcbiAgICogICAgIGV4cGVjdChbMSwgMl0pLnRvLm5vdC5lcXVhbChbMSwgMl0pO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmVxdWFsYC4gSG93ZXZlciwgaXQncyBvZnRlblxuICAgKiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLCByYXRoZXIgdGhhblxuICAgKiBub3QgZXF1YWwgdG8gb25lIG9mIGNvdW50bGVzcyB1bmV4cGVjdGVkIHZhbHVlcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5lcXVhbCgxKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuZXF1YWwoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBgLmVxdWFsYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzIHRoZVxuICAgKiBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMiwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KDEsICdub29vIHdoeSBmYWlsPz8nKS50by5lcXVhbCgyKTtcbiAgICpcbiAgICogVGhlIGFsaWFzZXMgYC5lcXVhbHNgIGFuZCBgZXFgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuZXF1YWxgLlxuICAgKlxuICAgKiBAbmFtZSBlcXVhbFxuICAgKiBAYWxpYXMgZXF1YWxzXG4gICAqIEBhbGlhcyBlcVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWxcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydEVxdWFsICh2YWwsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKTtcbiAgICBpZiAoZmxhZyh0aGlzLCAnZGVlcCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5lcWwodmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgdmFsID09PSBvYmpcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2V4cH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7ZXhwfSdcbiAgICAgICAgLCB2YWxcbiAgICAgICAgLCB0aGlzLl9vYmpcbiAgICAgICAgLCB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2VxdWFsJywgYXNzZXJ0RXF1YWwpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdlcXVhbHMnLCBhc3NlcnRFcXVhbCk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2VxJywgYXNzZXJ0RXF1YWwpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmVxbChvYmpbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBkZWVwbHkgZXF1YWwgdG8gdGhlIGdpdmVuIGBvYmpgLiBTZWUgdGhlXG4gICAqIGBkZWVwLWVxbGAgcHJvamVjdCBwYWdlIGZvciBpbmZvIG9uIHRoZSBkZWVwIGVxdWFsaXR5IGFsZ29yaXRobTpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2NoYWlqcy9kZWVwLWVxbC5cbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBvYmplY3QgaXMgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBlcXVhbCB0byB7YTogMX1cbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmVxbCh7YTogMX0pLmJ1dC5ub3QuZXF1YWwoe2E6IDF9KTtcbiAgICpcbiAgICogICAgIC8vIFRhcmdldCBhcnJheSBpcyBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGVxdWFsIHRvIFsxLCAyXVxuICAgKiAgICAgZXhwZWN0KFsxLCAyXSkudG8uZXFsKFsxLCAyXSkuYnV0Lm5vdC5lcXVhbChbMSwgMl0pO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmVxbGAuIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW4gYmVzdFxuICAgKiB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGlzIGRlZXBseSBlcXVhbCB0byBpdHMgZXhwZWN0ZWQgdmFsdWUsIHJhdGhlclxuICAgKiB0aGFuIG5vdCBkZWVwbHkgZXF1YWwgdG8gb25lIG9mIGNvdW50bGVzcyB1bmV4cGVjdGVkIHZhbHVlcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmVxbCh7YTogMX0pOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8ubm90LmVxbCh7YjogMn0pOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5lcWxgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICAgKiB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgdGhlXG4gICAqIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmVxbCh7YjogMn0sICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0sICdub29vIHdoeSBmYWlsPz8nKS50by5lcWwoe2I6IDJ9KTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuZXFsc2AgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGggYC5lcWxgLlxuICAgKlxuICAgKiBUaGUgYC5kZWVwLmVxdWFsYCBhc3NlcnRpb24gaXMgYWxtb3N0IGlkZW50aWNhbCB0byBgLmVxbGAgYnV0IHdpdGggb25lXG4gICAqIGRpZmZlcmVuY2U6IGAuZGVlcC5lcXVhbGAgY2F1c2VzIGRlZXAgZXF1YWxpdHkgY29tcGFyaXNvbnMgdG8gYWxzbyBiZSB1c2VkXG4gICAqIGZvciBhbnkgb3RoZXIgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4uXG4gICAqXG4gICAqIEBuYW1lIGVxbFxuICAgKiBAYWxpYXMgZXFsc1xuICAgKiBAcGFyYW0ge01peGVkfSBvYmpcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydEVxbChvYmosIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBfLmVxbChvYmosIGZsYWcodGhpcywgJ29iamVjdCcpKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBkZWVwbHkgZXF1YWwgI3tleHB9J1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgZGVlcGx5IGVxdWFsICN7ZXhwfSdcbiAgICAgICwgb2JqXG4gICAgICAsIHRoaXMuX29ialxuICAgICAgLCB0cnVlXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2VxbCcsIGFzc2VydEVxbCk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2VxbHMnLCBhc3NlcnRFcWwpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmFib3ZlKG5bLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlciBvciBhIGRhdGUgZ3JlYXRlciB0aGFuIHRoZSBnaXZlbiBudW1iZXIgb3IgZGF0ZSBgbmAgcmVzcGVjdGl2ZWx5LlxuICAgKiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCBpcyBlcXVhbCB0byBpdHMgZXhwZWN0ZWRcbiAgICogdmFsdWUuXG4gICAqXG4gICAqICAgICBleHBlY3QoMikudG8uZXF1YWwoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMikudG8uYmUuYWJvdmUoMSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5sZW5ndGhPZmAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gYXNzZXJ0IHRoYXQgdGhlIHZhbHVlIG9mIHRoZVxuICAgKiB0YXJnZXQncyBgbGVuZ3RoYCBwcm9wZXJ0eSBpcyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIG51bWJlciBgbmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YuYWJvdmUoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGhPZigzKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YuYWJvdmUoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmFib3ZlYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgyKS50by5lcXVhbCgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuYmUuYWJvdmUoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBgLmFib3ZlYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzIHRoZVxuICAgKiBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uYmUuYWJvdmUoMiwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KDEsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5hYm92ZSgyKTtcbiAgICpcbiAgICogVGhlIGFsaWFzZXMgYC5ndGAgYW5kIGAuZ3JlYXRlclRoYW5gIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoXG4gICAqIGAuYWJvdmVgLlxuICAgKlxuICAgKiBAbmFtZSBhYm92ZVxuICAgKiBAYWxpYXMgZ3RcbiAgICogQGFsaWFzIGdyZWF0ZXJUaGFuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRBYm92ZSAobiwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGRvTGVuZ3RoID0gZmxhZyh0aGlzLCAnZG9MZW5ndGgnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIG1zZ1ByZWZpeCA9ICgoZmxhZ01zZykgPyBmbGFnTXNnICsgJzogJyA6ICcnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIG9ialR5cGUgPSBfLnR5cGUob2JqKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIG5UeXBlID0gXy50eXBlKG4pLnRvTG93ZXJDYXNlKClcbiAgICAgICwgc2hvdWxkVGhyb3cgPSB0cnVlO1xuXG4gICAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eSgnbGVuZ3RoJyk7XG4gICAgfVxuICAgIFxuICAgIGlmICghZG9MZW5ndGggJiYgKG9ialR5cGUgPT09ICdkYXRlJyAmJiBuVHlwZSAhPT0gJ2RhdGUnKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ3RoZSBhcmd1bWVudCB0byBhYm92ZSBtdXN0IGJlIGEgZGF0ZSc7XG4gICAgfSBlbHNlIGlmIChuVHlwZSAhPT0gJ251bWJlcicgJiYgKGRvTGVuZ3RoIHx8IG9ialR5cGUgPT09ICdudW1iZXInKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ3RoZSBhcmd1bWVudCB0byBhYm92ZSBtdXN0IGJlIGEgbnVtYmVyJztcbiAgICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSAhPT0gJ2RhdGUnICYmIG9ialR5cGUgIT09ICdudW1iZXInKSkge1xuICAgICAgdmFyIHByaW50T2JqID0gKG9ialR5cGUgPT09ICdzdHJpbmcnKSA/IFwiJ1wiICsgb2JqICsgXCInXCIgOiBvYmo7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAnZXhwZWN0ZWQgJyArIHByaW50T2JqICsgJyB0byBiZSBhIG51bWJlciBvciBhIGRhdGUnO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRUaHJvdykge1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm9yTWVzc2FnZSwgdW5kZWZpbmVkLCBzc2ZpKTtcbiAgICB9XG5cbiAgICBpZiAoZG9MZW5ndGgpIHtcbiAgICAgIHZhciBsZW4gPSBvYmoubGVuZ3RoO1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgbGVuID4gblxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBsZW5ndGggYWJvdmUgI3tleHB9IGJ1dCBnb3QgI3thY3R9J1xuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgbGVuZ3RoIGFib3ZlICN7ZXhwfSdcbiAgICAgICAgLCBuXG4gICAgICAgICwgbGVuXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBvYmogPiBuXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYWJvdmUgI3tleHB9J1xuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGF0IG1vc3QgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnYWJvdmUnLCBhc3NlcnRBYm92ZSk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2d0JywgYXNzZXJ0QWJvdmUpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdncmVhdGVyVGhhbicsIGFzc2VydEFib3ZlKTtcblxuICAvKipcbiAgICogIyMjIC5sZWFzdChuWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgYSBudW1iZXIgb3IgYSBkYXRlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW5cbiAgICogbnVtYmVyIG9yIGRhdGUgYG5gIHJlc3BlY3RpdmVseS4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG9cbiAgICogaXRzIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmVxdWFsKDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmJlLmF0LmxlYXN0KDEpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgyKS50by5iZS5hdC5sZWFzdCgyKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEFkZCBgLmxlbmd0aE9mYCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBhc3NlcnQgdGhhdCB0aGUgdmFsdWUgb2YgdGhlXG4gICAqIHRhcmdldCdzIGBsZW5ndGhgIHByb3BlcnR5IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyXG4gICAqIGBuYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uaGF2ZS5sZW5ndGhPZigzKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uaGF2ZS5sZW5ndGhPZi5hdC5sZWFzdCgyKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mKDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGhPZi5hdC5sZWFzdCgyKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAubGVhc3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLm5vdC5iZS5hdC5sZWFzdCgyKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAubGVhc3RgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICAgKiB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgdGhlXG4gICAqIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5iZS5hdC5sZWFzdCgyLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqICAgICBleHBlY3QoMSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLmF0LmxlYXN0KDIpO1xuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5ndGVgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAubGVhc3RgLlxuICAgKlxuICAgKiBAbmFtZSBsZWFzdFxuICAgKiBAYWxpYXMgZ3RlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRMZWFzdCAobiwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGRvTGVuZ3RoID0gZmxhZyh0aGlzLCAnZG9MZW5ndGgnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIG1zZ1ByZWZpeCA9ICgoZmxhZ01zZykgPyBmbGFnTXNnICsgJzogJyA6ICcnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIG9ialR5cGUgPSBfLnR5cGUob2JqKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIG5UeXBlID0gXy50eXBlKG4pLnRvTG93ZXJDYXNlKClcbiAgICAgICwgc2hvdWxkVGhyb3cgPSB0cnVlO1xuXG4gICAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eSgnbGVuZ3RoJyk7XG4gICAgfVxuXG4gICAgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSA9PT0gJ2RhdGUnICYmIG5UeXBlICE9PSAnZGF0ZScpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50IHRvIGxlYXN0IG11c3QgYmUgYSBkYXRlJztcbiAgICB9IGVsc2UgaWYgKG5UeXBlICE9PSAnbnVtYmVyJyAmJiAoZG9MZW5ndGggfHwgb2JqVHlwZSA9PT0gJ251bWJlcicpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50IHRvIGxlYXN0IG11c3QgYmUgYSBudW1iZXInO1xuICAgIH0gZWxzZSBpZiAoIWRvTGVuZ3RoICYmIChvYmpUeXBlICE9PSAnZGF0ZScgJiYgb2JqVHlwZSAhPT0gJ251bWJlcicpKSB7XG4gICAgICB2YXIgcHJpbnRPYmogPSAob2JqVHlwZSA9PT0gJ3N0cmluZycpID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArICdleHBlY3RlZCAnICsgcHJpbnRPYmogKyAnIHRvIGJlIGEgbnVtYmVyIG9yIGEgZGF0ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3VsZFRocm93ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZXJyb3JNZXNzYWdlLCB1bmRlZmluZWQsIHNzZmkpO1xuICAgIH1cblxuICAgIGlmIChkb0xlbmd0aCkge1xuICAgICAgdmFyIGxlbiA9IG9iai5sZW5ndGg7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBsZW4gPj0gblxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBsZW5ndGggYXQgbGVhc3QgI3tleHB9IGJ1dCBnb3QgI3thY3R9J1xuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBsZW5ndGggYmVsb3cgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICAgLCBsZW5cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIG9iaiA+PSBuXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYXQgbGVhc3QgI3tleHB9J1xuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGJlbG93ICN7ZXhwfSdcbiAgICAgICAgLCBuXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2xlYXN0JywgYXNzZXJ0TGVhc3QpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdndGUnLCBhc3NlcnRMZWFzdCk7XG5cbiAgLyoqXG4gICAqICMjIyAuYmVsb3coblssIG1zZ10pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIGEgbnVtYmVyIG9yIGEgZGF0ZSBsZXNzIHRoYW4gdGhlIGdpdmVuIG51bWJlciBvciBkYXRlIGBuYCByZXNwZWN0aXZlbHkuXG4gICAqIEhvd2V2ZXIsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGlzIGVxdWFsIHRvIGl0cyBleHBlY3RlZFxuICAgKiB2YWx1ZS5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5lcXVhbCgxKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5iZS5iZWxvdygyKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEFkZCBgLmxlbmd0aE9mYCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBhc3NlcnQgdGhhdCB0aGUgdmFsdWUgb2YgdGhlXG4gICAqIHRhcmdldCdzIGBsZW5ndGhgIHByb3BlcnR5IGlzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyIGBuYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uaGF2ZS5sZW5ndGhPZigzKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uaGF2ZS5sZW5ndGhPZi5iZWxvdyg0KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aCgzKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YuYmVsb3coNCk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmJlbG93YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgyKS50by5lcXVhbCgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgyKS50by5ub3QuYmUuYmVsb3coMSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBgLmJlbG93YCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzIHRoZVxuICAgKiBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMikudG8uYmUuYmVsb3coMSwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KDIsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS5iZWxvdygxKTtcbiAgICpcbiAgICogVGhlIGFsaWFzZXMgYC5sdGAgYW5kIGAubGVzc1RoYW5gIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoXG4gICAqIGAuYmVsb3dgLlxuICAgKlxuICAgKiBAbmFtZSBiZWxvd1xuICAgKiBAYWxpYXMgbHRcbiAgICogQGFsaWFzIGxlc3NUaGFuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRCZWxvdyAobiwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGRvTGVuZ3RoID0gZmxhZyh0aGlzLCAnZG9MZW5ndGgnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIG1zZ1ByZWZpeCA9ICgoZmxhZ01zZykgPyBmbGFnTXNnICsgJzogJyA6ICcnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIG9ialR5cGUgPSBfLnR5cGUob2JqKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIG5UeXBlID0gXy50eXBlKG4pLnRvTG93ZXJDYXNlKClcbiAgICAgICwgc2hvdWxkVGhyb3cgPSB0cnVlO1xuXG4gICAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eSgnbGVuZ3RoJyk7XG4gICAgfVxuXG4gICAgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSA9PT0gJ2RhdGUnICYmIG5UeXBlICE9PSAnZGF0ZScpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50IHRvIGJlbG93IG11c3QgYmUgYSBkYXRlJztcbiAgICB9IGVsc2UgaWYgKG5UeXBlICE9PSAnbnVtYmVyJyAmJiAoZG9MZW5ndGggfHwgb2JqVHlwZSA9PT0gJ251bWJlcicpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50IHRvIGJlbG93IG11c3QgYmUgYSBudW1iZXInO1xuICAgIH0gZWxzZSBpZiAoIWRvTGVuZ3RoICYmIChvYmpUeXBlICE9PSAnZGF0ZScgJiYgb2JqVHlwZSAhPT0gJ251bWJlcicpKSB7XG4gICAgICB2YXIgcHJpbnRPYmogPSAob2JqVHlwZSA9PT0gJ3N0cmluZycpID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArICdleHBlY3RlZCAnICsgcHJpbnRPYmogKyAnIHRvIGJlIGEgbnVtYmVyIG9yIGEgZGF0ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3VsZFRocm93ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZXJyb3JNZXNzYWdlLCB1bmRlZmluZWQsIHNzZmkpO1xuICAgIH1cblxuICAgIGlmIChkb0xlbmd0aCkge1xuICAgICAgdmFyIGxlbiA9IG9iai5sZW5ndGg7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBsZW4gPCBuXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhIGxlbmd0aCBiZWxvdyAje2V4cH0gYnV0IGdvdCAje2FjdH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGhhdmUgYSBsZW5ndGggYmVsb3cgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICAgLCBsZW5cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIG9iaiA8IG5cbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBiZWxvdyAje2V4cH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYXQgbGVhc3QgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnYmVsb3cnLCBhc3NlcnRCZWxvdyk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2x0JywgYXNzZXJ0QmVsb3cpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdsZXNzVGhhbicsIGFzc2VydEJlbG93KTtcblxuICAvKipcbiAgICogIyMjIC5tb3N0KG5bLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlciBvciBhIGRhdGUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXJcbiAgICogb3IgZGF0ZSBgbmAgcmVzcGVjdGl2ZWx5LiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCBpcyBlcXVhbCB0byBpdHNcbiAgICogZXhwZWN0ZWQgdmFsdWUuXG4gICAqXG4gICAqICAgICBleHBlY3QoMSkudG8uZXF1YWwoMSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8uYmUuYXQubW9zdCgyKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMSkudG8uYmUuYXQubW9zdCgxKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEFkZCBgLmxlbmd0aE9mYCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBhc3NlcnQgdGhhdCB0aGUgdmFsdWUgb2YgdGhlXG4gICAqIHRhcmdldCdzIGBsZW5ndGhgIHByb3BlcnR5IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyIGBuYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uaGF2ZS5sZW5ndGhPZigzKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgnZm9vJykudG8uaGF2ZS5sZW5ndGhPZi5hdC5tb3N0KDQpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLmF0Lm1vc3QoNCk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLm1vc3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmVxdWFsKDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDIpLnRvLm5vdC5iZS5hdC5tb3N0KDEpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5tb3N0YCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzIHRoZVxuICAgKiBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoMikudG8uYmUuYXQubW9zdCgxLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqICAgICBleHBlY3QoMiwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLmF0Lm1vc3QoMSk7XG4gICAqXG4gICAqIFRoZSBhbGlhcyBgLmx0ZWAgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGggYC5tb3N0YC5cbiAgICpcbiAgICogQG5hbWUgbW9zdFxuICAgKiBAYWxpYXMgbHRlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRNb3N0IChuLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgZG9MZW5ndGggPSBmbGFnKHRoaXMsICdkb0xlbmd0aCcpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgbXNnUHJlZml4ID0gKChmbGFnTXNnKSA/IGZsYWdNc2cgKyAnOiAnIDogJycpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJylcbiAgICAgICwgb2JqVHlwZSA9IF8udHlwZShvYmopLnRvTG93ZXJDYXNlKClcbiAgICAgICwgblR5cGUgPSBfLnR5cGUobikudG9Mb3dlckNhc2UoKVxuICAgICAgLCBzaG91bGRUaHJvdyA9IHRydWU7XG5cbiAgICBpZiAoZG9MZW5ndGgpIHtcbiAgICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KCdsZW5ndGgnKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSA9PT0gJ2RhdGUnICYmIG5UeXBlICE9PSAnZGF0ZScpKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAndGhlIGFyZ3VtZW50IHRvIG1vc3QgbXVzdCBiZSBhIGRhdGUnO1xuICAgIH0gZWxzZSBpZiAoblR5cGUgIT09ICdudW1iZXInICYmIChkb0xlbmd0aCB8fCBvYmpUeXBlID09PSAnbnVtYmVyJykpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArICd0aGUgYXJndW1lbnQgdG8gbW9zdCBtdXN0IGJlIGEgbnVtYmVyJztcbiAgICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSAhPT0gJ2RhdGUnICYmIG9ialR5cGUgIT09ICdudW1iZXInKSkge1xuICAgICAgdmFyIHByaW50T2JqID0gKG9ialR5cGUgPT09ICdzdHJpbmcnKSA/IFwiJ1wiICsgb2JqICsgXCInXCIgOiBvYmo7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyAnZXhwZWN0ZWQgJyArIHByaW50T2JqICsgJyB0byBiZSBhIG51bWJlciBvciBhIGRhdGUnO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRUaHJvdykge1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm9yTWVzc2FnZSwgdW5kZWZpbmVkLCBzc2ZpKTtcbiAgICB9XG5cbiAgICBpZiAoZG9MZW5ndGgpIHtcbiAgICAgIHZhciBsZW4gPSBvYmoubGVuZ3RoO1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgbGVuIDw9IG5cbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgbGVuZ3RoIGF0IG1vc3QgI3tleHB9IGJ1dCBnb3QgI3thY3R9J1xuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBsZW5ndGggYWJvdmUgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICAgLCBsZW5cbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIG9iaiA8PSBuXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYXQgbW9zdCAje2V4cH0nXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgYWJvdmUgI3tleHB9J1xuICAgICAgICAsIG5cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnbW9zdCcsIGFzc2VydE1vc3QpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdsdGUnLCBhc3NlcnRNb3N0KTtcblxuICAvKipcbiAgICogIyMjIC53aXRoaW4oc3RhcnQsIGZpbmlzaFssIG1zZ10pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIGEgbnVtYmVyIG9yIGEgZGF0ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuXG4gICAqIG51bWJlciBvciBkYXRlIGBzdGFydGAsIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlciBvciBkYXRlIGBmaW5pc2hgIHJlc3BlY3RpdmVseS5cbiAgICogSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkXG4gICAqIHZhbHVlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmVxdWFsKDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDIpLnRvLmJlLndpdGhpbigxLCAzKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoMikudG8uYmUud2l0aGluKDIsIDMpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgyKS50by5iZS53aXRoaW4oMSwgMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5sZW5ndGhPZmAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gYXNzZXJ0IHRoYXQgdGhlIHZhbHVlIG9mIHRoZVxuICAgKiB0YXJnZXQncyBgbGVuZ3RoYCBwcm9wZXJ0eSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIG51bWJlclxuICAgKiBgc3RhcnRgLCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIgYGZpbmlzaGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2Yud2l0aGluKDIsIDQpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YoMyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLndpdGhpbigyLCA0KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAud2l0aGluYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5lcXVhbCgxKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuYmUud2l0aGluKDIsIDQpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC53aXRoaW5gIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCg0KS50by5iZS53aXRoaW4oMSwgMywgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KDQsICdub29vIHdoeSBmYWlsPz8nKS50by5iZS53aXRoaW4oMSwgMyk7XG4gICAqXG4gICAqIEBuYW1lIHdpdGhpblxuICAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnQgbG93ZXIgYm91bmQgaW5jbHVzaXZlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBmaW5pc2ggdXBwZXIgYm91bmQgaW5jbHVzaXZlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCd3aXRoaW4nLCBmdW5jdGlvbiAoc3RhcnQsIGZpbmlzaCwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGRvTGVuZ3RoID0gZmxhZyh0aGlzLCAnZG9MZW5ndGgnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIG1zZ1ByZWZpeCA9ICgoZmxhZ01zZykgPyBmbGFnTXNnICsgJzogJyA6ICcnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIG9ialR5cGUgPSBfLnR5cGUob2JqKS50b0xvd2VyQ2FzZSgpXG4gICAgICAsIHN0YXJ0VHlwZSA9IF8udHlwZShzdGFydCkudG9Mb3dlckNhc2UoKVxuICAgICAgLCBmaW5pc2hUeXBlID0gXy50eXBlKGZpbmlzaCkudG9Mb3dlckNhc2UoKVxuICAgICAgLCBzaG91bGRUaHJvdyA9IHRydWVcbiAgICAgICwgcmFuZ2UgPSAoc3RhcnRUeXBlID09PSAnZGF0ZScgJiYgZmluaXNoVHlwZSA9PT0gJ2RhdGUnKVxuICAgICAgICAgID8gc3RhcnQudG9VVENTdHJpbmcoKSArICcuLicgKyBmaW5pc2gudG9VVENTdHJpbmcoKVxuICAgICAgICAgIDogc3RhcnQgKyAnLi4nICsgZmluaXNoO1xuXG4gICAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eSgnbGVuZ3RoJyk7XG4gICAgfVxuXG4gICAgaWYgKCFkb0xlbmd0aCAmJiAob2JqVHlwZSA9PT0gJ2RhdGUnICYmIChzdGFydFR5cGUgIT09ICdkYXRlJyB8fCBmaW5pc2hUeXBlICE9PSAnZGF0ZScpKSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgJ3RoZSBhcmd1bWVudHMgdG8gd2l0aGluIG11c3QgYmUgZGF0ZXMnO1xuICAgIH0gZWxzZSBpZiAoKHN0YXJ0VHlwZSAhPT0gJ251bWJlcicgfHwgZmluaXNoVHlwZSAhPT0gJ251bWJlcicpICYmIChkb0xlbmd0aCB8fCBvYmpUeXBlID09PSAnbnVtYmVyJykpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArICd0aGUgYXJndW1lbnRzIHRvIHdpdGhpbiBtdXN0IGJlIG51bWJlcnMnO1xuICAgIH0gZWxzZSBpZiAoIWRvTGVuZ3RoICYmIChvYmpUeXBlICE9PSAnZGF0ZScgJiYgb2JqVHlwZSAhPT0gJ251bWJlcicpKSB7XG4gICAgICB2YXIgcHJpbnRPYmogPSAob2JqVHlwZSA9PT0gJ3N0cmluZycpID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArICdleHBlY3RlZCAnICsgcHJpbnRPYmogKyAnIHRvIGJlIGEgbnVtYmVyIG9yIGEgZGF0ZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNob3VsZFRocm93ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZXJyb3JNZXNzYWdlLCB1bmRlZmluZWQsIHNzZmkpO1xuICAgIH1cblxuICAgIGlmIChkb0xlbmd0aCkge1xuICAgICAgdmFyIGxlbiA9IG9iai5sZW5ndGg7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBsZW4gPj0gc3RhcnQgJiYgbGVuIDw9IGZpbmlzaFxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBsZW5ndGggd2l0aGluICcgKyByYW5nZVxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgbGVuZ3RoIHdpdGhpbiAnICsgcmFuZ2VcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIG9iaiA+PSBzdGFydCAmJiBvYmogPD0gZmluaXNoXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgd2l0aGluICcgKyByYW5nZVxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSB3aXRoaW4gJyArIHJhbmdlXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuaW5zdGFuY2VvZihjb25zdHJ1Y3RvclssIG1zZ10pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIGFuIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBgY29uc3RydWN0b3JgLlxuICAgKlxuICAgKiAgICAgZnVuY3Rpb24gQ2F0ICgpIHsgfVxuICAgKlxuICAgKiAgICAgZXhwZWN0KG5ldyBDYXQoKSkudG8uYmUuYW4uaW5zdGFuY2VvZihDYXQpO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyXSkudG8uYmUuYW4uaW5zdGFuY2VvZihBcnJheSk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuaW5zdGFuY2VvZmAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuYmUuYW4uaW5zdGFuY2VvZihBcnJheSk7XG4gICAqXG4gICAqIGAuaW5zdGFuY2VvZmAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLmFuLmluc3RhbmNlb2YoQXJyYXksICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCgxLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuYW4uaW5zdGFuY2VvZihBcnJheSk7XG4gICAqXG4gICAqIER1ZSB0byBsaW1pdGF0aW9ucyBpbiBFUzUsIGAuaW5zdGFuY2VvZmAgbWF5IG5vdCBhbHdheXMgd29yayBhcyBleHBlY3RlZFxuICAgKiB3aGVuIHVzaW5nIGEgdHJhbnNwaWxlciBzdWNoIGFzIEJhYmVsIG9yIFR5cGVTY3JpcHQuIEluIHBhcnRpY3VsYXIsIGl0IG1heVxuICAgKiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cyB3aGVuIHN1YmNsYXNzaW5nIGJ1aWx0LWluIG9iamVjdCBzdWNoIGFzXG4gICAqIGBBcnJheWAsIGBFcnJvcmAsIGFuZCBgTWFwYC4gU2VlIHlvdXIgdHJhbnNwaWxlcidzIGRvY3MgZm9yIGRldGFpbHM6XG4gICAqXG4gICAqIC0gKFtCYWJlbF0oaHR0cHM6Ly9iYWJlbGpzLmlvL2RvY3MvdXNhZ2UvY2F2ZWF0cy8jY2xhc3NlcykpXG4gICAqIC0gKFtUeXBlU2NyaXB0XShodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvd2lraS9CcmVha2luZy1DaGFuZ2VzI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29yaykpXG4gICAqXG4gICAqIFRoZSBhbGlhcyBgLmluc3RhbmNlT2ZgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuaW5zdGFuY2VvZmAuXG4gICAqXG4gICAqIEBuYW1lIGluc3RhbmNlb2ZcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3Rvcn0gY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBhbGlhcyBpbnN0YW5jZU9mXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydEluc3RhbmNlT2YgKGNvbnN0cnVjdG9yLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcblxuICAgIHZhciB0YXJnZXQgPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgIHZhciBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpO1xuICAgIHZhciBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhciBpc0luc3RhbmNlT2YgPSB0YXJnZXQgaW5zdGFuY2VvZiBjb25zdHJ1Y3RvcjtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgJzogJyA6ICcnO1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArICdUaGUgaW5zdGFuY2VvZiBhc3NlcnRpb24gbmVlZHMgYSBjb25zdHJ1Y3RvciBidXQgJ1xuICAgICAgICAgICAgKyBfLnR5cGUoY29uc3RydWN0b3IpICsgJyB3YXMgZ2l2ZW4uJyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgc3NmaVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHZhciBuYW1lID0gXy5nZXROYW1lKGNvbnN0cnVjdG9yKTtcbiAgICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgICAgbmFtZSA9ICdhbiB1bm5hbWVkIGNvbnN0cnVjdG9yJztcbiAgICB9XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgaXNJbnN0YW5jZU9mXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGFuIGluc3RhbmNlIG9mICcgKyBuYW1lXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBhbiBpbnN0YW5jZSBvZiAnICsgbmFtZVxuICAgICk7XG4gIH07XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnaW5zdGFuY2VvZicsIGFzc2VydEluc3RhbmNlT2YpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdpbnN0YW5jZU9mJywgYXNzZXJ0SW5zdGFuY2VPZik7XG5cbiAgLyoqXG4gICAqICMjIyAucHJvcGVydHkobmFtZVssIHZhbFssIG1zZ11dKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBoYXMgYSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBrZXkgYG5hbWVgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5wcm9wZXJ0eSgnYScpO1xuICAgKlxuICAgKiBXaGVuIGB2YWxgIGlzIHByb3ZpZGVkLCBgLnByb3BlcnR5YCBhbHNvIGFzc2VydHMgdGhhdCB0aGUgcHJvcGVydHkncyB2YWx1ZVxuICAgKiBpcyBlcXVhbCB0byB0aGUgZ2l2ZW4gYHZhbGAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLnByb3BlcnR5KCdhJywgMSk7XG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHN0cmljdCAoYD09PWApIGVxdWFsaXR5IGlzIHVzZWQuIEFkZCBgLmRlZXBgIGVhcmxpZXIgaW4gdGhlXG4gICAqIGNoYWluIHRvIHVzZSBkZWVwIGVxdWFsaXR5IGluc3RlYWQuIFNlZSB0aGUgYGRlZXAtZXFsYCBwcm9qZWN0IHBhZ2UgZm9yXG4gICAqIGluZm8gb24gdGhlIGRlZXAgZXF1YWxpdHkgYWxnb3JpdGhtOiBodHRwczovL2dpdGh1Yi5jb20vY2hhaWpzL2RlZXAtZXFsLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IG9iamVjdCBkZWVwbHkgKGJ1dCBub3Qgc3RyaWN0bHkpIGhhcyBwcm9wZXJ0eSBgeDoge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KHt4OiB7YTogMX19KS50by5oYXZlLmRlZXAucHJvcGVydHkoJ3gnLCB7YTogMX0pO1xuICAgKiAgICAgZXhwZWN0KHt4OiB7YTogMX19KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgneCcsIHthOiAxfSk7XG4gICAqXG4gICAqIFRoZSB0YXJnZXQncyBlbnVtZXJhYmxlIGFuZCBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGFyZSBhbHdheXMgaW5jbHVkZWRcbiAgICogaW4gdGhlIHNlYXJjaC4gQnkgZGVmYXVsdCwgYm90aCBvd24gYW5kIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGFyZSBpbmNsdWRlZC5cbiAgICogQWRkIGAub3duYCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBleGNsdWRlIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGZyb20gdGhlXG4gICAqIHNlYXJjaC5cbiAgICpcbiAgICogICAgIE9iamVjdC5wcm90b3R5cGUuYiA9IDI7XG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLm93bi5wcm9wZXJ0eSgnYScpO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5vd24ucHJvcGVydHkoJ2EnLCAxKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUucHJvcGVydHkoJ2InKS5idXQubm90Lm93bi5wcm9wZXJ0eSgnYicpOyBcbiAgICpcbiAgICogYC5kZWVwYCBhbmQgYC5vd25gIGNhbiBiZSBjb21iaW5lZC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7eDoge2E6IDF9fSkudG8uaGF2ZS5kZWVwLm93bi5wcm9wZXJ0eSgneCcsIHthOiAxfSk7XG4gICAqXG4gICAqIEFkZCBgLm5lc3RlZGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gZW5hYmxlIGRvdC0gYW5kIGJyYWNrZXQtbm90YXRpb24gd2hlblxuICAgKiByZWZlcmVuY2luZyBuZXN0ZWQgcHJvcGVydGllcy5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YToge2I6IFsneCcsICd5J119fSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkoJ2EuYlsxXScpO1xuICAgKiAgICAgZXhwZWN0KHthOiB7YjogWyd4JywgJ3knXX19KS50by5oYXZlLm5lc3RlZC5wcm9wZXJ0eSgnYS5iWzFdJywgJ3knKTtcbiAgICpcbiAgICogSWYgYC5gIG9yIGBbXWAgYXJlIHBhcnQgb2YgYW4gYWN0dWFsIHByb3BlcnR5IG5hbWUsIHRoZXkgY2FuIGJlIGVzY2FwZWQgYnlcbiAgICogYWRkaW5nIHR3byBiYWNrc2xhc2hlcyBiZWZvcmUgdGhlbS5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7Jy5hJzogeydbYl0nOiAneCd9fSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkoJ1xcXFwuYS5cXFxcW2JcXFxcXScpO1xuICAgKlxuICAgKiBgLmRlZXBgIGFuZCBgLm5lc3RlZGAgY2FuIGJlIGNvbWJpbmVkLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiB7YjogW3tjOiAzfV19fSlcbiAgICogICAgICAgLnRvLmhhdmUuZGVlcC5uZXN0ZWQucHJvcGVydHkoJ2EuYlswXScsIHtjOiAzfSk7XG4gICAqXG4gICAqIGAub3duYCBhbmQgYC5uZXN0ZWRgIGNhbm5vdCBiZSBjb21iaW5lZC5cbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5wcm9wZXJ0eWAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuaGF2ZS5wcm9wZXJ0eSgnYicpO1xuICAgKiBcbiAgICogSG93ZXZlciwgaXQncyBkYW5nZXJvdXMgdG8gbmVnYXRlIGAucHJvcGVydHlgIHdoZW4gcHJvdmlkaW5nIGB2YWxgLiBUaGVcbiAgICogcHJvYmxlbSBpcyB0aGF0IGl0IGNyZWF0ZXMgdW5jZXJ0YWluIGV4cGVjdGF0aW9ucyBieSBhc3NlcnRpbmcgdGhhdCB0aGVcbiAgICogdGFyZ2V0IGVpdGhlciBkb2Vzbid0IGhhdmUgYSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBrZXkgYG5hbWVgLCBvciB0aGF0IGl0XG4gICAqIGRvZXMgaGF2ZSBhIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGtleSBgbmFtZWAgYnV0IGl0cyB2YWx1ZSBpc24ndCBlcXVhbCB0b1xuICAgKiB0aGUgZ2l2ZW4gYHZhbGAuIEl0J3Mgb2Z0ZW4gYmVzdCB0byBpZGVudGlmeSB0aGUgZXhhY3Qgb3V0cHV0IHRoYXQnc1xuICAgKiBleHBlY3RlZCwgYW5kIHRoZW4gd3JpdGUgYW4gYXNzZXJ0aW9uIHRoYXQgb25seSBhY2NlcHRzIHRoYXQgZXhhY3Qgb3V0cHV0LlxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXNuJ3QgZXhwZWN0ZWQgdG8gaGF2ZSBhIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGtleVxuICAgKiBgbmFtZWAsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnQgZXhhY3RseSB0aGF0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHtiOiAyfSkudG8ubm90LmhhdmUucHJvcGVydHkoJ2EnKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YjogMn0pLnRvLm5vdC5oYXZlLnByb3BlcnR5KCdhJywgMSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBhIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGtleSBgbmFtZWAsXG4gICAqIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnQgdGhhdCB0aGUgcHJvcGVydHkgaGFzIGl0cyBleHBlY3RlZCB2YWx1ZSwgcmF0aGVyXG4gICAqIHRoYW4gYXNzZXJ0aW5nIHRoYXQgaXQgZG9lc24ndCBoYXZlIG9uZSBvZiBtYW55IHVuZXhwZWN0ZWQgdmFsdWVzLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAzfSkudG8uaGF2ZS5wcm9wZXJ0eSgnYScsIDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAzfSkudG8ubm90LmhhdmUucHJvcGVydHkoJ2EnLCAxKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAucHJvcGVydHlgIGNoYW5nZXMgdGhlIHRhcmdldCBvZiBhbnkgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW5cbiAgICogdG8gYmUgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBmcm9tIHRoZSBvcmlnaW5hbCB0YXJnZXQgb2JqZWN0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5wcm9wZXJ0eSgnYScpLnRoYXQuaXMuYSgnbnVtYmVyJyk7XG4gICAqXG4gICAqIGAucHJvcGVydHlgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC4gV2hlbiBub3QgcHJvdmlkaW5nIGB2YWxgLCBvbmx5IHVzZSB0aGVcbiAgICogc2Vjb25kIGZvcm0uXG4gICAqXG4gICAqICAgICAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5wcm9wZXJ0eSgnYScsIDIsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCh7YTogMX0sICdub29vIHdoeSBmYWlsPz8nKS50by5oYXZlLnByb3BlcnR5KCdhJywgMik7XG4gICAqICAgICBleHBlY3Qoe2E6IDF9LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uaGF2ZS5wcm9wZXJ0eSgnYicpO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLnByb3BlcnR5KCdiJywgdW5kZWZpbmVkLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqIFxuICAgKiBUaGUgYWJvdmUgYXNzZXJ0aW9uIGlzbid0IHRoZSBzYW1lIHRoaW5nIGFzIG5vdCBwcm92aWRpbmcgYHZhbGAuIEluc3RlYWQsXG4gICAqIGl0J3MgYXNzZXJ0aW5nIHRoYXQgdGhlIHRhcmdldCBvYmplY3QgaGFzIGEgYGJgIHByb3BlcnR5IHRoYXQncyBlcXVhbCB0b1xuICAgKiBgdW5kZWZpbmVkYC5cbiAgICpcbiAgICogVGhlIGFzc2VydGlvbnMgYC5vd25Qcm9wZXJ0eWAgYW5kIGAuaGF2ZU93blByb3BlcnR5YCBjYW4gYmUgdXNlZFxuICAgKiBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLm93bi5wcm9wZXJ0eWAuXG4gICAqXG4gICAqIEBuYW1lIHByb3BlcnR5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbCAob3B0aW9uYWwpXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAcmV0dXJucyB2YWx1ZSBvZiBwcm9wZXJ0eSBmb3IgY2hhaW5pbmdcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0UHJvcGVydHkgKG5hbWUsIHZhbCwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG5cbiAgICB2YXIgaXNOZXN0ZWQgPSBmbGFnKHRoaXMsICduZXN0ZWQnKVxuICAgICAgLCBpc093biA9IGZsYWcodGhpcywgJ293bicpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKTtcblxuICAgIGlmIChpc05lc3RlZCAmJiBpc093bikge1xuICAgICAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgJzogJyA6ICcnO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBmbGFnTXNnICsgJ1RoZSBcIm5lc3RlZFwiIGFuZCBcIm93blwiIGZsYWdzIGNhbm5vdCBiZSBjb21iaW5lZC4nLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHNzZmlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgJzogJyA6ICcnO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBmbGFnTXNnICsgJ1RhcmdldCBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuJyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBzc2ZpXG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciBpc0RlZXAgPSBmbGFnKHRoaXMsICdkZWVwJylcbiAgICAgICwgbmVnYXRlID0gZmxhZyh0aGlzLCAnbmVnYXRlJylcbiAgICAgICwgcGF0aEluZm8gPSBpc05lc3RlZCA/IF8uZ2V0UGF0aEluZm8ob2JqLCBuYW1lKSA6IG51bGxcbiAgICAgICwgdmFsdWUgPSBpc05lc3RlZCA/IHBhdGhJbmZvLnZhbHVlIDogb2JqW25hbWVdO1xuXG4gICAgdmFyIGRlc2NyaXB0b3IgPSAnJztcbiAgICBpZiAoaXNEZWVwKSBkZXNjcmlwdG9yICs9ICdkZWVwICc7XG4gICAgaWYgKGlzT3duKSBkZXNjcmlwdG9yICs9ICdvd24gJztcbiAgICBpZiAoaXNOZXN0ZWQpIGRlc2NyaXB0b3IgKz0gJ25lc3RlZCAnO1xuICAgIGRlc2NyaXB0b3IgKz0gJ3Byb3BlcnR5ICc7XG5cbiAgICB2YXIgaGFzUHJvcGVydHk7XG4gICAgaWYgKGlzT3duKSBoYXNQcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIG5hbWUpO1xuICAgIGVsc2UgaWYgKGlzTmVzdGVkKSBoYXNQcm9wZXJ0eSA9IHBhdGhJbmZvLmV4aXN0cztcbiAgICBlbHNlIGhhc1Byb3BlcnR5ID0gXy5oYXNQcm9wZXJ0eShvYmosIG5hbWUpO1xuXG4gICAgLy8gV2hlbiBwZXJmb3JtaW5nIGEgbmVnYXRlZCBhc3NlcnRpb24gZm9yIGJvdGggbmFtZSBhbmQgdmFsLCBtZXJlbHkgaGF2aW5nXG4gICAgLy8gYSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzbid0IGVub3VnaCB0byBjYXVzZSB0aGUgYXNzZXJ0aW9uIHRvXG4gICAgLy8gZmFpbC4gSXQgbXVzdCBib3RoIGhhdmUgYSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBhbmQgdGhlIHZhbHVlIG9mXG4gICAgLy8gdGhhdCBwcm9wZXJ0eSBtdXN0IGVxdWFsIHRoZSBnaXZlbiB2YWwuIFRoZXJlZm9yZSwgc2tpcCB0aGlzIGFzc2VydGlvbiBpblxuICAgIC8vIGZhdm9yIG9mIHRoZSBuZXh0LlxuICAgIGlmICghbmVnYXRlIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGhhc1Byb3BlcnR5XG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSAnICsgZGVzY3JpcHRvciArIF8uaW5zcGVjdChuYW1lKVxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlICcgKyBkZXNjcmlwdG9yICsgXy5pbnNwZWN0KG5hbWUpKTtcbiAgICB9XG5cbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGhhc1Byb3BlcnR5ICYmIChpc0RlZXAgPyBfLmVxbCh2YWwsIHZhbHVlKSA6IHZhbCA9PT0gdmFsdWUpXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSAnICsgZGVzY3JpcHRvciArIF8uaW5zcGVjdChuYW1lKSArICcgb2YgI3tleHB9LCBidXQgZ290ICN7YWN0fSdcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSAnICsgZGVzY3JpcHRvciArIF8uaW5zcGVjdChuYW1lKSArICcgb2YgI3thY3R9J1xuICAgICAgICAsIHZhbFxuICAgICAgICAsIHZhbHVlXG4gICAgICApO1xuICAgIH1cblxuICAgIGZsYWcodGhpcywgJ29iamVjdCcsIHZhbHVlKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ3Byb3BlcnR5JywgYXNzZXJ0UHJvcGVydHkpO1xuXG4gIGZ1bmN0aW9uIGFzc2VydE93blByb3BlcnR5IChuYW1lLCB2YWx1ZSwgbXNnKSB7XG4gICAgZmxhZyh0aGlzLCAnb3duJywgdHJ1ZSk7XG4gICAgYXNzZXJ0UHJvcGVydHkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ293blByb3BlcnR5JywgYXNzZXJ0T3duUHJvcGVydHkpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdoYXZlT3duUHJvcGVydHknLCBhc3NlcnRPd25Qcm9wZXJ0eSk7XG5cbiAgLyoqXG4gICAqICMjIyAub3duUHJvcGVydHlEZXNjcmlwdG9yKG5hbWVbLCBkZXNjcmlwdG9yWywgbXNnXV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGhhcyBpdHMgb3duIHByb3BlcnR5IGRlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4ga2V5XG4gICAqIGBuYW1lYC4gRW51bWVyYWJsZSBhbmQgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcyBhcmUgaW5jbHVkZWQgaW4gdGhlXG4gICAqIHNlYXJjaC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUub3duUHJvcGVydHlEZXNjcmlwdG9yKCdhJyk7XG4gICAqXG4gICAqIFdoZW4gYGRlc2NyaXB0b3JgIGlzIHByb3ZpZGVkLCBgLm93blByb3BlcnR5RGVzY3JpcHRvcmAgYWxzbyBhc3NlcnRzIHRoYXRcbiAgICogdGhlIHByb3BlcnR5J3MgZGVzY3JpcHRvciBpcyBkZWVwbHkgZXF1YWwgdG8gdGhlIGdpdmVuIGBkZXNjcmlwdG9yYC4gU2VlXG4gICAqIHRoZSBgZGVlcC1lcWxgIHByb2plY3QgcGFnZSBmb3IgaW5mbyBvbiB0aGUgZGVlcCBlcXVhbGl0eSBhbGdvcml0aG06XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFpanMvZGVlcC1lcWwuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLm93blByb3BlcnR5RGVzY3JpcHRvcignYScsIHtcbiAgICogICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICogICAgICAgdmFsdWU6IDEsXG4gICAqICAgICB9KTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5vd25Qcm9wZXJ0eURlc2NyaXB0b3JgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8ubm90LmhhdmUub3duUHJvcGVydHlEZXNjcmlwdG9yKCdiJyk7XG4gICAqIFxuICAgKiBIb3dldmVyLCBpdCdzIGRhbmdlcm91cyB0byBuZWdhdGUgYC5vd25Qcm9wZXJ0eURlc2NyaXB0b3JgIHdoZW4gcHJvdmlkaW5nXG4gICAqIGEgYGRlc2NyaXB0b3JgLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGl0IGNyZWF0ZXMgdW5jZXJ0YWluIGV4cGVjdGF0aW9ucyBieVxuICAgKiBhc3NlcnRpbmcgdGhhdCB0aGUgdGFyZ2V0IGVpdGhlciBkb2Vzbid0IGhhdmUgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHdpdGhcbiAgICogdGhlIGdpdmVuIGtleSBgbmFtZWAsIG9yIHRoYXQgaXQgZG9lcyBoYXZlIGEgcHJvcGVydHkgZGVzY3JpcHRvciB3aXRoIHRoZVxuICAgKiBnaXZlbiBrZXkgYG5hbWVgIGJ1dCBpdHMgbm90IGRlZXBseSBlcXVhbCB0byB0aGUgZ2l2ZW4gYGRlc2NyaXB0b3JgLiBJdCdzXG4gICAqIG9mdGVuIGJlc3QgdG8gaWRlbnRpZnkgdGhlIGV4YWN0IG91dHB1dCB0aGF0J3MgZXhwZWN0ZWQsIGFuZCB0aGVuIHdyaXRlIGFuXG4gICAqIGFzc2VydGlvbiB0aGF0IG9ubHkgYWNjZXB0cyB0aGF0IGV4YWN0IG91dHB1dC5cbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzbid0IGV4cGVjdGVkIHRvIGhhdmUgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuXG4gICAqIGtleSBgbmFtZWAsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnQgZXhhY3RseSB0aGF0LlxuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YjogMn0pLnRvLm5vdC5oYXZlLm93blByb3BlcnR5RGVzY3JpcHRvcignYScpO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2I6IDJ9KS50by5ub3QuaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2EnLCB7XG4gICAqICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAqICAgICAgIHZhbHVlOiAxLFxuICAgKiAgICAgfSk7XG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBleHBlY3RlZCB0byBoYXZlIGEgcHJvcGVydHkgZGVzY3JpcHRvciB3aXRoIHRoZSBnaXZlblxuICAgKiBrZXkgYG5hbWVgLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHByb3BlcnR5IGhhcyBpdHMgZXhwZWN0ZWRcbiAgICogZGVzY3JpcHRvciwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIHRoYXQgaXQgZG9lc24ndCBoYXZlIG9uZSBvZiBtYW55XG4gICAqIHVuZXhwZWN0ZWQgZGVzY3JpcHRvcnMuXG4gICAqXG4gICAqICAgICAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAzfSkudG8uaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2EnLCB7XG4gICAqICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAqICAgICAgIHZhbHVlOiAzLFxuICAgKiAgICAgfSk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YTogM30pLnRvLm5vdC5oYXZlLm93blByb3BlcnR5RGVzY3JpcHRvcignYScsIHtcbiAgICogICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICogICAgICAgdmFsdWU6IDEsXG4gICAqICAgICB9KTtcbiAgICpcbiAgICogYC5vd25Qcm9wZXJ0eURlc2NyaXB0b3JgIGNoYW5nZXMgdGhlIHRhcmdldCBvZiBhbnkgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvd1xuICAgKiBpbiB0aGUgY2hhaW4gdG8gYmUgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZyb20gdGhlIG9yaWdpbmFsXG4gICAqIHRhcmdldCBvYmplY3QuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5oYXZlLm93blByb3BlcnR5RGVzY3JpcHRvcignYScpXG4gICAqICAgICAgIC50aGF0Lmhhcy5wcm9wZXJ0eSgnZW51bWVyYWJsZScsIHRydWUpO1xuICAgKlxuICAgKiBgLm93blByb3BlcnR5RGVzY3JpcHRvcmAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhXG4gICAqIGN1c3RvbSBlcnJvciBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzb1xuICAgKiBiZSBnaXZlbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLiBXaGVuIG5vdCBwcm92aWRpbmdcbiAgICogYGRlc2NyaXB0b3JgLCBvbmx5IHVzZSB0aGUgc2Vjb25kIGZvcm0uXG4gICAqXG4gICAqICAgICAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaGF2ZS5vd25Qcm9wZXJ0eURlc2NyaXB0b3IoJ2EnLCB7XG4gICAqICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICogICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAqICAgICAgIHZhbHVlOiAyLFxuICAgKiAgICAgfSwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YTogMX0sICdub29vIHdoeSBmYWlsPz8nKS50by5oYXZlLm93blByb3BlcnR5RGVzY3JpcHRvcignYScsIHtcbiAgICogICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgKiAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICogICAgICAgdmFsdWU6IDIsXG4gICAqICAgICB9KTtcbiAgICogXG4gICAqICAgICAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHthOiAxfSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmhhdmUub3duUHJvcGVydHlEZXNjcmlwdG9yKCdiJyk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCh7YTogMX0pXG4gICAqICAgICAgIC50by5oYXZlLm93blByb3BlcnR5RGVzY3JpcHRvcignYicsIHVuZGVmaW5lZCwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKlxuICAgKiBUaGUgYWJvdmUgYXNzZXJ0aW9uIGlzbid0IHRoZSBzYW1lIHRoaW5nIGFzIG5vdCBwcm92aWRpbmcgYGRlc2NyaXB0b3JgLlxuICAgKiBJbnN0ZWFkLCBpdCdzIGFzc2VydGluZyB0aGF0IHRoZSB0YXJnZXQgb2JqZWN0IGhhcyBhIGBiYCBwcm9wZXJ0eVxuICAgKiBkZXNjcmlwdG9yIHRoYXQncyBkZWVwbHkgZXF1YWwgdG8gYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIFRoZSBhbGlhcyBgLmhhdmVPd25Qcm9wZXJ0eURlc2NyaXB0b3JgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoXG4gICAqIGAub3duUHJvcGVydHlEZXNjcmlwdG9yYC5cbiAgICpcbiAgICogQG5hbWUgb3duUHJvcGVydHlEZXNjcmlwdG9yXG4gICAqIEBhbGlhcyBoYXZlT3duUHJvcGVydHlEZXNjcmlwdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkZXNjcmlwdG9yIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydE93blByb3BlcnR5RGVzY3JpcHRvciAobmFtZSwgZGVzY3JpcHRvciwgbXNnKSB7XG4gICAgaWYgKHR5cGVvZiBkZXNjcmlwdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgbXNnID0gZGVzY3JpcHRvcjtcbiAgICAgIGRlc2NyaXB0b3IgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG4gICAgdmFyIGFjdHVhbERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdChvYmopLCBuYW1lKTtcbiAgICBpZiAoYWN0dWFsRGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yKSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBfLmVxbChkZXNjcmlwdG9yLCBhY3R1YWxEZXNjcmlwdG9yKVxuICAgICAgICAsICdleHBlY3RlZCB0aGUgb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yICcgKyBfLmluc3BlY3QobmFtZSkgKyAnIG9uICN7dGhpc30gdG8gbWF0Y2ggJyArIF8uaW5zcGVjdChkZXNjcmlwdG9yKSArICcsIGdvdCAnICsgXy5pbnNwZWN0KGFjdHVhbERlc2NyaXB0b3IpXG4gICAgICAgICwgJ2V4cGVjdGVkIHRoZSBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgJyArIF8uaW5zcGVjdChuYW1lKSArICcgb24gI3t0aGlzfSB0byBub3QgbWF0Y2ggJyArIF8uaW5zcGVjdChkZXNjcmlwdG9yKVxuICAgICAgICAsIGRlc2NyaXB0b3JcbiAgICAgICAgLCBhY3R1YWxEZXNjcmlwdG9yXG4gICAgICAgICwgdHJ1ZVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgYWN0dWFsRGVzY3JpcHRvclxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYW4gb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yICcgKyBfLmluc3BlY3QobmFtZSlcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBhbiBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgJyArIF8uaW5zcGVjdChuYW1lKVxuICAgICAgKTtcbiAgICB9XG4gICAgZmxhZyh0aGlzLCAnb2JqZWN0JywgYWN0dWFsRGVzY3JpcHRvcik7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdvd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBhc3NlcnRPd25Qcm9wZXJ0eURlc2NyaXB0b3IpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdoYXZlT3duUHJvcGVydHlEZXNjcmlwdG9yJywgYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yKTtcblxuICAvKipcbiAgICogIyMjIC5sZW5ndGhPZihuWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQncyBgbGVuZ3RoYCBwcm9wZXJ0eSBpcyBlcXVhbCB0byB0aGUgZ2l2ZW4gbnVtYmVyXG4gICAqIGBuYC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YoMyk7XG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmhhdmUubGVuZ3RoT2YoMyk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAubGVuZ3RoT2ZgLiBIb3dldmVyLCBpdCdzIG9mdGVuXG4gICAqIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHRhcmdldCdzIGBsZW5ndGhgIHByb3BlcnR5IGlzIGVxdWFsIHRvIGl0cyBleHBlY3RlZFxuICAgKiB2YWx1ZSwgcmF0aGVyIHRoYW4gbm90IGVxdWFsIHRvIG9uZSBvZiBtYW55IHVuZXhwZWN0ZWQgdmFsdWVzLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5oYXZlLmxlbmd0aE9mKDMpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5ub3QuaGF2ZS5sZW5ndGhPZig0KTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAubGVuZ3RoT2ZgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YoMiwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmhhdmUubGVuZ3RoT2YoMik7XG4gICAqXG4gICAqIGAubGVuZ3RoT2ZgIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBsYW5ndWFnZSBjaGFpbiwgY2F1c2luZyBhbGwgYC5hYm92ZWAsXG4gICAqIGAuYmVsb3dgLCBgLmxlYXN0YCwgYC5tb3N0YCwgYW5kIGAud2l0aGluYCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZVxuICAgKiBjaGFpbiB0byB1c2UgdGhlIHRhcmdldCdzIGBsZW5ndGhgIHByb3BlcnR5IGFzIHRoZSB0YXJnZXQuIEhvd2V2ZXIsIGl0J3NcbiAgICogb2Z0ZW4gYmVzdCB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0J3MgYGxlbmd0aGAgcHJvcGVydHkgaXMgZXF1YWwgdG8gaXRzXG4gICAqIGV4cGVjdGVkIGxlbmd0aCwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIHRoYXQgaXRzIGBsZW5ndGhgIHByb3BlcnR5IGZhbGxzXG4gICAqIHdpdGhpbiBzb21lIHJhbmdlIG9mIHZhbHVlcy5cbiAgICpcbiAgICogICAgIC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mKDMpO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLmFib3ZlKDIpO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5sZW5ndGhPZi5iZWxvdyg0KTtcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUubGVuZ3RoT2YuYXQubGVhc3QoMyk7XG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLmF0Lm1vc3QoMyk7XG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLmxlbmd0aE9mLndpdGhpbigyLDQpO1xuICAgKlxuICAgKiBEdWUgdG8gYSBjb21wYXRpYmlsaXR5IGlzc3VlLCB0aGUgYWxpYXMgYC5sZW5ndGhgIGNhbid0IGJlIGNoYWluZWQgZGlyZWN0bHlcbiAgICogb2ZmIG9mIGFuIHVuaW52b2tlZCBtZXRob2Qgc3VjaCBhcyBgLmFgLiBUaGVyZWZvcmUsIGAubGVuZ3RoYCBjYW4ndCBiZSB1c2VkXG4gICAqIGludGVyY2hhbmdlYWJseSB3aXRoIGAubGVuZ3RoT2ZgIGluIGV2ZXJ5IHNpdHVhdGlvbi4gSXQncyByZWNvbW1lbmRlZCB0b1xuICAgKiBhbHdheXMgdXNlIGAubGVuZ3RoT2ZgIGluc3RlYWQgb2YgYC5sZW5ndGhgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5hLmxlbmd0aCgzKTsgLy8gaW5jb21wYXRpYmxlOyB0aHJvd3MgZXJyb3JcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLmhhdmUuYS5sZW5ndGhPZigzKTsgIC8vIHBhc3NlcyBhcyBleHBlY3RlZFxuICAgKlxuICAgKiBAbmFtZSBsZW5ndGhPZlxuICAgKiBAYWxpYXMgbGVuZ3RoXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiBhc3NlcnRMZW5ndGhDaGFpbiAoKSB7XG4gICAgZmxhZyh0aGlzLCAnZG9MZW5ndGgnLCB0cnVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzc2VydExlbmd0aCAobiwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKTtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eSgnbGVuZ3RoJyk7XG4gICAgdmFyIGxlbiA9IG9iai5sZW5ndGg7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgbGVuID09IG5cbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhIGxlbmd0aCBvZiAje2V4cH0gYnV0IGdvdCAje2FjdH0nXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgbGVuZ3RoIG9mICN7YWN0fSdcbiAgICAgICwgblxuICAgICAgLCBsZW5cbiAgICApO1xuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCgnbGVuZ3RoJywgYXNzZXJ0TGVuZ3RoLCBhc3NlcnRMZW5ndGhDaGFpbik7XG4gIEFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoJ2xlbmd0aE9mJywgYXNzZXJ0TGVuZ3RoLCBhc3NlcnRMZW5ndGhDaGFpbik7XG5cbiAgLyoqXG4gICAqICMjIyAubWF0Y2gocmVbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBtYXRjaGVzIHRoZSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24gYHJlYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vYmFyJykudG8ubWF0Y2goL15mb28vKTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5tYXRjaGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2Zvb2JhcicpLnRvLm5vdC5tYXRjaCgvdGFjby8pO1xuICAgKlxuICAgKiBgLm1hdGNoYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzIHRoZVxuICAgKiBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2Zvb2JhcicpLnRvLm1hdGNoKC90YWNvLywgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KCdmb29iYXInLCAnbm9vbyB3aHkgZmFpbD8/JykudG8ubWF0Y2goL3RhY28vKTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAubWF0Y2hlc2AgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGggYC5tYXRjaGAuXG4gICAqXG4gICAqIEBuYW1lIG1hdGNoXG4gICAqIEBhbGlhcyBtYXRjaGVzXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG4gIGZ1bmN0aW9uIGFzc2VydE1hdGNoKHJlLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIHJlLmV4ZWMob2JqKVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBtYXRjaCAnICsgcmVcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gbm90IHRvIG1hdGNoICcgKyByZVxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdtYXRjaCcsIGFzc2VydE1hdGNoKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnbWF0Y2hlcycsIGFzc2VydE1hdGNoKTtcblxuICAvKipcbiAgICogIyMjIC5zdHJpbmcoc3RyWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgc3RyaW5nIGNvbnRhaW5zIHRoZSBnaXZlbiBzdWJzdHJpbmcgYHN0cmAuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2Zvb2JhcicpLnRvLmhhdmUuc3RyaW5nKCdiYXInKTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5zdHJpbmdgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb29iYXInKS50by5ub3QuaGF2ZS5zdHJpbmcoJ3RhY28nKTtcbiAgICpcbiAgICogYC5zdHJpbmdgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgnZm9vYmFyJykudG8uaGF2ZS5zdHJpbmcoL3RhY28vLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqICAgICBleHBlY3QoJ2Zvb2JhcicsICdub29vIHdoeSBmYWlsPz8nKS50by5oYXZlLnN0cmluZygvdGFjby8pO1xuICAgKlxuICAgKiBAbmFtZSBzdHJpbmdcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnc3RyaW5nJywgZnVuY3Rpb24gKHN0ciwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKTtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnc3RyaW5nJyk7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgfm9iai5pbmRleE9mKHN0cilcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gY29udGFpbiAnICsgXy5pbnNwZWN0KHN0cilcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGNvbnRhaW4gJyArIF8uaW5zcGVjdChzdHIpXG4gICAgKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAua2V5cyhrZXkxWywga2V5MlssIC4uLl1dKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBvYmplY3QsIGFycmF5LCBtYXAsIG9yIHNldCBoYXMgdGhlIGdpdmVuIGtleXMuIE9ubHlcbiAgICogdGhlIHRhcmdldCdzIG93biBpbmhlcml0ZWQgcHJvcGVydGllcyBhcmUgaW5jbHVkZWQgaW4gdGhlIHNlYXJjaC4gXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhbiBvYmplY3Qgb3IgYXJyYXksIGtleXMgY2FuIGJlIHByb3ZpZGVkIGFzIG9uZSBvciBtb3JlXG4gICAqIHN0cmluZyBhcmd1bWVudHMsIGEgc2luZ2xlIGFycmF5IGFyZ3VtZW50LCBvciBhIHNpbmdsZSBvYmplY3QgYXJndW1lbnQuIEluXG4gICAqIHRoZSBsYXR0ZXIgY2FzZSwgb25seSB0aGUga2V5cyBpbiB0aGUgZ2l2ZW4gb2JqZWN0IG1hdHRlcjsgdGhlIHZhbHVlcyBhcmVcbiAgICogaWdub3JlZC5cbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMn0pLnRvLmhhdmUuYWxsLmtleXMoJ2EnLCAnYicpO1xuICAgKiAgICAgZXhwZWN0KFsneCcsICd5J10pLnRvLmhhdmUuYWxsLmtleXMoMCwgMSk7XG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDJ9KS50by5oYXZlLmFsbC5rZXlzKFsnYScsICdiJ10pO1xuICAgKiAgICAgZXhwZWN0KFsneCcsICd5J10pLnRvLmhhdmUuYWxsLmtleXMoWzAsIDFdKTtcbiAgICpcbiAgICogICAgIGV4cGVjdCh7YTogMSwgYjogMn0pLnRvLmhhdmUuYWxsLmtleXMoe2E6IDQsIGI6IDV9KTsgLy8gaWdub3JlIDQgYW5kIDVcbiAgICogICAgIGV4cGVjdChbJ3gnLCAneSddKS50by5oYXZlLmFsbC5rZXlzKHswOiA0LCAxOiA1fSk7IC8vIGlnbm9yZSA0IGFuZCA1XG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpcyBhIG1hcCBvciBzZXQsIGVhY2gga2V5IG11c3QgYmUgcHJvdmlkZWQgYXMgYSBzZXBhcmF0ZVxuICAgKiBhcmd1bWVudC5cbiAgICpcbiAgICogICAgIGV4cGVjdChuZXcgTWFwKFtbJ2EnLCAxXSwgWydiJywgMl1dKSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqICAgICBleHBlY3QobmV3IFNldChbJ2EnLCAnYiddKSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqIEJlY2F1c2UgYC5rZXlzYCBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIHRhcmdldCdzIHR5cGUsIGl0J3NcbiAgICogaW1wb3J0YW50IHRvIGNoZWNrIHRoZSB0YXJnZXQncyB0eXBlIGJlZm9yZSB1c2luZyBgLmtleXNgLiBTZWUgdGhlIGAuYWAgZG9jXG4gICAqIGZvciBpbmZvIG9uIHRlc3RpbmcgYSB0YXJnZXQncyB0eXBlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8uYmUuYW4oJ29iamVjdCcpLnRoYXQuaGFzLmFsbC5rZXlzKCdhJywgJ2InKTtcbiAgICpcbiAgICogQnkgZGVmYXVsdCwgc3RyaWN0IChgPT09YCkgZXF1YWxpdHkgaXMgdXNlZCB0byBjb21wYXJlIGtleXMgb2YgbWFwcyBhbmRcbiAgICogc2V0cy4gQWRkIGAuZGVlcGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gdXNlIGRlZXAgZXF1YWxpdHkgaW5zdGVhZC4gU2VlXG4gICAqIHRoZSBgZGVlcC1lcWxgIHByb2plY3QgcGFnZSBmb3IgaW5mbyBvbiB0aGUgZGVlcCBlcXVhbGl0eSBhbGdvcml0aG06XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFpanMvZGVlcC1lcWwuXG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgc2V0IGRlZXBseSAoYnV0IG5vdCBzdHJpY3RseSkgaGFzIGtleSBge2E6IDF9YFxuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoW3thOiAxfV0pKS50by5oYXZlLmFsbC5kZWVwLmtleXMoW3thOiAxfV0pO1xuICAgKiAgICAgZXhwZWN0KG5ldyBTZXQoW3thOiAxfV0pKS50by5ub3QuaGF2ZS5hbGwua2V5cyhbe2E6IDF9XSk7XG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSB0YXJnZXQgbXVzdCBoYXZlIGFsbCBvZiB0aGUgZ2l2ZW4ga2V5cyBhbmQgbm8gbW9yZS4gQWRkXG4gICAqIGAuYW55YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBvbmx5IHJlcXVpcmUgdGhhdCB0aGUgdGFyZ2V0IGhhdmUgYXQgbGVhc3RcbiAgICogb25lIG9mIHRoZSBnaXZlbiBrZXlzLiBBbHNvLCBhZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZVxuICAgKiBgLmtleXNgLiBJdCdzIG9mdGVuIGJlc3QgdG8gYWRkIGAuYW55YCB3aGVuIG5lZ2F0aW5nIGAua2V5c2AsIGFuZCB0byB1c2VcbiAgICogYC5hbGxgIHdoZW4gYXNzZXJ0aW5nIGAua2V5c2Agd2l0aG91dCBuZWdhdGlvbi5cbiAgICpcbiAgICogV2hlbiBuZWdhdGluZyBgLmtleXNgLCBgLmFueWAgaXMgcHJlZmVycmVkIGJlY2F1c2UgYC5ub3QuYW55LmtleXNgIGFzc2VydHNcbiAgICogZXhhY3RseSB3aGF0J3MgZXhwZWN0ZWQgb2YgdGhlIG91dHB1dCwgd2hlcmVhcyBgLm5vdC5hbGwua2V5c2AgY3JlYXRlc1xuICAgKiB1bmNlcnRhaW4gZXhwZWN0YXRpb25zLlxuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWQ7IGFzc2VydHMgdGhhdCB0YXJnZXQgZG9lc24ndCBoYXZlIGFueSBvZiB0aGUgZ2l2ZW4ga2V5c1xuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8ubm90LmhhdmUuYW55LmtleXMoJ2MnLCAnZCcpO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkOyBhc3NlcnRzIHRoYXQgdGFyZ2V0IGRvZXNuJ3QgaGF2ZSBhbGwgb2YgdGhlIGdpdmVuXG4gICAqICAgICAvLyBrZXlzIGJ1dCBtYXkgb3IgbWF5IG5vdCBoYXZlIHNvbWUgb2YgdGhlbVxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8ubm90LmhhdmUuYWxsLmtleXMoJ2MnLCAnZCcpO1xuICAgKlxuICAgKiBXaGVuIGFzc2VydGluZyBgLmtleXNgIHdpdGhvdXQgbmVnYXRpb24sIGAuYWxsYCBpcyBwcmVmZXJyZWQgYmVjYXVzZVxuICAgKiBgLmFsbC5rZXlzYCBhc3NlcnRzIGV4YWN0bHkgd2hhdCdzIGV4cGVjdGVkIG9mIHRoZSBvdXRwdXQsIHdoZXJlYXNcbiAgICogYC5hbnkua2V5c2AgY3JlYXRlcyB1bmNlcnRhaW4gZXhwZWN0YXRpb25zLlxuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWQ7IGFzc2VydHMgdGhhdCB0YXJnZXQgaGFzIGFsbCB0aGUgZ2l2ZW4ga2V5c1xuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWQ7IGFzc2VydHMgdGhhdCB0YXJnZXQgaGFzIGF0IGxlYXN0IG9uZSBvZiB0aGUgZ2l2ZW5cbiAgICogICAgIC8vIGtleXMgYnV0IG1heSBvciBtYXkgbm90IGhhdmUgbW9yZSBvZiB0aGVtXG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDJ9KS50by5oYXZlLmFueS5rZXlzKCdhJywgJ2InKTtcbiAgICpcbiAgICogTm90ZSB0aGF0IGAuYWxsYCBpcyB1c2VkIGJ5IGRlZmF1bHQgd2hlbiBuZWl0aGVyIGAuYWxsYCBub3IgYC5hbnlgIGFwcGVhclxuICAgKiBlYXJsaWVyIGluIHRoZSBjaGFpbi4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0IHRvIGFkZCBgLmFsbGAgYW55d2F5IGJlY2F1c2VcbiAgICogaXQgaW1wcm92ZXMgcmVhZGFiaWxpdHkuXG4gICAqXG4gICAqICAgICAvLyBCb3RoIGFzc2VydGlvbnMgYXJlIGlkZW50aWNhbFxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyfSkudG8uaGF2ZS5hbGwua2V5cygnYScsICdiJyk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDJ9KS50by5oYXZlLmtleXMoJ2EnLCAnYicpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogQWRkIGAuaW5jbHVkZWAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gcmVxdWlyZSB0aGF0IHRoZSB0YXJnZXQncyBrZXlzIGJlIGFcbiAgICogc3VwZXJzZXQgb2YgdGhlIGV4cGVjdGVkIGtleXMsIHJhdGhlciB0aGFuIGlkZW50aWNhbCBzZXRzLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IG9iamVjdCdzIGtleXMgYXJlIGEgc3VwZXJzZXQgb2YgWydhJywgJ2InXSBidXQgbm90IGlkZW50aWNhbFxuICAgKiAgICAgZXhwZWN0KHthOiAxLCBiOiAyLCBjOiAzfSkudG8uaW5jbHVkZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqICAgICBleHBlY3Qoe2E6IDEsIGI6IDIsIGM6IDN9KS50by5ub3QuaGF2ZS5hbGwua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqIEhvd2V2ZXIsIGlmIGAuYW55YCBhbmQgYC5pbmNsdWRlYCBhcmUgY29tYmluZWQsIG9ubHkgdGhlIGAuYW55YCB0YWtlc1xuICAgKiBlZmZlY3QuIFRoZSBgLmluY2x1ZGVgIGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLlxuICAgKlxuICAgKiAgICAgLy8gQm90aCBhc3NlcnRpb25zIGFyZSBpZGVudGljYWxcbiAgICogICAgIGV4cGVjdCh7YTogMX0pLnRvLmhhdmUuYW55LmtleXMoJ2EnLCAnYicpO1xuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uaW5jbHVkZS5hbnkua2V5cygnYScsICdiJyk7XG4gICAqXG4gICAqIEEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgY2FuIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9LCAnbm9vbyB3aHkgZmFpbD8/JykudG8uaGF2ZS5rZXkoJ2InKTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAua2V5YCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLmtleXNgLlxuICAgKlxuICAgKiBAbmFtZSBrZXlzXG4gICAqIEBhbGlhcyBrZXlcbiAgICogQHBhcmFtIHsuLi5TdHJpbmd8QXJyYXl8T2JqZWN0fSBrZXlzXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydEtleXMgKGtleXMpIHtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgb2JqVHlwZSA9IF8udHlwZShvYmopXG4gICAgICAsIGtleXNUeXBlID0gXy50eXBlKGtleXMpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJylcbiAgICAgICwgaXNEZWVwID0gZmxhZyh0aGlzLCAnZGVlcCcpXG4gICAgICAsIHN0clxuICAgICAgLCBkZWVwU3RyID0gJydcbiAgICAgICwgb2sgPSB0cnVlXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJyk7XG5cbiAgICBmbGFnTXNnID0gZmxhZ01zZyA/IGZsYWdNc2cgKyAnOiAnIDogJyc7XG4gICAgdmFyIG1peGVkQXJnc01zZyA9IGZsYWdNc2cgKyAnd2hlbiB0ZXN0aW5nIGtleXMgYWdhaW5zdCBhbiBvYmplY3Qgb3IgYW4gYXJyYXkgeW91IG11c3QgZ2l2ZSBhIHNpbmdsZSBBcnJheXxPYmplY3R8U3RyaW5nIGFyZ3VtZW50IG9yIG11bHRpcGxlIFN0cmluZyBhcmd1bWVudHMnO1xuXG4gICAgaWYgKG9ialR5cGUgPT09ICdNYXAnIHx8IG9ialR5cGUgPT09ICdTZXQnKSB7XG4gICAgICBkZWVwU3RyID0gaXNEZWVwID8gJ2RlZXBseSAnIDogJyc7XG4gICAgICBhY3R1YWwgPSBbXTtcblxuICAgICAgLy8gTWFwIGFuZCBTZXQgJy5rZXlzJyBhcmVuJ3Qgc3VwcG9ydGVkIGluIElFIDExLiBUaGVyZWZvcmUsIHVzZSAuZm9yRWFjaC5cbiAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uICh2YWwsIGtleSkgeyBhY3R1YWwucHVzaChrZXkpIH0pO1xuXG4gICAgICBpZiAoa2V5c1R5cGUgIT09ICdBcnJheScpIHtcbiAgICAgICAga2V5cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgYWN0dWFsID0gXy5nZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcyhvYmopO1xuXG4gICAgICBzd2l0Y2ggKGtleXNUeXBlKSB7XG4gICAgICAgIGNhc2UgJ0FycmF5JzpcbiAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtaXhlZEFyZ3NNc2csIHVuZGVmaW5lZCwgc3NmaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdPYmplY3QnOlxuICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1peGVkQXJnc01zZywgdW5kZWZpbmVkLCBzc2ZpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKGtleXMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGtleXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IHN0cmluZ2lmeSBub24tU3ltYm9scyBiZWNhdXNlIFN5bWJvbHMgd291bGQgYmVjb21lIFwiU3ltYm9sKClcIlxuICAgICAga2V5cyA9IGtleXMubWFwKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdzeW1ib2wnID8gdmFsIDogU3RyaW5nKHZhbCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZmxhZ01zZyArICdrZXlzIHJlcXVpcmVkJywgdW5kZWZpbmVkLCBzc2ZpKTtcbiAgICB9XG5cbiAgICB2YXIgbGVuID0ga2V5cy5sZW5ndGhcbiAgICAgICwgYW55ID0gZmxhZyh0aGlzLCAnYW55JylcbiAgICAgICwgYWxsID0gZmxhZyh0aGlzLCAnYWxsJylcbiAgICAgICwgZXhwZWN0ZWQgPSBrZXlzXG4gICAgICAsIGFjdHVhbDtcblxuICAgIGlmICghYW55ICYmICFhbGwpIHtcbiAgICAgIGFsbCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gSGFzIGFueVxuICAgIGlmIChhbnkpIHtcbiAgICAgIG9rID0gZXhwZWN0ZWQuc29tZShmdW5jdGlvbihleHBlY3RlZEtleSkge1xuICAgICAgICByZXR1cm4gYWN0dWFsLnNvbWUoZnVuY3Rpb24oYWN0dWFsS2V5KSB7XG4gICAgICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICAgICAgcmV0dXJuIF8uZXFsKGV4cGVjdGVkS2V5LCBhY3R1YWxLZXkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWRLZXkgPT09IGFjdHVhbEtleTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSGFzIGFsbFxuICAgIGlmIChhbGwpIHtcbiAgICAgIG9rID0gZXhwZWN0ZWQuZXZlcnkoZnVuY3Rpb24oZXhwZWN0ZWRLZXkpIHtcbiAgICAgICAgcmV0dXJuIGFjdHVhbC5zb21lKGZ1bmN0aW9uKGFjdHVhbEtleSkge1xuICAgICAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgICAgIHJldHVybiBfLmVxbChleHBlY3RlZEtleSwgYWN0dWFsS2V5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGVkS2V5ID09PSBhY3R1YWxLZXk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWZsYWcodGhpcywgJ2NvbnRhaW5zJykpIHtcbiAgICAgICAgb2sgPSBvayAmJiBrZXlzLmxlbmd0aCA9PSBhY3R1YWwubGVuZ3RoO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEtleSBzdHJpbmdcbiAgICBpZiAobGVuID4gMSkge1xuICAgICAga2V5cyA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICByZXR1cm4gXy5pbnNwZWN0KGtleSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBsYXN0ID0ga2V5cy5wb3AoKTtcbiAgICAgIGlmIChhbGwpIHtcbiAgICAgICAgc3RyID0ga2V5cy5qb2luKCcsICcpICsgJywgYW5kICcgKyBsYXN0O1xuICAgICAgfVxuICAgICAgaWYgKGFueSkge1xuICAgICAgICBzdHIgPSBrZXlzLmpvaW4oJywgJykgKyAnLCBvciAnICsgbGFzdDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gXy5pbnNwZWN0KGtleXNbMF0pO1xuICAgIH1cblxuICAgIC8vIEZvcm1cbiAgICBzdHIgPSAobGVuID4gMSA/ICdrZXlzICcgOiAna2V5ICcpICsgc3RyO1xuXG4gICAgLy8gSGF2ZSAvIGluY2x1ZGVcbiAgICBzdHIgPSAoZmxhZyh0aGlzLCAnY29udGFpbnMnKSA/ICdjb250YWluICcgOiAnaGF2ZSAnKSArIHN0cjtcblxuICAgIC8vIEFzc2VydGlvblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBva1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byAnICsgZGVlcFN0ciArIHN0clxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgJyArIGRlZXBTdHIgKyBzdHJcbiAgICAgICwgZXhwZWN0ZWQuc2xpY2UoMCkuc29ydChfLmNvbXBhcmVCeUluc3BlY3QpXG4gICAgICAsIGFjdHVhbC5zb3J0KF8uY29tcGFyZUJ5SW5zcGVjdClcbiAgICAgICwgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdrZXlzJywgYXNzZXJ0S2V5cyk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2tleScsIGFzc2VydEtleXMpO1xuXG4gIC8qKlxuICAgKiAjIyMgLnRocm93KFtlcnJvckxpa2VdLCBbZXJyTXNnTWF0Y2hlcl0sIFttc2ddKVxuICAgKlxuICAgKiBXaGVuIG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIGAudGhyb3dgIGludm9rZXMgdGhlIHRhcmdldCBmdW5jdGlvbiBhbmRcbiAgICogYXNzZXJ0cyB0aGF0IGFuIGVycm9yIGlzIHRocm93bi5cbiAgICogXG4gICAqICAgICB2YXIgYmFkRm4gPSBmdW5jdGlvbiAoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgc2FsbW9uIScpOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGJhZEZuKS50by50aHJvdygpO1xuICAgKlxuICAgKiBXaGVuIG9uZSBhcmd1bWVudCBpcyBwcm92aWRlZCwgYW5kIGl0J3MgYW4gZXJyb3IgY29uc3RydWN0b3IsIGAudGhyb3dgXG4gICAqIGludm9rZXMgdGhlIHRhcmdldCBmdW5jdGlvbiBhbmQgYXNzZXJ0cyB0aGF0IGFuIGVycm9yIGlzIHRocm93biB0aGF0J3MgYW5cbiAgICogaW5zdGFuY2Ugb2YgdGhhdCBlcnJvciBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogICAgIHZhciBiYWRGbiA9IGZ1bmN0aW9uICgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBzYWxtb24hJyk7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYmFkRm4pLnRvLnRocm93KFR5cGVFcnJvcik7XG4gICAqXG4gICAqIFdoZW4gb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBhbmQgaXQncyBhbiBlcnJvciBpbnN0YW5jZSwgYC50aHJvd2AgaW52b2tlc1xuICAgKiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGFuZCBhc3NlcnRzIHRoYXQgYW4gZXJyb3IgaXMgdGhyb3duIHRoYXQncyBzdHJpY3RseVxuICAgKiAoYD09PWApIGVxdWFsIHRvIHRoYXQgZXJyb3IgaW5zdGFuY2UuXG4gICAqXG4gICAqICAgICB2YXIgZXJyID0gbmV3IFR5cGVFcnJvcignSWxsZWdhbCBzYWxtb24hJyk7XG4gICAqICAgICB2YXIgYmFkRm4gPSBmdW5jdGlvbiAoKSB7IHRocm93IGVycjsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChiYWRGbikudG8udGhyb3coZXJyKTtcbiAgICpcbiAgICogV2hlbiBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIGFuZCBpdCdzIGEgc3RyaW5nLCBgLnRocm93YCBpbnZva2VzIHRoZVxuICAgKiB0YXJnZXQgZnVuY3Rpb24gYW5kIGFzc2VydHMgdGhhdCBhbiBlcnJvciBpcyB0aHJvd24gd2l0aCBhIG1lc3NhZ2UgdGhhdFxuICAgKiBjb250YWlucyB0aGF0IHN0cmluZy5cbiAgICpcbiAgICogICAgIHZhciBiYWRGbiA9IGZ1bmN0aW9uICgpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBzYWxtb24hJyk7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYmFkRm4pLnRvLnRocm93KCdzYWxtb24nKTtcbiAgICpcbiAgICogV2hlbiBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIGFuZCBpdCdzIGEgcmVndWxhciBleHByZXNzaW9uLCBgLnRocm93YFxuICAgKiBpbnZva2VzIHRoZSB0YXJnZXQgZnVuY3Rpb24gYW5kIGFzc2VydHMgdGhhdCBhbiBlcnJvciBpcyB0aHJvd24gd2l0aCBhXG4gICAqIG1lc3NhZ2UgdGhhdCBtYXRjaGVzIHRoYXQgcmVndWxhciBleHByZXNzaW9uLlxuICAgKlxuICAgKiAgICAgdmFyIGJhZEZuID0gZnVuY3Rpb24gKCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIHNhbG1vbiEnKTsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChiYWRGbikudG8udGhyb3coL3NhbG1vbi8pO1xuICAgKlxuICAgKiBXaGVuIHR3byBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCBhbmQgdGhlIGZpcnN0IGlzIGFuIGVycm9yIGluc3RhbmNlIG9yXG4gICAqIGNvbnN0cnVjdG9yLCBhbmQgdGhlIHNlY29uZCBpcyBhIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb24sIGAudGhyb3dgXG4gICAqIGludm9rZXMgdGhlIGZ1bmN0aW9uIGFuZCBhc3NlcnRzIHRoYXQgYW4gZXJyb3IgaXMgdGhyb3duIHRoYXQgZnVsZmlsbHMgYm90aFxuICAgKiBjb25kaXRpb25zIGFzIGRlc2NyaWJlZCBhYm92ZS5cbiAgICpcbiAgICogICAgIHZhciBlcnIgPSBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIHNhbG1vbiEnKTtcbiAgICogICAgIHZhciBiYWRGbiA9IGZ1bmN0aW9uICgpIHsgdGhyb3cgZXJyOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGJhZEZuKS50by50aHJvdyhUeXBlRXJyb3IsICdzYWxtb24nKTtcbiAgICogICAgIGV4cGVjdChiYWRGbikudG8udGhyb3coVHlwZUVycm9yLCAvc2FsbW9uLyk7XG4gICAqICAgICBleHBlY3QoYmFkRm4pLnRvLnRocm93KGVyciwgJ3NhbG1vbicpO1xuICAgKiAgICAgZXhwZWN0KGJhZEZuKS50by50aHJvdyhlcnIsIC9zYWxtb24vKTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC50aHJvd2AuXG4gICAqICAgICBcbiAgICogICAgIHZhciBnb29kRm4gPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChnb29kRm4pLnRvLm5vdC50aHJvdygpO1xuICAgKiBcbiAgICogSG93ZXZlciwgaXQncyBkYW5nZXJvdXMgdG8gbmVnYXRlIGAudGhyb3dgIHdoZW4gcHJvdmlkaW5nIGFueSBhcmd1bWVudHMuXG4gICAqIFRoZSBwcm9ibGVtIGlzIHRoYXQgaXQgY3JlYXRlcyB1bmNlcnRhaW4gZXhwZWN0YXRpb25zIGJ5IGFzc2VydGluZyB0aGF0IHRoZVxuICAgKiB0YXJnZXQgZWl0aGVyIGRvZXNuJ3QgdGhyb3cgYW4gZXJyb3IsIG9yIHRoYXQgaXQgdGhyb3dzIGFuIGVycm9yIGJ1dCBvZiBhXG4gICAqIGRpZmZlcmVudCB0eXBlIHRoYW4gdGhlIGdpdmVuIHR5cGUsIG9yIHRoYXQgaXQgdGhyb3dzIGFuIGVycm9yIG9mIHRoZSBnaXZlblxuICAgKiB0eXBlIGJ1dCB3aXRoIGEgbWVzc2FnZSB0aGF0IGRvZXNuJ3QgaW5jbHVkZSB0aGUgZ2l2ZW4gc3RyaW5nLiBJdCdzIG9mdGVuXG4gICAqIGJlc3QgdG8gaWRlbnRpZnkgdGhlIGV4YWN0IG91dHB1dCB0aGF0J3MgZXhwZWN0ZWQsIGFuZCB0aGVuIHdyaXRlIGFuXG4gICAqIGFzc2VydGlvbiB0aGF0IG9ubHkgYWNjZXB0cyB0aGF0IGV4YWN0IG91dHB1dC5cbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzbid0IGV4cGVjdGVkIHRvIHRocm93IGFuIGVycm9yLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0XG4gICAqIGV4YWN0bHkgdGhhdC5cbiAgICpcbiAgICogICAgIHZhciBnb29kRm4gPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChnb29kRm4pLnRvLm5vdC50aHJvdygpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGdvb2RGbikudG8ubm90LnRocm93KFJlZmVyZW5jZUVycm9yLCAneCcpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGV4cGVjdGVkIHRvIHRocm93IGFuIGVycm9yLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0XG4gICAqIHRoYXQgdGhlIGVycm9yIGlzIG9mIGl0cyBleHBlY3RlZCB0eXBlLCBhbmQgaGFzIGEgbWVzc2FnZSB0aGF0IGluY2x1ZGVzIGFuXG4gICAqIGV4cGVjdGVkIHN0cmluZywgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIHRoYXQgaXQgZG9lc24ndCBoYXZlIG9uZSBvZiBtYW55XG4gICAqIHVuZXhwZWN0ZWQgdHlwZXMsIGFuZCBkb2Vzbid0IGhhdmUgYSBtZXNzYWdlIHRoYXQgaW5jbHVkZXMgc29tZSBzdHJpbmcuXG4gICAqXG4gICAqICAgICB2YXIgYmFkRm4gPSBmdW5jdGlvbiAoKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgc2FsbW9uIScpOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGJhZEZuKS50by50aHJvdyhUeXBlRXJyb3IsICdzYWxtb24nKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChiYWRGbikudG8ubm90LnRocm93KFJlZmVyZW5jZUVycm9yLCAneCcpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC50aHJvd2AgY2hhbmdlcyB0aGUgdGFyZ2V0IG9mIGFueSBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0b1xuICAgKiBiZSB0aGUgZXJyb3Igb2JqZWN0IHRoYXQncyB0aHJvd24uXG4gICAqXG4gICAqICAgICB2YXIgZXJyID0gbmV3IFR5cGVFcnJvcignSWxsZWdhbCBzYWxtb24hJyk7XG4gICAqICAgICBlcnIuY29kZSA9IDQyO1xuICAgKiAgICAgdmFyIGJhZEZuID0gZnVuY3Rpb24gKCkgeyB0aHJvdyBlcnI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYmFkRm4pLnRvLnRocm93KFR5cGVFcnJvcikud2l0aC5wcm9wZXJ0eSgnY29kZScsIDQyKTtcbiAgICpcbiAgICogYC50aHJvd2AgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gICAqIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhcyB0aGVcbiAgICogc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLiBXaGVuIG5vdCBwcm92aWRpbmcgdHdvIGFyZ3VtZW50cywgYWx3YXlzIHVzZVxuICAgKiB0aGUgc2Vjb25kIGZvcm0uXG4gICAqXG4gICAqICAgICB2YXIgZ29vZEZuID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QoZ29vZEZuKS50by50aHJvdyhUeXBlRXJyb3IsICd4JywgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KGdvb2RGbiwgJ25vb28gd2h5IGZhaWw/PycpLnRvLnRocm93KCk7XG4gICAqXG4gICAqIER1ZSB0byBsaW1pdGF0aW9ucyBpbiBFUzUsIGAudGhyb3dgIG1heSBub3QgYWx3YXlzIHdvcmsgYXMgZXhwZWN0ZWQgd2hlblxuICAgKiB1c2luZyBhIHRyYW5zcGlsZXIgc3VjaCBhcyBCYWJlbCBvciBUeXBlU2NyaXB0LiBJbiBwYXJ0aWN1bGFyLCBpdCBtYXlcbiAgICogcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMgd2hlbiBzdWJjbGFzc2luZyB0aGUgYnVpbHQtaW4gYEVycm9yYCBvYmplY3QgYW5kXG4gICAqIHRoZW4gcGFzc2luZyB0aGUgc3ViY2xhc3NlZCBjb25zdHJ1Y3RvciB0byBgLnRocm93YC4gU2VlIHlvdXIgdHJhbnNwaWxlcidzXG4gICAqIGRvY3MgZm9yIGRldGFpbHM6XG4gICAqXG4gICAqIC0gKFtCYWJlbF0oaHR0cHM6Ly9iYWJlbGpzLmlvL2RvY3MvdXNhZ2UvY2F2ZWF0cy8jY2xhc3NlcykpXG4gICAqIC0gKFtUeXBlU2NyaXB0XShodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvd2lraS9CcmVha2luZy1DaGFuZ2VzI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29yaykpXG4gICAqXG4gICAqIEJld2FyZSBvZiBzb21lIGNvbW1vbiBtaXN0YWtlcyB3aGVuIHVzaW5nIHRoZSBgdGhyb3dgIGFzc2VydGlvbi4gT25lIGNvbW1vblxuICAgKiBtaXN0YWtlIGlzIHRvIGFjY2lkZW50YWxseSBpbnZva2UgdGhlIGZ1bmN0aW9uIHlvdXJzZWxmIGluc3RlYWQgb2YgbGV0dGluZ1xuICAgKiB0aGUgYHRocm93YCBhc3NlcnRpb24gaW52b2tlIHRoZSBmdW5jdGlvbiBmb3IgeW91LiBGb3IgZXhhbXBsZSwgd2hlblxuICAgKiB0ZXN0aW5nIGlmIGEgZnVuY3Rpb24gbmFtZWQgYGZuYCB0aHJvd3MsIHByb3ZpZGUgYGZuYCBpbnN0ZWFkIG9mIGBmbigpYCBhc1xuICAgKiB0aGUgdGFyZ2V0IGZvciB0aGUgYXNzZXJ0aW9uLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KGZuKS50by50aHJvdygpOyAgICAgLy8gR29vZCEgVGVzdHMgYGZuYCBhcyBkZXNpcmVkXG4gICAqICAgICBleHBlY3QoZm4oKSkudG8udGhyb3coKTsgICAvLyBCYWQhIFRlc3RzIHJlc3VsdCBvZiBgZm4oKWAsIG5vdCBgZm5gXG4gICAqXG4gICAqIElmIHlvdSBuZWVkIHRvIGFzc2VydCB0aGF0IHlvdXIgZnVuY3Rpb24gYGZuYCB0aHJvd3Mgd2hlbiBwYXNzZWQgY2VydGFpblxuICAgKiBhcmd1bWVudHMsIHRoZW4gd3JhcCBhIGNhbGwgdG8gYGZuYCBpbnNpZGUgb2YgYW5vdGhlciBmdW5jdGlvbi5cbiAgICpcbiAgICogICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7IGZuKDQyKTsgfSkudG8udGhyb3coKTsgIC8vIEZ1bmN0aW9uIGV4cHJlc3Npb25cbiAgICogICAgIGV4cGVjdCgoKSA9PiBmbig0MikpLnRvLnRocm93KCk7ICAgICAgICAgICAgIC8vIEVTNiBhcnJvdyBmdW5jdGlvblxuICAgKlxuICAgKiBBbm90aGVyIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHByb3ZpZGUgYW4gb2JqZWN0IG1ldGhvZCAob3IgYW55IHN0YW5kLWFsb25lXG4gICAqIGZ1bmN0aW9uIHRoYXQgcmVsaWVzIG9uIGB0aGlzYCkgYXMgdGhlIHRhcmdldCBvZiB0aGUgYXNzZXJ0aW9uLiBEb2luZyBzbyBpc1xuICAgKiBwcm9ibGVtYXRpYyBiZWNhdXNlIHRoZSBgdGhpc2AgY29udGV4dCB3aWxsIGJlIGxvc3Qgd2hlbiB0aGUgZnVuY3Rpb24gaXNcbiAgICogaW52b2tlZCBieSBgLnRocm93YDsgdGhlcmUncyBubyB3YXkgZm9yIGl0IHRvIGtub3cgd2hhdCBgdGhpc2AgaXMgc3VwcG9zZWRcbiAgICogdG8gYmUuIFRoZXJlIGFyZSB0d28gd2F5cyBhcm91bmQgdGhpcyBwcm9ibGVtLiBPbmUgc29sdXRpb24gaXMgdG8gd3JhcCB0aGVcbiAgICogbWV0aG9kIG9yIGZ1bmN0aW9uIGNhbGwgaW5zaWRlIG9mIGFub3RoZXIgZnVuY3Rpb24uIEFub3RoZXIgc29sdXRpb24gaXMgdG9cbiAgICogdXNlIGBiaW5kYC5cbiAgICpcbiAgICogICAgIGV4cGVjdChmdW5jdGlvbiAoKSB7IGNhdC5tZW93KCk7IH0pLnRvLnRocm93KCk7ICAvLyBGdW5jdGlvbiBleHByZXNzaW9uXG4gICAqICAgICBleHBlY3QoKCkgPT4gY2F0Lm1lb3coKSkudG8udGhyb3coKTsgICAgICAgICAgICAgLy8gRVM2IGFycm93IGZ1bmN0aW9uXG4gICAqICAgICBleHBlY3QoY2F0Lm1lb3cuYmluZChjYXQpKS50by50aHJvdygpOyAgICAgICAgICAgLy8gQmluZFxuICAgKlxuICAgKiBGaW5hbGx5LCBpdCdzIHdvcnRoIG1lbnRpb25pbmcgdGhhdCBpdCdzIGEgYmVzdCBwcmFjdGljZSBpbiBKYXZhU2NyaXB0IHRvXG4gICAqIG9ubHkgdGhyb3cgYEVycm9yYCBhbmQgZGVyaXZhdGl2ZXMgb2YgYEVycm9yYCBzdWNoIGFzIGBSZWZlcmVuY2VFcnJvcmAsXG4gICAqIGBUeXBlRXJyb3JgLCBhbmQgdXNlci1kZWZpbmVkIG9iamVjdHMgdGhhdCBleHRlbmQgYEVycm9yYC4gTm8gb3RoZXIgdHlwZSBvZlxuICAgKiB2YWx1ZSB3aWxsIGdlbmVyYXRlIGEgc3RhY2sgdHJhY2Ugd2hlbiBpbml0aWFsaXplZC4gV2l0aCB0aGF0IHNhaWQsIHRoZVxuICAgKiBgdGhyb3dgIGFzc2VydGlvbiBkb2VzIHRlY2huaWNhbGx5IHN1cHBvcnQgYW55IHR5cGUgb2YgdmFsdWUgYmVpbmcgdGhyb3duLFxuICAgKiBub3QganVzdCBgRXJyb3JgIGFuZCBpdHMgZGVyaXZhdGl2ZXMuXG4gICAqXG4gICAqIFRoZSBhbGlhc2VzIGAudGhyb3dzYCBhbmQgYC5UaHJvd2AgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGhcbiAgICogYC50aHJvd2AuXG4gICAqXG4gICAqIEBuYW1lIHRocm93XG4gICAqIEBhbGlhcyB0aHJvd3NcbiAgICogQGFsaWFzIFRocm93XG4gICAqIEBwYXJhbSB7RXJyb3J8RXJyb3JDb25zdHJ1Y3Rvcn0gZXJyb3JMaWtlXG4gICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gZXJyTXNnTWF0Y2hlciBlcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yI0Vycm9yX3R5cGVzXG4gICAqIEByZXR1cm5zIGVycm9yIGZvciBjaGFpbmluZyAobnVsbCBpZiBubyBlcnJvcilcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0VGhyb3dzIChlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgbmVnYXRlID0gZmxhZyh0aGlzLCAnbmVnYXRlJykgfHwgZmFsc2U7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ2Z1bmN0aW9uJyk7XG5cbiAgICBpZiAoZXJyb3JMaWtlIGluc3RhbmNlb2YgUmVnRXhwIHx8IHR5cGVvZiBlcnJvckxpa2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlcnJNc2dNYXRjaGVyID0gZXJyb3JMaWtlO1xuICAgICAgZXJyb3JMaWtlID0gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgY2F1Z2h0RXJyO1xuICAgIHRyeSB7XG4gICAgICBvYmooKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNhdWdodEVyciA9IGVycjtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBoYXZlIHRoZSBuZWdhdGUgZmxhZyBlbmFibGVkIGFuZCBhdCBsZWFzdCBvbmUgdmFsaWQgYXJndW1lbnQgaXQgbWVhbnMgd2UgZG8gZXhwZWN0IGFuIGVycm9yXG4gICAgLy8gYnV0IHdlIHdhbnQgaXQgdG8gbWF0Y2ggYSBnaXZlbiBzZXQgb2YgY3JpdGVyaWFcbiAgICB2YXIgZXZlcnlBcmdJc1VuZGVmaW5lZCA9IGVycm9yTGlrZSA9PT0gdW5kZWZpbmVkICYmIGVyck1zZ01hdGNoZXIgPT09IHVuZGVmaW5lZDtcblxuICAgIC8vIElmIHdlJ3ZlIGdvdCB0aGUgbmVnYXRlIGZsYWcgZW5hYmxlZCBhbmQgYm90aCBhcmdzLCB3ZSBzaG91bGQgb25seSBmYWlsIGlmIGJvdGggYXJlbid0IGNvbXBhdGlibGVcbiAgICAvLyBTZWUgSXNzdWUgIzU1MSBhbmQgUFIgIzY4M0BHaXRIdWJcbiAgICB2YXIgZXZlcnlBcmdJc0RlZmluZWQgPSBCb29sZWFuKGVycm9yTGlrZSAmJiBlcnJNc2dNYXRjaGVyKTtcbiAgICB2YXIgZXJyb3JMaWtlRmFpbCA9IGZhbHNlO1xuICAgIHZhciBlcnJNc2dNYXRjaGVyRmFpbCA9IGZhbHNlO1xuXG4gICAgLy8gQ2hlY2tpbmcgaWYgZXJyb3Igd2FzIHRocm93blxuICAgIGlmIChldmVyeUFyZ0lzVW5kZWZpbmVkIHx8ICFldmVyeUFyZ0lzVW5kZWZpbmVkICYmICFuZWdhdGUpIHtcbiAgICAgIC8vIFdlIG5lZWQgdGhpcyB0byBkaXNwbGF5IHJlc3VsdHMgY29ycmVjdGx5IGFjY29yZGluZyB0byB0aGVpciB0eXBlc1xuICAgICAgdmFyIGVycm9yTGlrZVN0cmluZyA9ICdhbiBlcnJvcic7XG4gICAgICBpZiAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgZXJyb3JMaWtlU3RyaW5nID0gJyN7ZXhwfSc7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yTGlrZSkge1xuICAgICAgICBlcnJvckxpa2VTdHJpbmcgPSBfLmNoZWNrRXJyb3IuZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICAgIGNhdWdodEVyclxuICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHRocm93ICcgKyBlcnJvckxpa2VTdHJpbmdcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgdGhyb3cgYW4gZXJyb3IgYnV0ICN7YWN0fSB3YXMgdGhyb3duJ1xuICAgICAgICAsIGVycm9yTGlrZSAmJiBlcnJvckxpa2UudG9TdHJpbmcoKVxuICAgICAgICAsIChjYXVnaHRFcnIgaW5zdGFuY2VvZiBFcnJvciA/XG4gICAgICAgICAgICBjYXVnaHRFcnIudG9TdHJpbmcoKSA6ICh0eXBlb2YgY2F1Z2h0RXJyID09PSAnc3RyaW5nJyA/IGNhdWdodEVyciA6IGNhdWdodEVyciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5jaGVja0Vycm9yLmdldENvbnN0cnVjdG9yTmFtZShjYXVnaHRFcnIpKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVycm9yTGlrZSAmJiBjYXVnaHRFcnIpIHtcbiAgICAgIC8vIFdlIHNob3VsZCBjb21wYXJlIGluc3RhbmNlcyBvbmx5IGlmIGBlcnJvckxpa2VgIGlzIGFuIGluc3RhbmNlIG9mIGBFcnJvcmBcbiAgICAgIGlmIChlcnJvckxpa2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB2YXIgaXNDb21wYXRpYmxlSW5zdGFuY2UgPSBfLmNoZWNrRXJyb3IuY29tcGF0aWJsZUluc3RhbmNlKGNhdWdodEVyciwgZXJyb3JMaWtlKTtcblxuICAgICAgICBpZiAoaXNDb21wYXRpYmxlSW5zdGFuY2UgPT09IG5lZ2F0ZSkge1xuICAgICAgICAgIC8vIFRoZXNlIGNoZWNrcyB3ZXJlIGNyZWF0ZWQgdG8gZW5zdXJlIHdlIHdvbid0IGZhaWwgdG9vIHNvb24gd2hlbiB3ZSd2ZSBnb3QgYm90aCBhcmdzIGFuZCBhIG5lZ2F0ZVxuICAgICAgICAgIC8vIFNlZSBJc3N1ZSAjNTUxIGFuZCBQUiAjNjgzQEdpdEh1YlxuICAgICAgICAgIGlmIChldmVyeUFyZ0lzRGVmaW5lZCAmJiBuZWdhdGUpIHtcbiAgICAgICAgICAgIGVycm9yTGlrZUZhaWwgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgICBuZWdhdGVcbiAgICAgICAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byB0aHJvdyAje2V4cH0gYnV0ICN7YWN0fSB3YXMgdGhyb3duJ1xuICAgICAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyAje2V4cH0nICsgKGNhdWdodEVyciAmJiAhbmVnYXRlID8gJyBidXQgI3thY3R9IHdhcyB0aHJvd24nIDogJycpXG4gICAgICAgICAgICAgICwgZXJyb3JMaWtlLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgLCBjYXVnaHRFcnIudG9TdHJpbmcoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGlzQ29tcGF0aWJsZUNvbnN0cnVjdG9yID0gXy5jaGVja0Vycm9yLmNvbXBhdGlibGVDb25zdHJ1Y3RvcihjYXVnaHRFcnIsIGVycm9yTGlrZSk7XG4gICAgICBpZiAoaXNDb21wYXRpYmxlQ29uc3RydWN0b3IgPT09IG5lZ2F0ZSkge1xuICAgICAgICBpZiAoZXZlcnlBcmdJc0RlZmluZWQgJiYgbmVnYXRlKSB7XG4gICAgICAgICAgICBlcnJvckxpa2VGYWlsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICAgICAgbmVnYXRlXG4gICAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHRocm93ICN7ZXhwfSBidXQgI3thY3R9IHdhcyB0aHJvd24nXG4gICAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyAje2V4cH0nICsgKGNhdWdodEVyciA/ICcgYnV0ICN7YWN0fSB3YXMgdGhyb3duJyA6ICcnKVxuICAgICAgICAgICAgLCAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckxpa2UudG9TdHJpbmcoKSA6IGVycm9yTGlrZSAmJiBfLmNoZWNrRXJyb3IuZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSkpXG4gICAgICAgICAgICAsIChjYXVnaHRFcnIgaW5zdGFuY2VvZiBFcnJvciA/IGNhdWdodEVyci50b1N0cmluZygpIDogY2F1Z2h0RXJyICYmIF8uY2hlY2tFcnJvci5nZXRDb25zdHJ1Y3Rvck5hbWUoY2F1Z2h0RXJyKSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNhdWdodEVyciAmJiBlcnJNc2dNYXRjaGVyICE9PSB1bmRlZmluZWQgJiYgZXJyTXNnTWF0Y2hlciAhPT0gbnVsbCkge1xuICAgICAgLy8gSGVyZSB3ZSBjaGVjayBjb21wYXRpYmxlIG1lc3NhZ2VzXG4gICAgICB2YXIgcGxhY2Vob2xkZXIgPSAnaW5jbHVkaW5nJztcbiAgICAgIGlmIChlcnJNc2dNYXRjaGVyIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAgIHBsYWNlaG9sZGVyID0gJ21hdGNoaW5nJ1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNDb21wYXRpYmxlTWVzc2FnZSA9IF8uY2hlY2tFcnJvci5jb21wYXRpYmxlTWVzc2FnZShjYXVnaHRFcnIsIGVyck1zZ01hdGNoZXIpO1xuICAgICAgaWYgKGlzQ29tcGF0aWJsZU1lc3NhZ2UgPT09IG5lZ2F0ZSkge1xuICAgICAgICBpZiAoZXZlcnlBcmdJc0RlZmluZWQgJiYgbmVnYXRlKSB7XG4gICAgICAgICAgICBlcnJNc2dNYXRjaGVyRmFpbCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICBuZWdhdGVcbiAgICAgICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgZXJyb3IgJyArIHBsYWNlaG9sZGVyICsgJyAje2V4cH0gYnV0IGdvdCAje2FjdH0nXG4gICAgICAgICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHRocm93IGVycm9yIG5vdCAnICsgcGxhY2Vob2xkZXIgKyAnICN7ZXhwfSdcbiAgICAgICAgICAgICwgIGVyck1zZ01hdGNoZXJcbiAgICAgICAgICAgICwgIF8uY2hlY2tFcnJvci5nZXRNZXNzYWdlKGNhdWdodEVycilcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgYm90aCBhc3NlcnRpb25zIGZhaWxlZCBhbmQgYm90aCBzaG91bGQndmUgbWF0Y2hlZCB3ZSB0aHJvdyBhbiBlcnJvclxuICAgIGlmIChlcnJvckxpa2VGYWlsICYmIGVyck1zZ01hdGNoZXJGYWlsKSB7XG4gICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgbmVnYXRlXG4gICAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgI3tleHB9IGJ1dCAje2FjdH0gd2FzIHRocm93bidcbiAgICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgdGhyb3cgI3tleHB9JyArIChjYXVnaHRFcnIgPyAnIGJ1dCAje2FjdH0gd2FzIHRocm93bicgOiAnJylcbiAgICAgICAgLCAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckxpa2UudG9TdHJpbmcoKSA6IGVycm9yTGlrZSAmJiBfLmNoZWNrRXJyb3IuZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSkpXG4gICAgICAgICwgKGNhdWdodEVyciBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0RXJyLnRvU3RyaW5nKCkgOiBjYXVnaHRFcnIgJiYgXy5jaGVja0Vycm9yLmdldENvbnN0cnVjdG9yTmFtZShjYXVnaHRFcnIpKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmbGFnKHRoaXMsICdvYmplY3QnLCBjYXVnaHRFcnIpO1xuICB9O1xuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ3Rocm93JywgYXNzZXJ0VGhyb3dzKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgndGhyb3dzJywgYXNzZXJ0VGhyb3dzKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnVGhyb3cnLCBhc3NlcnRUaHJvd3MpO1xuXG4gIC8qKlxuICAgKiAjIyMgLnJlc3BvbmRUbyhtZXRob2RbLCBtc2ddKVxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgYSBub24tZnVuY3Rpb24gb2JqZWN0LCBgLnJlc3BvbmRUb2AgYXNzZXJ0cyB0aGF0IHRoZVxuICAgKiB0YXJnZXQgaGFzIGEgbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUgYG1ldGhvZGAuIFRoZSBtZXRob2QgY2FuIGJlIG93biBvclxuICAgKiBpbmhlcml0ZWQsIGFuZCBpdCBjYW4gYmUgZW51bWVyYWJsZSBvciBub24tZW51bWVyYWJsZS5cbiAgICpcbiAgICogICAgIGZ1bmN0aW9uIENhdCAoKSB7fVxuICAgKiAgICAgQ2F0LnByb3RvdHlwZS5tZW93ID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QobmV3IENhdCgpKS50by5yZXNwb25kVG8oJ21lb3cnKTtcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGEgZnVuY3Rpb24sIGAucmVzcG9uZFRvYCBhc3NlcnRzIHRoYXQgdGhlIHRhcmdldCdzXG4gICAqIGBwcm90b3R5cGVgIHByb3BlcnR5IGhhcyBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGBtZXRob2RgLiBBZ2FpbiwgdGhlXG4gICAqIG1ldGhvZCBjYW4gYmUgb3duIG9yIGluaGVyaXRlZCwgYW5kIGl0IGNhbiBiZSBlbnVtZXJhYmxlIG9yIG5vbi1lbnVtZXJhYmxlLlxuICAgKlxuICAgKiAgICAgZnVuY3Rpb24gQ2F0ICgpIHt9XG4gICAqICAgICBDYXQucHJvdG90eXBlLm1lb3cgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChDYXQpLnRvLnJlc3BvbmRUbygnbWVvdycpO1xuICAgKlxuICAgKiBBZGQgYC5pdHNlbGZgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIGZvcmNlIGAucmVzcG9uZFRvYCB0byB0cmVhdCB0aGVcbiAgICogdGFyZ2V0IGFzIGEgbm9uLWZ1bmN0aW9uIG9iamVjdCwgZXZlbiBpZiBpdCdzIGEgZnVuY3Rpb24uIFRodXMsIGl0IGFzc2VydHNcbiAgICogdGhhdCB0aGUgdGFyZ2V0IGhhcyBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGBtZXRob2RgLCByYXRoZXIgdGhhblxuICAgKiBhc3NlcnRpbmcgdGhhdCB0aGUgdGFyZ2V0J3MgYHByb3RvdHlwZWAgcHJvcGVydHkgaGFzIGEgbWV0aG9kIHdpdGggdGhlXG4gICAqIGdpdmVuIG5hbWUgYG1ldGhvZGAuXG4gICAqXG4gICAqICAgICBmdW5jdGlvbiBDYXQgKCkge31cbiAgICogICAgIENhdC5wcm90b3R5cGUubWVvdyA9IGZ1bmN0aW9uICgpIHt9O1xuICAgKiAgICAgQ2F0Lmhpc3MgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChDYXQpLml0c2VsZi50by5yZXNwb25kVG8oJ2hpc3MnKS5idXQubm90LnJlc3BvbmRUbygnbWVvdycpO1xuICAgKlxuICAgKiBXaGVuIG5vdCBhZGRpbmcgYC5pdHNlbGZgLCBpdCdzIGltcG9ydGFudCB0byBjaGVjayB0aGUgdGFyZ2V0J3MgdHlwZSBiZWZvcmVcbiAgICogdXNpbmcgYC5yZXNwb25kVG9gLiBTZWUgdGhlIGAuYWAgZG9jIGZvciBpbmZvIG9uIGNoZWNraW5nIGEgdGFyZ2V0J3MgdHlwZS5cbiAgICpcbiAgICogICAgIGZ1bmN0aW9uIENhdCAoKSB7fVxuICAgKiAgICAgQ2F0LnByb3RvdHlwZS5tZW93ID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QobmV3IENhdCgpKS50by5iZS5hbignb2JqZWN0JykudGhhdC5yZXNwb25kc1RvKCdtZW93Jyk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAucmVzcG9uZFRvYC5cbiAgICpcbiAgICogICAgIGZ1bmN0aW9uIERvZyAoKSB7fVxuICAgKiAgICAgRG9nLnByb3RvdHlwZS5iYXJrID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3QobmV3IERvZygpKS50by5ub3QucmVzcG9uZFRvKCdtZW93Jyk7XG4gICAqXG4gICAqIGAucmVzcG9uZFRvYCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yXG4gICAqIG1lc3NhZ2UgdG8gc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzXG4gICAqIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe30pLnRvLnJlc3BvbmRUbygnbWVvdycsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCh7fSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLnJlc3BvbmRUbygnbWVvdycpO1xuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5yZXNwb25kc1RvYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLnJlc3BvbmRUb2AuXG4gICAqXG4gICAqIEBuYW1lIHJlc3BvbmRUb1xuICAgKiBAYWxpYXMgcmVzcG9uZHNUb1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtc2cgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBmdW5jdGlvbiByZXNwb25kVG8gKG1ldGhvZCwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGl0c2VsZiA9IGZsYWcodGhpcywgJ2l0c2VsZicpXG4gICAgICAsIGNvbnRleHQgPSAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIG9iaiAmJiAhaXRzZWxmKVxuICAgICAgICA/IG9iai5wcm90b3R5cGVbbWV0aG9kXVxuICAgICAgICA6IG9ialttZXRob2RdO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICdmdW5jdGlvbicgPT09IHR5cGVvZiBjb250ZXh0XG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIHJlc3BvbmQgdG8gJyArIF8uaW5zcGVjdChtZXRob2QpXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIG5vdCByZXNwb25kIHRvICcgKyBfLmluc3BlY3QobWV0aG9kKVxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdyZXNwb25kVG8nLCByZXNwb25kVG8pO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdyZXNwb25kc1RvJywgcmVzcG9uZFRvKTtcblxuICAvKipcbiAgICogIyMjIC5pdHNlbGZcbiAgICpcbiAgICogRm9yY2VzIGFsbCBgLnJlc3BvbmRUb2AgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4gdG8gYmVoYXZlIGFzIGlmXG4gICAqIHRoZSB0YXJnZXQgaXMgYSBub24tZnVuY3Rpb24gb2JqZWN0LCBldmVuIGlmIGl0J3MgYSBmdW5jdGlvbi4gVGh1cywgaXRcbiAgICogY2F1c2VzIGAucmVzcG9uZFRvYCB0byBhc3NlcnQgdGhhdCB0aGUgdGFyZ2V0IGhhcyBhIG1ldGhvZCB3aXRoIHRoZSBnaXZlblxuICAgKiBuYW1lLCByYXRoZXIgdGhhbiBhc3NlcnRpbmcgdGhhdCB0aGUgdGFyZ2V0J3MgYHByb3RvdHlwZWAgcHJvcGVydHkgaGFzIGFcbiAgICogbWV0aG9kIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAqXG4gICAqICAgICBmdW5jdGlvbiBDYXQgKCkge31cbiAgICogICAgIENhdC5wcm90b3R5cGUubWVvdyA9IGZ1bmN0aW9uICgpIHt9O1xuICAgKiAgICAgQ2F0Lmhpc3MgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChDYXQpLml0c2VsZi50by5yZXNwb25kVG8oJ2hpc3MnKS5idXQubm90LnJlc3BvbmRUbygnbWVvdycpO1xuICAgKlxuICAgKiBAbmFtZSBpdHNlbGZcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdpdHNlbGYnLCBmdW5jdGlvbiAoKSB7XG4gICAgZmxhZyh0aGlzLCAnaXRzZWxmJywgdHJ1ZSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiAjIyMgLnNhdGlzZnkobWF0Y2hlclssIG1zZ10pXG4gICAqXG4gICAqIEludm9rZXMgdGhlIGdpdmVuIGBtYXRjaGVyYCBmdW5jdGlvbiB3aXRoIHRoZSB0YXJnZXQgYmVpbmcgcGFzc2VkIGFzIHRoZVxuICAgKiBmaXJzdCBhcmd1bWVudCwgYW5kIGFzc2VydHMgdGhhdCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgdHJ1dGh5LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLnNhdGlzZnkoZnVuY3Rpb24obnVtKSB7XG4gICAqICAgICAgIHJldHVybiBudW0gPiAwOyBcbiAgICogICAgIH0pO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLnNhdGlzZnlgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLm5vdC5zYXRpc2Z5KGZ1bmN0aW9uKG51bSkge1xuICAgKiAgICAgICByZXR1cm4gbnVtID4gMjtcbiAgICogICAgIH0pO1xuICAgKlxuICAgKiBgLnNhdGlzZnlgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5zYXRpc2Z5KGZ1bmN0aW9uKG51bSkge1xuICAgKiAgICAgICByZXR1cm4gbnVtID4gMjtcbiAgICogICAgIH0sICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICpcbiAgICogICAgIGV4cGVjdCgxLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uc2F0aXNmeShmdW5jdGlvbihudW0pIHtcbiAgICogICAgICAgcmV0dXJuIG51bSA+IDI7XG4gICAqICAgICB9KTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuc2F0aXNmaWVzYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLnNhdGlzZnlgLlxuICAgKlxuICAgKiBAbmFtZSBzYXRpc2Z5XG4gICAqIEBhbGlhcyBzYXRpc2ZpZXNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWF0Y2hlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gc2F0aXNmeSAobWF0Y2hlciwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpO1xuICAgIHZhciByZXN1bHQgPSBtYXRjaGVyKG9iaik7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIHJlc3VsdFxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBzYXRpc2Z5ICcgKyBfLm9iakRpc3BsYXkobWF0Y2hlcilcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IHNhdGlzZnknICsgXy5vYmpEaXNwbGF5KG1hdGNoZXIpXG4gICAgICAsIGZsYWcodGhpcywgJ25lZ2F0ZScpID8gZmFsc2UgOiB0cnVlXG4gICAgICAsIHJlc3VsdFxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdzYXRpc2Z5Jywgc2F0aXNmeSk7XG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ3NhdGlzZmllcycsIHNhdGlzZnkpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmNsb3NlVG8oZXhwZWN0ZWQsIGRlbHRhWywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgYSBudW1iZXIgdGhhdCdzIHdpdGhpbiBhIGdpdmVuICsvLSBgZGVsdGFgIHJhbmdlXG4gICAqIG9mIHRoZSBnaXZlbiBudW1iZXIgYGV4cGVjdGVkYC4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZVxuICAgKiB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxLjUpLnRvLmVxdWFsKDEuNSk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxLjUpLnRvLmJlLmNsb3NlVG8oMSwgMC41KTtcbiAgICogICAgIGV4cGVjdCgxLjUpLnRvLmJlLmNsb3NlVG8oMiwgMC41KTtcbiAgICogICAgIGV4cGVjdCgxLjUpLnRvLmJlLmNsb3NlVG8oMSwgMSk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuY2xvc2VUb2AuXG4gICAqXG4gICAqICAgICBleHBlY3QoMS41KS50by5lcXVhbCgxLjUpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEuNSkudG8ubm90LmJlLmNsb3NlVG8oMywgMSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBgLmNsb3NlVG9gIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxLjUpLnRvLmJlLmNsb3NlVG8oMywgMSwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KDEuNSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLmNsb3NlVG8oMywgMSk7XG4gICAqXG4gICAqIFRoZSBhbGlhcyBgLmFwcHJveGltYXRlbHlgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuY2xvc2VUb2AuXG4gICAqXG4gICAqIEBuYW1lIGNsb3NlVG9cbiAgICogQGFsaWFzIGFwcHJveGltYXRlbHlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGV4cGVjdGVkXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gY2xvc2VUbyhleHBlY3RlZCwgZGVsdGEsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJyk7XG5cbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnbnVtYmVyJyk7XG4gICAgaWYgKHR5cGVvZiBleHBlY3RlZCAhPT0gJ251bWJlcicgfHwgdHlwZW9mIGRlbHRhICE9PSAnbnVtYmVyJykge1xuICAgICAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgJzogJyA6ICcnO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICAgIGZsYWdNc2cgKyAndGhlIGFyZ3VtZW50cyB0byBjbG9zZVRvIG9yIGFwcHJveGltYXRlbHkgbXVzdCBiZSBudW1iZXJzJyxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgc3NmaVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgTWF0aC5hYnMob2JqIC0gZXhwZWN0ZWQpIDw9IGRlbHRhXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGNsb3NlIHRvICcgKyBleHBlY3RlZCArICcgKy8tICcgKyBkZWx0YVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSBub3QgdG8gYmUgY2xvc2UgdG8gJyArIGV4cGVjdGVkICsgJyArLy0gJyArIGRlbHRhXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2Nsb3NlVG8nLCBjbG9zZVRvKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnYXBwcm94aW1hdGVseScsIGNsb3NlVG8pO1xuXG4gIC8vIE5vdGU6IER1cGxpY2F0ZXMgYXJlIGlnbm9yZWQgaWYgdGVzdGluZyBmb3IgaW5jbHVzaW9uIGluc3RlYWQgb2Ygc2FtZW5lc3MuXG4gIGZ1bmN0aW9uIGlzU3Vic2V0T2Yoc3Vic2V0LCBzdXBlcnNldCwgY21wLCBjb250YWlucywgb3JkZXJlZCkge1xuICAgIGlmICghY29udGFpbnMpIHtcbiAgICAgIGlmIChzdWJzZXQubGVuZ3RoICE9PSBzdXBlcnNldC5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICAgIHN1cGVyc2V0ID0gc3VwZXJzZXQuc2xpY2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3Vic2V0LmV2ZXJ5KGZ1bmN0aW9uKGVsZW0sIGlkeCkge1xuICAgICAgaWYgKG9yZGVyZWQpIHJldHVybiBjbXAgPyBjbXAoZWxlbSwgc3VwZXJzZXRbaWR4XSkgOiBlbGVtID09PSBzdXBlcnNldFtpZHhdO1xuXG4gICAgICBpZiAoIWNtcCkge1xuICAgICAgICB2YXIgbWF0Y2hJZHggPSBzdXBlcnNldC5pbmRleE9mKGVsZW0pO1xuICAgICAgICBpZiAobWF0Y2hJZHggPT09IC0xKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gUmVtb3ZlIG1hdGNoIGZyb20gc3VwZXJzZXQgc28gbm90IGNvdW50ZWQgdHdpY2UgaWYgZHVwbGljYXRlIGluIHN1YnNldC5cbiAgICAgICAgaWYgKCFjb250YWlucykgc3VwZXJzZXQuc3BsaWNlKG1hdGNoSWR4LCAxKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdXBlcnNldC5zb21lKGZ1bmN0aW9uKGVsZW0yLCBtYXRjaElkeCkge1xuICAgICAgICBpZiAoIWNtcChlbGVtLCBlbGVtMikpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBSZW1vdmUgbWF0Y2ggZnJvbSBzdXBlcnNldCBzbyBub3QgY291bnRlZCB0d2ljZSBpZiBkdXBsaWNhdGUgaW4gc3Vic2V0LlxuICAgICAgICBpZiAoIWNvbnRhaW5zKSBzdXBlcnNldC5zcGxpY2UobWF0Y2hJZHgsIDEpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubWVtYmVycyhzZXRbLCBtc2ddKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBhcnJheSBoYXMgdGhlIHNhbWUgbWVtYmVycyBhcyB0aGUgZ2l2ZW4gYXJyYXlcbiAgICogYHNldGAuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLm1lbWJlcnMoWzIsIDEsIDNdKTtcbiAgICogICAgIGV4cGVjdChbMSwgMiwgMl0pLnRvLmhhdmUubWVtYmVycyhbMiwgMSwgMl0pO1xuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBtZW1iZXJzIGFyZSBjb21wYXJlZCB1c2luZyBzdHJpY3QgKGA9PT1gKSBlcXVhbGl0eS4gQWRkIGAuZGVlcGBcbiAgICogZWFybGllciBpbiB0aGUgY2hhaW4gdG8gdXNlIGRlZXAgZXF1YWxpdHkgaW5zdGVhZC4gU2VlIHRoZSBgZGVlcC1lcWxgXG4gICAqIHByb2plY3QgcGFnZSBmb3IgaW5mbyBvbiB0aGUgZGVlcCBlcXVhbGl0eSBhbGdvcml0aG06XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFpanMvZGVlcC1lcWwuXG4gICAqXG4gICAqICAgICAvLyBUYXJnZXQgYXJyYXkgZGVlcGx5IChidXQgbm90IHN0cmljdGx5KSBoYXMgbWVtYmVyIGB7YTogMX1gXG4gICAqICAgICBleHBlY3QoW3thOiAxfV0pLnRvLmhhdmUuZGVlcC5tZW1iZXJzKFt7YTogMX1dKTtcbiAgICogICAgIGV4cGVjdChbe2E6IDF9XSkudG8ubm90LmhhdmUubWVtYmVycyhbe2E6IDF9XSk7XG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIG9yZGVyIGRvZXNuJ3QgbWF0dGVyLiBBZGQgYC5vcmRlcmVkYCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0b1xuICAgKiByZXF1aXJlIHRoYXQgbWVtYmVycyBhcHBlYXIgaW4gdGhlIHNhbWUgb3JkZXIuXG4gICAqXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5oYXZlLm9yZGVyZWQubWVtYmVycyhbMSwgMiwgM10pO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaGF2ZS5tZW1iZXJzKFsyLCAxLCAzXSlcbiAgICogICAgICAgLmJ1dC5ub3Qub3JkZXJlZC5tZW1iZXJzKFsyLCAxLCAzXSk7XG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIGJvdGggYXJyYXlzIG11c3QgYmUgdGhlIHNhbWUgc2l6ZS4gQWRkIGAuaW5jbHVkZWAgZWFybGllciBpblxuICAgKiB0aGUgY2hhaW4gdG8gcmVxdWlyZSB0aGF0IHRoZSB0YXJnZXQncyBtZW1iZXJzIGJlIGEgc3VwZXJzZXQgb2YgdGhlXG4gICAqIGV4cGVjdGVkIG1lbWJlcnMuIE5vdGUgdGhhdCBkdXBsaWNhdGVzIGFyZSBpZ25vcmVkIGluIHRoZSBzdWJzZXQgd2hlblxuICAgKiBgLmluY2x1ZGVgIGlzIGFkZGVkLlxuICAgKlxuICAgKiAgICAgLy8gVGFyZ2V0IGFycmF5IGlzIGEgc3VwZXJzZXQgb2YgWzEsIDJdIGJ1dCBub3QgaWRlbnRpY2FsXG4gICAqICAgICBleHBlY3QoWzEsIDIsIDNdKS50by5pbmNsdWRlLm1lbWJlcnMoWzEsIDJdKTtcbiAgICogICAgIGV4cGVjdChbMSwgMiwgM10pLnRvLm5vdC5oYXZlLm1lbWJlcnMoWzEsIDJdKTtcbiAgICpcbiAgICogICAgIC8vIER1cGxpY2F0ZXMgaW4gdGhlIHN1YnNldCBhcmUgaWdub3JlZFxuICAgKiAgICAgZXhwZWN0KFsxLCAyLCAzXSkudG8uaW5jbHVkZS5tZW1iZXJzKFsxLCAyLCAyLCAyXSk7XG4gICAqXG4gICAqIGAuZGVlcGAsIGAub3JkZXJlZGAsIGFuZCBgLmluY2x1ZGVgIGNhbiBhbGwgYmUgY29tYmluZWQuIEhvd2V2ZXIsIGlmXG4gICAqIGAuaW5jbHVkZWAgYW5kIGAub3JkZXJlZGAgYXJlIGNvbWJpbmVkLCB0aGUgb3JkZXJpbmcgYmVnaW5zIGF0IHRoZSBzdGFydCBvZlxuICAgKiBib3RoIGFycmF5cy5cbiAgICpcbiAgICogICAgIGV4cGVjdChbe2E6IDF9LCB7YjogMn0sIHtjOiAzfV0pXG4gICAqICAgICAgIC50by5pbmNsdWRlLmRlZXAub3JkZXJlZC5tZW1iZXJzKFt7YTogMX0sIHtiOiAyfV0pXG4gICAqICAgICAgIC5idXQubm90LmluY2x1ZGUuZGVlcC5vcmRlcmVkLm1lbWJlcnMoW3tiOiAyfSwge2M6IDN9XSk7XG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAubWVtYmVyc2AuIEhvd2V2ZXIsIGl0J3NcbiAgICogZGFuZ2Vyb3VzIHRvIGRvIHNvLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGl0IGNyZWF0ZXMgdW5jZXJ0YWluIGV4cGVjdGF0aW9uc1xuICAgKiBieSBhc3NlcnRpbmcgdGhhdCB0aGUgdGFyZ2V0IGFycmF5IGRvZXNuJ3QgaGF2ZSBhbGwgb2YgdGhlIHNhbWUgbWVtYmVycyBhc1xuICAgKiB0aGUgZ2l2ZW4gYXJyYXkgYHNldGAgYnV0IG1heSBvciBtYXkgbm90IGhhdmUgc29tZSBvZiB0aGVtLiBJdCdzIG9mdGVuIGJlc3RcbiAgICogdG8gaWRlbnRpZnkgdGhlIGV4YWN0IG91dHB1dCB0aGF0J3MgZXhwZWN0ZWQsIGFuZCB0aGVuIHdyaXRlIGFuIGFzc2VydGlvblxuICAgKiB0aGF0IG9ubHkgYWNjZXB0cyB0aGF0IGV4YWN0IG91dHB1dC5cbiAgICpcbiAgICogICAgIGV4cGVjdChbMSwgMl0pLnRvLm5vdC5pbmNsdWRlKDMpLmFuZC5ub3QuaW5jbHVkZSg0KTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChbMSwgMl0pLnRvLm5vdC5oYXZlLm1lbWJlcnMoWzMsIDRdKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAubWVtYmVyc2AgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KFsxLCAyXSkudG8uaGF2ZS5tZW1iZXJzKFsxLCAyLCAzXSwgJ25vb28gd2h5IGZhaWw/PycpO1xuICAgKiAgICAgZXhwZWN0KFsxLCAyXSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmhhdmUubWVtYmVycyhbMSwgMiwgM10pO1xuICAgKlxuICAgKiBAbmFtZSBtZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnbWVtYmVycycsIGZ1bmN0aW9uIChzdWJzZXQsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBvYmogPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJyk7XG5cbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uYmUuYW4oJ2FycmF5Jyk7XG4gICAgbmV3IEFzc2VydGlvbihzdWJzZXQsIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmJlLmFuKCdhcnJheScpO1xuXG4gICAgdmFyIGNvbnRhaW5zID0gZmxhZyh0aGlzLCAnY29udGFpbnMnKTtcbiAgICB2YXIgb3JkZXJlZCA9IGZsYWcodGhpcywgJ29yZGVyZWQnKTtcblxuICAgIHZhciBzdWJqZWN0LCBmYWlsTXNnLCBmYWlsTmVnYXRlTXNnLCBsZW5ndGhDaGVjaztcblxuICAgIGlmIChjb250YWlucykge1xuICAgICAgc3ViamVjdCA9IG9yZGVyZWQgPyAnYW4gb3JkZXJlZCBzdXBlcnNldCcgOiAnYSBzdXBlcnNldCc7XG4gICAgICBmYWlsTXNnID0gJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgJyArIHN1YmplY3QgKyAnIG9mICN7ZXhwfSc7XG4gICAgICBmYWlsTmVnYXRlTXNnID0gJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlICcgKyBzdWJqZWN0ICsgJyBvZiAje2V4cH0nO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdWJqZWN0ID0gb3JkZXJlZCA/ICdvcmRlcmVkIG1lbWJlcnMnIDogJ21lbWJlcnMnO1xuICAgICAgZmFpbE1zZyA9ICdleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgdGhlIHNhbWUgJyArIHN1YmplY3QgKyAnIGFzICN7ZXhwfSc7XG4gICAgICBmYWlsTmVnYXRlTXNnID0gJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGhhdmUgdGhlIHNhbWUgJyArIHN1YmplY3QgKyAnIGFzICN7ZXhwfSc7XG4gICAgfVxuXG4gICAgdmFyIGNtcCA9IGZsYWcodGhpcywgJ2RlZXAnKSA/IF8uZXFsIDogdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIGlzU3Vic2V0T2Yoc3Vic2V0LCBvYmosIGNtcCwgY29udGFpbnMsIG9yZGVyZWQpXG4gICAgICAsIGZhaWxNc2dcbiAgICAgICwgZmFpbE5lZ2F0ZU1zZ1xuICAgICAgLCBzdWJzZXRcbiAgICAgICwgb2JqXG4gICAgICAsIHRydWVcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5vbmVPZihsaXN0WywgbXNnXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgYSBtZW1iZXIgb2YgdGhlIGdpdmVuIGFycmF5IGBsaXN0YC4gSG93ZXZlcixcbiAgICogaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydCB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgdG8gaXRzIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmVxdWFsKDEpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLm9uZU9mKFsxLCAyLCAzXSk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBDb21wYXJpc29ucyBhcmUgcGVyZm9ybWVkIHVzaW5nIHN0cmljdCAoYD09PWApIGVxdWFsaXR5LlxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLm9uZU9mYC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5lcXVhbCgxKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuYmUub25lT2YoWzIsIDMsIDRdKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAub25lT2ZgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICAgKiB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXMgdGhlXG4gICAqIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxKS50by5iZS5vbmVPZihbMiwgMywgNF0sICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdCgxLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUub25lT2YoWzIsIDMsIDRdKTtcbiAgICpcbiAgICogQG5hbWUgb25lT2ZcbiAgICogQHBhcmFtIHtBcnJheTwqPn0gbGlzdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gb25lT2YgKGxpc3QsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBleHBlY3RlZCA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKTtcbiAgICBuZXcgQXNzZXJ0aW9uKGxpc3QsIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmJlLmFuKCdhcnJheScpO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIGxpc3QuaW5kZXhPZihleHBlY3RlZCkgPiAtMVxuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBvbmUgb2YgI3tleHB9J1xuICAgICAgLCAnZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgb25lIG9mICN7ZXhwfSdcbiAgICAgICwgbGlzdFxuICAgICAgLCBleHBlY3RlZFxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdvbmVPZicsIG9uZU9mKTtcblxuXG4gIC8qKlxuICAgKiAjIyMgLmNoYW5nZShzdWJqZWN0WywgcHJvcFssIG1zZ11dKVxuICAgKlxuICAgKiBXaGVuIG9uZSBhcmd1bWVudCBpcyBwcm92aWRlZCwgYC5jaGFuZ2VgIGFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gZnVuY3Rpb25cbiAgICogYHN1YmplY3RgIHJldHVybnMgYSBkaWZmZXJlbnQgdmFsdWUgd2hlbiBpdCdzIGludm9rZWQgYmVmb3JlIHRoZSB0YXJnZXRcbiAgICogZnVuY3Rpb24gY29tcGFyZWQgdG8gd2hlbiBpdCdzIGludm9rZWQgYWZ0ZXJ3YXJkLiBIb3dldmVyLCBpdCdzIG9mdGVuIGJlc3RcbiAgICogdG8gYXNzZXJ0IHRoYXQgYHN1YmplY3RgIGlzIGVxdWFsIHRvIGl0cyBleHBlY3RlZCB2YWx1ZS5cbiAgICpcbiAgICogICAgIHZhciBkb3RzID0gJydcbiAgICogICAgICAgLCBhZGREb3QgPSBmdW5jdGlvbiAoKSB7IGRvdHMgKz0gJy4nOyB9XG4gICAqICAgICAgICwgZ2V0RG90cyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvdHM7IH07XG4gICAqXG4gICAqICAgICAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGdldERvdHMoKSkudG8uZXF1YWwoJycpO1xuICAgKiAgICAgYWRkRG90KCk7XG4gICAqICAgICBleHBlY3QoZ2V0RG90cygpKS50by5lcXVhbCgnLicpO1xuICAgKlxuICAgKiAgICAgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoYWRkRG90KS50by5jaGFuZ2UoZ2V0RG90cyk7XG4gICAqXG4gICAqIFdoZW4gdHdvIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIGAuY2hhbmdlYCBhc3NlcnRzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZVxuICAgKiBnaXZlbiBvYmplY3QgYHN1YmplY3RgJ3MgYHByb3BgIHByb3BlcnR5IGlzIGRpZmZlcmVudCBiZWZvcmUgaW52b2tpbmcgdGhlXG4gICAqIHRhcmdldCBmdW5jdGlvbiBjb21wYXJlZCB0byBhZnRlcndhcmQuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7ZG90czogJyd9XG4gICAqICAgICAgICwgYWRkRG90ID0gZnVuY3Rpb24gKCkgeyBteU9iai5kb3RzICs9ICcuJzsgfTtcbiAgICpcbiAgICogICAgIC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QobXlPYmopLnRvLmhhdmUucHJvcGVydHkoJ2RvdHMnLCAnJyk7XG4gICAqICAgICBhZGREb3QoKTtcbiAgICogICAgIGV4cGVjdChteU9iaikudG8uaGF2ZS5wcm9wZXJ0eSgnZG90cycsICcuJyk7XG4gICAqXG4gICAqICAgICAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChhZGREb3QpLnRvLmNoYW5nZShteU9iaiwgJ2RvdHMnKTtcbiAgICpcbiAgICogU3RyaWN0IChgPT09YCkgZXF1YWxpdHkgaXMgdXNlZCB0byBjb21wYXJlIGJlZm9yZSBhbmQgYWZ0ZXIgdmFsdWVzLlxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmNoYW5nZWAuXG4gICAqXG4gICAqICAgICB2YXIgZG90cyA9ICcnXG4gICAqICAgICAgICwgbm9vcCA9IGZ1bmN0aW9uICgpIHt9XG4gICAqICAgICAgICwgZ2V0RG90cyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvdHM7IH07XG4gICAqXG4gICAqICAgICBleHBlY3Qobm9vcCkudG8ubm90LmNoYW5nZShnZXREb3RzKTtcbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHtkb3RzOiAnJ31cbiAgICogICAgICAgLCBub29wID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3Qobm9vcCkudG8ubm90LmNoYW5nZShteU9iaiwgJ2RvdHMnKTtcbiAgICpcbiAgICogYC5jaGFuZ2VgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC4gV2hlbiBub3QgcHJvdmlkaW5nIHR3byBhcmd1bWVudHMsIGFsd2F5c1xuICAgKiB1c2UgdGhlIHNlY29uZCBmb3JtLlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge2RvdHM6ICcnfVxuICAgKiAgICAgICAsIGFkZERvdCA9IGZ1bmN0aW9uICgpIHsgbXlPYmouZG90cyArPSAnLic7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkRG90KS50by5ub3QuY2hhbmdlKG15T2JqLCAnZG90cycsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICpcbiAgICogICAgIHZhciBkb3RzID0gJydcbiAgICogICAgICAgLCBhZGREb3QgPSBmdW5jdGlvbiAoKSB7IGRvdHMgKz0gJy4nOyB9XG4gICAqICAgICAgICwgZ2V0RG90cyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRvdHM7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkRG90LCAnbm9vbyB3aHkgZmFpbD8/JykudG8ubm90LmNoYW5nZShnZXREb3RzKTtcbiAgICpcbiAgICogYC5jaGFuZ2VgIGFsc28gY2F1c2VzIGFsbCBgLmJ5YCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0b1xuICAgKiBhc3NlcnQgaG93IG11Y2ggYSBudW1lcmljIHN1YmplY3Qgd2FzIGluY3JlYXNlZCBvciBkZWNyZWFzZWQgYnkuIEhvd2V2ZXIsXG4gICAqIGl0J3MgZGFuZ2Vyb3VzIHRvIHVzZSBgLmNoYW5nZS5ieWAuIFRoZSBwcm9ibGVtIGlzIHRoYXQgaXQgY3JlYXRlc1xuICAgKiB1bmNlcnRhaW4gZXhwZWN0YXRpb25zIGJ5IGFzc2VydGluZyB0aGF0IHRoZSBzdWJqZWN0IGVpdGhlciBpbmNyZWFzZXMgYnlcbiAgICogdGhlIGdpdmVuIGRlbHRhLCBvciB0aGF0IGl0IGRlY3JlYXNlcyBieSB0aGUgZ2l2ZW4gZGVsdGEuIEl0J3Mgb2Z0ZW4gYmVzdFxuICAgKiB0byBpZGVudGlmeSB0aGUgZXhhY3Qgb3V0cHV0IHRoYXQncyBleHBlY3RlZCwgYW5kIHRoZW4gd3JpdGUgYW4gYXNzZXJ0aW9uXG4gICAqIHRoYXQgb25seSBhY2NlcHRzIHRoYXQgZXhhY3Qgb3V0cHV0LlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBhZGRUd28gPSBmdW5jdGlvbiAoKSB7IG15T2JqLnZhbCArPSAyOyB9XG4gICAqICAgICAgICwgc3VidHJhY3RUd28gPSBmdW5jdGlvbiAoKSB7IG15T2JqLnZhbCAtPSAyOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uaW5jcmVhc2UobXlPYmosICd2YWwnKS5ieSgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChhZGRUd28pLnRvLmNoYW5nZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdChzdWJ0cmFjdFR3bykudG8uZGVjcmVhc2UobXlPYmosICd2YWwnKS5ieSgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChzdWJ0cmFjdFR3bykudG8uY2hhbmdlKG15T2JqLCAndmFsJykuYnkoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5jaGFuZ2VzYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLmNoYW5nZWAuXG4gICAqXG4gICAqIEBuYW1lIGNoYW5nZVxuICAgKiBAYWxpYXMgY2hhbmdlc1xuICAgKiBAcGFyYW0ge1N0cmluZ30gc3ViamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcCBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydENoYW5nZXMgKHN1YmplY3QsIHByb3AsIG1zZykge1xuICAgIGlmIChtc2cpIGZsYWcodGhpcywgJ21lc3NhZ2UnLCBtc2cpO1xuICAgIHZhciBmbiA9IGZsYWcodGhpcywgJ29iamVjdCcpXG4gICAgICAsIGZsYWdNc2cgPSBmbGFnKHRoaXMsICdtZXNzYWdlJylcbiAgICAgICwgc3NmaSA9IGZsYWcodGhpcywgJ3NzZmknKTtcbiAgICBuZXcgQXNzZXJ0aW9uKGZuLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKCdmdW5jdGlvbicpO1xuXG4gICAgdmFyIGluaXRpYWw7XG4gICAgaWYgKCFwcm9wKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKHN1YmplY3QsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ2Z1bmN0aW9uJyk7XG4gICAgICBpbml0aWFsID0gc3ViamVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKHN1YmplY3QsIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmhhdmUucHJvcGVydHkocHJvcCk7XG4gICAgICBpbml0aWFsID0gc3ViamVjdFtwcm9wXTtcbiAgICB9XG5cbiAgICBmbigpO1xuXG4gICAgdmFyIGZpbmFsID0gcHJvcCA9PT0gdW5kZWZpbmVkIHx8IHByb3AgPT09IG51bGwgPyBzdWJqZWN0KCkgOiBzdWJqZWN0W3Byb3BdO1xuICAgIHZhciBtc2dPYmogPSBwcm9wID09PSB1bmRlZmluZWQgfHwgcHJvcCA9PT0gbnVsbCA/IGluaXRpYWwgOiAnLicgKyBwcm9wO1xuXG4gICAgLy8gVGhpcyBnZXRzIGZsYWdnZWQgYmVjYXVzZSBvZiB0aGUgLmJ5KGRlbHRhKSBhc3NlcnRpb25cbiAgICBmbGFnKHRoaXMsICdkZWx0YU1zZ09iaicsIG1zZ09iaik7XG4gICAgZmxhZyh0aGlzLCAnaW5pdGlhbERlbHRhVmFsdWUnLCBpbml0aWFsKTtcbiAgICBmbGFnKHRoaXMsICdmaW5hbERlbHRhVmFsdWUnLCBmaW5hbCk7XG4gICAgZmxhZyh0aGlzLCAnZGVsdGFCZWhhdmlvcicsICdjaGFuZ2UnKTtcbiAgICBmbGFnKHRoaXMsICdyZWFsRGVsdGEnLCBmaW5hbCAhPT0gaW5pdGlhbCk7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGluaXRpYWwgIT09IGZpbmFsXG4gICAgICAsICdleHBlY3RlZCAnICsgbXNnT2JqICsgJyB0byBjaGFuZ2UnXG4gICAgICAsICdleHBlY3RlZCAnICsgbXNnT2JqICsgJyB0byBub3QgY2hhbmdlJ1xuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdjaGFuZ2UnLCBhc3NlcnRDaGFuZ2VzKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnY2hhbmdlcycsIGFzc2VydENoYW5nZXMpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmluY3JlYXNlKHN1YmplY3RbLCBwcm9wWywgbXNnXV0pXG4gICAqXG4gICAqIFdoZW4gb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBgLmluY3JlYXNlYCBhc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGZ1bmN0aW9uXG4gICAqIGBzdWJqZWN0YCByZXR1cm5zIGEgZ3JlYXRlciBudW1iZXIgd2hlbiBpdCdzIGludm9rZWQgYWZ0ZXIgaW52b2tpbmcgdGhlXG4gICAqIHRhcmdldCBmdW5jdGlvbiBjb21wYXJlZCB0byB3aGVuIGl0J3MgaW52b2tlZCBiZWZvcmVoYW5kLiBgLmluY3JlYXNlYCBhbHNvXG4gICAqIGNhdXNlcyBhbGwgYC5ieWAgYXNzZXJ0aW9ucyB0aGF0IGZvbGxvdyBpbiB0aGUgY2hhaW4gdG8gYXNzZXJ0IGhvdyBtdWNoXG4gICAqIGdyZWF0ZXIgb2YgYSBudW1iZXIgaXMgcmV0dXJuZWQuIEl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnQgdGhhdCB0aGUgcmV0dXJuXG4gICAqIHZhbHVlIGluY3JlYXNlZCBieSB0aGUgZXhwZWN0ZWQgYW1vdW50LCByYXRoZXIgdGhhbiBhc3NlcnRpbmcgaXQgaW5jcmVhc2VkXG4gICAqIGJ5IGFueSBhbW91bnQuXG4gICAqXG4gICAqICAgICB2YXIgdmFsID0gMVxuICAgKiAgICAgICAsIGFkZFR3byA9IGZ1bmN0aW9uICgpIHsgdmFsICs9IDI7IH1cbiAgICogICAgICAgLCBnZXRWYWwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB2YWw7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShnZXRWYWwpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uaW5jcmVhc2UoZ2V0VmFsKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIFdoZW4gdHdvIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQsIGAuaW5jcmVhc2VgIGFzc2VydHMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlXG4gICAqIGdpdmVuIG9iamVjdCBgc3ViamVjdGAncyBgcHJvcGAgcHJvcGVydHkgaXMgZ3JlYXRlciBhZnRlciBpbnZva2luZyB0aGVcbiAgICogdGFyZ2V0IGZ1bmN0aW9uIGNvbXBhcmVkIHRvIGJlZm9yZWhhbmQuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIGFkZFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsICs9IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uaW5jcmVhc2UobXlPYmosICd2YWwnKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIEFkZCBgLm5vdGAgZWFybGllciBpbiB0aGUgY2hhaW4gdG8gbmVnYXRlIGAuaW5jcmVhc2VgLiBIb3dldmVyLCBpdCdzXG4gICAqIGRhbmdlcm91cyB0byBkbyBzby4gVGhlIHByb2JsZW0gaXMgdGhhdCBpdCBjcmVhdGVzIHVuY2VydGFpbiBleHBlY3RhdGlvbnNcbiAgICogYnkgYXNzZXJ0aW5nIHRoYXQgdGhlIHN1YmplY3QgZWl0aGVyIGRlY3JlYXNlcywgb3IgdGhhdCBpdCBzdGF5cyB0aGUgc2FtZS5cbiAgICogSXQncyBvZnRlbiBiZXN0IHRvIGlkZW50aWZ5IHRoZSBleGFjdCBvdXRwdXQgdGhhdCdzIGV4cGVjdGVkLCBhbmQgdGhlblxuICAgKiB3cml0ZSBhbiBhc3NlcnRpb24gdGhhdCBvbmx5IGFjY2VwdHMgdGhhdCBleGFjdCBvdXRwdXQuXG4gICAqXG4gICAqIFdoZW4gdGhlIHN1YmplY3QgaXMgZXhwZWN0ZWQgdG8gZGVjcmVhc2UsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnQgdGhhdCBpdFxuICAgKiBkZWNyZWFzZWQgYnkgdGhlIGV4cGVjdGVkIGFtb3VudC5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHt2YWw6IDF9XG4gICAqICAgICAgICwgc3VidHJhY3RUd28gPSBmdW5jdGlvbiAoKSB7IG15T2JqLnZhbCAtPSAyOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KHN1YnRyYWN0VHdvKS50by5kZWNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KHN1YnRyYWN0VHdvKS50by5ub3QuaW5jcmVhc2UobXlPYmosICd2YWwnKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqIFxuICAgKiBXaGVuIHRoZSBzdWJqZWN0IGlzIGV4cGVjdGVkIHRvIHN0YXkgdGhlIHNhbWUsIGl0J3Mgb2Z0ZW4gYmVzdCB0byBhc3NlcnRcbiAgICogZXhhY3RseSB0aGF0LlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBub29wID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3Qobm9vcCkudG8ubm90LmNoYW5nZShteU9iaiwgJ3ZhbCcpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KG5vb3ApLnRvLm5vdC5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogYC5pbmNyZWFzZWAgYWNjZXB0cyBhbiBvcHRpb25hbCBgbXNnYCBhcmd1bWVudCB3aGljaCBpcyBhIGN1c3RvbSBlcnJvclxuICAgKiBtZXNzYWdlIHRvIHNob3cgd2hlbiB0aGUgYXNzZXJ0aW9uIGZhaWxzLiBUaGUgbWVzc2FnZSBjYW4gYWxzbyBiZSBnaXZlbiBhc1xuICAgKiB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLiBXaGVuIG5vdCBwcm92aWRpbmcgdHdvIGFyZ3VtZW50cywgYWx3YXlzXG4gICAqIHVzZSB0aGUgc2Vjb25kIGZvcm0uXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIG5vb3AgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICpcbiAgICogICAgIGV4cGVjdChub29wKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICpcbiAgICogICAgIHZhciB2YWwgPSAxXG4gICAqICAgICAgICwgbm9vcCA9IGZ1bmN0aW9uICgpIHt9XG4gICAqICAgICAgICwgZ2V0VmFsID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KG5vb3AsICdub29vIHdoeSBmYWlsPz8nKS50by5pbmNyZWFzZShnZXRWYWwpO1xuICAgKlxuICAgKiBUaGUgYWxpYXMgYC5pbmNyZWFzZXNgIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB3aXRoIGAuaW5jcmVhc2VgLlxuICAgKlxuICAgKiBAbmFtZSBpbmNyZWFzZVxuICAgKiBAYWxpYXMgaW5jcmVhc2VzXG4gICAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzdWJqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wIG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbXNnIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgZnVuY3Rpb24gYXNzZXJ0SW5jcmVhc2VzIChzdWJqZWN0LCBwcm9wLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcbiAgICB2YXIgZm4gPSBmbGFnKHRoaXMsICdvYmplY3QnKVxuICAgICAgLCBmbGFnTXNnID0gZmxhZyh0aGlzLCAnbWVzc2FnZScpXG4gICAgICAsIHNzZmkgPSBmbGFnKHRoaXMsICdzc2ZpJyk7XG4gICAgbmV3IEFzc2VydGlvbihmbiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnZnVuY3Rpb24nKTtcblxuICAgIHZhciBpbml0aWFsO1xuICAgIGlmICghcHJvcCkge1xuICAgICAgbmV3IEFzc2VydGlvbihzdWJqZWN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKCdmdW5jdGlvbicpO1xuICAgICAgaW5pdGlhbCA9IHN1YmplY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3IEFzc2VydGlvbihzdWJqZWN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KHByb3ApO1xuICAgICAgaW5pdGlhbCA9IHN1YmplY3RbcHJvcF07XG4gICAgfVxuXG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRhcmdldCBpcyBhIG51bWJlclxuICAgIG5ldyBBc3NlcnRpb24oaW5pdGlhbCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnbnVtYmVyJyk7XG5cbiAgICBmbigpO1xuXG4gICAgdmFyIGZpbmFsID0gcHJvcCA9PT0gdW5kZWZpbmVkIHx8IHByb3AgPT09IG51bGwgPyBzdWJqZWN0KCkgOiBzdWJqZWN0W3Byb3BdO1xuICAgIHZhciBtc2dPYmogPSBwcm9wID09PSB1bmRlZmluZWQgfHwgcHJvcCA9PT0gbnVsbCA/IGluaXRpYWwgOiAnLicgKyBwcm9wO1xuXG4gICAgZmxhZyh0aGlzLCAnZGVsdGFNc2dPYmonLCBtc2dPYmopO1xuICAgIGZsYWcodGhpcywgJ2luaXRpYWxEZWx0YVZhbHVlJywgaW5pdGlhbCk7XG4gICAgZmxhZyh0aGlzLCAnZmluYWxEZWx0YVZhbHVlJywgZmluYWwpO1xuICAgIGZsYWcodGhpcywgJ2RlbHRhQmVoYXZpb3InLCAnaW5jcmVhc2UnKTtcbiAgICBmbGFnKHRoaXMsICdyZWFsRGVsdGEnLCBmaW5hbCAtIGluaXRpYWwpO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBmaW5hbCAtIGluaXRpYWwgPiAwXG4gICAgICAsICdleHBlY3RlZCAnICsgbXNnT2JqICsgJyB0byBpbmNyZWFzZSdcbiAgICAgICwgJ2V4cGVjdGVkICcgKyBtc2dPYmogKyAnIHRvIG5vdCBpbmNyZWFzZSdcbiAgICApO1xuICB9XG5cbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnaW5jcmVhc2UnLCBhc3NlcnRJbmNyZWFzZXMpO1xuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdpbmNyZWFzZXMnLCBhc3NlcnRJbmNyZWFzZXMpO1xuXG4gIC8qKlxuICAgKiAjIyMgLmRlY3JlYXNlKHN1YmplY3RbLCBwcm9wWywgbXNnXV0pXG4gICAqXG4gICAqIFdoZW4gb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBgLmRlY3JlYXNlYCBhc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGZ1bmN0aW9uXG4gICAqIGBzdWJqZWN0YCByZXR1cm5zIGEgbGVzc2VyIG51bWJlciB3aGVuIGl0J3MgaW52b2tlZCBhZnRlciBpbnZva2luZyB0aGVcbiAgICogdGFyZ2V0IGZ1bmN0aW9uIGNvbXBhcmVkIHRvIHdoZW4gaXQncyBpbnZva2VkIGJlZm9yZWhhbmQuIGAuZGVjcmVhc2VgIGFsc29cbiAgICogY2F1c2VzIGFsbCBgLmJ5YCBhc3NlcnRpb25zIHRoYXQgZm9sbG93IGluIHRoZSBjaGFpbiB0byBhc3NlcnQgaG93IG11Y2hcbiAgICogbGVzc2VyIG9mIGEgbnVtYmVyIGlzIHJldHVybmVkLiBJdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgdGhlIHJldHVyblxuICAgKiB2YWx1ZSBkZWNyZWFzZWQgYnkgdGhlIGV4cGVjdGVkIGFtb3VudCwgcmF0aGVyIHRoYW4gYXNzZXJ0aW5nIGl0IGRlY3JlYXNlZFxuICAgKiBieSBhbnkgYW1vdW50LlxuICAgKlxuICAgKiAgICAgdmFyIHZhbCA9IDFcbiAgICogICAgICAgLCBzdWJ0cmFjdFR3byA9IGZ1bmN0aW9uICgpIHsgdmFsIC09IDI7IH1cbiAgICogICAgICAgLCBnZXRWYWwgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB2YWw7IH07XG4gICAqXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLmRlY3JlYXNlKGdldFZhbCkuYnkoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLmRlY3JlYXNlKGdldFZhbCk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBXaGVuIHR3byBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCBgLmRlY3JlYXNlYCBhc3NlcnRzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZVxuICAgKiBnaXZlbiBvYmplY3QgYHN1YmplY3RgJ3MgYHByb3BgIHByb3BlcnR5IGlzIGxlc3NlciBhZnRlciBpbnZva2luZyB0aGVcbiAgICogdGFyZ2V0IGZ1bmN0aW9uIGNvbXBhcmVkIHRvIGJlZm9yZWhhbmQuIFxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBzdWJ0cmFjdFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsIC09IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLmRlY3JlYXNlKG15T2JqLCAndmFsJykuYnkoMik7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLmRlY3JlYXNlKG15T2JqLCAndmFsJyk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmRlY3JlYXNlYC4gSG93ZXZlciwgaXQnc1xuICAgKiBkYW5nZXJvdXMgdG8gZG8gc28uIFRoZSBwcm9ibGVtIGlzIHRoYXQgaXQgY3JlYXRlcyB1bmNlcnRhaW4gZXhwZWN0YXRpb25zXG4gICAqIGJ5IGFzc2VydGluZyB0aGF0IHRoZSBzdWJqZWN0IGVpdGhlciBpbmNyZWFzZXMsIG9yIHRoYXQgaXQgc3RheXMgdGhlIHNhbWUuXG4gICAqIEl0J3Mgb2Z0ZW4gYmVzdCB0byBpZGVudGlmeSB0aGUgZXhhY3Qgb3V0cHV0IHRoYXQncyBleHBlY3RlZCwgYW5kIHRoZW5cbiAgICogd3JpdGUgYW4gYXNzZXJ0aW9uIHRoYXQgb25seSBhY2NlcHRzIHRoYXQgZXhhY3Qgb3V0cHV0LlxuICAgKlxuICAgKiBXaGVuIHRoZSBzdWJqZWN0IGlzIGV4cGVjdGVkIHRvIGluY3JlYXNlLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IHRoYXQgaXRcbiAgICogaW5jcmVhc2VkIGJ5IHRoZSBleHBlY3RlZCBhbW91bnQuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIGFkZFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsICs9IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8ubm90LmRlY3JlYXNlKG15T2JqLCAndmFsJyk7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKiBcbiAgICogV2hlbiB0aGUgc3ViamVjdCBpcyBleHBlY3RlZCB0byBzdGF5IHRoZSBzYW1lLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0XG4gICAqIGV4YWN0bHkgdGhhdC5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHt2YWw6IDF9XG4gICAqICAgICAgICwgbm9vcCA9IGZ1bmN0aW9uICgpIHt9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KG5vb3ApLnRvLm5vdC5jaGFuZ2UobXlPYmosICd2YWwnKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChub29wKS50by5ub3QuZGVjcmVhc2UobXlPYmosICd2YWwnKTsgLy8gTm90IHJlY29tbWVuZGVkXG4gICAqXG4gICAqIGAuZGVjcmVhc2VgIGFjY2VwdHMgYW4gb3B0aW9uYWwgYG1zZ2AgYXJndW1lbnQgd2hpY2ggaXMgYSBjdXN0b20gZXJyb3JcbiAgICogbWVzc2FnZSB0byBzaG93IHdoZW4gdGhlIGFzc2VydGlvbiBmYWlscy4gVGhlIG1lc3NhZ2UgY2FuIGFsc28gYmUgZ2l2ZW4gYXNcbiAgICogdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC4gV2hlbiBub3QgcHJvdmlkaW5nIHR3byBhcmd1bWVudHMsIGFsd2F5c1xuICAgKiB1c2UgdGhlIHNlY29uZCBmb3JtLlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBub29wID0gZnVuY3Rpb24gKCkge307XG4gICAqXG4gICAqICAgICBleHBlY3Qobm9vcCkudG8uZGVjcmVhc2UobXlPYmosICd2YWwnLCAnbm9vbyB3aHkgZmFpbD8/Jyk7XG4gICAqXG4gICAqICAgICB2YXIgdmFsID0gMVxuICAgKiAgICAgICAsIG5vb3AgPSBmdW5jdGlvbiAoKSB7fVxuICAgKiAgICAgICAsIGdldFZhbCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbDsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChub29wLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uZGVjcmVhc2UoZ2V0VmFsKTtcbiAgICpcbiAgICogVGhlIGFsaWFzIGAuZGVjcmVhc2VzYCBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgd2l0aCBgLmRlY3JlYXNlYC5cbiAgICpcbiAgICogQG5hbWUgZGVjcmVhc2VcbiAgICogQGFsaWFzIGRlY3JlYXNlc1xuICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc3ViamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcCBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydERlY3JlYXNlcyAoc3ViamVjdCwgcHJvcCwgbXNnKSB7XG4gICAgaWYgKG1zZykgZmxhZyh0aGlzLCAnbWVzc2FnZScsIG1zZyk7XG4gICAgdmFyIGZuID0gZmxhZyh0aGlzLCAnb2JqZWN0JylcbiAgICAgICwgZmxhZ01zZyA9IGZsYWcodGhpcywgJ21lc3NhZ2UnKVxuICAgICAgLCBzc2ZpID0gZmxhZyh0aGlzLCAnc3NmaScpO1xuICAgIG5ldyBBc3NlcnRpb24oZm4sIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ2Z1bmN0aW9uJyk7XG5cbiAgICB2YXIgaW5pdGlhbDtcbiAgICBpZiAoIXByb3ApIHtcbiAgICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYSgnZnVuY3Rpb24nKTtcbiAgICAgIGluaXRpYWwgPSBzdWJqZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbiAgICAgIGluaXRpYWwgPSBzdWJqZWN0W3Byb3BdO1xuICAgIH1cblxuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB0YXJnZXQgaXMgYSBudW1iZXJcbiAgICBuZXcgQXNzZXJ0aW9uKGluaXRpYWwsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoJ251bWJlcicpO1xuXG4gICAgZm4oKTtcblxuICAgIHZhciBmaW5hbCA9IHByb3AgPT09IHVuZGVmaW5lZCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgICB2YXIgbXNnT2JqID0gcHJvcCA9PT0gdW5kZWZpbmVkIHx8IHByb3AgPT09IG51bGwgPyBpbml0aWFsIDogJy4nICsgcHJvcDtcblxuICAgIGZsYWcodGhpcywgJ2RlbHRhTXNnT2JqJywgbXNnT2JqKTtcbiAgICBmbGFnKHRoaXMsICdpbml0aWFsRGVsdGFWYWx1ZScsIGluaXRpYWwpO1xuICAgIGZsYWcodGhpcywgJ2ZpbmFsRGVsdGFWYWx1ZScsIGZpbmFsKTtcbiAgICBmbGFnKHRoaXMsICdkZWx0YUJlaGF2aW9yJywgJ2RlY3JlYXNlJyk7XG4gICAgZmxhZyh0aGlzLCAncmVhbERlbHRhJywgaW5pdGlhbCAtIGZpbmFsKTtcblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgZmluYWwgLSBpbml0aWFsIDwgMFxuICAgICAgLCAnZXhwZWN0ZWQgJyArIG1zZ09iaiArICcgdG8gZGVjcmVhc2UnXG4gICAgICAsICdleHBlY3RlZCAnICsgbXNnT2JqICsgJyB0byBub3QgZGVjcmVhc2UnXG4gICAgKTtcbiAgfVxuXG4gIEFzc2VydGlvbi5hZGRNZXRob2QoJ2RlY3JlYXNlJywgYXNzZXJ0RGVjcmVhc2VzKTtcbiAgQXNzZXJ0aW9uLmFkZE1ldGhvZCgnZGVjcmVhc2VzJywgYXNzZXJ0RGVjcmVhc2VzKTtcblxuICAvKipcbiAgICogIyMjIC5ieShkZWx0YVssIG1zZ10pXG4gICAqXG4gICAqIFdoZW4gZm9sbG93aW5nIGFuIGAuaW5jcmVhc2VgIGFzc2VydGlvbiBpbiB0aGUgY2hhaW4sIGAuYnlgIGFzc2VydHMgdGhhdFxuICAgKiB0aGUgc3ViamVjdCBvZiB0aGUgYC5pbmNyZWFzZWAgYXNzZXJ0aW9uIGluY3JlYXNlZCBieSB0aGUgZ2l2ZW4gYGRlbHRhYC5cbiAgICpcbiAgICogICAgIHZhciBteU9iaiA9IHt2YWw6IDF9XG4gICAqICAgICAgICwgYWRkVHdvID0gZnVuY3Rpb24gKCkgeyBteU9iai52YWwgKz0gMjsgfTtcbiAgICpcbiAgICogICAgIGV4cGVjdChhZGRUd28pLnRvLmluY3JlYXNlKG15T2JqLCAndmFsJykuYnkoMik7XG4gICAqXG4gICAqIFdoZW4gZm9sbG93aW5nIGEgYC5kZWNyZWFzZWAgYXNzZXJ0aW9uIGluIHRoZSBjaGFpbiwgYC5ieWAgYXNzZXJ0cyB0aGF0IHRoZVxuICAgKiBzdWJqZWN0IG9mIHRoZSBgLmRlY3JlYXNlYCBhc3NlcnRpb24gZGVjcmVhc2VkIGJ5IHRoZSBnaXZlbiBgZGVsdGFgLlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBzdWJ0cmFjdFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsIC09IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3Qoc3VidHJhY3RUd28pLnRvLmRlY3JlYXNlKG15T2JqLCAndmFsJykuYnkoMik7XG4gICAqXG4gICAqIFdoZW4gZm9sbG93aW5nIGEgYC5jaGFuZ2VgIGFzc2VydGlvbiBpbiB0aGUgY2hhaW4sIGAuYnlgIGFzc2VydHMgdGhhdCB0aGVcbiAgICogc3ViamVjdCBvZiB0aGUgYC5jaGFuZ2VgIGFzc2VydGlvbiBlaXRoZXIgaW5jcmVhc2VkIG9yIGRlY3JlYXNlZCBieSB0aGVcbiAgICogZ2l2ZW4gYGRlbHRhYC4gSG93ZXZlciwgaXQncyBkYW5nZXJvdXMgdG8gdXNlIGAuY2hhbmdlLmJ5YC4gVGhlIHByb2JsZW0gaXNcbiAgICogdGhhdCBpdCBjcmVhdGVzIHVuY2VydGFpbiBleHBlY3RhdGlvbnMuIEl0J3Mgb2Z0ZW4gYmVzdCB0byBpZGVudGlmeSB0aGVcbiAgICogZXhhY3Qgb3V0cHV0IHRoYXQncyBleHBlY3RlZCwgYW5kIHRoZW4gd3JpdGUgYW4gYXNzZXJ0aW9uIHRoYXQgb25seSBhY2NlcHRzXG4gICAqIHRoYXQgZXhhY3Qgb3V0cHV0LlxuICAgKlxuICAgKiAgICAgdmFyIG15T2JqID0ge3ZhbDogMX1cbiAgICogICAgICAgLCBhZGRUd28gPSBmdW5jdGlvbiAoKSB7IG15T2JqLnZhbCArPSAyOyB9XG4gICAqICAgICAgICwgc3VidHJhY3RUd28gPSBmdW5jdGlvbiAoKSB7IG15T2JqLnZhbCAtPSAyOyB9O1xuICAgKlxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uaW5jcmVhc2UobXlPYmosICd2YWwnKS5ieSgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChhZGRUd28pLnRvLmNoYW5nZShteU9iaiwgJ3ZhbCcpLmJ5KDIpOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogICAgIGV4cGVjdChzdWJ0cmFjdFR3bykudG8uZGVjcmVhc2UobXlPYmosICd2YWwnKS5ieSgyKTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChzdWJ0cmFjdFR3bykudG8uY2hhbmdlKG15T2JqLCAndmFsJykuYnkoMik7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmJ5YC4gSG93ZXZlciwgaXQncyBvZnRlbiBiZXN0XG4gICAqIHRvIGFzc2VydCB0aGF0IHRoZSBzdWJqZWN0IGNoYW5nZWQgYnkgaXRzIGV4cGVjdGVkIGRlbHRhLCByYXRoZXIgdGhhblxuICAgKiBhc3NlcnRpbmcgdGhhdCBpdCBkaWRuJ3QgY2hhbmdlIGJ5IG9uZSBvZiBjb3VudGxlc3MgdW5leHBlY3RlZCBkZWx0YXMuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIGFkZFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsICs9IDI7IH07XG4gICAqXG4gICAqICAgICAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uaW5jcmVhc2UobXlPYmosICd2YWwnKS5ieSgyKTtcbiAgICpcbiAgICogICAgIC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KGFkZFR3bykudG8uaW5jcmVhc2UobXlPYmosICd2YWwnKS5idXQubm90LmJ5KDMpO1xuICAgKlxuICAgKiBgLmJ5YCBhY2NlcHRzIGFuIG9wdGlvbmFsIGBtc2dgIGFyZ3VtZW50IHdoaWNoIGlzIGEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgdG9cbiAgICogc2hvdyB3aGVuIHRoZSBhc3NlcnRpb24gZmFpbHMuIFRoZSBtZXNzYWdlIGNhbiBhbHNvIGJlIGdpdmVuIGFzIHRoZSBzZWNvbmRcbiAgICogYXJndW1lbnQgdG8gYGV4cGVjdGAuXG4gICAqXG4gICAqICAgICB2YXIgbXlPYmogPSB7dmFsOiAxfVxuICAgKiAgICAgICAsIGFkZFR3byA9IGZ1bmN0aW9uICgpIHsgbXlPYmoudmFsICs9IDI7IH07XG4gICAqXG4gICAqICAgICBleHBlY3QoYWRkVHdvKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDMsICdub29vIHdoeSBmYWlsPz8nKTtcbiAgICogICAgIGV4cGVjdChhZGRUd28sICdub29vIHdoeSBmYWlsPz8nKS50by5pbmNyZWFzZShteU9iaiwgJ3ZhbCcpLmJ5KDMpO1xuICAgKlxuICAgKiBAbmFtZSBieVxuICAgKiBAcGFyYW0ge051bWJlcn0gZGVsdGFcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1zZyBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFzc2VydERlbHRhKGRlbHRhLCBtc2cpIHtcbiAgICBpZiAobXNnKSBmbGFnKHRoaXMsICdtZXNzYWdlJywgbXNnKTtcblxuICAgIHZhciBtc2dPYmogPSBmbGFnKHRoaXMsICdkZWx0YU1zZ09iaicpO1xuICAgIHZhciBpbml0aWFsID0gZmxhZyh0aGlzLCAnaW5pdGlhbERlbHRhVmFsdWUnKTtcbiAgICB2YXIgZmluYWwgPSBmbGFnKHRoaXMsICdmaW5hbERlbHRhVmFsdWUnKTtcbiAgICB2YXIgYmVoYXZpb3IgPSBmbGFnKHRoaXMsICdkZWx0YUJlaGF2aW9yJyk7XG4gICAgdmFyIHJlYWxEZWx0YSA9IGZsYWcodGhpcywgJ3JlYWxEZWx0YScpO1xuXG4gICAgdmFyIGV4cHJlc3Npb247XG4gICAgaWYgKGJlaGF2aW9yID09PSAnY2hhbmdlJykge1xuICAgICAgZXhwcmVzc2lvbiA9IE1hdGguYWJzKGZpbmFsIC0gaW5pdGlhbCkgPT09IE1hdGguYWJzKGRlbHRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwcmVzc2lvbiA9IHJlYWxEZWx0YSA9PT0gTWF0aC5hYnMoZGVsdGEpO1xuICAgIH1cblxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgZXhwcmVzc2lvblxuICAgICAgLCAnZXhwZWN0ZWQgJyArIG1zZ09iaiArICcgdG8gJyArIGJlaGF2aW9yICsgJyBieSAnICsgZGVsdGFcbiAgICAgICwgJ2V4cGVjdGVkICcgKyBtc2dPYmogKyAnIHRvIG5vdCAnICsgYmVoYXZpb3IgKyAnIGJ5ICcgKyBkZWx0YVxuICAgICk7XG4gIH1cblxuICBBc3NlcnRpb24uYWRkTWV0aG9kKCdieScsIGFzc2VydERlbHRhKTtcblxuICAvKipcbiAgICogIyMjIC5leHRlbnNpYmxlXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIGV4dGVuc2libGUsIHdoaWNoIG1lYW5zIHRoYXQgbmV3IHByb3BlcnRpZXMgY2FuXG4gICAqIGJlIGFkZGVkIHRvIGl0LiBQcmltaXRpdmVzIGFyZSBuZXZlciBleHRlbnNpYmxlLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSkudG8uYmUuZXh0ZW5zaWJsZTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5leHRlbnNpYmxlYC5cbiAgICpcbiAgICogICAgIHZhciBub25FeHRlbnNpYmxlT2JqZWN0ID0gT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KVxuICAgKiAgICAgICAsIHNlYWxlZE9iamVjdCA9IE9iamVjdC5zZWFsKHt9KVxuICAgKiAgICAgICAsIGZyb3plbk9iamVjdCA9IE9iamVjdC5mcmVlemUoe30pO1xuICAgKlxuICAgKiAgICAgZXhwZWN0KG5vbkV4dGVuc2libGVPYmplY3QpLnRvLm5vdC5iZS5leHRlbnNpYmxlO1xuICAgKiAgICAgZXhwZWN0KHNlYWxlZE9iamVjdCkudG8ubm90LmJlLmV4dGVuc2libGU7XG4gICAqICAgICBleHBlY3QoZnJvemVuT2JqZWN0KS50by5ub3QuYmUuZXh0ZW5zaWJsZTtcbiAgICogICAgIGV4cGVjdCgxKS50by5ub3QuYmUuZXh0ZW5zaWJsZTtcbiAgICpcbiAgICogQSBjdXN0b20gZXJyb3IgbWVzc2FnZSBjYW4gYmUgZ2l2ZW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0byBgZXhwZWN0YC5cbiAgICpcbiAgICogICAgIGV4cGVjdCgxLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuZXh0ZW5zaWJsZTtcbiAgICpcbiAgICogQG5hbWUgZXh0ZW5zaWJsZVxuICAgKiBAbmFtZXNwYWNlIEJERFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoJ2V4dGVuc2libGUnLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG5cbiAgICAvLyBJbiBFUzUsIGlmIHRoZSBhcmd1bWVudCB0byB0aGlzIG1ldGhvZCBpcyBhIHByaW1pdGl2ZSwgdGhlbiBpdCB3aWxsIGNhdXNlIGEgVHlwZUVycm9yLlxuICAgIC8vIEluIEVTNiwgYSBub24tb2JqZWN0IGFyZ3VtZW50IHdpbGwgYmUgdHJlYXRlZCBhcyBpZiBpdCB3YXMgYSBub24tZXh0ZW5zaWJsZSBvcmRpbmFyeSBvYmplY3QsIHNpbXBseSByZXR1cm4gZmFsc2UuXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzRXh0ZW5zaWJsZVxuICAgIC8vIFRoZSBmb2xsb3dpbmcgcHJvdmlkZXMgRVM2IGJlaGF2aW9yIGZvciBFUzUgZW52aXJvbm1lbnRzLlxuXG4gICAgdmFyIGlzRXh0ZW5zaWJsZSA9IG9iaiA9PT0gT2JqZWN0KG9iaikgJiYgT2JqZWN0LmlzRXh0ZW5zaWJsZShvYmopO1xuXG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBpc0V4dGVuc2libGVcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gYmUgZXh0ZW5zaWJsZSdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIGV4dGVuc2libGUnXG4gICAgKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqICMjIyAuc2VhbGVkXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIHNlYWxlZCwgd2hpY2ggbWVhbnMgdGhhdCBuZXcgcHJvcGVydGllcyBjYW4ndCBiZVxuICAgKiBhZGRlZCB0byBpdCwgYW5kIGl0cyBleGlzdGluZyBwcm9wZXJ0aWVzIGNhbid0IGJlIHJlY29uZmlndXJlZCBvciBkZWxldGVkLlxuICAgKiBIb3dldmVyLCBpdCdzIHBvc3NpYmxlIHRoYXQgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMgY2FuIHN0aWxsIGJlIHJlYXNzaWduZWRcbiAgICogdG8gZGlmZmVyZW50IHZhbHVlcy4gUHJpbWl0aXZlcyBhcmUgYWx3YXlzIHNlYWxlZC5cbiAgICpcbiAgICogICAgIHZhciBzZWFsZWRPYmplY3QgPSBPYmplY3Quc2VhbCh7fSk7XG4gICAqICAgICB2YXIgZnJvemVuT2JqZWN0ID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG4gICAqXG4gICAqICAgICBleHBlY3Qoc2VhbGVkT2JqZWN0KS50by5iZS5zZWFsZWQ7XG4gICAqICAgICBleHBlY3QoZnJvemVuT2JqZWN0KS50by5iZS5zZWFsZWQ7XG4gICAqICAgICBleHBlY3QoMSkudG8uYmUuc2VhbGVkO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLnNlYWxlZGAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuYmUuc2VhbGVkO1xuICAgKlxuICAgKiBBIGN1c3RvbSBlcnJvciBtZXNzYWdlIGNhbiBiZSBnaXZlbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLnNlYWxlZDtcbiAgICpcbiAgICogQG5hbWUgc2VhbGVkXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnc2VhbGVkJywgZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpO1xuXG4gICAgLy8gSW4gRVM1LCBpZiB0aGUgYXJndW1lbnQgdG8gdGhpcyBtZXRob2QgaXMgYSBwcmltaXRpdmUsIHRoZW4gaXQgd2lsbCBjYXVzZSBhIFR5cGVFcnJvci5cbiAgICAvLyBJbiBFUzYsIGEgbm9uLW9iamVjdCBhcmd1bWVudCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgaXQgd2FzIGEgc2VhbGVkIG9yZGluYXJ5IG9iamVjdCwgc2ltcGx5IHJldHVybiB0cnVlLlxuICAgIC8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNTZWFsZWRcbiAgICAvLyBUaGUgZm9sbG93aW5nIHByb3ZpZGVzIEVTNiBiZWhhdmlvciBmb3IgRVM1IGVudmlyb25tZW50cy5cblxuICAgIHZhciBpc1NlYWxlZCA9IG9iaiA9PT0gT2JqZWN0KG9iaikgPyBPYmplY3QuaXNTZWFsZWQob2JqKSA6IHRydWU7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGlzU2VhbGVkXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIHNlYWxlZCdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIHNlYWxlZCdcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5mcm96ZW5cbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgZnJvemVuLCB3aGljaCBtZWFucyB0aGF0IG5ldyBwcm9wZXJ0aWVzIGNhbid0IGJlXG4gICAqIGFkZGVkIHRvIGl0LCBhbmQgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMgY2FuJ3QgYmUgcmVhc3NpZ25lZCB0byBkaWZmZXJlbnRcbiAgICogdmFsdWVzLCByZWNvbmZpZ3VyZWQsIG9yIGRlbGV0ZWQuIFByaW1pdGl2ZXMgYXJlIGFsd2F5cyBmcm96ZW4uXG4gICAqXG4gICAqICAgICB2YXIgZnJvemVuT2JqZWN0ID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG4gICAqXG4gICAqICAgICBleHBlY3QoZnJvemVuT2JqZWN0KS50by5iZS5mcm96ZW47XG4gICAqICAgICBleHBlY3QoMSkudG8uYmUuZnJvemVuO1xuICAgKlxuICAgKiBBZGQgYC5ub3RgIGVhcmxpZXIgaW4gdGhlIGNoYWluIHRvIG5lZ2F0ZSBgLmZyb3plbmAuXG4gICAqXG4gICAqICAgICBleHBlY3Qoe2E6IDF9KS50by5ub3QuYmUuZnJvemVuO1xuICAgKlxuICAgKiBBIGN1c3RvbSBlcnJvciBtZXNzYWdlIGNhbiBiZSBnaXZlbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KHthOiAxfSwgJ25vb28gd2h5IGZhaWw/PycpLnRvLmJlLmZyb3plbjtcbiAgICpcbiAgICogQG5hbWUgZnJvemVuXG4gICAqIEBuYW1lc3BhY2UgQkREXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIEFzc2VydGlvbi5hZGRQcm9wZXJ0eSgnZnJvemVuJywgZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9iaiA9IGZsYWcodGhpcywgJ29iamVjdCcpO1xuXG4gICAgLy8gSW4gRVM1LCBpZiB0aGUgYXJndW1lbnQgdG8gdGhpcyBtZXRob2QgaXMgYSBwcmltaXRpdmUsIHRoZW4gaXQgd2lsbCBjYXVzZSBhIFR5cGVFcnJvci5cbiAgICAvLyBJbiBFUzYsIGEgbm9uLW9iamVjdCBhcmd1bWVudCB3aWxsIGJlIHRyZWF0ZWQgYXMgaWYgaXQgd2FzIGEgZnJvemVuIG9yZGluYXJ5IG9iamVjdCwgc2ltcGx5IHJldHVybiB0cnVlLlxuICAgIC8vIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNGcm96ZW5cbiAgICAvLyBUaGUgZm9sbG93aW5nIHByb3ZpZGVzIEVTNiBiZWhhdmlvciBmb3IgRVM1IGVudmlyb25tZW50cy5cblxuICAgIHZhciBpc0Zyb3plbiA9IG9iaiA9PT0gT2JqZWN0KG9iaikgPyBPYmplY3QuaXNGcm96ZW4ob2JqKSA6IHRydWU7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGlzRnJvemVuXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGZyb3plbidcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIGZyb3plbidcbiAgICApO1xuICB9KTtcblxuICAvKipcbiAgICogIyMjIC5maW5pdGVcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgYSBudW1iZXIsIGFuZCBpc24ndCBgTmFOYCBvciBwb3NpdGl2ZS9uZWdhdGl2ZVxuICAgKiBgSW5maW5pdHlgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KDEpLnRvLmJlLmZpbml0ZTtcbiAgICpcbiAgICogQWRkIGAubm90YCBlYXJsaWVyIGluIHRoZSBjaGFpbiB0byBuZWdhdGUgYC5maW5pdGVgLiBIb3dldmVyLCBpdCdzXG4gICAqIGRhbmdlcm91cyB0byBkbyBzby4gVGhlIHByb2JsZW0gaXMgdGhhdCBpdCBjcmVhdGVzIHVuY2VydGFpbiBleHBlY3RhdGlvbnNcbiAgICogYnkgYXNzZXJ0aW5nIHRoYXQgdGhlIHN1YmplY3QgZWl0aGVyIGlzbid0IGEgbnVtYmVyLCBvciB0aGF0IGl0J3MgYE5hTmAsIG9yXG4gICAqIHRoYXQgaXQncyBwb3NpdGl2ZSBgSW5maW5pdHlgLCBvciB0aGF0IGl0J3MgbmVnYXRpdmUgYEluZmluaXR5YC4gSXQncyBvZnRlblxuICAgKiBiZXN0IHRvIGlkZW50aWZ5IHRoZSBleGFjdCBvdXRwdXQgdGhhdCdzIGV4cGVjdGVkLCBhbmQgdGhlbiB3cml0ZSBhblxuICAgKiBhc3NlcnRpb24gdGhhdCBvbmx5IGFjY2VwdHMgdGhhdCBleGFjdCBvdXRwdXQuXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhcmdldCBpc24ndCBleHBlY3RlZCB0byBiZSBhIG51bWJlciwgaXQncyBvZnRlbiBiZXN0IHRvIGFzc2VydFxuICAgKiB0aGF0IGl0J3MgdGhlIGV4cGVjdGVkIHR5cGUsIHJhdGhlciB0aGFuIGFzc2VydGluZyB0aGF0IGl0IGlzbid0IG9uZSBvZlxuICAgKiBtYW55IHVuZXhwZWN0ZWQgdHlwZXMuXG4gICAqXG4gICAqICAgICBleHBlY3QoJ2ZvbycpLnRvLmJlLmEoJ3N0cmluZycpOyAvLyBSZWNvbW1lbmRlZFxuICAgKiAgICAgZXhwZWN0KCdmb28nKS50by5ub3QuYmUuZmluaXRlOyAvLyBOb3QgcmVjb21tZW5kZWRcbiAgICpcbiAgICogV2hlbiB0aGUgdGFyZ2V0IGlzIGV4cGVjdGVkIHRvIGJlIGBOYU5gLCBpdCdzIG9mdGVuIGJlc3QgdG8gYXNzZXJ0IGV4YWN0bHlcbiAgICogdGhhdC5cbiAgICpcbiAgICogICAgIGV4cGVjdChOYU4pLnRvLmJlLk5hTjsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdChOYU4pLnRvLm5vdC5iZS5maW5pdGU7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgZXhwZWN0ZWQgdG8gYmUgcG9zaXRpdmUgaW5maW5pdHksIGl0J3Mgb2Z0ZW4gYmVzdCB0b1xuICAgKiBhc3NlcnQgZXhhY3RseSB0aGF0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KEluZmluaXR5KS50by5lcXVhbChJbmZpbml0eSk7IC8vIFJlY29tbWVuZGVkXG4gICAqICAgICBleHBlY3QoSW5maW5pdHkpLnRvLm5vdC5iZS5maW5pdGU7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBXaGVuIHRoZSB0YXJnZXQgaXMgZXhwZWN0ZWQgdG8gYmUgbmVnYXRpdmUgaW5maW5pdHksIGl0J3Mgb2Z0ZW4gYmVzdCB0b1xuICAgKiBhc3NlcnQgZXhhY3RseSB0aGF0LlxuICAgKlxuICAgKiAgICAgZXhwZWN0KC1JbmZpbml0eSkudG8uZXF1YWwoLUluZmluaXR5KTsgLy8gUmVjb21tZW5kZWRcbiAgICogICAgIGV4cGVjdCgtSW5maW5pdHkpLnRvLm5vdC5iZS5maW5pdGU7IC8vIE5vdCByZWNvbW1lbmRlZFxuICAgKlxuICAgKiBBIGN1c3RvbSBlcnJvciBtZXNzYWdlIGNhbiBiZSBnaXZlbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIGBleHBlY3RgLlxuICAgKlxuICAgKiAgICAgZXhwZWN0KCdmb28nLCAnbm9vbyB3aHkgZmFpbD8/JykudG8uYmUuZmluaXRlO1xuICAgKlxuICAgKiBAbmFtZSBmaW5pdGVcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgQXNzZXJ0aW9uLmFkZFByb3BlcnR5KCdmaW5pdGUnLCBmdW5jdGlvbihtc2cpIHtcbiAgICB2YXIgb2JqID0gZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG5cbiAgICB0aGlzLmFzc2VydChcbiAgICAgICAgdHlwZW9mIG9iaiA9PT0gXCJudW1iZXJcIiAmJiBpc0Zpbml0ZShvYmopXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGJlIGEgZmluaXRlIG51bWJlcidcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIGEgZmluaXRlIG51bWJlcidcbiAgICApO1xuICB9KTtcbn07XG4iLCIvKiFcbiAqIGNoYWlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjaGFpLCB1dGlsKSB7XG4gIGNoYWkuZXhwZWN0ID0gZnVuY3Rpb24gKHZhbCwgbWVzc2FnZSkge1xuICAgIHJldHVybiBuZXcgY2hhaS5Bc3NlcnRpb24odmFsLCBtZXNzYWdlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5mYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIFttZXNzYWdlXSwgW29wZXJhdG9yXSlcbiAgICpcbiAgICogVGhyb3cgYSBmYWlsdXJlLlxuICAgKlxuICAgKiBAbmFtZSBmYWlsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gb3BlcmF0b3JcbiAgICogQG5hbWVzcGFjZSBCRERcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgY2hhaS5leHBlY3QuZmFpbCA9IGZ1bmN0aW9uIChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBvcGVyYXRvcikge1xuICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8ICdleHBlY3QuZmFpbCgpJztcbiAgICB0aHJvdyBuZXcgY2hhaS5Bc3NlcnRpb25FcnJvcihtZXNzYWdlLCB7XG4gICAgICAgIGFjdHVhbDogYWN0dWFsXG4gICAgICAsIGV4cGVjdGVkOiBleHBlY3RlZFxuICAgICAgLCBvcGVyYXRvcjogb3BlcmF0b3JcbiAgICB9LCBjaGFpLmV4cGVjdC5mYWlsKTtcbiAgfTtcbn07XG4iLCIvKiFcbiAqIGNoYWlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChjaGFpLCB1dGlsKSB7XG4gIHZhciBBc3NlcnRpb24gPSBjaGFpLkFzc2VydGlvbjtcblxuICBmdW5jdGlvbiBsb2FkU2hvdWxkICgpIHtcbiAgICAvLyBleHBsaWNpdGx5IGRlZmluZSB0aGlzIG1ldGhvZCBhcyBmdW5jdGlvbiBhcyB0byBoYXZlIGl0J3MgbmFtZSB0byBpbmNsdWRlIGFzIGBzc2ZpYFxuICAgIGZ1bmN0aW9uIHNob3VsZEdldHRlcigpIHtcbiAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgU3RyaW5nXG4gICAgICAgICAgfHwgdGhpcyBpbnN0YW5jZW9mIE51bWJlclxuICAgICAgICAgIHx8IHRoaXMgaW5zdGFuY2VvZiBCb29sZWFuXG4gICAgICAgICAgfHwgdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0aGlzIGluc3RhbmNlb2YgU3ltYm9sKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKHRoaXMudmFsdWVPZigpLCBudWxsLCBzaG91bGRHZXR0ZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBBc3NlcnRpb24odGhpcywgbnVsbCwgc2hvdWxkR2V0dGVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2hvdWxkU2V0dGVyKHZhbHVlKSB7XG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYWlqcy9jaGFpL2lzc3Vlcy84NjogdGhpcyBtYWtlc1xuICAgICAgLy8gYHdoYXRldmVyLnNob3VsZCA9IHNvbWVWYWx1ZWAgYWN0dWFsbHkgc2V0IGBzb21lVmFsdWVgLCB3aGljaCBpc1xuICAgICAgLy8gZXNwZWNpYWxseSB1c2VmdWwgZm9yIGBnbG9iYWwuc2hvdWxkID0gcmVxdWlyZSgnY2hhaScpLnNob3VsZCgpYC5cbiAgICAgIC8vXG4gICAgICAvLyBOb3RlIHRoYXQgd2UgaGF2ZSB0byB1c2UgW1tEZWZpbmVQcm9wZXJ0eV1dIGluc3RlYWQgb2YgW1tQdXRdXVxuICAgICAgLy8gc2luY2Ugb3RoZXJ3aXNlIHdlIHdvdWxkIHRyaWdnZXIgdGhpcyB2ZXJ5IHNldHRlciFcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc2hvdWxkJywge1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBtb2RpZnkgT2JqZWN0LnByb3RvdHlwZSB0byBoYXZlIGBzaG91bGRgXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KE9iamVjdC5wcm90b3R5cGUsICdzaG91bGQnLCB7XG4gICAgICBzZXQ6IHNob3VsZFNldHRlclxuICAgICAgLCBnZXQ6IHNob3VsZEdldHRlclxuICAgICAgLCBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcblxuICAgIHZhciBzaG91bGQgPSB7fTtcblxuICAgIC8qKlxuICAgICAqICMjIyAuZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0sIFtvcGVyYXRvcl0pXG4gICAgICpcbiAgICAgKiBUaHJvdyBhIGZhaWx1cmUuXG4gICAgICpcbiAgICAgKiBAbmFtZSBmYWlsXG4gICAgICogQHBhcmFtIHtNaXhlZH0gYWN0dWFsXG4gICAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWRcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBvcGVyYXRvclxuICAgICAqIEBuYW1lc3BhY2UgQkREXG4gICAgICogQGFwaSBwdWJsaWNcbiAgICAgKi9cblxuICAgIHNob3VsZC5mYWlsID0gZnVuY3Rpb24gKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsIG9wZXJhdG9yKSB7XG4gICAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCAnc2hvdWxkLmZhaWwoKSc7XG4gICAgICB0aHJvdyBuZXcgY2hhaS5Bc3NlcnRpb25FcnJvcihtZXNzYWdlLCB7XG4gICAgICAgICAgYWN0dWFsOiBhY3R1YWxcbiAgICAgICAgLCBleHBlY3RlZDogZXhwZWN0ZWRcbiAgICAgICAgLCBvcGVyYXRvcjogb3BlcmF0b3JcbiAgICAgIH0sIHNob3VsZC5mYWlsKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogIyMjIC5lcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0pXG4gICAgICpcbiAgICAgKiBBc3NlcnRzIG5vbi1zdHJpY3QgZXF1YWxpdHkgKGA9PWApIG9mIGBhY3R1YWxgIGFuZCBgZXhwZWN0ZWRgLlxuICAgICAqXG4gICAgICogICAgIHNob3VsZC5lcXVhbCgzLCAnMycsICc9PSBjb2VyY2VzIHZhbHVlcyB0byBzdHJpbmdzJyk7XG4gICAgICpcbiAgICAgKiBAbmFtZSBlcXVhbFxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IGV4cGVjdGVkXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAbmFtZXNwYWNlIFNob3VsZFxuICAgICAqIEBhcGkgcHVibGljXG4gICAgICovXG5cbiAgICBzaG91bGQuZXF1YWwgPSBmdW5jdGlvbiAodmFsMSwgdmFsMiwgbXNnKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKHZhbDEsIG1zZykudG8uZXF1YWwodmFsMik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqICMjIyAudGhyb3coZnVuY3Rpb24sIFtjb25zdHJ1Y3Rvci9zdHJpbmcvcmVnZXhwXSwgW3N0cmluZy9yZWdleHBdLCBbbWVzc2FnZV0pXG4gICAgICpcbiAgICAgKiBBc3NlcnRzIHRoYXQgYGZ1bmN0aW9uYCB3aWxsIHRocm93IGFuIGVycm9yIHRoYXQgaXMgYW4gaW5zdGFuY2Ugb2ZcbiAgICAgKiBgY29uc3RydWN0b3JgLCBvciBhbHRlcm5hdGVseSB0aGF0IGl0IHdpbGwgdGhyb3cgYW4gZXJyb3Igd2l0aCBtZXNzYWdlXG4gICAgICogbWF0Y2hpbmcgYHJlZ2V4cGAuXG4gICAgICpcbiAgICAgKiAgICAgc2hvdWxkLnRocm93KGZuLCAnZnVuY3Rpb24gdGhyb3dzIGEgcmVmZXJlbmNlIGVycm9yJyk7XG4gICAgICogICAgIHNob3VsZC50aHJvdyhmbiwgL2Z1bmN0aW9uIHRocm93cyBhIHJlZmVyZW5jZSBlcnJvci8pO1xuICAgICAqICAgICBzaG91bGQudGhyb3coZm4sIFJlZmVyZW5jZUVycm9yKTtcbiAgICAgKiAgICAgc2hvdWxkLnRocm93KGZuLCBSZWZlcmVuY2VFcnJvciwgJ2Z1bmN0aW9uIHRocm93cyBhIHJlZmVyZW5jZSBlcnJvcicpO1xuICAgICAqICAgICBzaG91bGQudGhyb3coZm4sIFJlZmVyZW5jZUVycm9yLCAvZnVuY3Rpb24gdGhyb3dzIGEgcmVmZXJlbmNlIGVycm9yLyk7XG4gICAgICpcbiAgICAgKiBAbmFtZSB0aHJvd1xuICAgICAqIEBhbGlhcyBUaHJvd1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IjRXJyb3JfdHlwZXNcbiAgICAgKiBAbmFtZXNwYWNlIFNob3VsZFxuICAgICAqIEBhcGkgcHVibGljXG4gICAgICovXG5cbiAgICBzaG91bGQuVGhyb3cgPSBmdW5jdGlvbiAoZm4sIGVycnQsIGVycnMsIG1zZykge1xuICAgICAgbmV3IEFzc2VydGlvbihmbiwgbXNnKS50by5UaHJvdyhlcnJ0LCBlcnJzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogIyMjIC5leGlzdFxuICAgICAqXG4gICAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgbmVpdGhlciBgbnVsbGAgbm9yIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogICAgIHZhciBmb28gPSAnaGknO1xuICAgICAqXG4gICAgICogICAgIHNob3VsZC5leGlzdChmb28sICdmb28gZXhpc3RzJyk7XG4gICAgICpcbiAgICAgKiBAbmFtZSBleGlzdFxuICAgICAqIEBuYW1lc3BhY2UgU2hvdWxkXG4gICAgICogQGFwaSBwdWJsaWNcbiAgICAgKi9cblxuICAgIHNob3VsZC5leGlzdCA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZykudG8uZXhpc3Q7XG4gICAgfVxuXG4gICAgLy8gbmVnYXRpb25cbiAgICBzaG91bGQubm90ID0ge31cblxuICAgIC8qKlxuICAgICAqICMjIyAubm90LmVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIFttZXNzYWdlXSlcbiAgICAgKlxuICAgICAqIEFzc2VydHMgbm9uLXN0cmljdCBpbmVxdWFsaXR5IChgIT1gKSBvZiBgYWN0dWFsYCBhbmQgYGV4cGVjdGVkYC5cbiAgICAgKlxuICAgICAqICAgICBzaG91bGQubm90LmVxdWFsKDMsIDQsICd0aGVzZSBudW1iZXJzIGFyZSBub3QgZXF1YWwnKTtcbiAgICAgKlxuICAgICAqIEBuYW1lIG5vdC5lcXVhbFxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgICAqIEBwYXJhbSB7TWl4ZWR9IGV4cGVjdGVkXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICAgKiBAbmFtZXNwYWNlIFNob3VsZFxuICAgICAqIEBhcGkgcHVibGljXG4gICAgICovXG5cbiAgICBzaG91bGQubm90LmVxdWFsID0gZnVuY3Rpb24gKHZhbDEsIHZhbDIsIG1zZykge1xuICAgICAgbmV3IEFzc2VydGlvbih2YWwxLCBtc2cpLnRvLm5vdC5lcXVhbCh2YWwyKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogIyMjIC50aHJvdyhmdW5jdGlvbiwgW2NvbnN0cnVjdG9yL3JlZ2V4cF0sIFttZXNzYWdlXSlcbiAgICAgKlxuICAgICAqIEFzc2VydHMgdGhhdCBgZnVuY3Rpb25gIHdpbGwgX25vdF8gdGhyb3cgYW4gZXJyb3IgdGhhdCBpcyBhbiBpbnN0YW5jZSBvZlxuICAgICAqIGBjb25zdHJ1Y3RvcmAsIG9yIGFsdGVybmF0ZWx5IHRoYXQgaXQgd2lsbCBub3QgdGhyb3cgYW4gZXJyb3Igd2l0aCBtZXNzYWdlXG4gICAgICogbWF0Y2hpbmcgYHJlZ2V4cGAuXG4gICAgICpcbiAgICAgKiAgICAgc2hvdWxkLm5vdC50aHJvdyhmbiwgRXJyb3IsICdmdW5jdGlvbiBkb2VzIG5vdCB0aHJvdycpO1xuICAgICAqXG4gICAgICogQG5hbWUgbm90LnRocm93XG4gICAgICogQGFsaWFzIG5vdC5UaHJvd1xuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBjb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgICAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRXJyb3IjRXJyb3JfdHlwZXNcbiAgICAgKiBAbmFtZXNwYWNlIFNob3VsZFxuICAgICAqIEBhcGkgcHVibGljXG4gICAgICovXG5cbiAgICBzaG91bGQubm90LlRocm93ID0gZnVuY3Rpb24gKGZuLCBlcnJ0LCBlcnJzLCBtc2cpIHtcbiAgICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZykudG8ubm90LlRocm93KGVycnQsIGVycnMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAjIyMgLm5vdC5leGlzdFxuICAgICAqXG4gICAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgbmVpdGhlciBgbnVsbGAgbm9yIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogICAgIHZhciBiYXIgPSBudWxsO1xuICAgICAqXG4gICAgICogICAgIHNob3VsZC5ub3QuZXhpc3QoYmFyLCAnYmFyIGRvZXMgbm90IGV4aXN0Jyk7XG4gICAgICpcbiAgICAgKiBAbmFtZSBub3QuZXhpc3RcbiAgICAgKiBAbmFtZXNwYWNlIFNob3VsZFxuICAgICAqIEBhcGkgcHVibGljXG4gICAgICovXG5cbiAgICBzaG91bGQubm90LmV4aXN0ID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnKS50by5ub3QuZXhpc3Q7XG4gICAgfVxuXG4gICAgc2hvdWxkWyd0aHJvdyddID0gc2hvdWxkWydUaHJvdyddO1xuICAgIHNob3VsZC5ub3RbJ3Rocm93J10gPSBzaG91bGQubm90WydUaHJvdyddO1xuXG4gICAgcmV0dXJuIHNob3VsZDtcbiAgfTtcblxuICBjaGFpLnNob3VsZCA9IGxvYWRTaG91bGQ7XG4gIGNoYWkuU2hvdWxkID0gbG9hZFNob3VsZDtcbn07XG4iLCIvKiFcbiAqIGNoYWlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNoYWksIHV0aWwpIHtcblxuICAvKiFcbiAgICogQ2hhaSBkZXBlbmRlbmNpZXMuXG4gICAqL1xuXG4gIHZhciBBc3NlcnRpb24gPSBjaGFpLkFzc2VydGlvblxuICAgICwgZmxhZyA9IHV0aWwuZmxhZztcblxuICAvKiFcbiAgICogTW9kdWxlIGV4cG9ydC5cbiAgICovXG5cbiAgLyoqXG4gICAqICMjIyBhc3NlcnQoZXhwcmVzc2lvbiwgbWVzc2FnZSlcbiAgICpcbiAgICogV3JpdGUgeW91ciBvd24gdGVzdCBleHByZXNzaW9ucy5cbiAgICpcbiAgICogICAgIGFzc2VydCgnZm9vJyAhPT0gJ2JhcicsICdmb28gaXMgbm90IGJhcicpO1xuICAgKiAgICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkoW10pLCAnZW1wdHkgYXJyYXlzIGFyZSBhcnJheXMnKTtcbiAgICpcbiAgICogQHBhcmFtIHtNaXhlZH0gZXhwcmVzc2lvbiB0byB0ZXN0IGZvciB0cnV0aGluZXNzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIHRvIGRpc3BsYXkgb24gZXJyb3JcbiAgICogQG5hbWUgYXNzZXJ0XG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIHZhciBhc3NlcnQgPSBjaGFpLmFzc2VydCA9IGZ1bmN0aW9uIChleHByZXNzLCBlcnJtc2cpIHtcbiAgICB2YXIgdGVzdCA9IG5ldyBBc3NlcnRpb24obnVsbCwgbnVsbCwgY2hhaS5hc3NlcnQsIHRydWUpO1xuICAgIHRlc3QuYXNzZXJ0KFxuICAgICAgICBleHByZXNzXG4gICAgICAsIGVycm1zZ1xuICAgICAgLCAnWyBuZWdhdGlvbiBtZXNzYWdlIHVuYXZhaWxhYmxlIF0nXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5mYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIFttZXNzYWdlXSwgW29wZXJhdG9yXSlcbiAgICpcbiAgICogVGhyb3cgYSBmYWlsdXJlLiBOb2RlLmpzIGBhc3NlcnRgIG1vZHVsZS1jb21wYXRpYmxlLlxuICAgKlxuICAgKiBAbmFtZSBmYWlsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gb3BlcmF0b3JcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmZhaWwgPSBmdW5jdGlvbiAoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IpIHtcbiAgICBtZXNzYWdlID0gbWVzc2FnZSB8fCAnYXNzZXJ0LmZhaWwoKSc7XG4gICAgdGhyb3cgbmV3IGNoYWkuQXNzZXJ0aW9uRXJyb3IobWVzc2FnZSwge1xuICAgICAgICBhY3R1YWw6IGFjdHVhbFxuICAgICAgLCBleHBlY3RlZDogZXhwZWN0ZWRcbiAgICAgICwgb3BlcmF0b3I6IG9wZXJhdG9yXG4gICAgfSwgYXNzZXJ0LmZhaWwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzT2sob2JqZWN0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyB0cnV0aHkuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNPaygnZXZlcnl0aGluZycsICdldmVyeXRoaW5nIGlzIG9rJyk7XG4gICAqICAgICBhc3NlcnQuaXNPayhmYWxzZSwgJ3RoaXMgd2lsbCBmYWlsJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzT2tcbiAgICogQGFsaWFzIG9rXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdCB0byB0ZXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc09rID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzT2ssIHRydWUpLmlzLm9rO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzTm90T2sob2JqZWN0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyBmYWxzeS5cbiAgICpcbiAgICogICAgIGFzc2VydC5pc05vdE9rKCdldmVyeXRoaW5nJywgJ3RoaXMgd2lsbCBmYWlsJyk7XG4gICAqICAgICBhc3NlcnQuaXNOb3RPayhmYWxzZSwgJ3RoaXMgd2lsbCBwYXNzJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzTm90T2tcbiAgICogQGFsaWFzIG5vdE9rXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdCB0byB0ZXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc05vdE9rID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90T2ssIHRydWUpLmlzLm5vdC5vaztcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5lcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgbm9uLXN0cmljdCBlcXVhbGl0eSAoYD09YCkgb2YgYGFjdHVhbGAgYW5kIGBleHBlY3RlZGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuZXF1YWwoMywgJzMnLCAnPT0gY29lcmNlcyB2YWx1ZXMgdG8gc3RyaW5ncycpO1xuICAgKlxuICAgKiBAbmFtZSBlcXVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBhY3R1YWxcbiAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24gKGFjdCwgZXhwLCBtc2cpIHtcbiAgICB2YXIgdGVzdCA9IG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5lcXVhbCwgdHJ1ZSk7XG5cbiAgICB0ZXN0LmFzc2VydChcbiAgICAgICAgZXhwID09IGZsYWcodGVzdCwgJ29iamVjdCcpXG4gICAgICAsICdleHBlY3RlZCAje3RoaXN9IHRvIGVxdWFsICN7ZXhwfSdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7YWN0fSdcbiAgICAgICwgZXhwXG4gICAgICAsIGFjdFxuICAgICAgLCB0cnVlXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgbm9uLXN0cmljdCBpbmVxdWFsaXR5IChgIT1gKSBvZiBgYWN0dWFsYCBhbmQgYGV4cGVjdGVkYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RFcXVhbCgzLCA0LCAndGhlc2UgbnVtYmVycyBhcmUgbm90IGVxdWFsJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdEVxdWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90RXF1YWwgPSBmdW5jdGlvbiAoYWN0LCBleHAsIG1zZykge1xuICAgIHZhciB0ZXN0ID0gbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0Lm5vdEVxdWFsLCB0cnVlKTtcblxuICAgIHRlc3QuYXNzZXJ0KFxuICAgICAgICBleHAgIT0gZmxhZyh0ZXN0LCAnb2JqZWN0JylcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7ZXhwfSdcbiAgICAgICwgJ2V4cGVjdGVkICN7dGhpc30gdG8gZXF1YWwgI3thY3R9J1xuICAgICAgLCBleHBcbiAgICAgICwgYWN0XG4gICAgICAsIHRydWVcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLnN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyBzdHJpY3QgZXF1YWxpdHkgKGA9PT1gKSBvZiBgYWN0dWFsYCBhbmQgYGV4cGVjdGVkYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0cnVlLCB0cnVlLCAndGhlc2UgYm9vbGVhbnMgYXJlIHN0cmljdGx5IGVxdWFsJyk7XG4gICAqXG4gICAqIEBuYW1lIHN0cmljdEVxdWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuc3RyaWN0RXF1YWwgPSBmdW5jdGlvbiAoYWN0LCBleHAsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5zdHJpY3RFcXVhbCwgdHJ1ZSkudG8uZXF1YWwoZXhwKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RTdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgc3RyaWN0IGluZXF1YWxpdHkgKGAhPT1gKSBvZiBgYWN0dWFsYCBhbmQgYGV4cGVjdGVkYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbCgzLCAnMycsICdubyBjb2VyY2lvbiBmb3Igc3RyaWN0IGVxdWFsaXR5Jyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdFN0cmljdEVxdWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90U3RyaWN0RXF1YWwgPSBmdW5jdGlvbiAoYWN0LCBleHAsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5ub3RTdHJpY3RFcXVhbCwgdHJ1ZSkudG8ubm90LmVxdWFsKGV4cCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBhY3R1YWxgIGlzIGRlZXBseSBlcXVhbCB0byBgZXhwZWN0ZWRgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmRlZXBFcXVhbCh7IHRlYTogJ2dyZWVuJyB9LCB7IHRlYTogJ2dyZWVuJyB9KTtcbiAgICpcbiAgICogQG5hbWUgZGVlcEVxdWFsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IGFjdHVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBleHBlY3RlZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYWxpYXMgZGVlcFN0cmljdEVxdWFsXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kZWVwRXF1YWwgPSBhc3NlcnQuZGVlcFN0cmljdEVxdWFsID0gZnVuY3Rpb24gKGFjdCwgZXhwLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGFjdCwgbXNnLCBhc3NlcnQuZGVlcEVxdWFsLCB0cnVlKS50by5lcWwoZXhwKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3REZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnQgdGhhdCBgYWN0dWFsYCBpcyBub3QgZGVlcGx5IGVxdWFsIHRvIGBleHBlY3RlZGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90RGVlcEVxdWFsKHsgdGVhOiAnZ3JlZW4nIH0sIHsgdGVhOiAnamFzbWluZScgfSk7XG4gICAqXG4gICAqIEBuYW1lIG5vdERlZXBFcXVhbFxuICAgKiBAcGFyYW0ge01peGVkfSBhY3R1YWxcbiAgICogQHBhcmFtIHtNaXhlZH0gZXhwZWN0ZWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdERlZXBFcXVhbCA9IGZ1bmN0aW9uIChhY3QsIGV4cCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0Lm5vdERlZXBFcXVhbCwgdHJ1ZSkudG8ubm90LmVxbChleHApO1xuICB9O1xuXG4gICAvKipcbiAgICogIyMjIC5pc0Fib3ZlKHZhbHVlVG9DaGVjaywgdmFsdWVUb0JlQWJvdmUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyBgdmFsdWVUb0NoZWNrYCBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gKD4pIGB2YWx1ZVRvQmVBYm92ZWAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNBYm92ZSg1LCAyLCAnNSBpcyBzdHJpY3RseSBncmVhdGVyIHRoYW4gMicpO1xuICAgKlxuICAgKiBAbmFtZSBpc0Fib3ZlXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlVG9DaGVja1xuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVRvQmVBYm92ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNBYm92ZSA9IGZ1bmN0aW9uICh2YWwsIGFidiwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQWJvdmUsIHRydWUpLnRvLmJlLmFib3ZlKGFidik7XG4gIH07XG5cbiAgIC8qKlxuICAgKiAjIyMgLmlzQXRMZWFzdCh2YWx1ZVRvQ2hlY2ssIHZhbHVlVG9CZUF0TGVhc3QsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyBgdmFsdWVUb0NoZWNrYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gKD49KSBgdmFsdWVUb0JlQXRMZWFzdGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNBdExlYXN0KDUsIDIsICc1IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMicpO1xuICAgKiAgICAgYXNzZXJ0LmlzQXRMZWFzdCgzLCAzLCAnMyBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIDMnKTtcbiAgICpcbiAgICogQG5hbWUgaXNBdExlYXN0XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlVG9DaGVja1xuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVRvQmVBdExlYXN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc0F0TGVhc3QgPSBmdW5jdGlvbiAodmFsLCBhdGxzdCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQXRMZWFzdCwgdHJ1ZSkudG8uYmUubGVhc3QoYXRsc3QpO1xuICB9O1xuXG4gICAvKipcbiAgICogIyMjIC5pc0JlbG93KHZhbHVlVG9DaGVjaywgdmFsdWVUb0JlQmVsb3csIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyBgdmFsdWVUb0NoZWNrYCBpcyBzdHJpY3RseSBsZXNzIHRoYW4gKDwpIGB2YWx1ZVRvQmVCZWxvd2AuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNCZWxvdygzLCA2LCAnMyBpcyBzdHJpY3RseSBsZXNzIHRoYW4gNicpO1xuICAgKlxuICAgKiBAbmFtZSBpc0JlbG93XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlVG9DaGVja1xuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVRvQmVCZWxvd1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNCZWxvdyA9IGZ1bmN0aW9uICh2YWwsIGJsdywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQmVsb3csIHRydWUpLnRvLmJlLmJlbG93KGJsdyk7XG4gIH07XG5cbiAgIC8qKlxuICAgKiAjIyMgLmlzQXRNb3N0KHZhbHVlVG9DaGVjaywgdmFsdWVUb0JlQXRNb3N0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgYHZhbHVlVG9DaGVja2AgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICg8PSkgYHZhbHVlVG9CZUF0TW9zdGAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNBdE1vc3QoMywgNiwgJzMgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDYnKTtcbiAgICogICAgIGFzc2VydC5pc0F0TW9zdCg0LCA0LCAnNCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNCcpO1xuICAgKlxuICAgKiBAbmFtZSBpc0F0TW9zdFxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVRvQ2hlY2tcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVUb0JlQXRNb3N0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc0F0TW9zdCA9IGZ1bmN0aW9uICh2YWwsIGF0bXN0LCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNBdE1vc3QsIHRydWUpLnRvLmJlLm1vc3QoYXRtc3QpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzVHJ1ZSh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyB0cnVlLlxuICAgKlxuICAgKiAgICAgdmFyIHRlYVNlcnZlZCA9IHRydWU7XG4gICAqICAgICBhc3NlcnQuaXNUcnVlKHRlYVNlcnZlZCwgJ3RoZSB0ZWEgaGFzIGJlZW4gc2VydmVkJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzVHJ1ZVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNUcnVlID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzVHJ1ZSwgdHJ1ZSkuaXNbJ3RydWUnXTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdFRydWUodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgbm90IHRydWUuXG4gICAqXG4gICAqICAgICB2YXIgdGVhID0gJ3Rhc3R5IGNoYWknO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90VHJ1ZSh0ZWEsICdncmVhdCwgdGltZSBmb3IgdGVhIScpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdFRydWVcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90VHJ1ZSA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdFRydWUsIHRydWUpLnRvLm5vdC5lcXVhbCh0cnVlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc0ZhbHNlKHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIGZhbHNlLlxuICAgKlxuICAgKiAgICAgdmFyIHRlYVNlcnZlZCA9IGZhbHNlO1xuICAgKiAgICAgYXNzZXJ0LmlzRmFsc2UodGVhU2VydmVkLCAnbm8gdGVhIHlldD8gaG1tLi4uJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzRmFsc2VcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRmFsc2UgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNGYWxzZSwgdHJ1ZSkuaXNbJ2ZhbHNlJ107XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3RGYWxzZSh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBub3QgZmFsc2UuXG4gICAqXG4gICAqICAgICB2YXIgdGVhID0gJ3Rhc3R5IGNoYWknO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90RmFsc2UodGVhLCAnZ3JlYXQsIHRpbWUgZm9yIHRlYSEnKTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RGYWxzZVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3RGYWxzZSA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdEZhbHNlLCB0cnVlKS50by5ub3QuZXF1YWwoZmFsc2UpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzTnVsbCh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBudWxsLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzTnVsbChlcnIsICd0aGVyZSB3YXMgbm8gZXJyb3InKTtcbiAgICpcbiAgICogQG5hbWUgaXNOdWxsXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc051bGwgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOdWxsLCB0cnVlKS50by5lcXVhbChudWxsKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdE51bGwodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgbm90IG51bGwuXG4gICAqXG4gICAqICAgICB2YXIgdGVhID0gJ3Rhc3R5IGNoYWknO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90TnVsbCh0ZWEsICdncmVhdCwgdGltZSBmb3IgdGVhIScpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdE51bGxcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90TnVsbCA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE51bGwsIHRydWUpLnRvLm5vdC5lcXVhbChudWxsKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05hTlxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdmFsdWUgaXMgTmFOLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzTmFOKE5hTiwgJ05hTiBpcyBOYU4nKTtcbiAgICpcbiAgICogQG5hbWUgaXNOYU5cbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTmFOID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTmFOLCB0cnVlKS50by5iZS5OYU47XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3ROYU5cbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHZhbHVlIGlzIG5vdCBOYU4uXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNOb3ROYU4oNCwgJzQgaXMgbm90IE5hTicpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdE5hTlxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cbiAgYXNzZXJ0LmlzTm90TmFOID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90TmFOLCB0cnVlKS5ub3QudG8uYmUuTmFOO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmV4aXN0c1xuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqICAgICB2YXIgZm9vID0gJ2hpJztcbiAgICpcbiAgICogICAgIGFzc2VydC5leGlzdHMoZm9vLCAnZm9vIGlzIG5laXRoZXIgYG51bGxgIG5vciBgdW5kZWZpbmVkYCcpO1xuICAgKlxuICAgKiBAbmFtZSBleGlzdHNcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmV4aXN0cyA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5leGlzdHMsIHRydWUpLnRvLmV4aXN0O1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdEV4aXN0c1xuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBpcyBlaXRoZXIgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICAgKlxuICAgKiAgICAgdmFyIGJhciA9IG51bGxcbiAgICogICAgICAgLCBiYXo7XG4gICAqXG4gICAqICAgICBhc3NlcnQubm90RXhpc3RzKGJhcik7XG4gICAqICAgICBhc3NlcnQubm90RXhpc3RzKGJheiwgJ2JheiBpcyBlaXRoZXIgbnVsbCBvciB1bmRlZmluZWQnKTtcbiAgICpcbiAgICogQG5hbWUgbm90RXhpc3RzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RFeGlzdHMgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQubm90RXhpc3RzLCB0cnVlKS50by5ub3QuZXhpc3Q7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNVbmRlZmluZWQodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqICAgICB2YXIgdGVhO1xuICAgKiAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHRlYSwgJ25vIHRlYSBkZWZpbmVkJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzVW5kZWZpbmVkXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc1VuZGVmaW5lZCA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc1VuZGVmaW5lZCwgdHJ1ZSkudG8uZXF1YWwodW5kZWZpbmVkKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc0RlZmluZWQodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgbm90IGB1bmRlZmluZWRgLlxuICAgKlxuICAgKiAgICAgdmFyIHRlYSA9ICdjdXAgb2YgY2hhaSc7XG4gICAqICAgICBhc3NlcnQuaXNEZWZpbmVkKHRlYSwgJ3RlYSBoYXMgYmVlbiBkZWZpbmVkJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzRGVmaW5lZFxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNEZWZpbmVkID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzRGVmaW5lZCwgdHJ1ZSkudG8ubm90LmVxdWFsKHVuZGVmaW5lZCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNGdW5jdGlvbih2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiAgICAgZnVuY3Rpb24gc2VydmVUZWEoKSB7IHJldHVybiAnY3VwIG9mIHRlYSc7IH07XG4gICAqICAgICBhc3NlcnQuaXNGdW5jdGlvbihzZXJ2ZVRlYSwgJ2dyZWF0LCB3ZSBjYW4gaGF2ZSB0ZWEgbm93Jyk7XG4gICAqXG4gICAqIEBuYW1lIGlzRnVuY3Rpb25cbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNGdW5jdGlvbiwgdHJ1ZSkudG8uYmUuYSgnZnVuY3Rpb24nKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdEZ1bmN0aW9uKHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIF9ub3RfIGEgZnVuY3Rpb24uXG4gICAqXG4gICAqICAgICB2YXIgc2VydmVUZWEgPSBbICdoZWF0JywgJ3BvdXInLCAnc2lwJyBdO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90RnVuY3Rpb24oc2VydmVUZWEsICdncmVhdCwgd2UgaGF2ZSBsaXN0ZWQgdGhlIHN0ZXBzJyk7XG4gICAqXG4gICAqIEBuYW1lIGlzTm90RnVuY3Rpb25cbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90RnVuY3Rpb24gPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RGdW5jdGlvbiwgdHJ1ZSkudG8ubm90LmJlLmEoJ2Z1bmN0aW9uJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNPYmplY3QodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYW4gb2JqZWN0IG9mIHR5cGUgJ09iamVjdCcgKGFzIHJldmVhbGVkIGJ5IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCkuXG4gICAqIF9UaGUgYXNzZXJ0aW9uIGRvZXMgbm90IG1hdGNoIHN1YmNsYXNzZWQgb2JqZWN0cy5fXG4gICAqXG4gICAqICAgICB2YXIgc2VsZWN0aW9uID0geyBuYW1lOiAnQ2hhaScsIHNlcnZlOiAnd2l0aCBzcGljZXMnIH07XG4gICAqICAgICBhc3NlcnQuaXNPYmplY3Qoc2VsZWN0aW9uLCAndGVhIHNlbGVjdGlvbiBpcyBhbiBvYmplY3QnKTtcbiAgICpcbiAgICogQG5hbWUgaXNPYmplY3RcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzT2JqZWN0ID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzT2JqZWN0LCB0cnVlKS50by5iZS5hKCdvYmplY3QnKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdE9iamVjdCh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBfbm90XyBhbiBvYmplY3Qgb2YgdHlwZSAnT2JqZWN0JyAoYXMgcmV2ZWFsZWQgYnkgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgKS5cbiAgICpcbiAgICogICAgIHZhciBzZWxlY3Rpb24gPSAnY2hhaSdcbiAgICogICAgIGFzc2VydC5pc05vdE9iamVjdChzZWxlY3Rpb24sICd0ZWEgc2VsZWN0aW9uIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICogICAgIGFzc2VydC5pc05vdE9iamVjdChudWxsLCAnbnVsbCBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAqXG4gICAqIEBuYW1lIGlzTm90T2JqZWN0XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc05vdE9iamVjdCA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE9iamVjdCwgdHJ1ZSkudG8ubm90LmJlLmEoJ29iamVjdCcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzQXJyYXkodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYW4gYXJyYXkuXG4gICAqXG4gICAqICAgICB2YXIgbWVudSA9IFsgJ2dyZWVuJywgJ2NoYWknLCAnb29sb25nJyBdO1xuICAgKiAgICAgYXNzZXJ0LmlzQXJyYXkobWVudSwgJ3doYXQga2luZCBvZiB0ZWEgZG8gd2Ugd2FudD8nKTtcbiAgICpcbiAgICogQG5hbWUgaXNBcnJheVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNBcnJheSA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0FycmF5LCB0cnVlKS50by5iZS5hbignYXJyYXknKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdEFycmF5KHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIF9ub3RfIGFuIGFycmF5LlxuICAgKlxuICAgKiAgICAgdmFyIG1lbnUgPSAnZ3JlZW58Y2hhaXxvb2xvbmcnO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90QXJyYXkobWVudSwgJ3doYXQga2luZCBvZiB0ZWEgZG8gd2Ugd2FudD8nKTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RBcnJheVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3RBcnJheSA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdEFycmF5LCB0cnVlKS50by5ub3QuYmUuYW4oJ2FycmF5Jyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNTdHJpbmcodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYSBzdHJpbmcuXG4gICAqXG4gICAqICAgICB2YXIgdGVhT3JkZXIgPSAnY2hhaSc7XG4gICAqICAgICBhc3NlcnQuaXNTdHJpbmcodGVhT3JkZXIsICdvcmRlciBwbGFjZWQnKTtcbiAgICpcbiAgICogQG5hbWUgaXNTdHJpbmdcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzU3RyaW5nID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzU3RyaW5nLCB0cnVlKS50by5iZS5hKCdzdHJpbmcnKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdFN0cmluZyh2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBpcyBfbm90XyBhIHN0cmluZy5cbiAgICpcbiAgICogICAgIHZhciB0ZWFPcmRlciA9IDQ7XG4gICAqICAgICBhc3NlcnQuaXNOb3RTdHJpbmcodGVhT3JkZXIsICdvcmRlciBwbGFjZWQnKTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RTdHJpbmdcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90U3RyaW5nID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90U3RyaW5nLCB0cnVlKS50by5ub3QuYmUuYSgnc3RyaW5nJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOdW1iZXIodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYSBudW1iZXIuXG4gICAqXG4gICAqICAgICB2YXIgY3VwcyA9IDI7XG4gICAqICAgICBhc3NlcnQuaXNOdW1iZXIoY3VwcywgJ2hvdyBtYW55IGN1cHMnKTtcbiAgICpcbiAgICogQG5hbWUgaXNOdW1iZXJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc051bWJlciA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc051bWJlciwgdHJ1ZSkudG8uYmUuYSgnbnVtYmVyJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3ROdW1iZXIodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgX25vdF8gYSBudW1iZXIuXG4gICAqXG4gICAqICAgICB2YXIgY3VwcyA9ICcyIGN1cHMgcGxlYXNlJztcbiAgICogICAgIGFzc2VydC5pc05vdE51bWJlcihjdXBzLCAnaG93IG1hbnkgY3VwcycpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdE51bWJlclxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3ROdW1iZXIgPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3ROdW1iZXIsIHRydWUpLnRvLm5vdC5iZS5hKCdudW1iZXInKTtcbiAgfTtcblxuICAgLyoqXG4gICAqICMjIyAuaXNGaW5pdGUodmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYSBmaW5pdGUgbnVtYmVyLiBVbmxpa2UgYC5pc051bWJlcmAsIHRoaXMgd2lsbCBmYWlsIGZvciBgTmFOYCBhbmQgYEluZmluaXR5YC5cbiAgICpcbiAgICogICAgIHZhciBjdXBzID0gMjtcbiAgICogICAgIGFzc2VydC5pc0Zpbml0ZShjdXBzLCAnaG93IG1hbnkgY3VwcycpO1xuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzRmluaXRlKE5hTik7IC8vIHRocm93c1xuICAgKlxuICAgKiBAbmFtZSBpc0Zpbml0ZVxuICAgKiBAcGFyYW0ge051bWJlcn0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRmluaXRlID0gZnVuY3Rpb24gKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzRmluaXRlLCB0cnVlKS50by5iZS5maW5pdGU7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNCb29sZWFuKHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIGEgYm9vbGVhbi5cbiAgICpcbiAgICogICAgIHZhciB0ZWFSZWFkeSA9IHRydWVcbiAgICogICAgICAgLCB0ZWFTZXJ2ZWQgPSBmYWxzZTtcbiAgICpcbiAgICogICAgIGFzc2VydC5pc0Jvb2xlYW4odGVhUmVhZHksICdpcyB0aGUgdGVhIHJlYWR5Jyk7XG4gICAqICAgICBhc3NlcnQuaXNCb29sZWFuKHRlYVNlcnZlZCwgJ2hhcyB0ZWEgYmVlbiBzZXJ2ZWQnKTtcbiAgICpcbiAgICogQG5hbWUgaXNCb29sZWFuXG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pc0Jvb2xlYW4gPSBmdW5jdGlvbiAodmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNCb29sZWFuLCB0cnVlKS50by5iZS5hKCdib29sZWFuJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3RCb29sZWFuKHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIGlzIF9ub3RfIGEgYm9vbGVhbi5cbiAgICpcbiAgICogICAgIHZhciB0ZWFSZWFkeSA9ICd5ZXAnXG4gICAqICAgICAgICwgdGVhU2VydmVkID0gJ25vcGUnO1xuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzTm90Qm9vbGVhbih0ZWFSZWFkeSwgJ2lzIHRoZSB0ZWEgcmVhZHknKTtcbiAgICogICAgIGFzc2VydC5pc05vdEJvb2xlYW4odGVhU2VydmVkLCAnaGFzIHRlYSBiZWVuIHNlcnZlZCcpO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdEJvb2xlYW5cbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90Qm9vbGVhbiA9IGZ1bmN0aW9uICh2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdEJvb2xlYW4sIHRydWUpLnRvLm5vdC5iZS5hKCdib29sZWFuJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAudHlwZU9mKHZhbHVlLCBuYW1lLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgJ3MgdHlwZSBpcyBgbmFtZWAsIGFzIGRldGVybWluZWQgYnlcbiAgICogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LnR5cGVPZih7IHRlYTogJ2NoYWknIH0sICdvYmplY3QnLCAnd2UgaGF2ZSBhbiBvYmplY3QnKTtcbiAgICogICAgIGFzc2VydC50eXBlT2YoWydjaGFpJywgJ2phc21pbmUnXSwgJ2FycmF5JywgJ3dlIGhhdmUgYW4gYXJyYXknKTtcbiAgICogICAgIGFzc2VydC50eXBlT2YoJ3RlYScsICdzdHJpbmcnLCAnd2UgaGF2ZSBhIHN0cmluZycpO1xuICAgKiAgICAgYXNzZXJ0LnR5cGVPZigvdGVhLywgJ3JlZ2V4cCcsICd3ZSBoYXZlIGEgcmVndWxhciBleHByZXNzaW9uJyk7XG4gICAqICAgICBhc3NlcnQudHlwZU9mKG51bGwsICdudWxsJywgJ3dlIGhhdmUgYSBudWxsJyk7XG4gICAqICAgICBhc3NlcnQudHlwZU9mKHVuZGVmaW5lZCwgJ3VuZGVmaW5lZCcsICd3ZSBoYXZlIGFuIHVuZGVmaW5lZCcpO1xuICAgKlxuICAgKiBAbmFtZSB0eXBlT2ZcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LnR5cGVPZiA9IGZ1bmN0aW9uICh2YWwsIHR5cGUsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC50eXBlT2YsIHRydWUpLnRvLmJlLmEodHlwZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90VHlwZU9mKHZhbHVlLCBuYW1lLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgJ3MgdHlwZSBpcyBfbm90XyBgbmFtZWAsIGFzIGRldGVybWluZWQgYnlcbiAgICogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdFR5cGVPZigndGVhJywgJ251bWJlcicsICdzdHJpbmdzIGFyZSBub3QgbnVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBub3RUeXBlT2ZcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGVvZiBuYW1lXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RUeXBlT2YgPSBmdW5jdGlvbiAodmFsLCB0eXBlLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQubm90VHlwZU9mLCB0cnVlKS50by5ub3QuYmUuYSh0eXBlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pbnN0YW5jZU9mKG9iamVjdCwgY29uc3RydWN0b3IsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGB2YWx1ZWAgaXMgYW4gaW5zdGFuY2Ugb2YgYGNvbnN0cnVjdG9yYC5cbiAgICpcbiAgICogICAgIHZhciBUZWEgPSBmdW5jdGlvbiAobmFtZSkgeyB0aGlzLm5hbWUgPSBuYW1lOyB9XG4gICAqICAgICAgICwgY2hhaSA9IG5ldyBUZWEoJ2NoYWknKTtcbiAgICpcbiAgICogICAgIGFzc2VydC5pbnN0YW5jZU9mKGNoYWksIFRlYSwgJ2NoYWkgaXMgYW4gaW5zdGFuY2Ugb2YgdGVhJyk7XG4gICAqXG4gICAqIEBuYW1lIGluc3RhbmNlT2ZcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yfSBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaW5zdGFuY2VPZiA9IGZ1bmN0aW9uICh2YWwsIHR5cGUsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pbnN0YW5jZU9mLCB0cnVlKS50by5iZS5pbnN0YW5jZU9mKHR5cGUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdEluc3RhbmNlT2Yob2JqZWN0LCBjb25zdHJ1Y3RvciwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIGB2YWx1ZWAgaXMgbm90IGFuIGluc3RhbmNlIG9mIGBjb25zdHJ1Y3RvcmAuXG4gICAqXG4gICAqICAgICB2YXIgVGVhID0gZnVuY3Rpb24gKG5hbWUpIHsgdGhpcy5uYW1lID0gbmFtZTsgfVxuICAgKiAgICAgICAsIGNoYWkgPSBuZXcgU3RyaW5nKCdjaGFpJyk7XG4gICAqXG4gICAqICAgICBhc3NlcnQubm90SW5zdGFuY2VPZihjaGFpLCBUZWEsICdjaGFpIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0ZWEnKTtcbiAgICpcbiAgICogQG5hbWUgbm90SW5zdGFuY2VPZlxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RJbnN0YW5jZU9mID0gZnVuY3Rpb24gKHZhbCwgdHlwZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0Lm5vdEluc3RhbmNlT2YsIHRydWUpXG4gICAgICAudG8ubm90LmJlLmluc3RhbmNlT2YodHlwZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaW5jbHVkZShoYXlzdGFjaywgbmVlZGxlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgaGF5c3RhY2tgIGluY2x1ZGVzIGBuZWVkbGVgLiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlXG4gICAqIGluY2x1c2lvbiBvZiBhIHZhbHVlIGluIGFuIGFycmF5LCBhIHN1YnN0cmluZyBpbiBhIHN0cmluZywgb3IgYSBzdWJzZXQgb2ZcbiAgICogcHJvcGVydGllcyBpbiBhbiBvYmplY3QuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaW5jbHVkZShbMSwyLDNdLCAyLCAnYXJyYXkgY29udGFpbnMgdmFsdWUnKTtcbiAgICogICAgIGFzc2VydC5pbmNsdWRlKCdmb29iYXInLCAnZm9vJywgJ3N0cmluZyBjb250YWlucyBzdWJzdHJpbmcnKTtcbiAgICogICAgIGFzc2VydC5pbmNsdWRlKHsgZm9vOiAnYmFyJywgaGVsbG86ICd1bml2ZXJzZScgfSwgeyBmb286ICdiYXInIH0sICdvYmplY3QgY29udGFpbnMgcHJvcGVydHknKTtcbiAgICpcbiAgICogU3RyaWN0IGVxdWFsaXR5ICg9PT0pIGlzIHVzZWQuIFdoZW4gYXNzZXJ0aW5nIHRoZSBpbmNsdXNpb24gb2YgYSB2YWx1ZSBpblxuICAgKiBhbiBhcnJheSwgdGhlIGFycmF5IGlzIHNlYXJjaGVkIGZvciBhbiBlbGVtZW50IHRoYXQncyBzdHJpY3RseSBlcXVhbCB0byB0aGVcbiAgICogZ2l2ZW4gdmFsdWUuIFdoZW4gYXNzZXJ0aW5nIGEgc3Vic2V0IG9mIHByb3BlcnRpZXMgaW4gYW4gb2JqZWN0LCB0aGUgb2JqZWN0XG4gICAqIGlzIHNlYXJjaGVkIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkga2V5cywgY2hlY2tpbmcgdGhhdCBlYWNoIG9uZSBpcyBwcmVzZW50XG4gICAqIGFuZCBzdHJpY3R5IGVxdWFsIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSB2YWx1ZS4gRm9yIGluc3RhbmNlOlxuICAgKlxuICAgKiAgICAgdmFyIG9iajEgPSB7YTogMX1cbiAgICogICAgICAgLCBvYmoyID0ge2I6IDJ9O1xuICAgKiAgICAgYXNzZXJ0LmluY2x1ZGUoW29iajEsIG9iajJdLCBvYmoxKTtcbiAgICogICAgIGFzc2VydC5pbmNsdWRlKHtmb286IG9iajEsIGJhcjogb2JqMn0sIHtmb286IG9iajF9KTtcbiAgICogICAgIGFzc2VydC5pbmNsdWRlKHtmb286IG9iajEsIGJhcjogb2JqMn0sIHtmb286IG9iajEsIGJhcjogb2JqMn0pO1xuICAgKlxuICAgKiBAbmFtZSBpbmNsdWRlXG4gICAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBoYXlzdGFja1xuICAgKiBAcGFyYW0ge01peGVkfSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmluY2x1ZGUgPSBmdW5jdGlvbiAoZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5pbmNsdWRlLCB0cnVlKS5pbmNsdWRlKGluYyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90SW5jbHVkZShoYXlzdGFjaywgbmVlZGxlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgaGF5c3RhY2tgIGRvZXMgbm90IGluY2x1ZGUgYG5lZWRsZWAuIENhbiBiZSB1c2VkIHRvIGFzc2VydFxuICAgKiB0aGUgYWJzZW5jZSBvZiBhIHZhbHVlIGluIGFuIGFycmF5LCBhIHN1YnN0cmluZyBpbiBhIHN0cmluZywgb3IgYSBzdWJzZXQgb2ZcbiAgICogcHJvcGVydGllcyBpbiBhbiBvYmplY3QuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZShbMSwyLDNdLCA0LCAnYXJyYXkgZG9lc24ndCBjb250YWluIHZhbHVlJyk7XG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZSgnZm9vYmFyJywgJ2JheicsICdzdHJpbmcgZG9lc24ndCBjb250YWluIHN1YnN0cmluZycpO1xuICAgKiAgICAgYXNzZXJ0Lm5vdEluY2x1ZGUoeyBmb286ICdiYXInLCBoZWxsbzogJ3VuaXZlcnNlJyB9LCB7IGZvbzogJ2JheicgfSwgJ29iamVjdCBkb2Vzbid0IGNvbnRhaW4gcHJvcGVydHknKTtcbiAgICpcbiAgICogU3RyaWN0IGVxdWFsaXR5ICg9PT0pIGlzIHVzZWQuIFdoZW4gYXNzZXJ0aW5nIHRoZSBhYnNlbmNlIG9mIGEgdmFsdWUgaW4gYW5cbiAgICogYXJyYXksIHRoZSBhcnJheSBpcyBzZWFyY2hlZCB0byBjb25maXJtIHRoZSBhYnNlbmNlIG9mIGFuIGVsZW1lbnQgdGhhdCdzXG4gICAqIHN0cmljdGx5IGVxdWFsIHRvIHRoZSBnaXZlbiB2YWx1ZS4gV2hlbiBhc3NlcnRpbmcgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpblxuICAgKiBhbiBvYmplY3QsIHRoZSBvYmplY3QgaXMgc2VhcmNoZWQgdG8gY29uZmlybSB0aGF0IGF0IGxlYXN0IG9uZSBvZiB0aGUgZ2l2ZW5cbiAgICogcHJvcGVydHkga2V5cyBpcyBlaXRoZXIgbm90IHByZXNlbnQgb3Igbm90IHN0cmljdGx5IGVxdWFsIHRvIHRoZSBnaXZlblxuICAgKiBwcm9wZXJ0eSB2YWx1ZS4gRm9yIGluc3RhbmNlOlxuICAgKlxuICAgKiAgICAgdmFyIG9iajEgPSB7YTogMX1cbiAgICogICAgICAgLCBvYmoyID0ge2I6IDJ9O1xuICAgKiAgICAgYXNzZXJ0Lm5vdEluY2x1ZGUoW29iajEsIG9iajJdLCB7YTogMX0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdEluY2x1ZGUoe2Zvbzogb2JqMSwgYmFyOiBvYmoyfSwge2Zvbzoge2E6IDF9fSk7XG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZSh7Zm9vOiBvYmoxLCBiYXI6IG9iajJ9LCB7Zm9vOiBvYmoxLCBiYXI6IHtiOiAyfX0pO1xuICAgKlxuICAgKiBAbmFtZSBub3RJbmNsdWRlXG4gICAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBoYXlzdGFja1xuICAgKiBAcGFyYW0ge01peGVkfSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdEluY2x1ZGUgPSBmdW5jdGlvbiAoZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5ub3RJbmNsdWRlLCB0cnVlKS5ub3QuaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmRlZXBJbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBoYXlzdGFja2AgaW5jbHVkZXMgYG5lZWRsZWAuIENhbiBiZSB1c2VkIHRvIGFzc2VydCB0aGVcbiAgICogaW5jbHVzaW9uIG9mIGEgdmFsdWUgaW4gYW4gYXJyYXkgb3IgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhbiBvYmplY3QuXG4gICAqIERlZXAgZXF1YWxpdHkgaXMgdXNlZC5cbiAgICpcbiAgICogICAgIHZhciBvYmoxID0ge2E6IDF9XG4gICAqICAgICAgICwgb2JqMiA9IHtiOiAyfTtcbiAgICogICAgIGFzc2VydC5kZWVwSW5jbHVkZShbb2JqMSwgb2JqMl0sIHthOiAxfSk7XG4gICAqICAgICBhc3NlcnQuZGVlcEluY2x1ZGUoe2Zvbzogb2JqMSwgYmFyOiBvYmoyfSwge2Zvbzoge2E6IDF9fSk7XG4gICAqICAgICBhc3NlcnQuZGVlcEluY2x1ZGUoe2Zvbzogb2JqMSwgYmFyOiBvYmoyfSwge2Zvbzoge2E6IDF9LCBiYXI6IHtiOiAyfX0pO1xuICAgKlxuICAgKiBAbmFtZSBkZWVwSW5jbHVkZVxuICAgKiBAcGFyYW0ge0FycmF5fFN0cmluZ30gaGF5c3RhY2tcbiAgICogQHBhcmFtIHtNaXhlZH0gbmVlZGxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kZWVwSW5jbHVkZSA9IGZ1bmN0aW9uIChleHAsIGluYywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0LmRlZXBJbmNsdWRlLCB0cnVlKS5kZWVwLmluY2x1ZGUoaW5jKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3REZWVwSW5jbHVkZShoYXlzdGFjaywgbmVlZGxlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgaGF5c3RhY2tgIGRvZXMgbm90IGluY2x1ZGUgYG5lZWRsZWAuIENhbiBiZSB1c2VkIHRvIGFzc2VydFxuICAgKiB0aGUgYWJzZW5jZSBvZiBhIHZhbHVlIGluIGFuIGFycmF5IG9yIGEgc3Vic2V0IG9mIHByb3BlcnRpZXMgaW4gYW4gb2JqZWN0LlxuICAgKiBEZWVwIGVxdWFsaXR5IGlzIHVzZWQuXG4gICAqXG4gICAqICAgICB2YXIgb2JqMSA9IHthOiAxfVxuICAgKiAgICAgICAsIG9iajIgPSB7YjogMn07XG4gICAqICAgICBhc3NlcnQubm90RGVlcEluY2x1ZGUoW29iajEsIG9iajJdLCB7YTogOX0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdERlZXBJbmNsdWRlKHtmb286IG9iajEsIGJhcjogb2JqMn0sIHtmb286IHthOiA5fX0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdERlZXBJbmNsdWRlKHtmb286IG9iajEsIGJhcjogb2JqMn0sIHtmb286IHthOiAxfSwgYmFyOiB7YjogOX19KTtcbiAgICpcbiAgICogQG5hbWUgbm90RGVlcEluY2x1ZGVcbiAgICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IGhheXN0YWNrXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG5lZWRsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90RGVlcEluY2x1ZGUgPSBmdW5jdGlvbiAoZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5ub3REZWVwSW5jbHVkZSwgdHJ1ZSkubm90LmRlZXAuaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5lc3RlZEluY2x1ZGUoaGF5c3RhY2ssIG5lZWRsZSwgW21lc3NhZ2VdKVxuICAgKiBcbiAgICogQXNzZXJ0cyB0aGF0ICdoYXlzdGFjaycgaW5jbHVkZXMgJ25lZWRsZScuIFxuICAgKiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIGluY2x1c2lvbiBvZiBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzIGluIGFuIFxuICAgKiBvYmplY3QuXG4gICAqIEVuYWJsZXMgdGhlIHVzZSBvZiBkb3QtIGFuZCBicmFja2V0LW5vdGF0aW9uIGZvciByZWZlcmVuY2luZyBuZXN0ZWQgXG4gICAqIHByb3BlcnRpZXMuXG4gICAqICdbXScgYW5kICcuJyBpbiBwcm9wZXJ0eSBuYW1lcyBjYW4gYmUgZXNjYXBlZCB1c2luZyBkb3VibGUgYmFja3NsYXNoZXMuXG4gICAqIFxuICAgKiAgICAgYXNzZXJ0Lm5lc3RlZEluY2x1ZGUoeycuYSc6IHsnYic6ICd4J319LCB7J1xcXFwuYS5bYl0nOiAneCd9KTtcbiAgICogICAgIGFzc2VydC5uZXN0ZWRJbmNsdWRlKHsnYSc6IHsnW2JdJzogJ3gnfX0sIHsnYS5cXFxcW2JcXFxcXSc6ICd4J30pO1xuICAgKiBcbiAgICogQG5hbWUgbmVzdGVkSW5jbHVkZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaGF5c3RhY2tcbiAgICogQHBhcmFtIHtPYmplY3R9IG5lZWRsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpYyBcbiAgICovIFxuXG4gIGFzc2VydC5uZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24gKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubmVzdGVkSW5jbHVkZSwgdHJ1ZSkubmVzdGVkLmluY2x1ZGUoaW5jKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3ROZXN0ZWRJbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICogXG4gICAqIEFzc2VydHMgdGhhdCAnaGF5c3RhY2snIGRvZXMgbm90IGluY2x1ZGUgJ25lZWRsZScuIFxuICAgKiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIGFic2VuY2Ugb2YgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhbiBcbiAgICogb2JqZWN0LlxuICAgKiBFbmFibGVzIHRoZSB1c2Ugb2YgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3IgcmVmZXJlbmNpbmcgbmVzdGVkIFxuICAgKiBwcm9wZXJ0aWVzLiBcbiAgICogJ1tdJyBhbmQgJy4nIGluIHByb3BlcnR5IG5hbWVzIGNhbiBiZSBlc2NhcGVkIHVzaW5nIGRvdWJsZSBiYWNrc2xhc2hlcy5cbiAgICogXG4gICAqICAgICBhc3NlcnQubm90TmVzdGVkSW5jbHVkZSh7Jy5hJzogeydiJzogJ3gnfX0sIHsnXFxcXC5hLmInOiAneSd9KTtcbiAgICogICAgIGFzc2VydC5ub3ROZXN0ZWRJbmNsdWRlKHsnYSc6IHsnW2JdJzogJ3gnfX0sIHsnYS5cXFxcW2JcXFxcXSc6ICd5J30pO1xuICAgKiBcbiAgICogQG5hbWUgbm90TmVzdGVkSW5jbHVkZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaGF5c3RhY2tcbiAgICogQHBhcmFtIHtPYmplY3R9IG5lZWRsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpYyBcbiAgICovIFxuXG4gIGFzc2VydC5ub3ROZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24gKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90TmVzdGVkSW5jbHVkZSwgdHJ1ZSlcbiAgICAgIC5ub3QubmVzdGVkLmluY2x1ZGUoaW5jKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5kZWVwTmVzdGVkSW5jbHVkZShoYXlzdGFjaywgbmVlZGxlLCBbbWVzc2FnZV0pXG4gICAqIFxuICAgKiBBc3NlcnRzIHRoYXQgJ2hheXN0YWNrJyBpbmNsdWRlcyAnbmVlZGxlJy5cbiAgICogQ2FuIGJlIHVzZWQgdG8gYXNzZXJ0IHRoZSBpbmNsdXNpb24gb2YgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhbiBcbiAgICogb2JqZWN0IHdoaWxlIGNoZWNraW5nIGZvciBkZWVwIGVxdWFsaXR5LlxuICAgKiBFbmFibGVzIHRoZSB1c2Ugb2YgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3IgcmVmZXJlbmNpbmcgbmVzdGVkIFxuICAgKiBwcm9wZXJ0aWVzLlxuICAgKiAnW10nIGFuZCAnLicgaW4gcHJvcGVydHkgbmFtZXMgY2FuIGJlIGVzY2FwZWQgdXNpbmcgZG91YmxlIGJhY2tzbGFzaGVzLlxuICAgKiBcbiAgICogICAgIGFzc2VydC5kZWVwTmVzdGVkSW5jbHVkZSh7YToge2I6IFt7eDogMX1dfX0sIHsnYS5iWzBdJzoge3g6IDF9fSk7XG4gICAqICAgICBhc3NlcnQuZGVlcE5lc3RlZEluY2x1ZGUoeycuYSc6IHsnW2JdJzoge3g6IDF9fX0sIHsnXFxcXC5hLlxcXFxbYlxcXFxdJzoge3g6IDF9fSk7XG4gICAqICAgIFxuICAgKiBAbmFtZSBkZWVwTmVzdGVkSW5jbHVkZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaGF5c3RhY2tcbiAgICogQHBhcmFtIHtPYmplY3R9IG5lZWRsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpYyBcbiAgICovXG5cbiAgYXNzZXJ0LmRlZXBOZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5kZWVwTmVzdGVkSW5jbHVkZSwgdHJ1ZSlcbiAgICAgIC5kZWVwLm5lc3RlZC5pbmNsdWRlKGluYyk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90RGVlcE5lc3RlZEluY2x1ZGUoaGF5c3RhY2ssIG5lZWRsZSwgW21lc3NhZ2VdKVxuICAgKiBcbiAgICogQXNzZXJ0cyB0aGF0ICdoYXlzdGFjaycgZG9lcyBub3QgaW5jbHVkZSAnbmVlZGxlJy5cbiAgICogQ2FuIGJlIHVzZWQgdG8gYXNzZXJ0IHRoZSBhYnNlbmNlIG9mIGEgc3Vic2V0IG9mIHByb3BlcnRpZXMgaW4gYW4gXG4gICAqIG9iamVjdCB3aGlsZSBjaGVja2luZyBmb3IgZGVlcCBlcXVhbGl0eS5cbiAgICogRW5hYmxlcyB0aGUgdXNlIG9mIGRvdC0gYW5kIGJyYWNrZXQtbm90YXRpb24gZm9yIHJlZmVyZW5jaW5nIG5lc3RlZCBcbiAgICogcHJvcGVydGllcy5cbiAgICogJ1tdJyBhbmQgJy4nIGluIHByb3BlcnR5IG5hbWVzIGNhbiBiZSBlc2NhcGVkIHVzaW5nIGRvdWJsZSBiYWNrc2xhc2hlcy5cbiAgICogXG4gICAqICAgICBhc3NlcnQubm90RGVlcE5lc3RlZEluY2x1ZGUoe2E6IHtiOiBbe3g6IDF9XX19LCB7J2EuYlswXSc6IHt5OiAxfX0pXG4gICAqICAgICBhc3NlcnQubm90RGVlcE5lc3RlZEluY2x1ZGUoeycuYSc6IHsnW2JdJzoge3g6IDF9fX0sIHsnXFxcXC5hLlxcXFxbYlxcXFxdJzoge3k6IDJ9fSk7XG4gICAqICAgIFxuICAgKiBAbmFtZSBub3REZWVwTmVzdGVkSW5jbHVkZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaGF5c3RhY2tcbiAgICogQHBhcmFtIHtPYmplY3R9IG5lZWRsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpYyBcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5ub3REZWVwTmVzdGVkSW5jbHVkZSwgdHJ1ZSlcbiAgICAgIC5ub3QuZGVlcC5uZXN0ZWQuaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm93bkluY2x1ZGUoaGF5c3RhY2ssIG5lZWRsZSwgW21lc3NhZ2VdKVxuICAgKiBcbiAgICogQXNzZXJ0cyB0aGF0ICdoYXlzdGFjaycgaW5jbHVkZXMgJ25lZWRsZScuXG4gICAqIENhbiBiZSB1c2VkIHRvIGFzc2VydCB0aGUgaW5jbHVzaW9uIG9mIGEgc3Vic2V0IG9mIHByb3BlcnRpZXMgaW4gYW4gXG4gICAqIG9iamVjdCB3aGlsZSBpZ25vcmluZyBpbmhlcml0ZWQgcHJvcGVydGllcy5cbiAgICogXG4gICAqICAgICBhc3NlcnQub3duSW5jbHVkZSh7IGE6IDEgfSwgeyBhOiAxIH0pO1xuICAgKiBcbiAgICogQG5hbWUgb3duSW5jbHVkZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaGF5c3RhY2tcbiAgICogQHBhcmFtIHtPYmplY3R9IG5lZWRsZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQub3duSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQub3duSW5jbHVkZSwgdHJ1ZSkub3duLmluY2x1ZGUoaW5jKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RPd25JbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICogXG4gICAqIEFzc2VydHMgdGhhdCAnaGF5c3RhY2snIGluY2x1ZGVzICduZWVkbGUnLlxuICAgKiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIGFic2VuY2Ugb2YgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhbiBcbiAgICogb2JqZWN0IHdoaWxlIGlnbm9yaW5nIGluaGVyaXRlZCBwcm9wZXJ0aWVzLlxuICAgKiBcbiAgICogICAgIE9iamVjdC5wcm90b3R5cGUuYiA9IDI7XG4gICAqIFxuICAgKiAgICAgYXNzZXJ0Lm5vdE93bkluY2x1ZGUoeyBhOiAxIH0sIHsgYjogMiB9KTtcbiAgICogXG4gICAqIEBuYW1lIG5vdE93bkluY2x1ZGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGhheXN0YWNrXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdE93bkluY2x1ZGUgPSBmdW5jdGlvbihleHAsIGluYywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE93bkluY2x1ZGUsIHRydWUpLm5vdC5vd24uaW5jbHVkZShpbmMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmRlZXBPd25JbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICogXG4gICAqIEFzc2VydHMgdGhhdCAnaGF5c3RhY2snIGluY2x1ZGVzICduZWVkbGUnLlxuICAgKiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIGluY2x1c2lvbiBvZiBhIHN1YnNldCBvZiBwcm9wZXJ0aWVzIGluIGFuIFxuICAgKiBvYmplY3Qgd2hpbGUgaWdub3JpbmcgaW5oZXJpdGVkIHByb3BlcnRpZXMgYW5kIGNoZWNraW5nIGZvciBkZWVwIGVxdWFsaXR5LlxuICAgKiBcbiAgICogICAgICBhc3NlcnQuZGVlcE93bkluY2x1ZGUoe2E6IHtiOiAyfX0sIHthOiB7YjogMn19KTtcbiAgICogICAgICBcbiAgICogQG5hbWUgZGVlcE93bkluY2x1ZGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGhheXN0YWNrXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBuZWVkbGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRlZXBPd25JbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5kZWVwT3duSW5jbHVkZSwgdHJ1ZSlcbiAgICAgIC5kZWVwLm93bi5pbmNsdWRlKGluYyk7XG4gIH07XG5cbiAgIC8qKlxuICAgKiAjIyMgLm5vdERlZXBPd25JbmNsdWRlKGhheXN0YWNrLCBuZWVkbGUsIFttZXNzYWdlXSlcbiAgICogXG4gICAqIEFzc2VydHMgdGhhdCAnaGF5c3RhY2snIGluY2x1ZGVzICduZWVkbGUnLlxuICAgKiBDYW4gYmUgdXNlZCB0byBhc3NlcnQgdGhlIGFic2VuY2Ugb2YgYSBzdWJzZXQgb2YgcHJvcGVydGllcyBpbiBhbiBcbiAgICogb2JqZWN0IHdoaWxlIGlnbm9yaW5nIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGFuZCBjaGVja2luZyBmb3IgZGVlcCBlcXVhbGl0eS5cbiAgICogXG4gICAqICAgICAgYXNzZXJ0Lm5vdERlZXBPd25JbmNsdWRlKHthOiB7YjogMn19LCB7YToge2M6IDN9fSk7XG4gICAqICAgICAgXG4gICAqIEBuYW1lIG5vdERlZXBPd25JbmNsdWRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBoYXlzdGFja1xuICAgKiBAcGFyYW0ge09iamVjdH0gbmVlZGxlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3REZWVwT3duSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90RGVlcE93bkluY2x1ZGUsIHRydWUpXG4gICAgICAubm90LmRlZXAub3duLmluY2x1ZGUoaW5jKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5tYXRjaCh2YWx1ZSwgcmVnZXhwLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgdmFsdWVgIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBgcmVnZXhwYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5tYXRjaCgnZm9vYmFyJywgL15mb28vLCAncmVnZXhwIG1hdGNoZXMnKTtcbiAgICpcbiAgICogQG5hbWUgbWF0Y2hcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubWF0Y2ggPSBmdW5jdGlvbiAoZXhwLCByZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm1hdGNoLCB0cnVlKS50by5tYXRjaChyZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90TWF0Y2godmFsdWUsIHJlZ2V4cCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHZhbHVlYCBkb2VzIG5vdCBtYXRjaCB0aGUgcmVndWxhciBleHByZXNzaW9uIGByZWdleHBgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdE1hdGNoKCdmb29iYXInLCAvXmZvby8sICdyZWdleHAgZG9lcyBub3QgbWF0Y2gnKTtcbiAgICpcbiAgICogQG5hbWUgbm90TWF0Y2hcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90TWF0Y2ggPSBmdW5jdGlvbiAoZXhwLCByZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE1hdGNoLCB0cnVlKS50by5ub3QubWF0Y2gocmUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLnByb3BlcnR5KG9iamVjdCwgcHJvcGVydHksIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZWQgYnlcbiAgICogYHByb3BlcnR5YC5cbiAgICpcbiAgICogICAgIGFzc2VydC5wcm9wZXJ0eSh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0ZWEnKTtcbiAgICogICAgIGFzc2VydC5wcm9wZXJ0eSh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0b1N0cmluZycpO1xuICAgKlxuICAgKiBAbmFtZSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQucHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQucHJvcGVydHksIHRydWUpLnRvLmhhdmUucHJvcGVydHkocHJvcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90UHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgZG9lcyBfbm90XyBoYXZlIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lZFxuICAgKiBieSBgcHJvcGVydHlgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdFByb3BlcnR5KHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9fSwgJ2NvZmZlZScpO1xuICAgKlxuICAgKiBAbmFtZSBub3RQcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90UHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90UHJvcGVydHksIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUucHJvcGVydHkocHJvcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAucHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZWQgYnlcbiAgICogYHByb3BlcnR5YCB3aXRoIGEgdmFsdWUgZ2l2ZW4gYnkgYHZhbHVlYC4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVja1xuICAgKiAoPT09KS5cbiAgICpcbiAgICogICAgIGFzc2VydC5wcm9wZXJ0eVZhbCh7IHRlYTogJ2lzIGdvb2QnIH0sICd0ZWEnLCAnaXMgZ29vZCcpO1xuICAgKlxuICAgKiBAbmFtZSBwcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQucHJvcGVydHlWYWwgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5wcm9wZXJ0eVZhbCwgdHJ1ZSlcbiAgICAgIC50by5oYXZlLnByb3BlcnR5KHByb3AsIHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90UHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGRvZXMgX25vdF8gaGF2ZSBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgbmFtZWRcbiAgICogYnkgYHByb3BlcnR5YCB3aXRoIHZhbHVlIGdpdmVuIGJ5IGB2YWx1ZWAuIFVzZXMgYSBzdHJpY3QgZXF1YWxpdHkgY2hlY2tcbiAgICogKD09PSkuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90UHJvcGVydHlWYWwoeyB0ZWE6ICdpcyBnb29kJyB9LCAndGVhJywgJ2lzIGJhZCcpO1xuICAgKiAgICAgYXNzZXJ0Lm5vdFByb3BlcnR5VmFsKHsgdGVhOiAnaXMgZ29vZCcgfSwgJ2NvZmZlZScsICdpcyBnb29kJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdFByb3BlcnR5VmFsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uIChvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5vdFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLnByb3BlcnR5KHByb3AsIHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcFByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVkIGJ5XG4gICAqIGBwcm9wZXJ0eWAgd2l0aCBhIHZhbHVlIGdpdmVuIGJ5IGB2YWx1ZWAuIFVzZXMgYSBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmRlZXBQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfSB9LCAndGVhJywgeyBncmVlbjogJ21hdGNoYScgfSk7XG4gICAqXG4gICAqIEBuYW1lIGRlZXBQcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZGVlcFByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZGVlcFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLmhhdmUuZGVlcC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm5vdERlZXBQcm9wZXJ0eVZhbChvYmplY3QsIHByb3BlcnR5LCB2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgZG9lcyBfbm90XyBoYXZlIGEgZGlyZWN0IG9yIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lZFxuICAgKiBieSBgcHJvcGVydHlgIHdpdGggdmFsdWUgZ2l2ZW4gYnkgYHZhbHVlYC4gVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90RGVlcFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9IH0sICd0ZWEnLCB7IGJsYWNrOiAnbWF0Y2hhJyB9KTtcbiAgICogICAgIGFzc2VydC5ub3REZWVwUHJvcGVydHlWYWwoeyB0ZWE6IHsgZ3JlZW46ICdtYXRjaGEnIH0gfSwgJ3RlYScsIHsgZ3JlZW46ICdvb2xvbmcnIH0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdERlZXBQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfSB9LCAnY29mZmVlJywgeyBncmVlbjogJ21hdGNoYScgfSk7XG4gICAqXG4gICAqIEBuYW1lIG5vdERlZXBQcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90RGVlcFByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90RGVlcFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLmRlZXAucHJvcGVydHkocHJvcCwgdmFsKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5vd25Qcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YC4gSW5oZXJpdGVkXG4gICAqIHByb3BlcnRpZXMgYXJlbid0IGNoZWNrZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQub3duUHJvcGVydHkoeyB0ZWE6IHsgZ3JlZW46ICdtYXRjaGEnIH19LCAndGVhJyk7XG4gICAqXG4gICAqIEBuYW1lIG93blByb3BlcnR5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5vd25Qcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmosIHByb3AsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5vd25Qcm9wZXJ0eSwgdHJ1ZSlcbiAgICAgIC50by5oYXZlLm93bi5wcm9wZXJ0eShwcm9wKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RPd25Qcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBkb2VzIF9ub3RfIGhhdmUgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnlcbiAgICogYHByb3BlcnR5YC4gSW5oZXJpdGVkIHByb3BlcnRpZXMgYXJlbid0IGNoZWNrZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90T3duUHJvcGVydHkoeyB0ZWE6IHsgZ3JlZW46ICdtYXRjaGEnIH19LCAnY29mZmVlJyk7XG4gICAqICAgICBhc3NlcnQubm90T3duUHJvcGVydHkoe30sICd0b1N0cmluZycpO1xuICAgKlxuICAgKiBAbmFtZSBub3RPd25Qcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90T3duUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90T3duUHJvcGVydHksIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUub3duLnByb3BlcnR5KHByb3ApO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm93blByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YCBhbmQgYSB2YWx1ZVxuICAgKiBlcXVhbCB0byB0aGUgcHJvdmlkZWQgYHZhbHVlYC4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS5cbiAgICogSW5oZXJpdGVkIHByb3BlcnRpZXMgYXJlbid0IGNoZWNrZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQub3duUHJvcGVydHlWYWwoeyBjb2ZmZWU6ICdpcyBnb29kJ30sICdjb2ZmZWUnLCAnaXMgZ29vZCcpO1xuICAgKlxuICAgKiBAbmFtZSBvd25Qcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQub3duUHJvcGVydHlWYWwgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCB2YWx1ZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm93blByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLmhhdmUub3duLnByb3BlcnR5KHByb3AsIHZhbHVlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3RPd25Qcm9wZXJ0eVZhbChvYmplY3QsIHByb3BlcnR5LCB2YWx1ZSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgZG9lcyBfbm90XyBoYXZlIGEgZGlyZWN0IHByb3BlcnR5IG5hbWVkIGJ5IGBwcm9wZXJ0eWBcbiAgICogd2l0aCBhIHZhbHVlIGVxdWFsIHRvIHRoZSBwcm92aWRlZCBgdmFsdWVgLiBVc2VzIGEgc3RyaWN0IGVxdWFsaXR5IGNoZWNrXG4gICAqICg9PT0pLiBJbmhlcml0ZWQgcHJvcGVydGllcyBhcmVuJ3QgY2hlY2tlZC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RPd25Qcm9wZXJ0eVZhbCh7IHRlYTogJ2lzIGJldHRlcid9LCAndGVhJywgJ2lzIHdvcnNlJyk7XG4gICAqICAgICBhc3NlcnQubm90T3duUHJvcGVydHlWYWwoe30sICd0b1N0cmluZycsIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpO1xuICAgKlxuICAgKiBAbmFtZSBub3RPd25Qcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90T3duUHJvcGVydHlWYWwgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCB2YWx1ZSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5vdE93blByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcE93blByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YCBhbmQgYSB2YWx1ZVxuICAgKiBlcXVhbCB0byB0aGUgcHJvdmlkZWQgYHZhbHVlYC4gVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suIEluaGVyaXRlZFxuICAgKiBwcm9wZXJ0aWVzIGFyZW4ndCBjaGVja2VkLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmRlZXBPd25Qcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfSB9LCAndGVhJywgeyBncmVlbjogJ21hdGNoYScgfSk7XG4gICAqXG4gICAqIEBuYW1lIGRlZXBPd25Qcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZGVlcE93blByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsdWUsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5kZWVwT3duUHJvcGVydHlWYWwsIHRydWUpXG4gICAgICAudG8uaGF2ZS5kZWVwLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90RGVlcE93blByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBkb2VzIF9ub3RfIGhhdmUgYSBkaXJlY3QgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YFxuICAgKiB3aXRoIGEgdmFsdWUgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIGB2YWx1ZWAuIFVzZXMgYSBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKiBJbmhlcml0ZWQgcHJvcGVydGllcyBhcmVuJ3QgY2hlY2tlZC5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3REZWVwT3duUHJvcGVydHlWYWwoeyB0ZWE6IHsgZ3JlZW46ICdtYXRjaGEnIH0gfSwgJ3RlYScsIHsgYmxhY2s6ICdtYXRjaGEnIH0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfSB9LCAndGVhJywgeyBncmVlbjogJ29vbG9uZycgfSk7XG4gICAqICAgICBhc3NlcnQubm90RGVlcE93blByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9IH0sICdjb2ZmZWUnLCB7IGdyZWVuOiAnbWF0Y2hhJyB9KTtcbiAgICogICAgIGFzc2VydC5ub3REZWVwT3duUHJvcGVydHlWYWwoe30sICd0b1N0cmluZycsIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpO1xuICAgKlxuICAgKiBAbmFtZSBub3REZWVwT3duUHJvcGVydHlWYWxcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uIChvYmosIHByb3AsIHZhbHVlLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90RGVlcE93blByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLmRlZXAub3duLnByb3BlcnR5KHByb3AsIHZhbHVlKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5uZXN0ZWRQcm9wZXJ0eShvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVkIGJ5XG4gICAqIGBwcm9wZXJ0eWAsIHdoaWNoIGNhbiBiZSBhIHN0cmluZyB1c2luZyBkb3QtIGFuZCBicmFja2V0LW5vdGF0aW9uIGZvclxuICAgKiBuZXN0ZWQgcmVmZXJlbmNlLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5lc3RlZFByb3BlcnR5KHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9fSwgJ3RlYS5ncmVlbicpO1xuICAgKlxuICAgKiBAbmFtZSBuZXN0ZWRQcm9wZXJ0eVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubmVzdGVkUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBwcm9wLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubmVzdGVkUHJvcGVydHksIHRydWUpXG4gICAgICAudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkocHJvcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90TmVzdGVkUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgZG9lcyBfbm90XyBoYXZlIGEgcHJvcGVydHkgbmFtZWQgYnkgYHByb3BlcnR5YCwgd2hpY2hcbiAgICogY2FuIGJlIGEgc3RyaW5nIHVzaW5nIGRvdC0gYW5kIGJyYWNrZXQtbm90YXRpb24gZm9yIG5lc3RlZCByZWZlcmVuY2UuIFRoZVxuICAgKiBwcm9wZXJ0eSBjYW5ub3QgZXhpc3Qgb24gdGhlIG9iamVjdCBub3IgYW55d2hlcmUgaW4gaXRzIHByb3RvdHlwZSBjaGFpbi5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eSh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0ZWEub29sb25nJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdE5lc3RlZFByb3BlcnR5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmosIHByb3AsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eSwgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5uZXN0ZWQucHJvcGVydHkocHJvcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubmVzdGVkUHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhIHByb3BlcnR5IG5hbWVkIGJ5IGBwcm9wZXJ0eWAgd2l0aCB2YWx1ZSBnaXZlblxuICAgKiBieSBgdmFsdWVgLiBgcHJvcGVydHlgIGNhbiB1c2UgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3IgbmVzdGVkXG4gICAqIHJlZmVyZW5jZS4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS5cbiAgICpcbiAgICogICAgIGFzc2VydC5uZXN0ZWRQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0ZWEuZ3JlZW4nLCAnbWF0Y2hhJyk7XG4gICAqXG4gICAqIEBuYW1lIG5lc3RlZFByb3BlcnR5VmFsXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5XG4gICAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5uZXN0ZWRQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uIChvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5lc3RlZFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLmhhdmUubmVzdGVkLnByb3BlcnR5KHByb3AsIHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAubm90TmVzdGVkUHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGRvZXMgX25vdF8gaGF2ZSBhIHByb3BlcnR5IG5hbWVkIGJ5IGBwcm9wZXJ0eWAgd2l0aFxuICAgKiB2YWx1ZSBnaXZlbiBieSBgdmFsdWVgLiBgcHJvcGVydHlgIGNhbiB1c2UgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3JcbiAgICogbmVzdGVkIHJlZmVyZW5jZS4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogJ21hdGNoYScgfX0sICd0ZWEuZ3JlZW4nLCAna29uYWNoYScpO1xuICAgKiAgICAgYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiAnbWF0Y2hhJyB9fSwgJ2NvZmZlZS5ncmVlbicsICdtYXRjaGEnKTtcbiAgICpcbiAgICogQG5hbWUgbm90TmVzdGVkUHJvcGVydHlWYWxcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90TmVzdGVkUHJvcGVydHlWYWwsIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUubmVzdGVkLnByb3BlcnR5KHByb3AsIHZhbCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuZGVlcE5lc3RlZFByb3BlcnR5VmFsKG9iamVjdCwgcHJvcGVydHksIHZhbHVlLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYSBwcm9wZXJ0eSBuYW1lZCBieSBgcHJvcGVydHlgIHdpdGggYSB2YWx1ZSBnaXZlblxuICAgKiBieSBgdmFsdWVgLiBgcHJvcGVydHlgIGNhbiB1c2UgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3IgbmVzdGVkXG4gICAqIHJlZmVyZW5jZS4gVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQuZGVlcE5lc3RlZFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiB7IG1hdGNoYTogJ3l1bScgfSB9IH0sICd0ZWEuZ3JlZW4nLCB7IG1hdGNoYTogJ3l1bScgfSk7XG4gICAqXG4gICAqIEBuYW1lIGRlZXBOZXN0ZWRQcm9wZXJ0eVZhbFxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eVxuICAgKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZGVlcE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZGVlcE5lc3RlZFByb3BlcnR5VmFsLCB0cnVlKVxuICAgICAgLnRvLmhhdmUuZGVlcC5uZXN0ZWQucHJvcGVydHkocHJvcCwgdmFsKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5ub3REZWVwTmVzdGVkUHJvcGVydHlWYWwob2JqZWN0LCBwcm9wZXJ0eSwgdmFsdWUsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGRvZXMgX25vdF8gaGF2ZSBhIHByb3BlcnR5IG5hbWVkIGJ5IGBwcm9wZXJ0eWAgd2l0aFxuICAgKiB2YWx1ZSBnaXZlbiBieSBgdmFsdWVgLiBgcHJvcGVydHlgIGNhbiB1c2UgZG90LSBhbmQgYnJhY2tldC1ub3RhdGlvbiBmb3JcbiAgICogbmVzdGVkIHJlZmVyZW5jZS4gVXNlcyBhIGRlZXAgZXF1YWxpdHkgY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90RGVlcE5lc3RlZFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiB7IG1hdGNoYTogJ3l1bScgfSB9IH0sICd0ZWEuZ3JlZW4nLCB7IG9vbG9uZzogJ3l1bScgfSk7XG4gICAqICAgICBhc3NlcnQubm90RGVlcE5lc3RlZFByb3BlcnR5VmFsKHsgdGVhOiB7IGdyZWVuOiB7IG1hdGNoYTogJ3l1bScgfSB9IH0sICd0ZWEuZ3JlZW4nLCB7IG1hdGNoYTogJ3l1Y2snIH0pO1xuICAgKiAgICAgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRQcm9wZXJ0eVZhbCh7IHRlYTogeyBncmVlbjogeyBtYXRjaGE6ICd5dW0nIH0gfSB9LCAndGVhLmJsYWNrJywgeyBtYXRjaGE6ICd5dW0nIH0pO1xuICAgKlxuICAgKiBAbmFtZSBub3REZWVwTmVzdGVkUHJvcGVydHlWYWxcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsdWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uIChvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRQcm9wZXJ0eVZhbCwgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5kZWVwLm5lc3RlZC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubGVuZ3RoT2Yob2JqZWN0LCBsZW5ndGgsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGhhcyBhIGBsZW5ndGhgIHByb3BlcnR5IHdpdGggdGhlIGV4cGVjdGVkIHZhbHVlLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lmxlbmd0aE9mKFsxLDIsM10sIDMsICdhcnJheSBoYXMgbGVuZ3RoIG9mIDMnKTtcbiAgICogICAgIGFzc2VydC5sZW5ndGhPZignZm9vYmFyJywgNiwgJ3N0cmluZyBoYXMgbGVuZ3RoIG9mIDYnKTtcbiAgICpcbiAgICogQG5hbWUgbGVuZ3RoT2ZcbiAgICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7TnVtYmVyfSBsZW5ndGhcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lmxlbmd0aE9mID0gZnVuY3Rpb24gKGV4cCwgbGVuLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubGVuZ3RoT2YsIHRydWUpLnRvLmhhdmUubGVuZ3RoT2YobGVuKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5oYXNBbnlLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBga2V5c2AgcHJvdmlkZWQuXG4gICAqIFlvdSBjYW4gYWxzbyBwcm92aWRlIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIG9mIGEgYGtleXNgIGFycmF5IGFuZCBpdHMga2V5c1xuICAgKiB3aWxsIGJlIHVzZWQgYXMgdGhlIGV4cGVjdGVkIHNldCBvZiBrZXlzLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lmhhc0FueUtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCBbJ2ZvbycsICdpRG9udEV4aXN0JywgJ2JheiddKTtcbiAgICogICAgIGFzc2VydC5oYXNBbnlLZXlzKHtmb286IDEsIGJhcjogMiwgYmF6OiAzfSwge2ZvbzogMzAsIGlEb250RXhpc3Q6IDk5LCBiYXo6IDEzMzd9KTtcbiAgICogICAgIGFzc2VydC5oYXNBbnlLZXlzKG5ldyBNYXAoW1t7Zm9vOiAxfSwgJ2JhciddLCBbJ2tleScsICd2YWx1ZSddXSksIFt7Zm9vOiAxfSwgJ2tleSddKTtcbiAgICogICAgIGFzc2VydC5oYXNBbnlLZXlzKG5ldyBTZXQoW3tmb286ICdiYXInfSwgJ2Fub3RoZXJLZXknXSksIFt7Zm9vOiAnYmFyJ30sICdhbm90aGVyS2V5J10pO1xuICAgKlxuICAgKiBAbmFtZSBoYXNBbnlLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaGFzQW55S2V5cyA9IGZ1bmN0aW9uIChvYmosIGtleXMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5oYXNBbnlLZXlzLCB0cnVlKS50by5oYXZlLmFueS5rZXlzKGtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuaGFzQWxsS2V5cyhvYmplY3QsIFtrZXlzXSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaGFzIGFsbCBhbmQgb25seSBhbGwgb2YgdGhlIGBrZXlzYCBwcm92aWRlZC5cbiAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgYSBga2V5c2AgYXJyYXkgYW5kIGl0cyBrZXlzXG4gICAqIHdpbGwgYmUgdXNlZCBhcyB0aGUgZXhwZWN0ZWQgc2V0IG9mIGtleXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaGFzQWxsS2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIFsnZm9vJywgJ2JhcicsICdiYXonXSk7XG4gICAqICAgICBhc3NlcnQuaGFzQWxsS2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIHtmb286IDMwLCBiYXI6IDk5LCBiYXo6IDEzMzddKTtcbiAgICogICAgIGFzc2VydC5oYXNBbGxLZXlzKG5ldyBNYXAoW1t7Zm9vOiAxfSwgJ2JhciddLCBbJ2tleScsICd2YWx1ZSddXSksIFt7Zm9vOiAxfSwgJ2tleSddKTtcbiAgICogICAgIGFzc2VydC5oYXNBbGxLZXlzKG5ldyBTZXQoW3tmb286ICdiYXInfSwgJ2Fub3RoZXJLZXknXSwgW3tmb286ICdiYXInfSwgJ2Fub3RoZXJLZXknXSk7XG4gICAqXG4gICAqIEBuYW1lIGhhc0FsbEtleXNcbiAgICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nW119IGtleXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lmhhc0FsbEtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQWxsS2V5cywgdHJ1ZSkudG8uaGF2ZS5hbGwua2V5cyhrZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmNvbnRhaW5zQWxsS2V5cyhvYmplY3QsIFtrZXlzXSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaGFzIGFsbCBvZiB0aGUgYGtleXNgIHByb3ZpZGVkIGJ1dCBtYXkgaGF2ZSBtb3JlIGtleXMgbm90IGxpc3RlZC5cbiAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgYSBga2V5c2AgYXJyYXkgYW5kIGl0cyBrZXlzXG4gICAqIHdpbGwgYmUgdXNlZCBhcyB0aGUgZXhwZWN0ZWQgc2V0IG9mIGtleXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxLZXlzKHtmb286IDEsIGJhcjogMiwgYmF6OiAzfSwgWydmb28nLCAnYmF6J10pO1xuICAgKiAgICAgYXNzZXJ0LmNvbnRhaW5zQWxsS2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIFsnZm9vJywgJ2JhcicsICdiYXonXSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxLZXlzKHtmb286IDEsIGJhcjogMiwgYmF6OiAzfSwge2ZvbzogMzAsIGJhejogMTMzN30pO1xuICAgKiAgICAgYXNzZXJ0LmNvbnRhaW5zQWxsS2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIHtmb286IDMwLCBiYXI6IDk5LCBiYXo6IDEzMzd9KTtcbiAgICogICAgIGFzc2VydC5jb250YWluc0FsbEtleXMobmV3IE1hcChbW3tmb286IDF9LCAnYmFyJ10sIFsna2V5JywgJ3ZhbHVlJ11dKSwgW3tmb286IDF9XSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxLZXlzKG5ldyBNYXAoW1t7Zm9vOiAxfSwgJ2JhciddLCBbJ2tleScsICd2YWx1ZSddXSksIFt7Zm9vOiAxfSwgJ2tleSddKTtcbiAgICogICAgIGFzc2VydC5jb250YWluc0FsbEtleXMobmV3IFNldChbe2ZvbzogJ2Jhcid9LCAnYW5vdGhlcktleSddLCBbe2ZvbzogJ2Jhcid9XSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxLZXlzKG5ldyBTZXQoW3tmb286ICdiYXInfSwgJ2Fub3RoZXJLZXknXSwgW3tmb286ICdiYXInfSwgJ2Fub3RoZXJLZXknXSk7XG4gICAqXG4gICAqIEBuYW1lIGNvbnRhaW5zQWxsS2V5c1xuICAgKiBAcGFyYW0ge01peGVkfSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmdbXX0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuY29udGFpbnNBbGxLZXlzID0gZnVuY3Rpb24gKG9iaiwga2V5cywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmNvbnRhaW5zQWxsS2V5cywgdHJ1ZSlcbiAgICAgIC50by5jb250YWluLmFsbC5rZXlzKGtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuZG9lc05vdEhhdmVBbnlLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgbm9uZSBvZiB0aGUgYGtleXNgIHByb3ZpZGVkLlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGBrZXlzYCBhcnJheSBhbmQgaXRzIGtleXNcbiAgICogd2lsbCBiZSB1c2VkIGFzIHRoZSBleHBlY3RlZCBzZXQgb2Yga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueUtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCBbJ29uZScsICd0d28nLCAnZXhhbXBsZSddKTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueUtleXMoe2ZvbzogMSwgYmFyOiAyLCBiYXo6IDN9LCB7b25lOiAxLCB0d286IDIsIGV4YW1wbGU6ICdmb28nfSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbnlLZXlzKG5ldyBNYXAoW1t7Zm9vOiAxfSwgJ2JhciddLCBbJ2tleScsICd2YWx1ZSddXSksIFt7b25lOiAndHdvJ30sICdleGFtcGxlJ10pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQW55S2V5cyhuZXcgU2V0KFt7Zm9vOiAnYmFyJ30sICdhbm90aGVyS2V5J10sIFt7b25lOiAndHdvJ30sICdleGFtcGxlJ10pO1xuICAgKlxuICAgKiBAbmFtZSBkb2VzTm90SGF2ZUFueUtleXNcbiAgICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nW119IGtleXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRvZXNOb3RIYXZlQW55S2V5cyA9IGZ1bmN0aW9uIChvYmosIGtleXMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5kb2VzTm90SGF2ZUFueUtleXMsIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUuYW55LmtleXMoa2V5cyk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5kb2VzTm90SGF2ZUFsbEtleXMob2JqZWN0LCBba2V5c10sIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGRvZXMgbm90IGhhdmUgYXQgbGVhc3Qgb25lIG9mIHRoZSBga2V5c2AgcHJvdmlkZWQuXG4gICAqIFlvdSBjYW4gYWxzbyBwcm92aWRlIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIG9mIGEgYGtleXNgIGFycmF5IGFuZCBpdHMga2V5c1xuICAgKiB3aWxsIGJlIHVzZWQgYXMgdGhlIGV4cGVjdGVkIHNldCBvZiBrZXlzLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQWxsS2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIFsnb25lJywgJ3R3bycsICdleGFtcGxlJ10pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQWxsS2V5cyh7Zm9vOiAxLCBiYXI6IDIsIGJhejogM30sIHtvbmU6IDEsIHR3bzogMiwgZXhhbXBsZTogJ2Zvbyd9KTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFsbEtleXMobmV3IE1hcChbW3tmb286IDF9LCAnYmFyJ10sIFsna2V5JywgJ3ZhbHVlJ11dKSwgW3tvbmU6ICd0d28nfSwgJ2V4YW1wbGUnXSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbGxLZXlzKG5ldyBTZXQoW3tmb286ICdiYXInfSwgJ2Fub3RoZXJLZXknXSwgW3tvbmU6ICd0d28nfSwgJ2V4YW1wbGUnXSk7XG4gICAqXG4gICAqIEBuYW1lIGRvZXNOb3RIYXZlQWxsS2V5c1xuICAgKiBAcGFyYW0ge01peGVkfSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmdbXX0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZG9lc05vdEhhdmVBbGxLZXlzID0gZnVuY3Rpb24gKG9iaiwga2V5cywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmRvZXNOb3RIYXZlQWxsS2V5cywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5hbGwua2V5cyhrZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmhhc0FueURlZXBLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgYXQgbGVhc3Qgb25lIG9mIHRoZSBga2V5c2AgcHJvdmlkZWQuXG4gICAqIFNpbmNlIFNldHMgYW5kIE1hcHMgY2FuIGhhdmUgb2JqZWN0cyBhcyBrZXlzIHlvdSBjYW4gdXNlIHRoaXMgYXNzZXJ0aW9uIHRvIHBlcmZvcm1cbiAgICogYSBkZWVwIGNvbXBhcmlzb24uXG4gICAqIFlvdSBjYW4gYWxzbyBwcm92aWRlIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIG9mIGEgYGtleXNgIGFycmF5IGFuZCBpdHMga2V5c1xuICAgKiB3aWxsIGJlIHVzZWQgYXMgdGhlIGV4cGVjdGVkIHNldCBvZiBrZXlzLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lmhhc0FueURlZXBLZXlzKG5ldyBNYXAoW1t7b25lOiAnb25lJ30sICd2YWx1ZU9uZSddLCBbMSwgMl1dKSwge29uZTogJ29uZSd9KTtcbiAgICogICAgIGFzc2VydC5oYXNBbnlEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgWzEsIDJdXSksIFt7b25lOiAnb25lJ30sIHt0d286ICd0d28nfV0pO1xuICAgKiAgICAgYXNzZXJ0Lmhhc0FueURlZXBLZXlzKG5ldyBNYXAoW1t7b25lOiAnb25lJ30sICd2YWx1ZU9uZSddLCBbe3R3bzogJ3R3byd9LCAndmFsdWVUd28nXV0pLCBbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKTtcbiAgICogICAgIGFzc2VydC5oYXNBbnlEZWVwS2V5cyhuZXcgU2V0KFt7b25lOiAnb25lJ30sIHt0d286ICd0d28nfV0pLCB7b25lOiAnb25lJ30pO1xuICAgKiAgICAgYXNzZXJ0Lmhhc0FueURlZXBLZXlzKG5ldyBTZXQoW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSksIFt7b25lOiAnb25lJ30sIHt0aHJlZTogJ3RocmVlJ31dKTtcbiAgICogICAgIGFzc2VydC5oYXNBbnlEZWVwS2V5cyhuZXcgU2V0KFt7b25lOiAnb25lJ30sIHt0d286ICd0d28nfV0pLCBbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdEhhdmVBbGxLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaGFzQW55RGVlcEtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQW55RGVlcEtleXMsIHRydWUpXG4gICAgICAudG8uaGF2ZS5hbnkuZGVlcC5rZXlzKGtleXMpO1xuICB9XG5cbiAvKipcbiAgICogIyMjIC5oYXNBbGxEZWVwS2V5cyhvYmplY3QsIFtrZXlzXSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaGFzIGFsbCBhbmQgb25seSBhbGwgb2YgdGhlIGBrZXlzYCBwcm92aWRlZC5cbiAgICogU2luY2UgU2V0cyBhbmQgTWFwcyBjYW4gaGF2ZSBvYmplY3RzIGFzIGtleXMgeW91IGNhbiB1c2UgdGhpcyBhc3NlcnRpb24gdG8gcGVyZm9ybVxuICAgKiBhIGRlZXAgY29tcGFyaXNvbi5cbiAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgYSBga2V5c2AgYXJyYXkgYW5kIGl0cyBrZXlzXG4gICAqIHdpbGwgYmUgdXNlZCBhcyB0aGUgZXhwZWN0ZWQgc2V0IG9mIGtleXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaGFzQWxsRGVlcEtleXMobmV3IE1hcChbW3tvbmU6ICdvbmUnfSwgJ3ZhbHVlT25lJ11dKSwge29uZTogJ29uZSd9KTtcbiAgICogICAgIGFzc2VydC5oYXNBbGxEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqICAgICBhc3NlcnQuaGFzQWxsRGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9XSksIHtvbmU6ICdvbmUnfSk7XG4gICAqICAgICBhc3NlcnQuaGFzQWxsRGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqXG4gICAqIEBuYW1lIGhhc0FsbERlZXBLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaGFzQWxsRGVlcEtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQWxsRGVlcEtleXMsIHRydWUpXG4gICAgICAudG8uaGF2ZS5hbGwuZGVlcC5rZXlzKGtleXMpO1xuICB9XG5cbiAvKipcbiAgICogIyMjIC5jb250YWluc0FsbERlZXBLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBjb250YWlucyBhbGwgb2YgdGhlIGBrZXlzYCBwcm92aWRlZC5cbiAgICogU2luY2UgU2V0cyBhbmQgTWFwcyBjYW4gaGF2ZSBvYmplY3RzIGFzIGtleXMgeW91IGNhbiB1c2UgdGhpcyBhc3NlcnRpb24gdG8gcGVyZm9ybVxuICAgKiBhIGRlZXAgY29tcGFyaXNvbi5cbiAgICogWW91IGNhbiBhbHNvIHByb3ZpZGUgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQgb2YgYSBga2V5c2AgYXJyYXkgYW5kIGl0cyBrZXlzXG4gICAqIHdpbGwgYmUgdXNlZCBhcyB0aGUgZXhwZWN0ZWQgc2V0IG9mIGtleXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgWzEsIDJdXSksIHtvbmU6ICdvbmUnfSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqICAgICBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyhuZXcgU2V0KFt7b25lOiAnb25lJ30sIHt0d286ICd0d28nfV0pLCB7b25lOiAnb25lJ30pO1xuICAgKiAgICAgYXNzZXJ0LmNvbnRhaW5zQWxsRGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwgW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSk7XG4gICAqXG4gICAqIEBuYW1lIGNvbnRhaW5zQWxsRGVlcEtleXNcbiAgICogQHBhcmFtIHtNaXhlZH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBrZXlzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5jb250YWluc0FsbERlZXBLZXlzID0gZnVuY3Rpb24gKG9iaiwga2V5cywgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmNvbnRhaW5zQWxsRGVlcEtleXMsIHRydWUpXG4gICAgICAudG8uY29udGFpbi5hbGwuZGVlcC5rZXlzKGtleXMpO1xuICB9XG5cbiAvKipcbiAgICogIyMjIC5kb2VzTm90SGF2ZUFueURlZXBLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBoYXMgbm9uZSBvZiB0aGUgYGtleXNgIHByb3ZpZGVkLlxuICAgKiBTaW5jZSBTZXRzIGFuZCBNYXBzIGNhbiBoYXZlIG9iamVjdHMgYXMga2V5cyB5b3UgY2FuIHVzZSB0aGlzIGFzc2VydGlvbiB0byBwZXJmb3JtXG4gICAqIGEgZGVlcCBjb21wYXJpc29uLlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGBrZXlzYCBhcnJheSBhbmQgaXRzIGtleXNcbiAgICogd2lsbCBiZSB1c2VkIGFzIHRoZSBleHBlY3RlZCBzZXQgb2Yga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzKG5ldyBNYXAoW1t7b25lOiAnb25lJ30sICd2YWx1ZU9uZSddLCBbMSwgMl1dKSwge3RoaXNEb2VzTm90OiAnZXhpc3QnfSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbnlEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3t0d2VudHk6ICd0d2VudHknfSwge2ZpZnR5OiAnZmlmdHknfV0pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQW55RGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwge3R3ZW50eTogJ3R3ZW50eSd9KTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzKG5ldyBTZXQoW3tvbmU6ICdvbmUnfSwge3R3bzogJ3R3byd9XSksIFt7dHdlbnR5OiAndHdlbnR5J30sIHtmaWZ0eTogJ2ZpZnR5J31dKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdEhhdmVBbnlEZWVwS2V5c1xuICAgKiBAcGFyYW0ge01peGVkfSBvYmplY3RcbiAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGtleXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRvZXNOb3RIYXZlQW55RGVlcEtleXMgPSBmdW5jdGlvbiAob2JqLCBrZXlzLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZG9lc05vdEhhdmVBbnlEZWVwS2V5cywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5hbnkuZGVlcC5rZXlzKGtleXMpO1xuICB9XG5cbiAvKipcbiAgICogIyMjIC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzKG9iamVjdCwgW2tleXNdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBkb2VzIG5vdCBoYXZlIGF0IGxlYXN0IG9uZSBvZiB0aGUgYGtleXNgIHByb3ZpZGVkLlxuICAgKiBTaW5jZSBTZXRzIGFuZCBNYXBzIGNhbiBoYXZlIG9iamVjdHMgYXMga2V5cyB5b3UgY2FuIHVzZSB0aGlzIGFzc2VydGlvbiB0byBwZXJmb3JtXG4gICAqIGEgZGVlcCBjb21wYXJpc29uLlxuICAgKiBZb3UgY2FuIGFsc28gcHJvdmlkZSBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGBrZXlzYCBhcnJheSBhbmQgaXRzIGtleXNcbiAgICogd2lsbCBiZSB1c2VkIGFzIHRoZSBleHBlY3RlZCBzZXQgb2Yga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzKG5ldyBNYXAoW1t7b25lOiAnb25lJ30sICd2YWx1ZU9uZSddLCBbMSwgMl1dKSwge3RoaXNEb2VzTm90OiAnZXhpc3QnfSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbGxEZWVwS2V5cyhuZXcgTWFwKFtbe29uZTogJ29uZSd9LCAndmFsdWVPbmUnXSwgW3t0d286ICd0d28nfSwgJ3ZhbHVlVHdvJ11dKSwgW3t0d2VudHk6ICd0d2VudHknfSwge29uZTogJ29uZSd9XSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdEhhdmVBbGxEZWVwS2V5cyhuZXcgU2V0KFt7b25lOiAnb25lJ30sIHt0d286ICd0d28nfV0pLCB7dHdlbnR5OiAndHdlbnR5J30pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RIYXZlQWxsRGVlcEtleXMobmV3IFNldChbe29uZTogJ29uZSd9LCB7dHdvOiAndHdvJ31dKSwgW3tvbmU6ICdvbmUnfSwge2ZpZnR5OiAnZmlmdHknfV0pO1xuICAgKlxuICAgKiBAbmFtZSBkb2VzTm90SGF2ZUFsbERlZXBLZXlzXG4gICAqIEBwYXJhbSB7TWl4ZWR9IG9iamVjdFxuICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0ga2V5c1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZG9lc05vdEhhdmVBbGxEZWVwS2V5cyA9IGZ1bmN0aW9uIChvYmosIGtleXMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLmFsbC5kZWVwLmtleXMoa2V5cyk7XG4gIH1cblxuIC8qKlxuICAgKiAjIyMgLnRocm93cyhmbiwgW2Vycm9yTGlrZS9zdHJpbmcvcmVnZXhwXSwgW3N0cmluZy9yZWdleHBdLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIElmIGBlcnJvckxpa2VgIGlzIGFuIGBFcnJvcmAgY29uc3RydWN0b3IsIGFzc2VydHMgdGhhdCBgZm5gIHdpbGwgdGhyb3cgYW4gZXJyb3IgdGhhdCBpcyBhblxuICAgKiBpbnN0YW5jZSBvZiBgZXJyb3JMaWtlYC5cbiAgICogSWYgYGVycm9yTGlrZWAgaXMgYW4gYEVycm9yYCBpbnN0YW5jZSwgYXNzZXJ0cyB0aGF0IHRoZSBlcnJvciB0aHJvd24gaXMgdGhlIHNhbWVcbiAgICogaW5zdGFuY2UgYXMgYGVycm9yTGlrZWAuXG4gICAqIElmIGBlcnJNc2dNYXRjaGVyYCBpcyBwcm92aWRlZCwgaXQgYWxzbyBhc3NlcnRzIHRoYXQgdGhlIGVycm9yIHRocm93biB3aWxsIGhhdmUgYVxuICAgKiBtZXNzYWdlIG1hdGNoaW5nIGBlcnJNc2dNYXRjaGVyYC5cbiAgICpcbiAgICogICAgIGFzc2VydC50aHJvd3MoZm4sICdmdW5jdGlvbiB0aHJvd3MgYSByZWZlcmVuY2UgZXJyb3InKTtcbiAgICogICAgIGFzc2VydC50aHJvd3MoZm4sIC9mdW5jdGlvbiB0aHJvd3MgYSByZWZlcmVuY2UgZXJyb3IvKTtcbiAgICogICAgIGFzc2VydC50aHJvd3MoZm4sIFJlZmVyZW5jZUVycm9yKTtcbiAgICogICAgIGFzc2VydC50aHJvd3MoZm4sIGVycm9ySW5zdGFuY2UpO1xuICAgKiAgICAgYXNzZXJ0LnRocm93cyhmbiwgUmVmZXJlbmNlRXJyb3IsICdFcnJvciB0aHJvd24gbXVzdCBiZSBhIFJlZmVyZW5jZUVycm9yIGFuZCBoYXZlIHRoaXMgbXNnJyk7XG4gICAqICAgICBhc3NlcnQudGhyb3dzKGZuLCBlcnJvckluc3RhbmNlLCAnRXJyb3IgdGhyb3duIG11c3QgYmUgdGhlIHNhbWUgZXJyb3JJbnN0YW5jZSBhbmQgaGF2ZSB0aGlzIG1zZycpO1xuICAgKiAgICAgYXNzZXJ0LnRocm93cyhmbiwgUmVmZXJlbmNlRXJyb3IsIC9FcnJvciB0aHJvd24gbXVzdCBiZSBhIFJlZmVyZW5jZUVycm9yIGFuZCBtYXRjaCB0aGlzLyk7XG4gICAqICAgICBhc3NlcnQudGhyb3dzKGZuLCBlcnJvckluc3RhbmNlLCAvRXJyb3IgdGhyb3duIG11c3QgYmUgdGhlIHNhbWUgZXJyb3JJbnN0YW5jZSBhbmQgbWF0Y2ggdGhpcy8pO1xuICAgKlxuICAgKiBAbmFtZSB0aHJvd3NcbiAgICogQGFsaWFzIHRocm93XG4gICAqIEBhbGlhcyBUaHJvd1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J8RXJyb3J9IGVycm9yTGlrZVxuICAgKiBAcGFyYW0ge1JlZ0V4cHxTdHJpbmd9IGVyck1zZ01hdGNoZXJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9FcnJvciNFcnJvcl90eXBlc1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQudGhyb3dzID0gZnVuY3Rpb24gKGZuLCBlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIsIG1zZykge1xuICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIGVycm9yTGlrZSB8fCBlcnJvckxpa2UgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgIGVyck1zZ01hdGNoZXIgPSBlcnJvckxpa2U7XG4gICAgICBlcnJvckxpa2UgPSBudWxsO1xuICAgIH1cblxuICAgIHZhciBhc3NlcnRFcnIgPSBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC50aHJvd3MsIHRydWUpXG4gICAgICAudG8udGhyb3coZXJyb3JMaWtlLCBlcnJNc2dNYXRjaGVyKTtcbiAgICByZXR1cm4gZmxhZyhhc3NlcnRFcnIsICdvYmplY3QnKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5kb2VzTm90VGhyb3coZm4sIFtlcnJvckxpa2Uvc3RyaW5nL3JlZ2V4cF0sIFtzdHJpbmcvcmVnZXhwXSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBJZiBgZXJyb3JMaWtlYCBpcyBhbiBgRXJyb3JgIGNvbnN0cnVjdG9yLCBhc3NlcnRzIHRoYXQgYGZuYCB3aWxsIF9ub3RfIHRocm93IGFuIGVycm9yIHRoYXQgaXMgYW5cbiAgICogaW5zdGFuY2Ugb2YgYGVycm9yTGlrZWAuXG4gICAqIElmIGBlcnJvckxpa2VgIGlzIGFuIGBFcnJvcmAgaW5zdGFuY2UsIGFzc2VydHMgdGhhdCB0aGUgZXJyb3IgdGhyb3duIGlzIF9ub3RfIHRoZSBzYW1lXG4gICAqIGluc3RhbmNlIGFzIGBlcnJvckxpa2VgLlxuICAgKiBJZiBgZXJyTXNnTWF0Y2hlcmAgaXMgcHJvdmlkZWQsIGl0IGFsc28gYXNzZXJ0cyB0aGF0IHRoZSBlcnJvciB0aHJvd24gd2lsbCBfbm90XyBoYXZlIGFcbiAgICogbWVzc2FnZSBtYXRjaGluZyBgZXJyTXNnTWF0Y2hlcmAuXG4gICAqXG4gICAqICAgICBhc3NlcnQuZG9lc05vdFRocm93KGZuLCAnQW55IEVycm9yIHRocm93biBtdXN0IG5vdCBoYXZlIHRoaXMgbWVzc2FnZScpO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdyhmbiwgL0FueSBFcnJvciB0aHJvd24gbXVzdCBub3QgbWF0Y2ggdGhpcy8pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdyhmbiwgRXJyb3IpO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdyhmbiwgZXJyb3JJbnN0YW5jZSk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdFRocm93KGZuLCBFcnJvciwgJ0Vycm9yIG11c3Qgbm90IGhhdmUgdGhpcyBtZXNzYWdlJyk7XG4gICAqICAgICBhc3NlcnQuZG9lc05vdFRocm93KGZuLCBlcnJvckluc3RhbmNlLCAnRXJyb3IgbXVzdCBub3QgaGF2ZSB0aGlzIG1lc3NhZ2UnKTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90VGhyb3coZm4sIEVycm9yLCAvRXJyb3IgbXVzdCBub3QgbWF0Y2ggdGhpcy8pO1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdyhmbiwgZXJyb3JJbnN0YW5jZSwgL0Vycm9yIG11c3Qgbm90IG1hdGNoIHRoaXMvKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdFRocm93XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gICAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gZXJyb3JMaWtlXG4gICAqIEBwYXJhbSB7UmVnRXhwfFN0cmluZ30gZXJyTXNnTWF0Y2hlclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yI0Vycm9yX3R5cGVzXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kb2VzTm90VGhyb3cgPSBmdW5jdGlvbiAoZm4sIGVycm9yTGlrZSwgZXJyTXNnTWF0Y2hlciwgbXNnKSB7XG4gICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgZXJyb3JMaWtlIHx8IGVycm9yTGlrZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgZXJyTXNnTWF0Y2hlciA9IGVycm9yTGlrZTtcbiAgICAgIGVycm9yTGlrZSA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdFRocm93LCB0cnVlKVxuICAgICAgLnRvLm5vdC50aHJvdyhlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLm9wZXJhdG9yKHZhbDEsIG9wZXJhdG9yLCB2YWwyLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIENvbXBhcmVzIHR3byB2YWx1ZXMgdXNpbmcgYG9wZXJhdG9yYC5cbiAgICpcbiAgICogICAgIGFzc2VydC5vcGVyYXRvcigxLCAnPCcsIDIsICdldmVyeXRoaW5nIGlzIG9rJyk7XG4gICAqICAgICBhc3NlcnQub3BlcmF0b3IoMSwgJz4nLCAyLCAndGhpcyB3aWxsIGZhaWwnKTtcbiAgICpcbiAgICogQG5hbWUgb3BlcmF0b3JcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsMVxuICAgKiBAcGFyYW0ge1N0cmluZ30gb3BlcmF0b3JcbiAgICogQHBhcmFtIHtNaXhlZH0gdmFsMlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQub3BlcmF0b3IgPSBmdW5jdGlvbiAodmFsLCBvcGVyYXRvciwgdmFsMiwgbXNnKSB7XG4gICAgdmFyIG9rO1xuICAgIHN3aXRjaChvcGVyYXRvcikge1xuICAgICAgY2FzZSAnPT0nOlxuICAgICAgICBvayA9IHZhbCA9PSB2YWwyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJz09PSc6XG4gICAgICAgIG9rID0gdmFsID09PSB2YWwyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJz4nOlxuICAgICAgICBvayA9IHZhbCA+IHZhbDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnPj0nOlxuICAgICAgICBvayA9IHZhbCA+PSB2YWwyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJzwnOlxuICAgICAgICBvayA9IHZhbCA8IHZhbDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnPD0nOlxuICAgICAgICBvayA9IHZhbCA8PSB2YWwyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyE9JzpcbiAgICAgICAgb2sgPSB2YWwgIT0gdmFsMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICchPT0nOlxuICAgICAgICBvayA9IHZhbCAhPT0gdmFsMjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBtc2cgPSBtc2cgPyBtc2cgKyAnOiAnIDogbXNnO1xuICAgICAgICB0aHJvdyBuZXcgY2hhaS5Bc3NlcnRpb25FcnJvcihcbiAgICAgICAgICBtc2cgKyAnSW52YWxpZCBvcGVyYXRvciBcIicgKyBvcGVyYXRvciArICdcIicsXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIGFzc2VydC5vcGVyYXRvclxuICAgICAgICApO1xuICAgIH1cbiAgICB2YXIgdGVzdCA9IG5ldyBBc3NlcnRpb24ob2ssIG1zZywgYXNzZXJ0Lm9wZXJhdG9yLCB0cnVlKTtcbiAgICB0ZXN0LmFzc2VydChcbiAgICAgICAgdHJ1ZSA9PT0gZmxhZyh0ZXN0LCAnb2JqZWN0JylcbiAgICAgICwgJ2V4cGVjdGVkICcgKyB1dGlsLmluc3BlY3QodmFsKSArICcgdG8gYmUgJyArIG9wZXJhdG9yICsgJyAnICsgdXRpbC5pbnNwZWN0KHZhbDIpXG4gICAgICAsICdleHBlY3RlZCAnICsgdXRpbC5pbnNwZWN0KHZhbCkgKyAnIHRvIG5vdCBiZSAnICsgb3BlcmF0b3IgKyAnICcgKyB1dGlsLmluc3BlY3QodmFsMikgKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5jbG9zZVRvKGFjdHVhbCwgZXhwZWN0ZWQsIGRlbHRhLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCB0aGUgdGFyZ2V0IGlzIGVxdWFsIGBleHBlY3RlZGAsIHRvIHdpdGhpbiBhICsvLSBgZGVsdGFgIHJhbmdlLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmNsb3NlVG8oMS41LCAxLCAwLjUsICdudW1iZXJzIGFyZSBjbG9zZScpO1xuICAgKlxuICAgKiBAbmFtZSBjbG9zZVRvXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBhY3R1YWxcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGV4cGVjdGVkXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuY2xvc2VUbyA9IGZ1bmN0aW9uIChhY3QsIGV4cCwgZGVsdGEsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5jbG9zZVRvLCB0cnVlKS50by5iZS5jbG9zZVRvKGV4cCwgZGVsdGEpO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmFwcHJveGltYXRlbHkoYWN0dWFsLCBleHBlY3RlZCwgZGVsdGEsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgaXMgZXF1YWwgYGV4cGVjdGVkYCwgdG8gd2l0aGluIGEgKy8tIGBkZWx0YWAgcmFuZ2UuXG4gICAqXG4gICAqICAgICBhc3NlcnQuYXBwcm94aW1hdGVseSgxLjUsIDEsIDAuNSwgJ251bWJlcnMgYXJlIGNsb3NlJyk7XG4gICAqXG4gICAqIEBuYW1lIGFwcHJveGltYXRlbHlcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGFjdHVhbFxuICAgKiBAcGFyYW0ge051bWJlcn0gZXhwZWN0ZWRcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGRlbHRhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5hcHByb3hpbWF0ZWx5ID0gZnVuY3Rpb24gKGFjdCwgZXhwLCBkZWx0YSwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0LmFwcHJveGltYXRlbHksIHRydWUpXG4gICAgICAudG8uYmUuYXBwcm94aW1hdGVseShleHAsIGRlbHRhKTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5zYW1lTWVtYmVycyhzZXQxLCBzZXQyLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc2V0MWAgYW5kIGBzZXQyYCBoYXZlIHRoZSBzYW1lIG1lbWJlcnMgaW4gYW55IG9yZGVyLiBVc2VzIGFcbiAgICogc3RyaWN0IGVxdWFsaXR5IGNoZWNrICg9PT0pLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LnNhbWVNZW1iZXJzKFsgMSwgMiwgMyBdLCBbIDIsIDEsIDMgXSwgJ3NhbWUgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBzYW1lTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzZXQxXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LnNhbWVNZW1iZXJzID0gZnVuY3Rpb24gKHNldDEsIHNldDIsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQuc2FtZU1lbWJlcnMsIHRydWUpXG4gICAgICAudG8uaGF2ZS5zYW1lLm1lbWJlcnMoc2V0Mik7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5ub3RTYW1lTWVtYmVycyhzZXQxLCBzZXQyLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc2V0MWAgYW5kIGBzZXQyYCBkb24ndCBoYXZlIHRoZSBzYW1lIG1lbWJlcnMgaW4gYW55IG9yZGVyLlxuICAgKiBVc2VzIGEgc3RyaWN0IGVxdWFsaXR5IGNoZWNrICg9PT0pLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdFNhbWVNZW1iZXJzKFsgMSwgMiwgMyBdLCBbIDUsIDEsIDMgXSwgJ25vdCBzYW1lIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgbm90U2FtZU1lbWJlcnNcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MVxuICAgKiBAcGFyYW0ge0FycmF5fSBzZXQyXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RTYW1lTWVtYmVycyA9IGZ1bmN0aW9uIChzZXQxLCBzZXQyLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0Lm5vdFNhbWVNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLm5vdC5oYXZlLnNhbWUubWVtYmVycyhzZXQyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLnNhbWVEZWVwTWVtYmVycyhzZXQxLCBzZXQyLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc2V0MWAgYW5kIGBzZXQyYCBoYXZlIHRoZSBzYW1lIG1lbWJlcnMgaW4gYW55IG9yZGVyLiBVc2VzIGFcbiAgICogZGVlcCBlcXVhbGl0eSBjaGVjay5cbiAgICpcbiAgICogICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMoWyB7IGE6IDEgfSwgeyBiOiAyIH0sIHsgYzogMyB9IF0sIFt7IGI6IDIgfSwgeyBhOiAxIH0sIHsgYzogMyB9XSwgJ3NhbWUgZGVlcCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIHNhbWVEZWVwTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzZXQxXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LnNhbWVEZWVwTWVtYmVycyA9IGZ1bmN0aW9uIChzZXQxLCBzZXQyLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0LnNhbWVEZWVwTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5oYXZlLnNhbWUuZGVlcC5tZW1iZXJzKHNldDIpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubm90U2FtZURlZXBNZW1iZXJzKHNldDEsIHNldDIsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzZXQxYCBhbmQgYHNldDJgIGRvbid0IGhhdmUgdGhlIHNhbWUgbWVtYmVycyBpbiBhbnkgb3JkZXIuXG4gICAqIFVzZXMgYSBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdFNhbWVEZWVwTWVtYmVycyhbIHsgYTogMSB9LCB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgW3sgYjogMiB9LCB7IGE6IDEgfSwgeyBmOiA1IH1dLCAnbm90IHNhbWUgZGVlcCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdFNhbWVEZWVwTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzZXQxXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdFNhbWVEZWVwTWVtYmVycyA9IGZ1bmN0aW9uIChzZXQxLCBzZXQyLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0Lm5vdFNhbWVEZWVwTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5zYW1lLmRlZXAubWVtYmVycyhzZXQyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLnNhbWVPcmRlcmVkTWVtYmVycyhzZXQxLCBzZXQyLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc2V0MWAgYW5kIGBzZXQyYCBoYXZlIHRoZSBzYW1lIG1lbWJlcnMgaW4gdGhlIHNhbWUgb3JkZXIuXG4gICAqIFVzZXMgYSBzdHJpY3QgZXF1YWxpdHkgY2hlY2sgKD09PSkuXG4gICAqXG4gICAqICAgICBhc3NlcnQuc2FtZU9yZGVyZWRNZW1iZXJzKFsgMSwgMiwgMyBdLCBbIDEsIDIsIDMgXSwgJ3NhbWUgb3JkZXJlZCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIHNhbWVPcmRlcmVkTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzZXQxXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LnNhbWVPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uIChzZXQxLCBzZXQyLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0LnNhbWVPcmRlcmVkTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5oYXZlLnNhbWUub3JkZXJlZC5tZW1iZXJzKHNldDIpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubm90U2FtZU9yZGVyZWRNZW1iZXJzKHNldDEsIHNldDIsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzZXQxYCBhbmQgYHNldDJgIGRvbid0IGhhdmUgdGhlIHNhbWUgbWVtYmVycyBpbiB0aGUgc2FtZVxuICAgKiBvcmRlci4gVXNlcyBhIHN0cmljdCBlcXVhbGl0eSBjaGVjayAoPT09KS5cbiAgICpcbiAgICogICAgIGFzc2VydC5ub3RTYW1lT3JkZXJlZE1lbWJlcnMoWyAxLCAyLCAzIF0sIFsgMiwgMSwgMyBdLCAnbm90IHNhbWUgb3JkZXJlZCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdFNhbWVPcmRlcmVkTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzZXQxXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDJcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdFNhbWVPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uIChzZXQxLCBzZXQyLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0Lm5vdFNhbWVPcmRlcmVkTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5ub3QuaGF2ZS5zYW1lLm9yZGVyZWQubWVtYmVycyhzZXQyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLnNhbWVEZWVwT3JkZXJlZE1lbWJlcnMoc2V0MSwgc2V0MiwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHNldDFgIGFuZCBgc2V0MmAgaGF2ZSB0aGUgc2FtZSBtZW1iZXJzIGluIHRoZSBzYW1lIG9yZGVyLlxuICAgKiBVc2VzIGEgZGVlcCBlcXVhbGl0eSBjaGVjay5cbiAgICpcbiAgICogYXNzZXJ0LnNhbWVEZWVwT3JkZXJlZE1lbWJlcnMoWyB7IGE6IDEgfSwgeyBiOiAyIH0sIHsgYzogMyB9IF0sIFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCAnc2FtZSBkZWVwIG9yZGVyZWQgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBzYW1lRGVlcE9yZGVyZWRNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDFcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuc2FtZURlZXBPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uIChzZXQxLCBzZXQyLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0LnNhbWVEZWVwT3JkZXJlZE1lbWJlcnMsIHRydWUpXG4gICAgICAudG8uaGF2ZS5zYW1lLmRlZXAub3JkZXJlZC5tZW1iZXJzKHNldDIpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubm90U2FtZURlZXBPcmRlcmVkTWVtYmVycyhzZXQxLCBzZXQyLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc2V0MWAgYW5kIGBzZXQyYCBkb24ndCBoYXZlIHRoZSBzYW1lIG1lbWJlcnMgaW4gdGhlIHNhbWVcbiAgICogb3JkZXIuIFVzZXMgYSBkZWVwIGVxdWFsaXR5IGNoZWNrLlxuICAgKlxuICAgKiBhc3NlcnQubm90U2FtZURlZXBPcmRlcmVkTWVtYmVycyhbIHsgYTogMSB9LCB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgWyB7IGE6IDEgfSwgeyBiOiAyIH0sIHsgejogNSB9IF0sICdub3Qgc2FtZSBkZWVwIG9yZGVyZWQgbWVtYmVycycpO1xuICAgKiBhc3NlcnQubm90U2FtZURlZXBPcmRlcmVkTWVtYmVycyhbIHsgYTogMSB9LCB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgWyB7IGI6IDIgfSwgeyBhOiAxIH0sIHsgYzogMyB9IF0sICdub3Qgc2FtZSBkZWVwIG9yZGVyZWQgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBub3RTYW1lRGVlcE9yZGVyZWRNZW1iZXJzXG4gICAqIEBwYXJhbSB7QXJyYXl9IHNldDFcbiAgICogQHBhcmFtIHtBcnJheX0gc2V0MlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQubm90U2FtZURlZXBPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uIChzZXQxLCBzZXQyLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHNldDEsIG1zZywgYXNzZXJ0Lm5vdFNhbWVEZWVwT3JkZXJlZE1lbWJlcnMsIHRydWUpXG4gICAgICAudG8ubm90LmhhdmUuc2FtZS5kZWVwLm9yZGVyZWQubWVtYmVycyhzZXQyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmluY2x1ZGVNZW1iZXJzKHN1cGVyc2V0LCBzdWJzZXQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzdWJzZXRgIGlzIGluY2x1ZGVkIGluIGBzdXBlcnNldGAgaW4gYW55IG9yZGVyLiBVc2VzIGFcbiAgICogc3RyaWN0IGVxdWFsaXR5IGNoZWNrICg9PT0pLiBEdXBsaWNhdGVzIGFyZSBpZ25vcmVkLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmluY2x1ZGVNZW1iZXJzKFsgMSwgMiwgMyBdLCBbIDIsIDEsIDIgXSwgJ2luY2x1ZGUgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBpbmNsdWRlTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdXBlcnNldFxuICAgKiBAcGFyYW0ge0FycmF5fSBzdWJzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmluY2x1ZGVNZW1iZXJzID0gZnVuY3Rpb24gKHN1cGVyc2V0LCBzdWJzZXQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0LmluY2x1ZGVNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLmluY2x1ZGUubWVtYmVycyhzdWJzZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAubm90SW5jbHVkZU1lbWJlcnMoc3VwZXJzZXQsIHN1YnNldCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHN1YnNldGAgaXNuJ3QgaW5jbHVkZWQgaW4gYHN1cGVyc2V0YCBpbiBhbnkgb3JkZXIuIFVzZXMgYVxuICAgKiBzdHJpY3QgZXF1YWxpdHkgY2hlY2sgKD09PSkuIER1cGxpY2F0ZXMgYXJlIGlnbm9yZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZU1lbWJlcnMoWyAxLCAyLCAzIF0sIFsgNSwgMSBdLCAnbm90IGluY2x1ZGUgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBub3RJbmNsdWRlTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdXBlcnNldFxuICAgKiBAcGFyYW0ge0FycmF5fSBzdWJzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdEluY2x1ZGVNZW1iZXJzID0gZnVuY3Rpb24gKHN1cGVyc2V0LCBzdWJzZXQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0Lm5vdEluY2x1ZGVNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLm5vdC5pbmNsdWRlLm1lbWJlcnMoc3Vic2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmluY2x1ZGVEZWVwTWVtYmVycyhzdXBlcnNldCwgc3Vic2V0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc3Vic2V0YCBpcyBpbmNsdWRlZCBpbiBgc3VwZXJzZXRgIGluIGFueSBvcmRlci4gVXNlcyBhIGRlZXBcbiAgICogZXF1YWxpdHkgY2hlY2suIER1cGxpY2F0ZXMgYXJlIGlnbm9yZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCBbIHsgYjogMiB9LCB7IGE6IDEgfSwgeyBiOiAyIH0gXSwgJ2luY2x1ZGUgZGVlcCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIGluY2x1ZGVEZWVwTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdXBlcnNldFxuICAgKiBAcGFyYW0ge0FycmF5fSBzdWJzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyA9IGZ1bmN0aW9uIChzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1cGVyc2V0LCBtc2csIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMsIHRydWUpXG4gICAgICAudG8uaW5jbHVkZS5kZWVwLm1lbWJlcnMoc3Vic2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLm5vdEluY2x1ZGVEZWVwTWVtYmVycyhzdXBlcnNldCwgc3Vic2V0LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgc3Vic2V0YCBpc24ndCBpbmNsdWRlZCBpbiBgc3VwZXJzZXRgIGluIGFueSBvcmRlci4gVXNlcyBhXG4gICAqIGRlZXAgZXF1YWxpdHkgY2hlY2suIER1cGxpY2F0ZXMgYXJlIGlnbm9yZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZURlZXBNZW1iZXJzKFsgeyBhOiAxIH0sIHsgYjogMiB9LCB7IGM6IDMgfSBdLCBbIHsgYjogMiB9LCB7IGY6IDUgfSBdLCAnbm90IGluY2x1ZGUgZGVlcCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdEluY2x1ZGVEZWVwTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdXBlcnNldFxuICAgKiBAcGFyYW0ge0FycmF5fSBzdWJzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwTWVtYmVycyA9IGZ1bmN0aW9uIChzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1cGVyc2V0LCBtc2csIGFzc2VydC5ub3RJbmNsdWRlRGVlcE1lbWJlcnMsIHRydWUpXG4gICAgICAudG8ubm90LmluY2x1ZGUuZGVlcC5tZW1iZXJzKHN1YnNldCk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5pbmNsdWRlT3JkZXJlZE1lbWJlcnMoc3VwZXJzZXQsIHN1YnNldCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHN1YnNldGAgaXMgaW5jbHVkZWQgaW4gYHN1cGVyc2V0YCBpbiB0aGUgc2FtZSBvcmRlclxuICAgKiBiZWdpbm5pbmcgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBpbiBgc3VwZXJzZXRgLiBVc2VzIGEgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNoZWNrICg9PT0pLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmluY2x1ZGVPcmRlcmVkTWVtYmVycyhbIDEsIDIsIDMgXSwgWyAxLCAyIF0sICdpbmNsdWRlIG9yZGVyZWQgbWVtYmVycycpO1xuICAgKlxuICAgKiBAbmFtZSBpbmNsdWRlT3JkZXJlZE1lbWJlcnNcbiAgICogQHBhcmFtIHtBcnJheX0gc3VwZXJzZXRcbiAgICogQHBhcmFtIHtBcnJheX0gc3Vic2V0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pbmNsdWRlT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbiAoc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihzdXBlcnNldCwgbXNnLCBhc3NlcnQuaW5jbHVkZU9yZGVyZWRNZW1iZXJzLCB0cnVlKVxuICAgICAgLnRvLmluY2x1ZGUub3JkZXJlZC5tZW1iZXJzKHN1YnNldCk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5ub3RJbmNsdWRlT3JkZXJlZE1lbWJlcnMoc3VwZXJzZXQsIHN1YnNldCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYHN1YnNldGAgaXNuJ3QgaW5jbHVkZWQgaW4gYHN1cGVyc2V0YCBpbiB0aGUgc2FtZSBvcmRlclxuICAgKiBiZWdpbm5pbmcgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCBpbiBgc3VwZXJzZXRgLiBVc2VzIGEgc3RyaWN0IGVxdWFsaXR5XG4gICAqIGNoZWNrICg9PT0pLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm5vdEluY2x1ZGVPcmRlcmVkTWVtYmVycyhbIDEsIDIsIDMgXSwgWyAyLCAxIF0sICdub3QgaW5jbHVkZSBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICogICAgIGFzc2VydC5ub3RJbmNsdWRlT3JkZXJlZE1lbWJlcnMoWyAxLCAyLCAzIF0sIFsgMiwgMyBdLCAnbm90IGluY2x1ZGUgb3JkZXJlZCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdEluY2x1ZGVPcmRlcmVkTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdXBlcnNldFxuICAgKiBAcGFyYW0ge0FycmF5fSBzdWJzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0Lm5vdEluY2x1ZGVPcmRlcmVkTWVtYmVycyA9IGZ1bmN0aW9uIChzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1cGVyc2V0LCBtc2csIGFzc2VydC5ub3RJbmNsdWRlT3JkZXJlZE1lbWJlcnMsIHRydWUpXG4gICAgICAudG8ubm90LmluY2x1ZGUub3JkZXJlZC5tZW1iZXJzKHN1YnNldCk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5pbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzKHN1cGVyc2V0LCBzdWJzZXQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzdWJzZXRgIGlzIGluY2x1ZGVkIGluIGBzdXBlcnNldGAgaW4gdGhlIHNhbWUgb3JkZXJcbiAgICogYmVnaW5uaW5nIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgaW4gYHN1cGVyc2V0YC4gVXNlcyBhIGRlZXAgZXF1YWxpdHlcbiAgICogY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQuaW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycyhbIHsgYTogMSB9LCB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgWyB7IGE6IDEgfSwgeyBiOiAyIH0gXSwgJ2luY2x1ZGUgZGVlcCBvcmRlcmVkIG1lbWJlcnMnKTtcbiAgICpcbiAgICogQG5hbWUgaW5jbHVkZURlZXBPcmRlcmVkTWVtYmVyc1xuICAgKiBAcGFyYW0ge0FycmF5fSBzdXBlcnNldFxuICAgKiBAcGFyYW0ge0FycmF5fSBzdWJzZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2VcbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbiAoc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihzdXBlcnNldCwgbXNnLCBhc3NlcnQuaW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycywgdHJ1ZSlcbiAgICAgIC50by5pbmNsdWRlLmRlZXAub3JkZXJlZC5tZW1iZXJzKHN1YnNldCk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5ub3RJbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzKHN1cGVyc2V0LCBzdWJzZXQsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBzdWJzZXRgIGlzbid0IGluY2x1ZGVkIGluIGBzdXBlcnNldGAgaW4gdGhlIHNhbWUgb3JkZXJcbiAgICogYmVnaW5uaW5nIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgaW4gYHN1cGVyc2V0YC4gVXNlcyBhIGRlZXAgZXF1YWxpdHlcbiAgICogY2hlY2suXG4gICAqXG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycyhbIHsgYTogMSB9LCB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgWyB7IGE6IDEgfSwgeyBmOiA1IH0gXSwgJ25vdCBpbmNsdWRlIGRlZXAgb3JkZXJlZCBtZW1iZXJzJyk7XG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycyhbIHsgYTogMSB9LCB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgWyB7IGI6IDIgfSwgeyBhOiAxIH0gXSwgJ25vdCBpbmNsdWRlIGRlZXAgb3JkZXJlZCBtZW1iZXJzJyk7XG4gICAqICAgICBhc3NlcnQubm90SW5jbHVkZURlZXBPcmRlcmVkTWVtYmVycyhbIHsgYTogMSB9LCB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgWyB7IGI6IDIgfSwgeyBjOiAzIH0gXSwgJ25vdCBpbmNsdWRlIGRlZXAgb3JkZXJlZCBtZW1iZXJzJyk7XG4gICAqXG4gICAqIEBuYW1lIG5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnNcbiAgICogQHBhcmFtIHtBcnJheX0gc3VwZXJzZXRcbiAgICogQHBhcmFtIHtBcnJheX0gc3Vic2V0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5ub3RJbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24gKHN1cGVyc2V0LCBzdWJzZXQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMsIHRydWUpXG4gICAgICAudG8ubm90LmluY2x1ZGUuZGVlcC5vcmRlcmVkLm1lbWJlcnMoc3Vic2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLm9uZU9mKGluTGlzdCwgbGlzdCwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgbm9uLW9iamVjdCwgbm9uLWFycmF5IHZhbHVlIGBpbkxpc3RgIGFwcGVhcnMgaW4gdGhlIGZsYXQgYXJyYXkgYGxpc3RgLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0Lm9uZU9mKDEsIFsgMiwgMSBdLCAnTm90IGZvdW5kIGluIGxpc3QnKTtcbiAgICpcbiAgICogQG5hbWUgb25lT2ZcbiAgICogQHBhcmFtIHsqfSBpbkxpc3RcbiAgICogQHBhcmFtIHtBcnJheTwqPn0gbGlzdFxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQub25lT2YgPSBmdW5jdGlvbiAoaW5MaXN0LCBsaXN0LCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGluTGlzdCwgbXNnLCBhc3NlcnQub25lT2YsIHRydWUpLnRvLmJlLm9uZU9mKGxpc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuY2hhbmdlcyhmdW5jdGlvbiwgb2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBjaGFuZ2VzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5LlxuICAgKlxuICAgKiAgICAgdmFyIG9iaiA9IHsgdmFsOiAxMCB9O1xuICAgKiAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7IG9iai52YWwgPSAyMiB9O1xuICAgKiAgICAgYXNzZXJ0LmNoYW5nZXMoZm4sIG9iaiwgJ3ZhbCcpO1xuICAgKlxuICAgKiBAbmFtZSBjaGFuZ2VzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuY2hhbmdlcyA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtc2cgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuY2hhbmdlcywgdHJ1ZSkudG8uY2hhbmdlKG9iaiwgcHJvcCk7XG4gIH1cblxuICAgLyoqXG4gICAqICMjIyAuY2hhbmdlc0J5KGZ1bmN0aW9uLCBvYmplY3QsIHByb3BlcnR5LCBkZWx0YSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBjaGFuZ2VzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IGJ5IGFuIGFtb3VudCAoZGVsdGEpLlxuICAgKlxuICAgKiAgICAgdmFyIG9iaiA9IHsgdmFsOiAxMCB9O1xuICAgKiAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7IG9iai52YWwgKz0gMiB9O1xuICAgKiAgICAgYXNzZXJ0LmNoYW5nZXNCeShmbiwgb2JqLCAndmFsJywgMik7XG4gICAqXG4gICAqIEBuYW1lIGNoYW5nZXNCeVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2RpZmllciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IG9yIGdldHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgbmFtZSBfb3B0aW9uYWxfXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBjaGFuZ2UgYW1vdW50IChkZWx0YSlcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuY2hhbmdlc0J5ID0gZnVuY3Rpb24gKGZuLCBvYmosIHByb3AsIGRlbHRhLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgdG1wTXNnID0gZGVsdGE7XG4gICAgICBkZWx0YSA9IHByb3A7XG4gICAgICBtc2cgPSB0bXBNc2c7XG4gICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgICBkZWx0YSA9IHByb3A7XG4gICAgICBwcm9wID0gbnVsbDtcbiAgICB9XG5cbiAgICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5jaGFuZ2VzQnksIHRydWUpXG4gICAgICAudG8uY2hhbmdlKG9iaiwgcHJvcCkuYnkoZGVsdGEpO1xuICB9XG5cbiAgIC8qKlxuICAgKiAjIyMgLmRvZXNOb3RDaGFuZ2UoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGEgZnVuY3Rpb24gZG9lcyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5LlxuICAgKlxuICAgKiAgICAgdmFyIG9iaiA9IHsgdmFsOiAxMCB9O1xuICAgKiAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdmb28nKTsgfTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90Q2hhbmdlKGZuLCBvYmosICd2YWwnKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdENoYW5nZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2RpZmllciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IG9yIGdldHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgbmFtZSBfb3B0aW9uYWxfXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRvZXNOb3RDaGFuZ2UgPSBmdW5jdGlvbiAoZm4sIG9iaiwgcHJvcCwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbXNnID0gcHJvcDtcbiAgICAgIHByb3AgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kb2VzTm90Q2hhbmdlLCB0cnVlKVxuICAgICAgLnRvLm5vdC5jaGFuZ2Uob2JqLCBwcm9wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmNoYW5nZXNCdXROb3RCeShmdW5jdGlvbiwgb2JqZWN0LCBwcm9wZXJ0eSwgZGVsdGEsIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGEgZnVuY3Rpb24gZG9lcyBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IG9yIG9mIGEgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgYnkgYW4gYW1vdW50IChkZWx0YSlcbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsICs9IDEwIH07XG4gICAqICAgICBhc3NlcnQuY2hhbmdlc0J1dE5vdEJ5KGZuLCBvYmosICd2YWwnLCA1KTtcbiAgICpcbiAgICogQG5hbWUgY2hhbmdlc0J1dE5vdEJ5XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5jaGFuZ2VzQnV0Tm90QnkgPSBmdW5jdGlvbiAoZm4sIG9iaiwgcHJvcCwgZGVsdGEsIG1zZykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciB0bXBNc2cgPSBkZWx0YTtcbiAgICAgIGRlbHRhID0gcHJvcDtcbiAgICAgIG1zZyA9IHRtcE1zZztcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICAgIGRlbHRhID0gcHJvcDtcbiAgICAgIHByb3AgPSBudWxsO1xuICAgIH1cblxuICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmNoYW5nZXNCdXROb3RCeSwgdHJ1ZSlcbiAgICAgIC50by5jaGFuZ2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmluY3JlYXNlcyhmdW5jdGlvbiwgb2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBpbmNyZWFzZXMgYSBudW1lcmljIG9iamVjdCBwcm9wZXJ0eS5cbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsID0gMTMgfTtcbiAgICogICAgIGFzc2VydC5pbmNyZWFzZXMoZm4sIG9iaiwgJ3ZhbCcpO1xuICAgKlxuICAgKiBAbmFtZSBpbmNyZWFzZXNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbW9kaWZpZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBvciBnZXR0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pbmNyZWFzZXMgPSBmdW5jdGlvbiAoZm4sIG9iaiwgcHJvcCwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbXNnID0gcHJvcDtcbiAgICAgIHByb3AgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5pbmNyZWFzZXMsIHRydWUpXG4gICAgICAudG8uaW5jcmVhc2Uob2JqLCBwcm9wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmluY3JlYXNlc0J5KGZ1bmN0aW9uLCBvYmplY3QsIHByb3BlcnR5LCBkZWx0YSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBpbmNyZWFzZXMgYSBudW1lcmljIG9iamVjdCBwcm9wZXJ0eSBvciBhIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIGJ5IGFuIGFtb3VudCAoZGVsdGEpLlxuICAgKlxuICAgKiAgICAgdmFyIG9iaiA9IHsgdmFsOiAxMCB9O1xuICAgKiAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7IG9iai52YWwgKz0gMTAgfTtcbiAgICogICAgIGFzc2VydC5pbmNyZWFzZXNCeShmbiwgb2JqLCAndmFsJywgMTApO1xuICAgKlxuICAgKiBAbmFtZSBpbmNyZWFzZXNCeVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2RpZmllciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IG9yIGdldHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgbmFtZSBfb3B0aW9uYWxfXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBjaGFuZ2UgYW1vdW50IChkZWx0YSlcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaW5jcmVhc2VzQnkgPSBmdW5jdGlvbiAoZm4sIG9iaiwgcHJvcCwgZGVsdGEsIG1zZykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHZhciB0bXBNc2cgPSBkZWx0YTtcbiAgICAgIGRlbHRhID0gcHJvcDtcbiAgICAgIG1zZyA9IHRtcE1zZztcbiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICAgIGRlbHRhID0gcHJvcDtcbiAgICAgIHByb3AgPSBudWxsO1xuICAgIH1cblxuICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmluY3JlYXNlc0J5LCB0cnVlKVxuICAgICAgLnRvLmluY3JlYXNlKG9iaiwgcHJvcCkuYnkoZGVsdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuZG9lc05vdEluY3JlYXNlKGZ1bmN0aW9uLCBvYmplY3QsIHByb3BlcnR5LCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGRvZXMgbm90IGluY3JlYXNlIGEgbnVtZXJpYyBvYmplY3QgcHJvcGVydHkuXG4gICAqXG4gICAqICAgICB2YXIgb2JqID0geyB2YWw6IDEwIH07XG4gICAqICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgb2JqLnZhbCA9IDggfTtcbiAgICogICAgIGFzc2VydC5kb2VzTm90SW5jcmVhc2UoZm4sIG9iaiwgJ3ZhbCcpO1xuICAgKlxuICAgKiBAbmFtZSBkb2VzTm90SW5jcmVhc2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbW9kaWZpZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBvciBnZXR0ZXIgZnVuY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IG5hbWUgX29wdGlvbmFsX1xuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kb2VzTm90SW5jcmVhc2UgPSBmdW5jdGlvbiAoZm4sIG9iaiwgcHJvcCwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbXNnID0gcHJvcDtcbiAgICAgIHByb3AgPSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kb2VzTm90SW5jcmVhc2UsIHRydWUpXG4gICAgICAudG8ubm90LmluY3JlYXNlKG9iaiwgcHJvcCk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5pbmNyZWFzZXNCdXROb3RCeShmdW5jdGlvbiwgb2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBkb2VzIG5vdCBpbmNyZWFzZSBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5IG9yIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIGJ5IGFuIGFtb3VudCAoZGVsdGEpLlxuICAgKlxuICAgKiAgICAgdmFyIG9iaiA9IHsgdmFsOiAxMCB9O1xuICAgKiAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7IG9iai52YWwgPSAxNSB9O1xuICAgKiAgICAgYXNzZXJ0LmluY3JlYXNlc0J1dE5vdEJ5KGZuLCBvYmosICd2YWwnLCAxMCk7XG4gICAqXG4gICAqIEBuYW1lIGluY3JlYXNlc0J1dE5vdEJ5XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5pbmNyZWFzZXNCdXROb3RCeSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgbXNnID0gdG1wTXNnO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuaW5jcmVhc2VzQnV0Tm90QnksIHRydWUpXG4gICAgICAudG8uaW5jcmVhc2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmRlY3JlYXNlcyhmdW5jdGlvbiwgb2JqZWN0LCBwcm9wZXJ0eSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBkZWNyZWFzZXMgYSBudW1lcmljIG9iamVjdCBwcm9wZXJ0eS5cbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsID0gNSB9O1xuICAgKiAgICAgYXNzZXJ0LmRlY3JlYXNlcyhmbiwgb2JqLCAndmFsJyk7XG4gICAqXG4gICAqIEBuYW1lIGRlY3JlYXNlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtb2RpZmllciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IG9yIGdldHRlciBmdW5jdGlvblxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgbmFtZSBfb3B0aW9uYWxfXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmRlY3JlYXNlcyA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBtc2cgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRlY3JlYXNlcywgdHJ1ZSlcbiAgICAgIC50by5kZWNyZWFzZShvYmosIHByb3ApO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuZGVjcmVhc2VzQnkoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIGRlbHRhLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGRlY3JlYXNlcyBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5IG9yIGEgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgYnkgYW4gYW1vdW50IChkZWx0YSlcbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsIC09IDUgfTtcbiAgICogICAgIGFzc2VydC5kZWNyZWFzZXNCeShmbiwgb2JqLCAndmFsJywgNSk7XG4gICAqXG4gICAqIEBuYW1lIGRlY3JlYXNlc0J5XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kZWNyZWFzZXNCeSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgbXNnID0gdG1wTXNnO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZGVjcmVhc2VzQnksIHRydWUpXG4gICAgICAudG8uZGVjcmVhc2Uob2JqLCBwcm9wKS5ieShkZWx0YSk7XG4gIH1cblxuICAvKipcbiAgICogIyMjIC5kb2VzTm90RGVjcmVhc2UoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIFttZXNzYWdlXSlcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGEgZnVuY3Rpb24gZG9lcyBub3QgZGVjcmVhc2VzIGEgbnVtZXJpYyBvYmplY3QgcHJvcGVydHkuXG4gICAqXG4gICAqICAgICB2YXIgb2JqID0geyB2YWw6IDEwIH07XG4gICAqICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgb2JqLnZhbCA9IDE1IH07XG4gICAqICAgICBhc3NlcnQuZG9lc05vdERlY3JlYXNlKGZuLCBvYmosICd2YWwnKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdERlY3JlYXNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuZG9lc05vdERlY3JlYXNlID0gZnVuY3Rpb24gKGZuLCBvYmosIHByb3AsIG1zZykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG1zZyA9IHByb3A7XG4gICAgICBwcm9wID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdERlY3JlYXNlLCB0cnVlKVxuICAgICAgLnRvLm5vdC5kZWNyZWFzZShvYmosIHByb3ApO1xuICB9XG5cbiAgLyoqXG4gICAqICMjIyAuZG9lc05vdERlY3JlYXNlQnkoZnVuY3Rpb24sIG9iamVjdCwgcHJvcGVydHksIGRlbHRhLCBbbWVzc2FnZV0pXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBhIGZ1bmN0aW9uIGRvZXMgbm90IGRlY3JlYXNlcyBhIG51bWVyaWMgb2JqZWN0IHByb3BlcnR5IG9yIGEgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgYnkgYW4gYW1vdW50IChkZWx0YSlcbiAgICpcbiAgICogICAgIHZhciBvYmogPSB7IHZhbDogMTAgfTtcbiAgICogICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkgeyBvYmoudmFsID0gNSB9O1xuICAgKiAgICAgYXNzZXJ0LmRvZXNOb3REZWNyZWFzZUJ5KGZuLCBvYmosICd2YWwnLCAxKTtcbiAgICpcbiAgICogQG5hbWUgZG9lc05vdERlY3JlYXNlXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kb2VzTm90RGVjcmVhc2VCeSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgbXNnID0gdG1wTXNnO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRvZXNOb3REZWNyZWFzZUJ5LCB0cnVlKVxuICAgICAgLnRvLm5vdC5kZWNyZWFzZShvYmosIHByb3ApLmJ5KGRlbHRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAjIyMgLmRlY3JlYXNlc0J1dE5vdEJ5KGZ1bmN0aW9uLCBvYmplY3QsIHByb3BlcnR5LCBkZWx0YSwgW21lc3NhZ2VdKVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYSBmdW5jdGlvbiBkb2VzIG5vdCBkZWNyZWFzZXMgYSBudW1lcmljIG9iamVjdCBwcm9wZXJ0eSBvciBhIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIGJ5IGFuIGFtb3VudCAoZGVsdGEpXG4gICAqXG4gICAqICAgICB2YXIgb2JqID0geyB2YWw6IDEwIH07XG4gICAqICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgb2JqLnZhbCA9IDUgfTtcbiAgICogICAgIGFzc2VydC5kZWNyZWFzZXNCdXROb3RCeShmbiwgb2JqLCAndmFsJywgMSk7XG4gICAqXG4gICAqIEBuYW1lIGRlY3JlYXNlc0J1dE5vdEJ5XG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZGlmaWVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3Qgb3IgZ2V0dGVyIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSBuYW1lIF9vcHRpb25hbF9cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNoYW5nZSBhbW91bnQgKGRlbHRhKVxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBfb3B0aW9uYWxfXG4gICAqIEBuYW1lc3BhY2UgQXNzZXJ0XG4gICAqIEBhcGkgcHVibGljXG4gICAqL1xuXG4gIGFzc2VydC5kZWNyZWFzZXNCdXROb3RCeSA9IGZ1bmN0aW9uIChmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFyIHRtcE1zZyA9IGRlbHRhO1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgbXNnID0gdG1wTXNnO1xuICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgICAgZGVsdGEgPSBwcm9wO1xuICAgICAgcHJvcCA9IG51bGw7XG4gICAgfVxuXG4gICAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZGVjcmVhc2VzQnV0Tm90QnksIHRydWUpXG4gICAgICAudG8uZGVjcmVhc2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbiAgfVxuXG4gIC8qIVxuICAgKiAjIyMgLmlmRXJyb3Iob2JqZWN0KVxuICAgKlxuICAgKiBBc3NlcnRzIGlmIHZhbHVlIGlzIG5vdCBhIGZhbHNlIHZhbHVlLCBhbmQgdGhyb3dzIGlmIGl0IGlzIGEgdHJ1ZSB2YWx1ZS5cbiAgICogVGhpcyBpcyBhZGRlZCB0byBhbGxvdyBmb3IgY2hhaSB0byBiZSBhIGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIE5vZGUnc1xuICAgKiBhc3NlcnQgY2xhc3MuXG4gICAqXG4gICAqICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdJIGFtIGEgY3VzdG9tIGVycm9yJyk7XG4gICAqICAgICBhc3NlcnQuaWZFcnJvcihlcnIpOyAvLyBSZXRocm93cyBlcnIhXG4gICAqXG4gICAqIEBuYW1lIGlmRXJyb3JcbiAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaWZFcnJvciA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICBpZiAodmFsKSB7XG4gICAgICB0aHJvdyh2YWwpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc0V4dGVuc2libGUob2JqZWN0KVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaXMgZXh0ZW5zaWJsZSAoY2FuIGhhdmUgbmV3IHByb3BlcnRpZXMgYWRkZWQgdG8gaXQpLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzRXh0ZW5zaWJsZSh7fSk7XG4gICAqXG4gICAqIEBuYW1lIGlzRXh0ZW5zaWJsZVxuICAgKiBAYWxpYXMgZXh0ZW5zaWJsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uIChvYmosIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc0V4dGVuc2libGUsIHRydWUpLnRvLmJlLmV4dGVuc2libGU7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3RFeHRlbnNpYmxlKG9iamVjdClcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IGBvYmplY3RgIGlzIF9ub3RfIGV4dGVuc2libGUuXG4gICAqXG4gICAqICAgICB2YXIgbm9uRXh0ZW5zaWJsZU9iamVjdCA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSk7XG4gICAqICAgICB2YXIgc2VhbGVkT2JqZWN0ID0gT2JqZWN0LnNlYWwoe30pO1xuICAgKiAgICAgdmFyIGZyb3plbk9iamVjdCA9IE9iamVjdC5mcmVlemUoe30pO1xuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzTm90RXh0ZW5zaWJsZShub25FeHRlbnNpYmxlT2JqZWN0KTtcbiAgICogICAgIGFzc2VydC5pc05vdEV4dGVuc2libGUoc2VhbGVkT2JqZWN0KTtcbiAgICogICAgIGFzc2VydC5pc05vdEV4dGVuc2libGUoZnJvemVuT2JqZWN0KTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RFeHRlbnNpYmxlXG4gICAqIEBhbGlhcyBub3RFeHRlbnNpYmxlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3RFeHRlbnNpYmxlID0gZnVuY3Rpb24gKG9iaiwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmlzTm90RXh0ZW5zaWJsZSwgdHJ1ZSkudG8ubm90LmJlLmV4dGVuc2libGU7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNTZWFsZWQob2JqZWN0KVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaXMgc2VhbGVkIChjYW5ub3QgaGF2ZSBuZXcgcHJvcGVydGllcyBhZGRlZCB0byBpdFxuICAgKiBhbmQgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMgY2Fubm90IGJlIHJlbW92ZWQpLlxuICAgKlxuICAgKiAgICAgdmFyIHNlYWxlZE9iamVjdCA9IE9iamVjdC5zZWFsKHt9KTtcbiAgICogICAgIHZhciBmcm96ZW5PYmplY3QgPSBPYmplY3Quc2VhbCh7fSk7XG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNTZWFsZWQoc2VhbGVkT2JqZWN0KTtcbiAgICogICAgIGFzc2VydC5pc1NlYWxlZChmcm96ZW5PYmplY3QpO1xuICAgKlxuICAgKiBAbmFtZSBpc1NlYWxlZFxuICAgKiBAYWxpYXMgc2VhbGVkXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNTZWFsZWQgPSBmdW5jdGlvbiAob2JqLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNTZWFsZWQsIHRydWUpLnRvLmJlLnNlYWxlZDtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdFNlYWxlZChvYmplY3QpXG4gICAqXG4gICAqIEFzc2VydHMgdGhhdCBgb2JqZWN0YCBpcyBfbm90XyBzZWFsZWQuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNOb3RTZWFsZWQoe30pO1xuICAgKlxuICAgKiBAbmFtZSBpc05vdFNlYWxlZFxuICAgKiBAYWxpYXMgbm90U2VhbGVkXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3RTZWFsZWQgPSBmdW5jdGlvbiAob2JqLCBtc2cpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNOb3RTZWFsZWQsIHRydWUpLnRvLm5vdC5iZS5zZWFsZWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNGcm96ZW4ob2JqZWN0KVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaXMgZnJvemVuIChjYW5ub3QgaGF2ZSBuZXcgcHJvcGVydGllcyBhZGRlZCB0byBpdFxuICAgKiBhbmQgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMgY2Fubm90IGJlIG1vZGlmaWVkKS5cbiAgICpcbiAgICogICAgIHZhciBmcm96ZW5PYmplY3QgPSBPYmplY3QuZnJlZXplKHt9KTtcbiAgICogICAgIGFzc2VydC5mcm96ZW4oZnJvemVuT2JqZWN0KTtcbiAgICpcbiAgICogQG5hbWUgaXNGcm96ZW5cbiAgICogQGFsaWFzIGZyb3plblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRnJvemVuID0gZnVuY3Rpb24gKG9iaiwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmlzRnJvemVuLCB0cnVlKS50by5iZS5mcm96ZW47XG4gIH07XG5cbiAgLyoqXG4gICAqICMjIyAuaXNOb3RGcm96ZW4ob2JqZWN0KVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgYG9iamVjdGAgaXMgX25vdF8gZnJvemVuLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0LmlzTm90RnJvemVuKHt9KTtcbiAgICpcbiAgICogQG5hbWUgaXNOb3RGcm96ZW5cbiAgICogQGFsaWFzIG5vdEZyb3plblxuICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzTm90RnJvemVuID0gZnVuY3Rpb24gKG9iaiwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmlzTm90RnJvemVuLCB0cnVlKS50by5ub3QuYmUuZnJvemVuO1xuICB9O1xuXG4gIC8qKlxuICAgKiAjIyMgLmlzRW1wdHkodGFyZ2V0KVxuICAgKlxuICAgKiBBc3NlcnRzIHRoYXQgdGhlIHRhcmdldCBkb2VzIG5vdCBjb250YWluIGFueSB2YWx1ZXMuXG4gICAqIEZvciBhcnJheXMgYW5kIHN0cmluZ3MsIGl0IGNoZWNrcyB0aGUgYGxlbmd0aGAgcHJvcGVydHkuXG4gICAqIEZvciBgTWFwYCBhbmQgYFNldGAgaW5zdGFuY2VzLCBpdCBjaGVja3MgdGhlIGBzaXplYCBwcm9wZXJ0eS5cbiAgICogRm9yIG5vbi1mdW5jdGlvbiBvYmplY3RzLCBpdCBnZXRzIHRoZSBjb3VudCBvZiBvd25cbiAgICogZW51bWVyYWJsZSBzdHJpbmcga2V5cy5cbiAgICpcbiAgICogICAgIGFzc2VydC5pc0VtcHR5KFtdKTtcbiAgICogICAgIGFzc2VydC5pc0VtcHR5KCcnKTtcbiAgICogICAgIGFzc2VydC5pc0VtcHR5KG5ldyBNYXApO1xuICAgKiAgICAgYXNzZXJ0LmlzRW1wdHkoe30pO1xuICAgKlxuICAgKiBAbmFtZSBpc0VtcHR5XG4gICAqIEBhbGlhcyBlbXB0eVxuICAgKiBAcGFyYW0ge09iamVjdHxBcnJheXxTdHJpbmd8TWFwfFNldH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIF9vcHRpb25hbF9cbiAgICogQG5hbWVzcGFjZSBBc3NlcnRcbiAgICogQGFwaSBwdWJsaWNcbiAgICovXG5cbiAgYXNzZXJ0LmlzRW1wdHkgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0VtcHR5LCB0cnVlKS50by5iZS5lbXB0eTtcbiAgfTtcblxuICAvKipcbiAgICogIyMjIC5pc05vdEVtcHR5KHRhcmdldClcbiAgICpcbiAgICogQXNzZXJ0cyB0aGF0IHRoZSB0YXJnZXQgY29udGFpbnMgdmFsdWVzLlxuICAgKiBGb3IgYXJyYXlzIGFuZCBzdHJpbmdzLCBpdCBjaGVja3MgdGhlIGBsZW5ndGhgIHByb3BlcnR5LlxuICAgKiBGb3IgYE1hcGAgYW5kIGBTZXRgIGluc3RhbmNlcywgaXQgY2hlY2tzIHRoZSBgc2l6ZWAgcHJvcGVydHkuXG4gICAqIEZvciBub24tZnVuY3Rpb24gb2JqZWN0cywgaXQgZ2V0cyB0aGUgY291bnQgb2Ygb3duXG4gICAqIGVudW1lcmFibGUgc3RyaW5nIGtleXMuXG4gICAqXG4gICAqICAgICBhc3NlcnQuaXNOb3RFbXB0eShbMSwgMl0pO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90RW1wdHkoJzM0Jyk7XG4gICAqICAgICBhc3NlcnQuaXNOb3RFbXB0eShuZXcgU2V0KFs1LCA2XSkpO1xuICAgKiAgICAgYXNzZXJ0LmlzTm90RW1wdHkoeyBrZXk6IDcgfSk7XG4gICAqXG4gICAqIEBuYW1lIGlzTm90RW1wdHlcbiAgICogQGFsaWFzIG5vdEVtcHR5XG4gICAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fFN0cmluZ3xNYXB8U2V0fSB0YXJnZXRcbiAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgX29wdGlvbmFsX1xuICAgKiBAbmFtZXNwYWNlIEFzc2VydFxuICAgKiBAYXBpIHB1YmxpY1xuICAgKi9cblxuICBhc3NlcnQuaXNOb3RFbXB0eSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90RW1wdHksIHRydWUpLnRvLm5vdC5iZS5lbXB0eTtcbiAgfTtcblxuICAvKiFcbiAgICogQWxpYXNlcy5cbiAgICovXG5cbiAgKGZ1bmN0aW9uIGFsaWFzKG5hbWUsIGFzKXtcbiAgICBhc3NlcnRbYXNdID0gYXNzZXJ0W25hbWVdO1xuICAgIHJldHVybiBhbGlhcztcbiAgfSlcbiAgKCdpc09rJywgJ29rJylcbiAgKCdpc05vdE9rJywgJ25vdE9rJylcbiAgKCd0aHJvd3MnLCAndGhyb3cnKVxuICAoJ3Rocm93cycsICdUaHJvdycpXG4gICgnaXNFeHRlbnNpYmxlJywgJ2V4dGVuc2libGUnKVxuICAoJ2lzTm90RXh0ZW5zaWJsZScsICdub3RFeHRlbnNpYmxlJylcbiAgKCdpc1NlYWxlZCcsICdzZWFsZWQnKVxuICAoJ2lzTm90U2VhbGVkJywgJ25vdFNlYWxlZCcpXG4gICgnaXNGcm96ZW4nLCAnZnJvemVuJylcbiAgKCdpc05vdEZyb3plbicsICdub3RGcm96ZW4nKVxuICAoJ2lzRW1wdHknLCAnZW1wdHknKVxuICAoJ2lzTm90RW1wdHknLCAnbm90RW1wdHknKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qICFcbiAqIENoYWkgLSBwYXRodmFsIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpY2FscGFyYWRveC9maWx0clxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmhhc1Byb3BlcnR5KG9iamVjdCwgbmFtZSlcbiAqXG4gKiBUaGlzIGFsbG93cyBjaGVja2luZyB3aGV0aGVyIGFuIG9iamVjdCBoYXMgb3duXG4gKiBvciBpbmhlcml0ZWQgZnJvbSBwcm90b3R5cGUgY2hhaW4gbmFtZWQgcHJvcGVydHkuXG4gKlxuICogQmFzaWNhbGx5IGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIGBpbmBcbiAqIG9wZXJhdG9yIGJ1dCB3b3JrcyBwcm9wZXJseSB3aXRoIG51bGwvdW5kZWZpbmVkIHZhbHVlc1xuICogYW5kIG90aGVyIHByaW1pdGl2ZXMuXG4gKlxuICogICAgIHZhciBvYmogPSB7XG4gKiAgICAgICAgIGFycjogWydhJywgJ2InLCAnYyddXG4gKiAgICAgICAsIHN0cjogJ0hlbGxvJ1xuICogICAgIH1cbiAqXG4gKiBUaGUgZm9sbG93aW5nIHdvdWxkIGJlIHRoZSByZXN1bHRzLlxuICpcbiAqICAgICBoYXNQcm9wZXJ0eShvYmosICdzdHInKTsgIC8vIHRydWVcbiAqICAgICBoYXNQcm9wZXJ0eShvYmosICdjb25zdHJ1Y3RvcicpOyAgLy8gdHJ1ZVxuICogICAgIGhhc1Byb3BlcnR5KG9iaiwgJ2JhcicpOyAgLy8gZmFsc2VcbiAqXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLnN0ciwgJ2xlbmd0aCcpOyAvLyB0cnVlXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLnN0ciwgMSk7ICAvLyB0cnVlXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLnN0ciwgNSk7ICAvLyBmYWxzZVxuICpcbiAqICAgICBoYXNQcm9wZXJ0eShvYmouYXJyLCAnbGVuZ3RoJyk7ICAvLyB0cnVlXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLmFyciwgMik7ICAvLyB0cnVlXG4gKiAgICAgaGFzUHJvcGVydHkob2JqLmFyciwgMyk7ICAvLyBmYWxzZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfFN5bWJvbH0gbmFtZVxuICogQHJldHVybnMge0Jvb2xlYW59IHdoZXRoZXIgaXQgZXhpc3RzXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBoYXNQcm9wZXJ0eVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBoYXNQcm9wZXJ0eShvYmosIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnIHx8IG9iaiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRoZSBgaW5gIG9wZXJhdG9yIGRvZXMgbm90IHdvcmsgd2l0aCBwcmltaXRpdmVzLlxuICByZXR1cm4gbmFtZSBpbiBPYmplY3Qob2JqKTtcbn1cblxuLyogIVxuICogIyMgcGFyc2VQYXRoKHBhdGgpXG4gKlxuICogSGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gcGFyc2Ugc3RyaW5nIG9iamVjdFxuICogcGF0aHMuIFVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIGBpbnRlcm5hbEdldFBhdGhWYWx1ZWAuXG4gKlxuICogICAgICB2YXIgcGFyc2VkID0gcGFyc2VQYXRoKCdteW9iamVjdC5wcm9wZXJ0eS5zdWJwcm9wJyk7XG4gKlxuICogIyMjIFBhdGhzOlxuICpcbiAqICogQ2FuIGJlIGluZmluaXRlbHkgZGVlcCBhbmQgbmVzdGVkLlxuICogKiBBcnJheXMgYXJlIGFsc28gdmFsaWQgdXNpbmcgdGhlIGZvcm1hbCBgbXlvYmplY3QuZG9jdW1lbnRbM10ucHJvcGVydHlgLlxuICogKiBMaXRlcmFsIGRvdHMgYW5kIGJyYWNrZXRzIChub3QgZGVsaW1pdGVyKSBtdXN0IGJlIGJhY2tzbGFzaC1lc2NhcGVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBwYXJzZWRcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlUGF0aChwYXRoKSB7XG4gIHZhciBzdHIgPSBwYXRoLnJlcGxhY2UoLyhbXlxcXFxdKVxcWy9nLCAnJDEuWycpO1xuICB2YXIgcGFydHMgPSBzdHIubWF0Y2goLyhcXFxcXFwufFteLl0rPykrL2cpO1xuICByZXR1cm4gcGFydHMubWFwKGZ1bmN0aW9uIG1hcE1hdGNoZXModmFsdWUpIHtcbiAgICB2YXIgcmVnZXhwID0gL15cXFsoXFxkKylcXF0kLztcbiAgICB2YXIgbUFyciA9IHJlZ2V4cC5leGVjKHZhbHVlKTtcbiAgICB2YXIgcGFyc2VkID0gbnVsbDtcbiAgICBpZiAobUFycikge1xuICAgICAgcGFyc2VkID0geyBpOiBwYXJzZUZsb2F0KG1BcnJbMV0pIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlZCA9IHsgcDogdmFsdWUucmVwbGFjZSgvXFxcXChbLlxcW1xcXV0pL2csICckMScpIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfSk7XG59XG5cbi8qICFcbiAqICMjIGludGVybmFsR2V0UGF0aFZhbHVlKG9iaiwgcGFyc2VkWywgcGF0aERlcHRoXSlcbiAqXG4gKiBIZWxwZXIgY29tcGFuaW9uIGZ1bmN0aW9uIGZvciBgLnBhcnNlUGF0aGAgdGhhdCByZXR1cm5zXG4gKiB0aGUgdmFsdWUgbG9jYXRlZCBhdCB0aGUgcGFyc2VkIGFkZHJlc3MuXG4gKlxuICogICAgICB2YXIgdmFsdWUgPSBnZXRQYXRoVmFsdWUob2JqLCBwYXJzZWQpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgdG8gc2VhcmNoIGFnYWluc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJzZWQgZGVmaW5pdGlvbiBmcm9tIGBwYXJzZVBhdGhgLlxuICogQHBhcmFtIHtOdW1iZXJ9IGRlcHRoIChuZXN0aW5nIGxldmVsKSBvZiB0aGUgcHJvcGVydHkgd2Ugd2FudCB0byByZXRyaWV2ZVxuICogQHJldHVybnMge09iamVjdHxVbmRlZmluZWR9IHZhbHVlXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpbnRlcm5hbEdldFBhdGhWYWx1ZShvYmosIHBhcnNlZCwgcGF0aERlcHRoKSB7XG4gIHZhciB0ZW1wb3JhcnlWYWx1ZSA9IG9iajtcbiAgdmFyIHJlcyA9IG51bGw7XG4gIHBhdGhEZXB0aCA9ICh0eXBlb2YgcGF0aERlcHRoID09PSAndW5kZWZpbmVkJyA/IHBhcnNlZC5sZW5ndGggOiBwYXRoRGVwdGgpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aERlcHRoOyBpKyspIHtcbiAgICB2YXIgcGFydCA9IHBhcnNlZFtpXTtcbiAgICBpZiAodGVtcG9yYXJ5VmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgcGFydC5wID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0ZW1wb3JhcnlWYWx1ZSA9IHRlbXBvcmFyeVZhbHVlW3BhcnQuaV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZW1wb3JhcnlWYWx1ZSA9IHRlbXBvcmFyeVZhbHVlW3BhcnQucF07XG4gICAgICB9XG5cbiAgICAgIGlmIChpID09PSAocGF0aERlcHRoIC0gMSkpIHtcbiAgICAgICAgcmVzID0gdGVtcG9yYXJ5VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuLyogIVxuICogIyMgaW50ZXJuYWxTZXRQYXRoVmFsdWUob2JqLCB2YWx1ZSwgcGFyc2VkKVxuICpcbiAqIENvbXBhbmlvbiBmdW5jdGlvbiBmb3IgYHBhcnNlUGF0aGAgdGhhdCBzZXRzXG4gKiB0aGUgdmFsdWUgbG9jYXRlZCBhdCBhIHBhcnNlZCBhZGRyZXNzLlxuICpcbiAqICBpbnRlcm5hbFNldFBhdGhWYWx1ZShvYmosICd2YWx1ZScsIHBhcnNlZCk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCB0byBzZWFyY2ggYW5kIGRlZmluZSBvblxuICogQHBhcmFtIHsqfSB2YWx1ZSB0byB1c2UgdXBvbiBzZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJzZWQgZGVmaW5pdGlvbiBmcm9tIGBwYXJzZVBhdGhgXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpbnRlcm5hbFNldFBhdGhWYWx1ZShvYmosIHZhbCwgcGFyc2VkKSB7XG4gIHZhciB0ZW1wT2JqID0gb2JqO1xuICB2YXIgcGF0aERlcHRoID0gcGFyc2VkLmxlbmd0aDtcbiAgdmFyIHBhcnQgPSBudWxsO1xuICAvLyBIZXJlIHdlIGl0ZXJhdGUgdGhyb3VnaCBldmVyeSBwYXJ0IG9mIHRoZSBwYXRoXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aERlcHRoOyBpKyspIHtcbiAgICB2YXIgcHJvcE5hbWUgPSBudWxsO1xuICAgIHZhciBwcm9wVmFsID0gbnVsbDtcbiAgICBwYXJ0ID0gcGFyc2VkW2ldO1xuXG4gICAgLy8gSWYgaXQncyB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBwYXRoLCB3ZSBzZXQgdGhlICdwcm9wTmFtZScgdmFsdWUgd2l0aCB0aGUgcHJvcGVydHkgbmFtZVxuICAgIGlmIChpID09PSAocGF0aERlcHRoIC0gMSkpIHtcbiAgICAgIHByb3BOYW1lID0gdHlwZW9mIHBhcnQucCA9PT0gJ3VuZGVmaW5lZCcgPyBwYXJ0LmkgOiBwYXJ0LnA7XG4gICAgICAvLyBOb3cgd2Ugc2V0IHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBuYW1lIGhlbGQgYnkgJ3Byb3BOYW1lJyBvbiBvYmplY3Qgd2l0aCB0aGUgZGVzaXJlZCB2YWxcbiAgICAgIHRlbXBPYmpbcHJvcE5hbWVdID0gdmFsO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcnQucCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGVtcE9ialtwYXJ0LnBdKSB7XG4gICAgICB0ZW1wT2JqID0gdGVtcE9ialtwYXJ0LnBdO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcnQuaSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGVtcE9ialtwYXJ0LmldKSB7XG4gICAgICB0ZW1wT2JqID0gdGVtcE9ialtwYXJ0LmldO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUgb2JqIGRvZXNuJ3QgaGF2ZSB0aGUgcHJvcGVydHkgd2UgY3JlYXRlIG9uZSB3aXRoIHRoYXQgbmFtZSB0byBkZWZpbmUgaXRcbiAgICAgIHZhciBuZXh0ID0gcGFyc2VkW2kgKyAxXTtcbiAgICAgIC8vIEhlcmUgd2Ugc2V0IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aGljaCB3aWxsIGJlIGRlZmluZWRcbiAgICAgIHByb3BOYW1lID0gdHlwZW9mIHBhcnQucCA9PT0gJ3VuZGVmaW5lZCcgPyBwYXJ0LmkgOiBwYXJ0LnA7XG4gICAgICAvLyBIZXJlIHdlIGRlY2lkZSBpZiB0aGlzIHByb3BlcnR5IHdpbGwgYmUgYW4gYXJyYXkgb3IgYSBuZXcgb2JqZWN0XG4gICAgICBwcm9wVmFsID0gdHlwZW9mIG5leHQucCA9PT0gJ3VuZGVmaW5lZCcgPyBbXSA6IHt9O1xuICAgICAgdGVtcE9ialtwcm9wTmFtZV0gPSBwcm9wVmFsO1xuICAgICAgdGVtcE9iaiA9IHRlbXBPYmpbcHJvcE5hbWVdO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqICMjIyAuZ2V0UGF0aEluZm8ob2JqZWN0LCBwYXRoKVxuICpcbiAqIFRoaXMgYWxsb3dzIHRoZSByZXRyaWV2YWwgb2YgcHJvcGVydHkgaW5mbyBpbiBhblxuICogb2JqZWN0IGdpdmVuIGEgc3RyaW5nIHBhdGguXG4gKlxuICogVGhlIHBhdGggaW5mbyBjb25zaXN0cyBvZiBhbiBvYmplY3Qgd2l0aCB0aGVcbiAqIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICogcGFyZW50IC0gVGhlIHBhcmVudCBvYmplY3Qgb2YgdGhlIHByb3BlcnR5IHJlZmVyZW5jZWQgYnkgYHBhdGhgXG4gKiAqIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmluYWwgcHJvcGVydHksIGEgbnVtYmVyIGlmIGl0IHdhcyBhbiBhcnJheSBpbmRleGVyXG4gKiAqIHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgYHVuZGVmaW5lZGBcbiAqICogZXhpc3RzIC0gV2hldGhlciB0aGUgcHJvcGVydHkgZXhpc3RzIG9yIG5vdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBpbmZvXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBnZXRQYXRoSW5mb1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBnZXRQYXRoSW5mbyhvYmosIHBhdGgpIHtcbiAgdmFyIHBhcnNlZCA9IHBhcnNlUGF0aChwYXRoKTtcbiAgdmFyIGxhc3QgPSBwYXJzZWRbcGFyc2VkLmxlbmd0aCAtIDFdO1xuICB2YXIgaW5mbyA9IHtcbiAgICBwYXJlbnQ6IHBhcnNlZC5sZW5ndGggPiAxID8gaW50ZXJuYWxHZXRQYXRoVmFsdWUob2JqLCBwYXJzZWQsIHBhcnNlZC5sZW5ndGggLSAxKSA6IG9iaixcbiAgICBuYW1lOiBsYXN0LnAgfHwgbGFzdC5pLFxuICAgIHZhbHVlOiBpbnRlcm5hbEdldFBhdGhWYWx1ZShvYmosIHBhcnNlZCksXG4gIH07XG4gIGluZm8uZXhpc3RzID0gaGFzUHJvcGVydHkoaW5mby5wYXJlbnQsIGluZm8ubmFtZSk7XG5cbiAgcmV0dXJuIGluZm87XG59XG5cbi8qKlxuICogIyMjIC5nZXRQYXRoVmFsdWUob2JqZWN0LCBwYXRoKVxuICpcbiAqIFRoaXMgYWxsb3dzIHRoZSByZXRyaWV2YWwgb2YgdmFsdWVzIGluIGFuXG4gKiBvYmplY3QgZ2l2ZW4gYSBzdHJpbmcgcGF0aC5cbiAqXG4gKiAgICAgdmFyIG9iaiA9IHtcbiAqICAgICAgICAgcHJvcDE6IHtcbiAqICAgICAgICAgICAgIGFycjogWydhJywgJ2InLCAnYyddXG4gKiAgICAgICAgICAgLCBzdHI6ICdIZWxsbydcbiAqICAgICAgICAgfVxuICogICAgICAgLCBwcm9wMjoge1xuICogICAgICAgICAgICAgYXJyOiBbIHsgbmVzdGVkOiAnVW5pdmVyc2UnIH0gXVxuICogICAgICAgICAgICwgc3RyOiAnSGVsbG8gYWdhaW4hJ1xuICogICAgICAgICB9XG4gKiAgICAgfVxuICpcbiAqIFRoZSBmb2xsb3dpbmcgd291bGQgYmUgdGhlIHJlc3VsdHMuXG4gKlxuICogICAgIGdldFBhdGhWYWx1ZShvYmosICdwcm9wMS5zdHInKTsgLy8gSGVsbG9cbiAqICAgICBnZXRQYXRoVmFsdWUob2JqLCAncHJvcDEuYXR0WzJdJyk7IC8vIGJcbiAqICAgICBnZXRQYXRoVmFsdWUob2JqLCAncHJvcDIuYXJyWzBdLm5lc3RlZCcpOyAvLyBVbml2ZXJzZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcmV0dXJucyB7T2JqZWN0fSB2YWx1ZSBvciBgdW5kZWZpbmVkYFxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZ2V0UGF0aFZhbHVlXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGdldFBhdGhWYWx1ZShvYmosIHBhdGgpIHtcbiAgdmFyIGluZm8gPSBnZXRQYXRoSW5mbyhvYmosIHBhdGgpO1xuICByZXR1cm4gaW5mby52YWx1ZTtcbn1cblxuLyoqXG4gKiAjIyMgLnNldFBhdGhWYWx1ZShvYmplY3QsIHBhdGgsIHZhbHVlKVxuICpcbiAqIERlZmluZSB0aGUgdmFsdWUgaW4gYW4gb2JqZWN0IGF0IGEgZ2l2ZW4gc3RyaW5nIHBhdGguXG4gKlxuICogYGBganNcbiAqIHZhciBvYmogPSB7XG4gKiAgICAgcHJvcDE6IHtcbiAqICAgICAgICAgYXJyOiBbJ2EnLCAnYicsICdjJ11cbiAqICAgICAgICwgc3RyOiAnSGVsbG8nXG4gKiAgICAgfVxuICogICAsIHByb3AyOiB7XG4gKiAgICAgICAgIGFycjogWyB7IG5lc3RlZDogJ1VuaXZlcnNlJyB9IF1cbiAqICAgICAgICwgc3RyOiAnSGVsbG8gYWdhaW4hJ1xuICogICAgIH1cbiAqIH07XG4gKiBgYGBcbiAqXG4gKiBUaGUgZm9sbG93aW5nIHdvdWxkIGJlIGFjY2VwdGFibGUuXG4gKlxuICogYGBganNcbiAqIHZhciBwcm9wZXJ0aWVzID0gcmVxdWlyZSgndGVhLXByb3BlcnRpZXMnKTtcbiAqIHByb3BlcnRpZXMuc2V0KG9iaiwgJ3Byb3AxLnN0cicsICdIZWxsbyBVbml2ZXJzZSEnKTtcbiAqIHByb3BlcnRpZXMuc2V0KG9iaiwgJ3Byb3AxLmFyclsyXScsICdCJyk7XG4gKiBwcm9wZXJ0aWVzLnNldChvYmosICdwcm9wMi5hcnJbMF0ubmVzdGVkLnZhbHVlJywgeyBoZWxsbzogJ3VuaXZlcnNlJyB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge01peGVkfSB2YWx1ZVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gc2V0UGF0aFZhbHVlKG9iaiwgcGF0aCwgdmFsKSB7XG4gIHZhciBwYXJzZWQgPSBwYXJzZVBhdGgocGF0aCk7XG4gIGludGVybmFsU2V0UGF0aFZhbHVlKG9iaiwgdmFsLCBwYXJzZWQpO1xuICByZXR1cm4gb2JqO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaGFzUHJvcGVydHk6IGhhc1Byb3BlcnR5LFxuICBnZXRQYXRoSW5mbzogZ2V0UGF0aEluZm8sXG4gIGdldFBhdGhWYWx1ZTogZ2V0UGF0aFZhbHVlLFxuICBzZXRQYXRoVmFsdWU6IHNldFBhdGhWYWx1ZSxcbn07XG4iLCIvKiFcbiAqIENoYWkgLSB0ZXN0IHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKiFcbiAqIE1vZHVsZSBkZXBlbmRhbmNpZXNcbiAqL1xuXG52YXIgZmxhZyA9IHJlcXVpcmUoJy4vZmxhZycpO1xuXG4vKipcbiAqICMjIyAudGVzdChvYmplY3QsIGV4cHJlc3Npb24pXG4gKlxuICogVGVzdCBhbmQgb2JqZWN0IGZvciBleHByZXNzaW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgKGNvbnN0cnVjdGVkIEFzc2VydGlvbilcbiAqIEBwYXJhbSB7QXJndW1lbnRzfSBjaGFpLkFzc2VydGlvbi5wcm90b3R5cGUuYXNzZXJ0IGFyZ3VtZW50c1xuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgdGVzdFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdGVzdChvYmosIGFyZ3MpIHtcbiAgdmFyIG5lZ2F0ZSA9IGZsYWcob2JqLCAnbmVnYXRlJylcbiAgICAsIGV4cHIgPSBhcmdzWzBdO1xuICByZXR1cm4gbmVnYXRlID8gIWV4cHIgOiBleHByO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyogIVxuICogdHlwZS1kZXRlY3RcbiAqIENvcHlyaWdodChjKSAyMDEzIGpha2UgbHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cbnZhciBwcm9taXNlRXhpc3RzID0gdHlwZW9mIFByb21pc2UgPT09ICdmdW5jdGlvbic7XG52YXIgZ2xvYmFsT2JqZWN0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHNlbGY7IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbnZhciBpc0RvbSA9ICdsb2NhdGlvbicgaW4gZ2xvYmFsT2JqZWN0ICYmICdkb2N1bWVudCcgaW4gZ2xvYmFsT2JqZWN0O1xudmFyIHN5bWJvbEV4aXN0cyA9IHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnO1xudmFyIG1hcEV4aXN0cyA9IHR5cGVvZiBNYXAgIT09ICd1bmRlZmluZWQnO1xudmFyIHNldEV4aXN0cyA9IHR5cGVvZiBTZXQgIT09ICd1bmRlZmluZWQnO1xudmFyIHdlYWtNYXBFeGlzdHMgPSB0eXBlb2YgV2Vha01hcCAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgd2Vha1NldEV4aXN0cyA9IHR5cGVvZiBXZWFrU2V0ICE9PSAndW5kZWZpbmVkJztcbnZhciBkYXRhVmlld0V4aXN0cyA9IHR5cGVvZiBEYXRhVmlldyAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgc3ltYm9sSXRlcmF0b3JFeGlzdHMgPSBzeW1ib2xFeGlzdHMgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgc3ltYm9sVG9TdHJpbmdUYWdFeGlzdHMgPSBzeW1ib2xFeGlzdHMgJiYgdHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgc2V0RW50cmllc0V4aXN0cyA9IHNldEV4aXN0cyAmJiB0eXBlb2YgU2V0LnByb3RvdHlwZS5lbnRyaWVzID09PSAnZnVuY3Rpb24nO1xudmFyIG1hcEVudHJpZXNFeGlzdHMgPSBtYXBFeGlzdHMgJiYgdHlwZW9mIE1hcC5wcm90b3R5cGUuZW50cmllcyA9PT0gJ2Z1bmN0aW9uJztcbnZhciBzZXRJdGVyYXRvclByb3RvdHlwZSA9IHNldEVudHJpZXNFeGlzdHMgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyBTZXQoKS5lbnRyaWVzKCkpO1xudmFyIG1hcEl0ZXJhdG9yUHJvdG90eXBlID0gbWFwRW50cmllc0V4aXN0cyAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YobmV3IE1hcCgpLmVudHJpZXMoKSk7XG52YXIgYXJyYXlJdGVyYXRvckV4aXN0cyA9IHN5bWJvbEl0ZXJhdG9yRXhpc3RzICYmIHR5cGVvZiBBcnJheS5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcbnZhciBhcnJheUl0ZXJhdG9yUHJvdG90eXBlID0gYXJyYXlJdGVyYXRvckV4aXN0cyAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoW11bU3ltYm9sLml0ZXJhdG9yXSgpKTtcbnZhciBzdHJpbmdJdGVyYXRvckV4aXN0cyA9IHN5bWJvbEl0ZXJhdG9yRXhpc3RzICYmIHR5cGVvZiBTdHJpbmcucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbic7XG52YXIgc3RyaW5nSXRlcmF0b3JQcm90b3R5cGUgPSBzdHJpbmdJdGVyYXRvckV4aXN0cyAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoJydbU3ltYm9sLml0ZXJhdG9yXSgpKTtcbnZhciB0b1N0cmluZ0xlZnRTbGljZUxlbmd0aCA9IDg7XG52YXIgdG9TdHJpbmdSaWdodFNsaWNlTGVuZ3RoID0gLTE7XG4vKipcbiAqICMjIyB0eXBlT2YgKG9iailcbiAqXG4gKiBVc2VzIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgYW4gb2JqZWN0LFxuICogbm9ybWFsaXNpbmcgYmVoYXZpb3VyIGFjcm9zcyBlbmdpbmUgdmVyc2lvbnMgJiB3ZWxsIG9wdGltaXNlZC5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSBvYmplY3RcbiAqIEByZXR1cm4ge1N0cmluZ30gb2JqZWN0IHR5cGVcbiAqIEBhcGkgcHVibGljXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdHlwZURldGVjdChvYmopIHtcbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgICogUHJlOlxuICAgKiAgIHN0cmluZyBsaXRlcmFsICAgICB4IDMsMDM5LDAzNSBvcHMvc2VjIMKxMS42MiUgKDc4IHJ1bnMgc2FtcGxlZClcbiAgICogICBib29sZWFuIGxpdGVyYWwgICAgeCAxLDQyNCwxMzggb3BzL3NlYyDCsTQuNTQlICg3NSBydW5zIHNhbXBsZWQpXG4gICAqICAgbnVtYmVyIGxpdGVyYWwgICAgIHggMSw2NTMsMTUzIG9wcy9zZWMgwrExLjkxJSAoODIgcnVucyBzYW1wbGVkKVxuICAgKiAgIHVuZGVmaW5lZCAgICAgICAgICB4IDksOTc4LDY2MCBvcHMvc2VjIMKxMS45MiUgKDc1IHJ1bnMgc2FtcGxlZClcbiAgICogICBmdW5jdGlvbiAgICAgICAgICAgeCAyLDU1Niw3Njkgb3BzL3NlYyDCsTEuNzMlICg3NyBydW5zIHNhbXBsZWQpXG4gICAqIFBvc3Q6XG4gICAqICAgc3RyaW5nIGxpdGVyYWwgICAgIHggMzgsNTY0LDc5NiBvcHMvc2VjIMKxMS4xNSUgKDc5IHJ1bnMgc2FtcGxlZClcbiAgICogICBib29sZWFuIGxpdGVyYWwgICAgeCAzMSwxNDgsOTQwIG9wcy9zZWMgwrExLjEwJSAoNzkgcnVucyBzYW1wbGVkKVxuICAgKiAgIG51bWJlciBsaXRlcmFsICAgICB4IDMyLDY3OSwzMzAgb3BzL3NlYyDCsTEuOTAlICg3OCBydW5zIHNhbXBsZWQpXG4gICAqICAgdW5kZWZpbmVkICAgICAgICAgIHggMzIsMzYzLDM2OCBvcHMvc2VjIMKxMS4wNyUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgICogICBmdW5jdGlvbiAgICAgICAgICAgeCAzMSwyOTYsODcwIG9wcy9zZWMgwrEwLjk2JSAoODMgcnVucyBzYW1wbGVkKVxuICAgKi9cbiAgdmFyIHR5cGVvZk9iaiA9IHR5cGVvZiBvYmo7XG4gIGlmICh0eXBlb2ZPYmogIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHR5cGVvZk9iajtcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICAqIFByZTpcbiAgICogICBudWxsICAgICAgICAgICAgICAgeCAyOCw2NDUsNzY1IG9wcy9zZWMgwrExLjE3JSAoODIgcnVucyBzYW1wbGVkKVxuICAgKiBQb3N0OlxuICAgKiAgIG51bGwgICAgICAgICAgICAgICB4IDM2LDQyOCw5NjIgb3BzL3NlYyDCsTEuMzclICg4NCBydW5zIHNhbXBsZWQpXG4gICAqL1xuICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgcmV0dXJuICdudWxsJztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdylgYFxuICAgKiAgLSBOb2RlID09PSBcIltvYmplY3QgZ2xvYmFsXVwiXG4gICAqICAtIENocm9tZSA9PT0gXCJbb2JqZWN0IGdsb2JhbF1cIlxuICAgKiAgLSBGaXJlZm94ID09PSBcIltvYmplY3QgV2luZG93XVwiXG4gICAqICAtIFBoYW50b21KUyA9PT0gXCJbb2JqZWN0IFdpbmRvd11cIlxuICAgKiAgLSBTYWZhcmkgPT09IFwiW29iamVjdCBXaW5kb3ddXCJcbiAgICogIC0gSUUgMTEgPT09IFwiW29iamVjdCBXaW5kb3ddXCJcbiAgICogIC0gSUUgRWRnZSA9PT0gXCJbb2JqZWN0IFdpbmRvd11cIlxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRoaXMpYGBcbiAgICogIC0gQ2hyb21lIFdvcmtlciA9PT0gXCJbb2JqZWN0IGdsb2JhbF1cIlxuICAgKiAgLSBGaXJlZm94IFdvcmtlciA9PT0gXCJbb2JqZWN0IERlZGljYXRlZFdvcmtlckdsb2JhbFNjb3BlXVwiXG4gICAqICAtIFNhZmFyaSBXb3JrZXIgPT09IFwiW29iamVjdCBEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZV1cIlxuICAgKiAgLSBJRSAxMSBXb3JrZXIgPT09IFwiW29iamVjdCBXb3JrZXJHbG9iYWxTY29wZV1cIlxuICAgKiAgLSBJRSBFZGdlIFdvcmtlciA9PT0gXCJbb2JqZWN0IFdvcmtlckdsb2JhbFNjb3BlXVwiXG4gICAqL1xuICBpZiAob2JqID09PSBnbG9iYWxPYmplY3QpIHtcbiAgICByZXR1cm4gJ2dsb2JhbCc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAgKiBQcmU6XG4gICAqICAgYXJyYXkgbGl0ZXJhbCAgICAgIHggMiw4ODgsMzUyIG9wcy9zZWMgwrEwLjY3JSAoODIgcnVucyBzYW1wbGVkKVxuICAgKiBQb3N0OlxuICAgKiAgIGFycmF5IGxpdGVyYWwgICAgICB4IDIyLDQ3OSw2NTAgb3BzL3NlYyDCsTAuOTYlICg4MSBydW5zIHNhbXBsZWQpXG4gICAqL1xuICBpZiAoXG4gICAgQXJyYXkuaXNBcnJheShvYmopICYmXG4gICAgKHN5bWJvbFRvU3RyaW5nVGFnRXhpc3RzID09PSBmYWxzZSB8fCAhKFN5bWJvbC50b1N0cmluZ1RhZyBpbiBvYmopKVxuICApIHtcbiAgICByZXR1cm4gJ0FycmF5JztcbiAgfVxuXG4gIGlmIChpc0RvbSkge1xuICAgIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgICAqIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9icm93c2Vycy5odG1sI2xvY2F0aW9uKVxuICAgICAqIFdoYXRXRyBIVE1MJDcuNy4zIC0gVGhlIGBMb2NhdGlvbmAgaW50ZXJmYWNlXG4gICAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3aW5kb3cubG9jYXRpb24pYGBcbiAgICAgKiAgLSBJRSA8PTExID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAgICogIC0gSUUgRWRnZSA8PTEzID09PSBcIltvYmplY3QgT2JqZWN0XVwiXG4gICAgICovXG4gICAgaWYgKG9iaiA9PT0gZ2xvYmFsT2JqZWN0LmxvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gJ0xvY2F0aW9uJztcbiAgICB9XG5cbiAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jZG9jdW1lbnQpXG4gICAgICogV2hhdFdHIEhUTUwkMy4xLjEgLSBUaGUgYERvY3VtZW50YCBvYmplY3RcbiAgICAgKiBOb3RlOiBNb3N0IGJyb3dzZXJzIGN1cnJlbnRseSBhZGhlciB0byB0aGUgVzNDIERPTSBMZXZlbCAyIHNwZWNcbiAgICAgKiAgICAgICAoaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUhUTUwvaHRtbC5odG1sI0lELTI2ODA5MjY4KVxuICAgICAqICAgICAgIHdoaWNoIHN1Z2dlc3RzIHRoYXQgYnJvd3NlcnMgc2hvdWxkIHVzZSBIVE1MVGFibGVDZWxsRWxlbWVudCBmb3JcbiAgICAgKiAgICAgICBib3RoIFREIGFuZCBUSCBlbGVtZW50cy4gV2hhdFdHIHNlcGFyYXRlcyB0aGVzZS5cbiAgICAgKiAgICAgICBXaGF0V0cgSFRNTCBzdGF0ZXM6XG4gICAgICogICAgICAgICA+IEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIFdpbmRvdyBvYmplY3RzIG11c3QgYWxzbyBoYXZlIGFcbiAgICAgKiAgICAgICAgID4gd3JpdGFibGUsIGNvbmZpZ3VyYWJsZSwgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgbmFtZWRcbiAgICAgKiAgICAgICAgID4gSFRNTERvY3VtZW50IHdob3NlIHZhbHVlIGlzIHRoZSBEb2N1bWVudCBpbnRlcmZhY2Ugb2JqZWN0LlxuICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9jdW1lbnQpYGBcbiAgICAgKiAgLSBDaHJvbWUgPT09IFwiW29iamVjdCBIVE1MRG9jdW1lbnRdXCJcbiAgICAgKiAgLSBGaXJlZm94ID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICogIC0gU2FmYXJpID09PSBcIltvYmplY3QgSFRNTERvY3VtZW50XVwiXG4gICAgICogIC0gSUUgPD0xMCA9PT0gXCJbb2JqZWN0IERvY3VtZW50XVwiXG4gICAgICogIC0gSUUgMTEgPT09IFwiW29iamVjdCBIVE1MRG9jdW1lbnRdXCJcbiAgICAgKiAgLSBJRSBFZGdlIDw9MTMgPT09IFwiW29iamVjdCBIVE1MRG9jdW1lbnRdXCJcbiAgICAgKi9cbiAgICBpZiAob2JqID09PSBnbG9iYWxPYmplY3QuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiAnRG9jdW1lbnQnO1xuICAgIH1cblxuICAgIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgICAqIChodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS93ZWJhcHBhcGlzLmh0bWwjbWltZXR5cGVhcnJheSlcbiAgICAgKiBXaGF0V0cgSFRNTCQ4LjYuMS41IC0gUGx1Z2lucyAtIEludGVyZmFjZSBNaW1lVHlwZUFycmF5XG4gICAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuYXZpZ2F0b3IubWltZVR5cGVzKWBgXG4gICAgICogIC0gSUUgPD0xMCA9PT0gXCJbb2JqZWN0IE1TTWltZVR5cGVzQ29sbGVjdGlvbl1cIlxuICAgICAqL1xuICAgIGlmIChvYmogPT09IChnbG9iYWxPYmplY3QubmF2aWdhdG9yIHx8IHt9KS5taW1lVHlwZXMpIHtcbiAgICAgIHJldHVybiAnTWltZVR5cGVBcnJheSc7XG4gICAgfVxuXG4gICAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAgICogKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3dlYmFwcGFwaXMuaHRtbCNwbHVnaW5hcnJheSlcbiAgICAgKiBXaGF0V0cgSFRNTCQ4LjYuMS41IC0gUGx1Z2lucyAtIEludGVyZmFjZSBQbHVnaW5BcnJheVxuICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmF2aWdhdG9yLnBsdWdpbnMpYGBcbiAgICAgKiAgLSBJRSA8PTEwID09PSBcIltvYmplY3QgTVNQbHVnaW5zQ29sbGVjdGlvbl1cIlxuICAgICAqL1xuICAgIGlmIChvYmogPT09IChnbG9iYWxPYmplY3QubmF2aWdhdG9yIHx8IHt9KS5wbHVnaW5zKSB7XG4gICAgICByZXR1cm4gJ1BsdWdpbkFycmF5JztcbiAgICB9XG5cbiAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvd2ViYXBwYXBpcy5odG1sI3BsdWdpbmFycmF5KVxuICAgICAqIFdoYXRXRyBIVE1MJDQuNC40IC0gVGhlIGBibG9ja3F1b3RlYCBlbGVtZW50IC0gSW50ZXJmYWNlIGBIVE1MUXVvdGVFbGVtZW50YFxuICAgICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYmxvY2txdW90ZScpKWBgXG4gICAgICogIC0gSUUgPD0xMCA9PT0gXCJbb2JqZWN0IEhUTUxCbG9ja0VsZW1lbnRdXCJcbiAgICAgKi9cbiAgICBpZiAob2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgb2JqLnRhZ05hbWUgPT09ICdCTE9DS1FVT1RFJykge1xuICAgICAgcmV0dXJuICdIVE1MUXVvdGVFbGVtZW50JztcbiAgICB9XG5cbiAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jaHRtbHRhYmxlZGF0YWNlbGxlbGVtZW50KVxuICAgICAqIFdoYXRXRyBIVE1MJDQuOS45IC0gVGhlIGB0ZGAgZWxlbWVudCAtIEludGVyZmFjZSBgSFRNTFRhYmxlRGF0YUNlbGxFbGVtZW50YFxuICAgICAqIE5vdGU6IE1vc3QgYnJvd3NlcnMgY3VycmVudGx5IGFkaGVyIHRvIHRoZSBXM0MgRE9NIExldmVsIDIgc3BlY1xuICAgICAqICAgICAgIChodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTItSFRNTC9odG1sLmh0bWwjSUQtODI5MTUwNzUpXG4gICAgICogICAgICAgd2hpY2ggc3VnZ2VzdHMgdGhhdCBicm93c2VycyBzaG91bGQgdXNlIEhUTUxUYWJsZUNlbGxFbGVtZW50IGZvclxuICAgICAqICAgICAgIGJvdGggVEQgYW5kIFRIIGVsZW1lbnRzLiBXaGF0V0cgc2VwYXJhdGVzIHRoZXNlLlxuICAgICAqIFRlc3Q6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpKVxuICAgICAqICAtIENocm9tZSA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICogIC0gRmlyZWZveCA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICogIC0gU2FmYXJpID09PSBcIltvYmplY3QgSFRNTFRhYmxlQ2VsbEVsZW1lbnRdXCJcbiAgICAgKi9cbiAgICBpZiAob2JqIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgb2JqLnRhZ05hbWUgPT09ICdURCcpIHtcbiAgICAgIHJldHVybiAnSFRNTFRhYmxlRGF0YUNlbGxFbGVtZW50JztcbiAgICB9XG5cbiAgICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICAgKiAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jaHRtbHRhYmxlaGVhZGVyY2VsbGVsZW1lbnQpXG4gICAgICogV2hhdFdHIEhUTUwkNC45LjkgLSBUaGUgYHRkYCBlbGVtZW50IC0gSW50ZXJmYWNlIGBIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudGBcbiAgICAgKiBOb3RlOiBNb3N0IGJyb3dzZXJzIGN1cnJlbnRseSBhZGhlciB0byB0aGUgVzNDIERPTSBMZXZlbCAyIHNwZWNcbiAgICAgKiAgICAgICAoaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0yLUhUTUwvaHRtbC5odG1sI0lELTgyOTE1MDc1KVxuICAgICAqICAgICAgIHdoaWNoIHN1Z2dlc3RzIHRoYXQgYnJvd3NlcnMgc2hvdWxkIHVzZSBIVE1MVGFibGVDZWxsRWxlbWVudCBmb3JcbiAgICAgKiAgICAgICBib3RoIFREIGFuZCBUSCBlbGVtZW50cy4gV2hhdFdHIHNlcGFyYXRlcyB0aGVzZS5cbiAgICAgKiBUZXN0OiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGgnKSlcbiAgICAgKiAgLSBDaHJvbWUgPT09IFwiW29iamVjdCBIVE1MVGFibGVDZWxsRWxlbWVudF1cIlxuICAgICAqICAtIEZpcmVmb3ggPT09IFwiW29iamVjdCBIVE1MVGFibGVDZWxsRWxlbWVudF1cIlxuICAgICAqICAtIFNhZmFyaSA9PT0gXCJbb2JqZWN0IEhUTUxUYWJsZUNlbGxFbGVtZW50XVwiXG4gICAgICovXG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIG9iai50YWdOYW1lID09PSAnVEgnKSB7XG4gICAgICByZXR1cm4gJ0hUTUxUYWJsZUhlYWRlckNlbGxFbGVtZW50JztcbiAgICB9XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIEZsb2F0NjRBcnJheSAgICAgICB4IDYyNSw2NDQgb3BzL3NlYyDCsTEuNTglICg4MCBydW5zIHNhbXBsZWQpXG4gICogICBGbG9hdDMyQXJyYXkgICAgICAgeCAxLDI3OSw4NTIgb3BzL3NlYyDCsTIuOTElICg3NyBydW5zIHNhbXBsZWQpXG4gICogICBVaW50MzJBcnJheSAgICAgICAgeCAxLDE3OCwxODUgb3BzL3NlYyDCsTEuOTUlICg4MyBydW5zIHNhbXBsZWQpXG4gICogICBVaW50MTZBcnJheSAgICAgICAgeCAxLDAwOCwzODAgb3BzL3NlYyDCsTIuMjUlICg4MCBydW5zIHNhbXBsZWQpXG4gICogICBVaW50OEFycmF5ICAgICAgICAgeCAxLDEyOCwwNDAgb3BzL3NlYyDCsTIuMTElICg4MSBydW5zIHNhbXBsZWQpXG4gICogICBJbnQzMkFycmF5ICAgICAgICAgeCAxLDE3MCwxMTkgb3BzL3NlYyDCsTIuODglICg4MCBydW5zIHNhbXBsZWQpXG4gICogICBJbnQxNkFycmF5ICAgICAgICAgeCAxLDE3NiwzNDggb3BzL3NlYyDCsTUuNzklICg4NiBydW5zIHNhbXBsZWQpXG4gICogICBJbnQ4QXJyYXkgICAgICAgICAgeCAxLDA1OCw3MDcgb3BzL3NlYyDCsTQuOTQlICg3NyBydW5zIHNhbXBsZWQpXG4gICogICBVaW50OENsYW1wZWRBcnJheSAgeCAxLDExMCw2MzMgb3BzL3NlYyDCsTQuMjAlICg4MCBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIEZsb2F0NjRBcnJheSAgICAgICB4IDcsMTA1LDY3MSBvcHMvc2VjIMKxMTMuNDclICg2NCBydW5zIHNhbXBsZWQpXG4gICogICBGbG9hdDMyQXJyYXkgICAgICAgeCA1LDg4Nyw5MTIgb3BzL3NlYyDCsTEuNDYlICg4MiBydW5zIHNhbXBsZWQpXG4gICogICBVaW50MzJBcnJheSAgICAgICAgeCA2LDQ5MSw2NjEgb3BzL3NlYyDCsTEuNzYlICg3OSBydW5zIHNhbXBsZWQpXG4gICogICBVaW50MTZBcnJheSAgICAgICAgeCA2LDU1OSw3OTUgb3BzL3NlYyDCsTEuNjclICg4MiBydW5zIHNhbXBsZWQpXG4gICogICBVaW50OEFycmF5ICAgICAgICAgeCA2LDQ2Myw5NjYgb3BzL3NlYyDCsTEuNDMlICg4NSBydW5zIHNhbXBsZWQpXG4gICogICBJbnQzMkFycmF5ICAgICAgICAgeCA1LDY0MSw4NDEgb3BzL3NlYyDCsTMuNDklICg4MSBydW5zIHNhbXBsZWQpXG4gICogICBJbnQxNkFycmF5ICAgICAgICAgeCA2LDU4Myw1MTEgb3BzL3NlYyDCsTEuOTglICg4MCBydW5zIHNhbXBsZWQpXG4gICogICBJbnQ4QXJyYXkgICAgICAgICAgeCA2LDYwNiwwNzggb3BzL3NlYyDCsTEuNzQlICg4MSBydW5zIHNhbXBsZWQpXG4gICogICBVaW50OENsYW1wZWRBcnJheSAgeCA2LDYwMiwyMjQgb3BzL3NlYyDCsTEuNzclICg4MyBydW5zIHNhbXBsZWQpXG4gICovXG4gIHZhciBzdHJpbmdUYWcgPSAoc3ltYm9sVG9TdHJpbmdUYWdFeGlzdHMgJiYgb2JqW1N5bWJvbC50b1N0cmluZ1RhZ10pO1xuICBpZiAodHlwZW9mIHN0cmluZ1RhZyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyaW5nVGFnO1xuICB9XG5cbiAgdmFyIG9ialByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopO1xuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIHJlZ2V4IGxpdGVyYWwgICAgICB4IDEsNzcyLDM4NSBvcHMvc2VjIMKxMS44NSUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKiAgIHJlZ2V4IGNvbnN0cnVjdG9yICB4IDIsMTQzLDYzNCBvcHMvc2VjIMKxMi40NiUgKDc4IHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgcmVnZXggbGl0ZXJhbCAgICAgIHggMyw5MjgsMDA5IG9wcy9zZWMgwrEwLjY1JSAoNzggcnVucyBzYW1wbGVkKVxuICAqICAgcmVnZXggY29uc3RydWN0b3IgIHggMyw5MzEsMTA4IG9wcy9zZWMgwrEwLjU4JSAoODQgcnVucyBzYW1wbGVkKVxuICAqL1xuICBpZiAob2JqUHJvdG90eXBlID09PSBSZWdFeHAucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdSZWdFeHAnO1xuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICBkYXRlICAgICAgICAgICAgICAgeCAyLDEzMCwwNzQgb3BzL3NlYyDCsTQuNDIlICg2OCBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIGRhdGUgICAgICAgICAgICAgICB4IDMsOTUzLDc3OSBvcHMvc2VjIMKxMS4zNSUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKG9ialByb3RvdHlwZSA9PT0gRGF0ZS5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gJ0RhdGUnO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLXByb21pc2UucHJvdG90eXBlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyNS40LjUuNCAtIFByb21pc2UucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIlByb21pc2VcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChQcm9taXNlLnJlc29sdmUoKSlgYFxuICAgKiAgLSBDaHJvbWUgPD00NyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKiAgLSBFZGdlIDw9MjAgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICogIC0gRmlyZWZveCAyOS1MYXRlc3QgPT09IFwiW29iamVjdCBQcm9taXNlXVwiXG4gICAqICAtIFNhZmFyaSA3LjEtTGF0ZXN0ID09PSBcIltvYmplY3QgUHJvbWlzZV1cIlxuICAgKi9cbiAgaWYgKHByb21pc2VFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBQcm9taXNlLnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnUHJvbWlzZSc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIHNldCAgICAgICAgICAgICAgICB4IDIsMjIyLDE4NiBvcHMvc2VjIMKxMS4zMSUgKDgyIHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgc2V0ICAgICAgICAgICAgICAgIHggNCw1NDUsODc5IG9wcy9zZWMgwrExLjEzJSAoODMgcnVucyBzYW1wbGVkKVxuICAqL1xuICBpZiAoc2V0RXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gU2V0LnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnU2V0JztcbiAgfVxuXG4gIC8qICEgU3BlZWQgb3B0aW1pc2F0aW9uXG4gICogUHJlOlxuICAqICAgbWFwICAgICAgICAgICAgICAgIHggMiwzOTYsODQyIG9wcy9zZWMgwrExLjU5JSAoODEgcnVucyBzYW1wbGVkKVxuICAqIFBvc3Q6XG4gICogICBtYXAgICAgICAgICAgICAgICAgeCA0LDE4Myw5NDUgb3BzL3NlYyDCsTYuNTklICg4MiBydW5zIHNhbXBsZWQpXG4gICovXG4gIGlmIChtYXBFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBNYXAucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdNYXAnO1xuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICB3ZWFrc2V0ICAgICAgICAgICAgeCAxLDMyMywyMjAgb3BzL3NlYyDCsTIuMTclICg3NiBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIHdlYWtzZXQgICAgICAgICAgICB4IDQsMjM3LDUxMCBvcHMvc2VjIMKxMi4wMSUgKDc3IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKHdlYWtTZXRFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBXZWFrU2V0LnByb3RvdHlwZSkge1xuICAgIHJldHVybiAnV2Vha1NldCc7XG4gIH1cblxuICAvKiAhIFNwZWVkIG9wdGltaXNhdGlvblxuICAqIFByZTpcbiAgKiAgIHdlYWttYXAgICAgICAgICAgICB4IDEsNTAwLDI2MCBvcHMvc2VjIMKxMi4wMiUgKDc4IHJ1bnMgc2FtcGxlZClcbiAgKiBQb3N0OlxuICAqICAgd2Vha21hcCAgICAgICAgICAgIHggMyw4ODEsMzg0IG9wcy9zZWMgwrExLjQ1JSAoODIgcnVucyBzYW1wbGVkKVxuICAqL1xuICBpZiAod2Vha01hcEV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IFdlYWtNYXAucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdXZWFrTWFwJztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiAoaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy1kYXRhdmlldy5wcm90b3R5cGUtQEB0b3N0cmluZ3RhZylcbiAgICogRVM2JDI0LjIuNC4yMSAtIERhdGFWaWV3LnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXSBzaG91bGQgYmUgXCJEYXRhVmlld1wiOlxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSkpKWBgXG4gICAqICAtIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKi9cbiAgaWYgKGRhdGFWaWV3RXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gRGF0YVZpZXcucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdEYXRhVmlldyc7XG4gIH1cblxuICAvKiAhIFNwZWMgQ29uZm9ybWFuY2VcbiAgICogKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtJW1hcGl0ZXJhdG9ycHJvdG90eXBlJS1AQHRvc3RyaW5ndGFnKVxuICAgKiBFUzYkMjMuMS41LjIuMiAtICVNYXBJdGVyYXRvclByb3RvdHlwZSVbQEB0b1N0cmluZ1RhZ10gc2hvdWxkIGJlIFwiTWFwIEl0ZXJhdG9yXCI6XG4gICAqIFRlc3Q6IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobmV3IE1hcCgpLmVudHJpZXMoKSlgYFxuICAgKiAgLSBFZGdlIDw9MTMgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICovXG4gIGlmIChtYXBFeGlzdHMgJiYgb2JqUHJvdG90eXBlID09PSBtYXBJdGVyYXRvclByb3RvdHlwZSkge1xuICAgIHJldHVybiAnTWFwIEl0ZXJhdG9yJztcbiAgfVxuXG4gIC8qICEgU3BlYyBDb25mb3JtYW5jZVxuICAgKiAoaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy0lc2V0aXRlcmF0b3Jwcm90b3R5cGUlLUBAdG9zdHJpbmd0YWcpXG4gICAqIEVTNiQyMy4yLjUuMi4yIC0gJVNldEl0ZXJhdG9yUHJvdG90eXBlJVtAQHRvU3RyaW5nVGFnXSBzaG91bGQgYmUgXCJTZXQgSXRlcmF0b3JcIjpcbiAgICogVGVzdDogYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXcgU2V0KCkuZW50cmllcygpKWBgXG4gICAqICAtIEVkZ2UgPD0xMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIlxuICAgKi9cbiAgaWYgKHNldEV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IHNldEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdTZXQgSXRlcmF0b3InO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLSVhcnJheWl0ZXJhdG9ycHJvdG90eXBlJS1AQHRvc3RyaW5ndGFnKVxuICAgKiBFUzYkMjIuMS41LjIuMiAtICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJVtAQHRvU3RyaW5nVGFnXSBzaG91bGQgYmUgXCJBcnJheSBJdGVyYXRvclwiOlxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFtdW1N5bWJvbC5pdGVyYXRvcl0oKSlgYFxuICAgKiAgLSBFZGdlIDw9MTMgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICovXG4gIGlmIChhcnJheUl0ZXJhdG9yRXhpc3RzICYmIG9ialByb3RvdHlwZSA9PT0gYXJyYXlJdGVyYXRvclByb3RvdHlwZSkge1xuICAgIHJldHVybiAnQXJyYXkgSXRlcmF0b3InO1xuICB9XG5cbiAgLyogISBTcGVjIENvbmZvcm1hbmNlXG4gICAqIChodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wL2luZGV4Lmh0bWwjc2VjLSVzdHJpbmdpdGVyYXRvcnByb3RvdHlwZSUtQEB0b3N0cmluZ3RhZylcbiAgICogRVM2JDIxLjEuNS4yLjIgLSAlU3RyaW5nSXRlcmF0b3JQcm90b3R5cGUlW0BAdG9TdHJpbmdUYWddIHNob3VsZCBiZSBcIlN0cmluZyBJdGVyYXRvclwiOlxuICAgKiBUZXN0OiBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKCcnW1N5bWJvbC5pdGVyYXRvcl0oKSlgYFxuICAgKiAgLSBFZGdlIDw9MTMgPT09IFwiW29iamVjdCBPYmplY3RdXCJcbiAgICovXG4gIGlmIChzdHJpbmdJdGVyYXRvckV4aXN0cyAmJiBvYmpQcm90b3R5cGUgPT09IHN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgcmV0dXJuICdTdHJpbmcgSXRlcmF0b3InO1xuICB9XG5cbiAgLyogISBTcGVlZCBvcHRpbWlzYXRpb25cbiAgKiBQcmU6XG4gICogICBvYmplY3QgZnJvbSBudWxsICAgeCAyLDQyNCwzMjAgb3BzL3NlYyDCsTEuNjclICg3NiBydW5zIHNhbXBsZWQpXG4gICogUG9zdDpcbiAgKiAgIG9iamVjdCBmcm9tIG51bGwgICB4IDUsODM4LDAwMCBvcHMvc2VjIMKxMC45OSUgKDg0IHJ1bnMgc2FtcGxlZClcbiAgKi9cbiAgaWYgKG9ialByb3RvdHlwZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnT2JqZWN0JztcbiAgfVxuXG4gIHJldHVybiBPYmplY3RcbiAgICAucHJvdG90eXBlXG4gICAgLnRvU3RyaW5nXG4gICAgLmNhbGwob2JqKVxuICAgIC5zbGljZSh0b1N0cmluZ0xlZnRTbGljZUxlbmd0aCwgdG9TdHJpbmdSaWdodFNsaWNlTGVuZ3RoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLnR5cGVEZXRlY3QgPSBtb2R1bGUuZXhwb3J0cztcbiIsIi8qIVxuICogQ2hhaSAtIGV4cGVjdFR5cGVzIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAuZXhwZWN0VHlwZXMob2JqLCB0eXBlcylcbiAqXG4gKiBFbnN1cmVzIHRoYXQgdGhlIG9iamVjdCBiZWluZyB0ZXN0ZWQgYWdhaW5zdCBpcyBvZiBhIHZhbGlkIHR5cGUuXG4gKlxuICogICAgIHV0aWxzLmV4cGVjdFR5cGVzKHRoaXMsIFsnYXJyYXknLCAnb2JqZWN0JywgJ3N0cmluZyddKTtcbiAqXG4gKiBAcGFyYW0ge01peGVkfSBvYmogY29uc3RydWN0ZWQgQXNzZXJ0aW9uXG4gKiBAcGFyYW0ge0FycmF5fSB0eXBlIEEgbGlzdCBvZiBhbGxvd2VkIHR5cGVzIGZvciB0aGlzIGFzc2VydGlvblxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZXhwZWN0VHlwZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxudmFyIEFzc2VydGlvbkVycm9yID0gcmVxdWlyZSgnYXNzZXJ0aW9uLWVycm9yJyk7XG52YXIgZmxhZyA9IHJlcXVpcmUoJy4vZmxhZycpO1xudmFyIHR5cGUgPSByZXF1aXJlKCd0eXBlLWRldGVjdCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGV4cGVjdFR5cGVzKG9iaiwgdHlwZXMpIHtcbiAgdmFyIGZsYWdNc2cgPSBmbGFnKG9iaiwgJ21lc3NhZ2UnKTtcbiAgdmFyIHNzZmkgPSBmbGFnKG9iaiwgJ3NzZmknKTtcblxuICBmbGFnTXNnID0gZmxhZ01zZyA/IGZsYWdNc2cgKyAnOiAnIDogJyc7XG5cbiAgb2JqID0gZmxhZyhvYmosICdvYmplY3QnKTtcbiAgdHlwZXMgPSB0eXBlcy5tYXAoZnVuY3Rpb24gKHQpIHsgcmV0dXJuIHQudG9Mb3dlckNhc2UoKTsgfSk7XG4gIHR5cGVzLnNvcnQoKTtcblxuICAvLyBUcmFuc2Zvcm1zIFsnbG9yZW0nLCAnaXBzdW0nXSBpbnRvICdhIGxvcmVtLCBvciBhbiBpcHN1bSdcbiAgdmFyIHN0ciA9IHR5cGVzLm1hcChmdW5jdGlvbiAodCwgaW5kZXgpIHtcbiAgICB2YXIgYXJ0ID0gflsgJ2EnLCAnZScsICdpJywgJ28nLCAndScgXS5pbmRleE9mKHQuY2hhckF0KDApKSA/ICdhbicgOiAnYSc7XG4gICAgdmFyIG9yID0gdHlwZXMubGVuZ3RoID4gMSAmJiBpbmRleCA9PT0gdHlwZXMubGVuZ3RoIC0gMSA/ICdvciAnIDogJyc7XG4gICAgcmV0dXJuIG9yICsgYXJ0ICsgJyAnICsgdDtcbiAgfSkuam9pbignLCAnKTtcblxuICB2YXIgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpO1xuXG4gIGlmICghdHlwZXMuc29tZShmdW5jdGlvbiAoZXhwZWN0ZWQpIHsgcmV0dXJuIG9ialR5cGUgPT09IGV4cGVjdGVkOyB9KSkge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIGZsYWdNc2cgKyAnb2JqZWN0IHRlc3RlZCBtdXN0IGJlICcgKyBzdHIgKyAnLCBidXQgJyArIG9ialR5cGUgKyAnIGdpdmVuJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG59O1xuIiwiLyohXG4gKiBDaGFpIC0gbWVzc2FnZSBjb21wb3NpdGlvbiB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyohXG4gKiBNb2R1bGUgZGVwZW5kYW5jaWVzXG4gKi9cblxudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKVxuICAsIGdldEFjdHVhbCA9IHJlcXVpcmUoJy4vZ2V0QWN0dWFsJylcbiAgLCBpbnNwZWN0ID0gcmVxdWlyZSgnLi9pbnNwZWN0JylcbiAgLCBvYmpEaXNwbGF5ID0gcmVxdWlyZSgnLi9vYmpEaXNwbGF5Jyk7XG5cbi8qKlxuICogIyMjIC5nZXRNZXNzYWdlKG9iamVjdCwgbWVzc2FnZSwgbmVnYXRlTWVzc2FnZSlcbiAqXG4gKiBDb25zdHJ1Y3QgdGhlIGVycm9yIG1lc3NhZ2UgYmFzZWQgb24gZmxhZ3NcbiAqIGFuZCB0ZW1wbGF0ZSB0YWdzLiBUZW1wbGF0ZSB0YWdzIHdpbGwgcmV0dXJuXG4gKiBhIHN0cmluZ2lmaWVkIGluc3BlY3Rpb24gb2YgdGhlIG9iamVjdCByZWZlcmVuY2VkLlxuICpcbiAqIE1lc3NhZ2UgdGVtcGxhdGUgdGFnczpcbiAqIC0gYCN7dGhpc31gIGN1cnJlbnQgYXNzZXJ0ZWQgb2JqZWN0XG4gKiAtIGAje2FjdH1gIGFjdHVhbCB2YWx1ZVxuICogLSBgI3tleHB9YCBleHBlY3RlZCB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgKGNvbnN0cnVjdGVkIEFzc2VydGlvbilcbiAqIEBwYXJhbSB7QXJndW1lbnRzfSBjaGFpLkFzc2VydGlvbi5wcm90b3R5cGUuYXNzZXJ0IGFyZ3VtZW50c1xuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZ2V0TWVzc2FnZVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGdldE1lc3NhZ2Uob2JqLCBhcmdzKSB7XG4gIHZhciBuZWdhdGUgPSBmbGFnKG9iaiwgJ25lZ2F0ZScpXG4gICAgLCB2YWwgPSBmbGFnKG9iaiwgJ29iamVjdCcpXG4gICAgLCBleHBlY3RlZCA9IGFyZ3NbM11cbiAgICAsIGFjdHVhbCA9IGdldEFjdHVhbChvYmosIGFyZ3MpXG4gICAgLCBtc2cgPSBuZWdhdGUgPyBhcmdzWzJdIDogYXJnc1sxXVxuICAgICwgZmxhZ01zZyA9IGZsYWcob2JqLCAnbWVzc2FnZScpO1xuXG4gIGlmKHR5cGVvZiBtc2cgPT09IFwiZnVuY3Rpb25cIikgbXNnID0gbXNnKCk7XG4gIG1zZyA9IG1zZyB8fCAnJztcbiAgbXNnID0gbXNnXG4gICAgLnJlcGxhY2UoLyNcXHt0aGlzXFx9L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9iakRpc3BsYXkodmFsKTsgfSlcbiAgICAucmVwbGFjZSgvI1xce2FjdFxcfS9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBvYmpEaXNwbGF5KGFjdHVhbCk7IH0pXG4gICAgLnJlcGxhY2UoLyNcXHtleHBcXH0vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gb2JqRGlzcGxheShleHBlY3RlZCk7IH0pO1xuXG4gIHJldHVybiBmbGFnTXNnID8gZmxhZ01zZyArICc6ICcgKyBtc2cgOiBtc2c7XG59O1xuIiwiLyohXG4gKiBDaGFpIC0gZ2V0QWN0dWFsIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAuZ2V0QWN0dWFsKG9iamVjdCwgW2FjdHVhbF0pXG4gKlxuICogUmV0dXJucyB0aGUgYGFjdHVhbGAgdmFsdWUgZm9yIGFuIEFzc2VydGlvbi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IChjb25zdHJ1Y3RlZCBBc3NlcnRpb24pXG4gKiBAcGFyYW0ge0FyZ3VtZW50c30gY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLmFzc2VydCBhcmd1bWVudHNcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIGdldEFjdHVhbFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0QWN0dWFsKG9iaiwgYXJncykge1xuICByZXR1cm4gYXJncy5sZW5ndGggPiA0ID8gYXJnc1s0XSA6IG9iai5fb2JqO1xufTtcbiIsIi8vIFRoaXMgaXMgKGFsbW9zdCkgZGlyZWN0bHkgZnJvbSBOb2RlLmpzIHV0aWxzXG4vLyBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUvYmxvYi9mOGMzMzVkMGNhZjQ3ZjE2ZDMxNDEzZjg5YWEyOGVkYTM4NzhlM2FhL2xpYi91dGlsLmpzXG5cbnZhciBnZXROYW1lID0gcmVxdWlyZSgnZ2V0LWZ1bmMtbmFtZScpO1xudmFyIGdldFByb3BlcnRpZXMgPSByZXF1aXJlKCcuL2dldFByb3BlcnRpZXMnKTtcbnZhciBnZXRFbnVtZXJhYmxlUHJvcGVydGllcyA9IHJlcXVpcmUoJy4vZ2V0RW51bWVyYWJsZVByb3BlcnRpZXMnKTtcbnZhciBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbnNwZWN0O1xuXG4vKipcbiAqICMjIyAuaW5zcGVjdChvYmosIFtzaG93SGlkZGVuXSwgW2RlcHRoXSwgW2NvbG9yc10pXG4gKlxuICogRWNob2VzIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcmllcyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtCb29sZWFufSBzaG93SGlkZGVuIEZsYWcgdGhhdCBzaG93cyBoaWRkZW4gKG5vdCBlbnVtZXJhYmxlKVxuICogICAgcHJvcGVydGllcyBvZiBvYmplY3RzLiBEZWZhdWx0IGlzIGZhbHNlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGRlcHRoIERlcHRoIGluIHdoaWNoIHRvIGRlc2NlbmQgaW4gb2JqZWN0LiBEZWZhdWx0IGlzIDIuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGNvbG9ycyBGbGFnIHRvIHR1cm4gb24gQU5TSSBlc2NhcGUgY29kZXMgdG8gY29sb3IgdGhlXG4gKiAgICBvdXRwdXQuIERlZmF1bHQgaXMgZmFsc2UgKG5vIGNvbG9yaW5nKS5cbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIGluc3BlY3RcbiAqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMpIHtcbiAgdmFyIGN0eCA9IHtcbiAgICBzaG93SGlkZGVuOiBzaG93SGlkZGVuLFxuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IGZ1bmN0aW9uIChzdHIpIHsgcmV0dXJuIHN0cjsgfVxuICB9O1xuICByZXR1cm4gZm9ybWF0VmFsdWUoY3R4LCBvYmosICh0eXBlb2YgZGVwdGggPT09ICd1bmRlZmluZWQnID8gMiA6IGRlcHRoKSk7XG59XG5cbi8vIFJldHVybnMgdHJ1ZSBpZiBvYmplY3QgaXMgYSBET00gZWxlbWVudC5cbnZhciBpc0RPTUVsZW1lbnQgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG4gIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBvYmplY3QgJiZcbiAgICAgIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG4gICAgICAnbm9kZVR5cGUnIGluIG9iamVjdCAmJlxuICAgICAgb2JqZWN0Lm5vZGVUeXBlID09PSAxICYmXG4gICAgICB0eXBlb2Ygb2JqZWN0Lm5vZGVOYW1lID09PSAnc3RyaW5nJztcbiAgfVxufTtcblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzKSB7XG4gIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cbiAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG4gIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuaW5zcGVjdCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAodHlwZW9mIHJldCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBJZiB0aGlzIGlzIGEgRE9NIGVsZW1lbnQsIHRyeSB0byBnZXQgdGhlIG91dGVyIEhUTUwuXG4gIGlmIChpc0RPTUVsZW1lbnQodmFsdWUpKSB7XG4gICAgaWYgKCdvdXRlckhUTUwnIGluIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUub3V0ZXJIVE1MO1xuICAgICAgLy8gVGhpcyB2YWx1ZSBkb2VzIG5vdCBoYXZlIGFuIG91dGVySFRNTCBhdHRyaWJ1dGUsXG4gICAgICAvLyAgIGl0IGNvdWxkIHN0aWxsIGJlIGFuIFhNTCBlbGVtZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEF0dGVtcHQgdG8gc2VyaWFsaXplIGl0XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZG9jdW1lbnQueG1sVmVyc2lvbikge1xuICAgICAgICAgIHZhciB4bWxTZXJpYWxpemVyID0gbmV3IFhNTFNlcmlhbGl6ZXIoKTtcbiAgICAgICAgICByZXR1cm4geG1sU2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmlyZWZveCAxMS0gZG8gbm90IHN1cHBvcnQgb3V0ZXJIVE1MXG4gICAgICAgICAgLy8gICBJdCBkb2VzLCBob3dldmVyLCBzdXBwb3J0IGlubmVySFRNTFxuICAgICAgICAgIC8vICAgVXNlIHRoZSBmb2xsb3dpbmcgdG8gcmVuZGVyIHRoZSBlbGVtZW50XG4gICAgICAgICAgdmFyIG5zID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI7XG4gICAgICAgICAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhucywgJ18nKTtcblxuICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh2YWx1ZS5jbG9uZU5vZGUoZmFsc2UpKTtcbiAgICAgICAgICB2YXIgaHRtbCA9IGNvbnRhaW5lci5pbm5lckhUTUxcbiAgICAgICAgICAgIC5yZXBsYWNlKCc+PCcsICc+JyArIHZhbHVlLmlubmVySFRNTCArICc8Jyk7XG4gICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSBhIG5vbi1uYXRpdmUgRE9NIGltcGxlbWVudGF0aW9uLFxuICAgICAgICAvLyAgIGNvbnRpbnVlIHdpdGggdGhlIG5vcm1hbCBmbG93OlxuICAgICAgICAvLyAgIHByaW50aW5nIHRoZSBlbGVtZW50IGFzIGlmIGl0IGlzIGFuIG9iamVjdC5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciB2aXNpYmxlS2V5cyA9IGdldEVudW1lcmFibGVQcm9wZXJ0aWVzKHZhbHVlKTtcbiAgdmFyIGtleXMgPSBjdHguc2hvd0hpZGRlbiA/IGdldFByb3BlcnRpZXModmFsdWUpIDogdmlzaWJsZUtleXM7XG5cbiAgdmFyIG5hbWUsIG5hbWVTdWZmaXg7XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICAvLyBJbiBJRSwgZXJyb3JzIGhhdmUgYSBzaW5nbGUgYHN0YWNrYCBwcm9wZXJ0eSwgb3IgaWYgdGhleSBhcmUgdmFuaWxsYSBgRXJyb3JgLFxuICAvLyBhIGBzdGFja2AgcGx1cyBgZGVzY3JpcHRpb25gIHByb3BlcnR5OyBpZ25vcmUgdGhvc2UgZm9yIGNvbnNpc3RlbmN5LlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgfHwgKGlzRXJyb3IodmFsdWUpICYmIChcbiAgICAgIChrZXlzLmxlbmd0aCA9PT0gMSAmJiBrZXlzWzBdID09PSAnc3RhY2snKSB8fFxuICAgICAgKGtleXMubGVuZ3RoID09PSAyICYmIGtleXNbMF0gPT09ICdkZXNjcmlwdGlvbicgJiYga2V5c1sxXSA9PT0gJ3N0YWNrJylcbiAgICAgKSkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBuYW1lID0gZ2V0TmFtZSh2YWx1ZSk7XG4gICAgICBuYW1lU3VmZml4ID0gbmFtZSA/ICc6ICcgKyBuYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lU3VmZml4ICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJ1xuICAgICwgYXJyYXkgPSBmYWxzZVxuICAgICwgdHlwZWRBcnJheSA9IGZhbHNlXG4gICAgLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIGlmIChpc1R5cGVkQXJyYXkodmFsdWUpKSB7XG4gICAgdHlwZWRBcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG5hbWUgPSBnZXROYW1lKHZhbHVlKTtcbiAgICBuYW1lU3VmZml4ID0gbmFtZSA/ICc6ICcgKyBuYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG5hbWVTdWZmaXggKyAnXSc7XG4gIH1cblxuICAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgdmFyIG91dHB1dDtcbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSBpZiAodHlwZWRBcnJheSkge1xuICAgIHJldHVybiBmb3JtYXRUeXBlZEFycmF5KHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG5cbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuXG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGlmICh2YWx1ZSA9PT0gMCAmJiAoMS92YWx1ZSkgPT09IC1JbmZpbml0eSkge1xuICAgICAgICByZXR1cm4gY3R4LnN0eWxpemUoJy0wJywgJ251bWJlcicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG5cbiAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKHZhbHVlLnRvU3RyaW5nKCksICdzeW1ib2wnKTtcbiAgfVxuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cblxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFR5cGVkQXJyYXkodmFsdWUpIHtcbiAgdmFyIHN0ciA9ICdbICc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgIGlmIChzdHIubGVuZ3RoID49IGNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZCAtIDcpIHtcbiAgICAgIHN0ciArPSAnLi4uJztcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzdHIgKz0gdmFsdWVbaV0gKyAnLCAnO1xuICB9XG4gIHN0ciArPSAnIF0nO1xuXG4gIC8vIFJlbW92aW5nIHRyYWlsaW5nIGAsIGAgaWYgdGhlIGFycmF5IHdhcyBub3QgdHJ1bmNhdGVkXG4gIGlmIChzdHIuaW5kZXhPZignLCAgXScpICE9PSAtMSkge1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKCcsICBdJywgJyBdJyk7XG4gIH1cblxuICByZXR1cm4gc3RyO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lO1xuICB2YXIgcHJvcERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpO1xuICB2YXIgc3RyO1xuXG4gIGlmIChwcm9wRGVzY3JpcHRvcikge1xuICAgIGlmIChwcm9wRGVzY3JpcHRvci5nZXQpIHtcbiAgICAgIGlmIChwcm9wRGVzY3JpcHRvci5zZXQpIHtcbiAgICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJvcERlc2NyaXB0b3Iuc2V0KSB7XG4gICAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICh2aXNpYmxlS2V5cy5pbmRleE9mKGtleSkgPCAwKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKHZhbHVlW2tleV0pIDwgMCkge1xuICAgICAgaWYgKHJlY3Vyc2VUaW1lcyA9PT0gbnVsbCkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlW2tleV0sIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZVtrZXldLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5mdW5jdGlvbiBpc1R5cGVkQXJyYXkoYXIpIHtcbiAgLy8gVW5mb3J0dW5hdGVseSB0aGVyZSdzIG5vIHdheSB0byBjaGVjayBpZiBhbiBvYmplY3QgaXMgYSBUeXBlZEFycmF5XG4gIC8vIFdlIGhhdmUgdG8gY2hlY2sgaWYgaXQncyBvbmUgb2YgdGhlc2UgdHlwZXNcbiAgcmV0dXJuICh0eXBlb2YgYXIgPT09ICdvYmplY3QnICYmIC9cXHcrQXJyYXldJC8udGVzdChvYmplY3RUb1N0cmluZyhhcikpKTtcbn1cblxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcikgfHxcbiAgICAgICAgICh0eXBlb2YgYXIgPT09ICdvYmplY3QnICYmIG9iamVjdFRvU3RyaW5nKGFyKSA9PT0gJ1tvYmplY3QgQXJyYXldJyk7XG59XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiB0eXBlb2YgcmUgPT09ICdvYmplY3QnICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiB0eXBlb2YgZCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiB0eXBlb2YgZSA9PT0gJ29iamVjdCcgJiYgb2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXSc7XG59XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cbiIsIi8qIVxuICogQ2hhaSAtIGZsYWcgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qIVxuICogTW9kdWxlIGRlcGVuZGFuY2llc1xuICovXG5cbnZhciBpbnNwZWN0ID0gcmVxdWlyZSgnLi9pbnNwZWN0Jyk7XG52YXIgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJyk7XG5cbi8qKlxuICogIyMjIC5vYmpEaXNwbGF5KG9iamVjdClcbiAqXG4gKiBEZXRlcm1pbmVzIGlmIGFuIG9iamVjdCBvciBhbiBhcnJheSBtYXRjaGVzXG4gKiBjcml0ZXJpYSB0byBiZSBpbnNwZWN0ZWQgaW4tbGluZSBmb3IgZXJyb3JcbiAqIG1lc3NhZ2VzIG9yIHNob3VsZCBiZSB0cnVuY2F0ZWQuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gamF2YXNjcmlwdCBvYmplY3QgdG8gaW5zcGVjdFxuICogQG5hbWUgb2JqRGlzcGxheVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG9iakRpc3BsYXkob2JqKSB7XG4gIHZhciBzdHIgPSBpbnNwZWN0KG9iailcbiAgICAsIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKTtcblxuICBpZiAoY29uZmlnLnRydW5jYXRlVGhyZXNob2xkICYmIHN0ci5sZW5ndGggPj0gY29uZmlnLnRydW5jYXRlVGhyZXNob2xkKSB7XG4gICAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXScpIHtcbiAgICAgIHJldHVybiAhb2JqLm5hbWUgfHwgb2JqLm5hbWUgPT09ICcnXG4gICAgICAgID8gJ1tGdW5jdGlvbl0nXG4gICAgICAgIDogJ1tGdW5jdGlvbjogJyArIG9iai5uYW1lICsgJ10nO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgICAgcmV0dXJuICdbIEFycmF5KCcgKyBvYmoubGVuZ3RoICsgJykgXSc7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopXG4gICAgICAgICwga3N0ciA9IGtleXMubGVuZ3RoID4gMlxuICAgICAgICAgID8ga2V5cy5zcGxpY2UoMCwgMikuam9pbignLCAnKSArICcsIC4uLidcbiAgICAgICAgICA6IGtleXMuam9pbignLCAnKTtcbiAgICAgIHJldHVybiAneyBPYmplY3QgKCcgKyBrc3RyICsgJykgfSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn07XG4iLCIvKiFcbiAqIENoYWkgLSBmbGFnIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAuZmxhZyhvYmplY3QsIGtleSwgW3ZhbHVlXSlcbiAqXG4gKiBHZXQgb3Igc2V0IGEgZmxhZyB2YWx1ZSBvbiBhbiBvYmplY3QuIElmIGFcbiAqIHZhbHVlIGlzIHByb3ZpZGVkIGl0IHdpbGwgYmUgc2V0LCBlbHNlIGl0IHdpbGxcbiAqIHJldHVybiB0aGUgY3VycmVudGx5IHNldCB2YWx1ZSBvciBgdW5kZWZpbmVkYCBpZlxuICogdGhlIHZhbHVlIGlzIG5vdCBzZXQuXG4gKlxuICogICAgIHV0aWxzLmZsYWcodGhpcywgJ2ZvbycsICdiYXInKTsgLy8gc2V0dGVyXG4gKiAgICAgdXRpbHMuZmxhZyh0aGlzLCAnZm9vJyk7IC8vIGdldHRlciwgcmV0dXJucyBgYmFyYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgY29uc3RydWN0ZWQgQXNzZXJ0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge01peGVkfSB2YWx1ZSAob3B0aW9uYWwpXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBmbGFnXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZsYWcob2JqLCBrZXksIHZhbHVlKSB7XG4gIHZhciBmbGFncyA9IG9iai5fX2ZsYWdzIHx8IChvYmouX19mbGFncyA9IE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIGZsYWdzW2tleV0gPSB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmxhZ3Nba2V5XTtcbiAgfVxufTtcbiIsIi8qIVxuICogQ2hhaSAtIHRyYW5zZmVyRmxhZ3MgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogIyMjIC50cmFuc2ZlckZsYWdzKGFzc2VydGlvbiwgb2JqZWN0LCBpbmNsdWRlQWxsID0gdHJ1ZSlcbiAqXG4gKiBUcmFuc2ZlciBhbGwgdGhlIGZsYWdzIGZvciBgYXNzZXJ0aW9uYCB0byBgb2JqZWN0YC4gSWZcbiAqIGBpbmNsdWRlQWxsYCBpcyBzZXQgdG8gYGZhbHNlYCwgdGhlbiB0aGUgYmFzZSBDaGFpXG4gKiBhc3NlcnRpb24gZmxhZ3MgKG5hbWVseSBgb2JqZWN0YCwgYHNzZmlgLCBgbG9ja1NzZmlgLFxuICogYW5kIGBtZXNzYWdlYCkgd2lsbCBub3QgYmUgdHJhbnNmZXJyZWQuXG4gKlxuICpcbiAqICAgICB2YXIgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICogICAgIHV0aWxzLnRyYW5zZmVyRmxhZ3MoYXNzZXJ0aW9uLCBuZXdBc3NlcnRpb24pO1xuICpcbiAqICAgICB2YXIgYW5vdGhlckFzc2VyaXRvbiA9IG5ldyBBc3NlcnRpb24obXlPYmopO1xuICogICAgIHV0aWxzLnRyYW5zZmVyRmxhZ3MoYXNzZXJ0aW9uLCBhbm90aGVyQXNzZXJ0aW9uLCBmYWxzZSk7XG4gKlxuICogQHBhcmFtIHtBc3NlcnRpb259IGFzc2VydGlvbiB0aGUgYXNzZXJ0aW9uIHRvIHRyYW5zZmVyIHRoZSBmbGFncyBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IHRoZSBvYmplY3QgdG8gdHJhbnNmZXIgdGhlIGZsYWdzIHRvOyB1c3VhbGx5IGEgbmV3IGFzc2VydGlvblxuICogQHBhcmFtIHtCb29sZWFufSBpbmNsdWRlQWxsXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSB0cmFuc2ZlckZsYWdzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHRyYW5zZmVyRmxhZ3MoYXNzZXJ0aW9uLCBvYmplY3QsIGluY2x1ZGVBbGwpIHtcbiAgdmFyIGZsYWdzID0gYXNzZXJ0aW9uLl9fZmxhZ3MgfHwgKGFzc2VydGlvbi5fX2ZsYWdzID0gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG5cbiAgaWYgKCFvYmplY3QuX19mbGFncykge1xuICAgIG9iamVjdC5fX2ZsYWdzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIGluY2x1ZGVBbGwgPSBhcmd1bWVudHMubGVuZ3RoID09PSAzID8gaW5jbHVkZUFsbCA6IHRydWU7XG5cbiAgZm9yICh2YXIgZmxhZyBpbiBmbGFncykge1xuICAgIGlmIChpbmNsdWRlQWxsIHx8XG4gICAgICAgIChmbGFnICE9PSAnb2JqZWN0JyAmJiBmbGFnICE9PSAnc3NmaScgJiYgZmxhZyAhPT0gJ2xvY2tTc2ZpJyAmJiBmbGFnICE9ICdtZXNzYWdlJykpIHtcbiAgICAgIG9iamVjdC5fX2ZsYWdzW2ZsYWddID0gZmxhZ3NbZmxhZ107XG4gICAgfVxuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLyogZ2xvYmFscyBTeW1ib2w6IGZhbHNlLCBVaW50OEFycmF5OiBmYWxzZSwgV2Vha01hcDogZmFsc2UgKi9cbi8qIVxuICogZGVlcC1lcWxcbiAqIENvcHlyaWdodChjKSAyMDEzIEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxudmFyIHR5cGUgPSByZXF1aXJlKCd0eXBlLWRldGVjdCcpO1xuZnVuY3Rpb24gRmFrZU1hcCgpIHtcbiAgdGhpcy5fa2V5ID0gJ2NoYWkvZGVlcC1lcWxfXycgKyBNYXRoLnJhbmRvbSgpICsgRGF0ZS5ub3coKTtcbn1cblxuRmFrZU1hcC5wcm90b3R5cGUgPSB7XG4gIGdldDogZnVuY3Rpb24gZ2V0TWFwKGtleSkge1xuICAgIHJldHVybiBrZXlbdGhpcy5fa2V5XTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiBzZXRNYXAoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghT2JqZWN0LmlzRnJvemVuKGtleSkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMuX2tleSwge1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSxcbn07XG5cbnZhciBNZW1vaXplTWFwID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgPyBXZWFrTWFwIDogRmFrZU1hcDtcbi8qIVxuICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBNZW1vaXplTWFwIGhhcyByZWNvcmRlZCBhIHJlc3VsdCBvZiB0aGUgdHdvIG9wZXJhbmRzXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge01peGVkfSByaWdodEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge01lbW9pemVNYXB9IG1lbW9pemVNYXBcbiAqIEByZXR1cm5zIHtCb29sZWFufG51bGx9IHJlc3VsdFxuKi9cbmZ1bmN0aW9uIG1lbW9pemVDb21wYXJlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbWVtb2l6ZU1hcCkge1xuICAvLyBUZWNobmljYWxseSwgV2Vha01hcCBrZXlzIGNhbiAqb25seSogYmUgb2JqZWN0cywgbm90IHByaW1pdGl2ZXMuXG4gIGlmICghbWVtb2l6ZU1hcCB8fCBpc1ByaW1pdGl2ZShsZWZ0SGFuZE9wZXJhbmQpIHx8IGlzUHJpbWl0aXZlKHJpZ2h0SGFuZE9wZXJhbmQpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmFyIGxlZnRIYW5kTWFwID0gbWVtb2l6ZU1hcC5nZXQobGVmdEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kTWFwKSB7XG4gICAgdmFyIHJlc3VsdCA9IGxlZnRIYW5kTWFwLmdldChyaWdodEhhbmRPcGVyYW5kKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyohXG4gKiBTZXQgdGhlIHJlc3VsdCBvZiB0aGUgZXF1YWxpdHkgaW50byB0aGUgTWVtb2l6ZU1hcFxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IGxlZnRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtNaXhlZH0gcmlnaHRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtNZW1vaXplTWFwfSBtZW1vaXplTWFwXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHJlc3VsdFxuKi9cbmZ1bmN0aW9uIG1lbW9pemVTZXQobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBtZW1vaXplTWFwLCByZXN1bHQpIHtcbiAgLy8gVGVjaG5pY2FsbHksIFdlYWtNYXAga2V5cyBjYW4gKm9ubHkqIGJlIG9iamVjdHMsIG5vdCBwcmltaXRpdmVzLlxuICBpZiAoIW1lbW9pemVNYXAgfHwgaXNQcmltaXRpdmUobGVmdEhhbmRPcGVyYW5kKSB8fCBpc1ByaW1pdGl2ZShyaWdodEhhbmRPcGVyYW5kKSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbGVmdEhhbmRNYXAgPSBtZW1vaXplTWFwLmdldChsZWZ0SGFuZE9wZXJhbmQpO1xuICBpZiAobGVmdEhhbmRNYXApIHtcbiAgICBsZWZ0SGFuZE1hcC5zZXQocmlnaHRIYW5kT3BlcmFuZCwgcmVzdWx0KTtcbiAgfSBlbHNlIHtcbiAgICBsZWZ0SGFuZE1hcCA9IG5ldyBNZW1vaXplTWFwKCk7XG4gICAgbGVmdEhhbmRNYXAuc2V0KHJpZ2h0SGFuZE9wZXJhbmQsIHJlc3VsdCk7XG4gICAgbWVtb2l6ZU1hcC5zZXQobGVmdEhhbmRPcGVyYW5kLCBsZWZ0SGFuZE1hcCk7XG4gIH1cbn1cblxuLyohXG4gKiBQcmltYXJ5IEV4cG9ydFxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZGVlcEVxdWFsO1xubW9kdWxlLmV4cG9ydHMuTWVtb2l6ZU1hcCA9IE1lbW9pemVNYXA7XG5cbi8qKlxuICogQXNzZXJ0IGRlZXBseSBuZXN0ZWQgc2FtZVZhbHVlIGVxdWFsaXR5IGJldHdlZW4gdHdvIG9iamVjdHMgb2YgYW55IHR5cGUuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge01peGVkfSByaWdodEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIChvcHRpb25hbCkgQWRkaXRpb25hbCBvcHRpb25zXG4gKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5jb21wYXJhdG9yXSAob3B0aW9uYWwpIE92ZXJyaWRlIGRlZmF1bHQgYWxnb3JpdGhtLCBkZXRlcm1pbmluZyBjdXN0b20gZXF1YWxpdHkuXG4gKiBAcGFyYW0ge0FycmF5fSBbb3B0aW9ucy5tZW1vaXplXSAob3B0aW9uYWwpIFByb3ZpZGUgYSBjdXN0b20gbWVtb2l6YXRpb24gb2JqZWN0IHdoaWNoIHdpbGwgY2FjaGUgdGhlIHJlc3VsdHMgb2ZcbiAgICBjb21wbGV4IG9iamVjdHMgZm9yIGEgc3BlZWQgYm9vc3QuIEJ5IHBhc3NpbmcgYGZhbHNlYCB5b3UgY2FuIGRpc2FibGUgbWVtb2l6YXRpb24sIGJ1dCB0aGlzIHdpbGwgY2F1c2UgY2lyY3VsYXJcbiAgICByZWZlcmVuY2VzIHRvIGJsb3cgdGhlIHN0YWNrLlxuICogQHJldHVybiB7Qm9vbGVhbn0gZXF1YWwgbWF0Y2hcbiAqL1xuZnVuY3Rpb24gZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucykge1xuICAvLyBJZiB3ZSBoYXZlIGEgY29tcGFyYXRvciwgd2UgY2FuJ3QgYXNzdW1lIGFueXRoaW5nOyBzbyBiYWlsIHRvIGl0cyBjaGVjayBmaXJzdC5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5jb21wYXJhdG9yKSB7XG4gICAgcmV0dXJuIGV4dGVuc2l2ZURlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xuICB9XG5cbiAgdmFyIHNpbXBsZVJlc3VsdCA9IHNpbXBsZUVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCk7XG4gIGlmIChzaW1wbGVSZXN1bHQgIT09IG51bGwpIHtcbiAgICByZXR1cm4gc2ltcGxlUmVzdWx0O1xuICB9XG5cbiAgLy8gRGVlcGVyIGNvbXBhcmlzb25zIGFyZSBwdXNoZWQgdGhyb3VnaCB0byBhIGxhcmdlciBmdW5jdGlvblxuICByZXR1cm4gZXh0ZW5zaXZlRGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogTWFueSBjb21wYXJpc29ucyBjYW4gYmUgY2FuY2VsZWQgb3V0IGVhcmx5IHZpYSBzaW1wbGUgZXF1YWxpdHkgb3IgcHJpbWl0aXZlIGNoZWNrcy5cbiAqIEBwYXJhbSB7TWl4ZWR9IGxlZnRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtNaXhlZH0gcmlnaHRIYW5kT3BlcmFuZFxuICogQHJldHVybiB7Qm9vbGVhbnxudWxsfSBlcXVhbCBtYXRjaFxuICovXG5mdW5jdGlvbiBzaW1wbGVFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgLy8gRXF1YWwgcmVmZXJlbmNlcyAoZXhjZXB0IGZvciBOdW1iZXJzKSBjYW4gYmUgcmV0dXJuZWQgZWFybHlcbiAgaWYgKGxlZnRIYW5kT3BlcmFuZCA9PT0gcmlnaHRIYW5kT3BlcmFuZCkge1xuICAgIC8vIEhhbmRsZSArLTAgY2FzZXNcbiAgICByZXR1cm4gbGVmdEhhbmRPcGVyYW5kICE9PSAwIHx8IDEgLyBsZWZ0SGFuZE9wZXJhbmQgPT09IDEgLyByaWdodEhhbmRPcGVyYW5kO1xuICB9XG5cbiAgLy8gaGFuZGxlIE5hTiBjYXNlc1xuICBpZiAoXG4gICAgbGVmdEhhbmRPcGVyYW5kICE9PSBsZWZ0SGFuZE9wZXJhbmQgJiYgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICByaWdodEhhbmRPcGVyYW5kICE9PSByaWdodEhhbmRPcGVyYW5kIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQW55dGhpbmcgdGhhdCBpcyBub3QgYW4gJ29iamVjdCcsIGkuZS4gc3ltYm9scywgZnVuY3Rpb25zLCBib29sZWFucywgbnVtYmVycyxcbiAgLy8gc3RyaW5ncywgYW5kIHVuZGVmaW5lZCwgY2FuIGJlIGNvbXBhcmVkIGJ5IHJlZmVyZW5jZS5cbiAgaWYgKGlzUHJpbWl0aXZlKGxlZnRIYW5kT3BlcmFuZCkgfHwgaXNQcmltaXRpdmUocmlnaHRIYW5kT3BlcmFuZCkpIHtcbiAgICAvLyBFYXN5IG91dCBiL2MgaXQgd291bGQgaGF2ZSBwYXNzZWQgdGhlIGZpcnN0IGVxdWFsaXR5IGNoZWNrXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKiFcbiAqIFRoZSBtYWluIGxvZ2ljIG9mIHRoZSBgZGVlcEVxdWFsYCBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSBsZWZ0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7TWl4ZWR9IHJpZ2h0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gKG9wdGlvbmFsKSBBZGRpdGlvbmFsIG9wdGlvbnNcbiAqIEBwYXJhbSB7QXJyYXl9IFtvcHRpb25zLmNvbXBhcmF0b3JdIChvcHRpb25hbCkgT3ZlcnJpZGUgZGVmYXVsdCBhbGdvcml0aG0sIGRldGVybWluaW5nIGN1c3RvbSBlcXVhbGl0eS5cbiAqIEBwYXJhbSB7QXJyYXl9IFtvcHRpb25zLm1lbW9pemVdIChvcHRpb25hbCkgUHJvdmlkZSBhIGN1c3RvbSBtZW1vaXphdGlvbiBvYmplY3Qgd2hpY2ggd2lsbCBjYWNoZSB0aGUgcmVzdWx0cyBvZlxuICAgIGNvbXBsZXggb2JqZWN0cyBmb3IgYSBzcGVlZCBib29zdC4gQnkgcGFzc2luZyBgZmFsc2VgIHlvdSBjYW4gZGlzYWJsZSBtZW1vaXphdGlvbiwgYnV0IHRoaXMgd2lsbCBjYXVzZSBjaXJjdWxhclxuICAgIHJlZmVyZW5jZXMgdG8gYmxvdyB0aGUgc3RhY2suXG4gKiBAcmV0dXJuIHtCb29sZWFufSBlcXVhbCBtYXRjaFxuKi9cbmZ1bmN0aW9uIGV4dGVuc2l2ZURlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMubWVtb2l6ZSA9IG9wdGlvbnMubWVtb2l6ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IG9wdGlvbnMubWVtb2l6ZSB8fCBuZXcgTWVtb2l6ZU1hcCgpO1xuICB2YXIgY29tcGFyYXRvciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb21wYXJhdG9yO1xuXG4gIC8vIENoZWNrIGlmIGEgbWVtb2l6ZWQgcmVzdWx0IGV4aXN0cy5cbiAgdmFyIG1lbW9pemVSZXN1bHRMZWZ0ID0gbWVtb2l6ZUNvbXBhcmUobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zLm1lbW9pemUpO1xuICBpZiAobWVtb2l6ZVJlc3VsdExlZnQgIT09IG51bGwpIHtcbiAgICByZXR1cm4gbWVtb2l6ZVJlc3VsdExlZnQ7XG4gIH1cbiAgdmFyIG1lbW9pemVSZXN1bHRSaWdodCA9IG1lbW9pemVDb21wYXJlKHJpZ2h0SGFuZE9wZXJhbmQsIGxlZnRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplKTtcbiAgaWYgKG1lbW9pemVSZXN1bHRSaWdodCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBtZW1vaXplUmVzdWx0UmlnaHQ7XG4gIH1cblxuICAvLyBJZiBhIGNvbXBhcmF0b3IgaXMgcHJlc2VudCwgdXNlIGl0LlxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIHZhciBjb21wYXJhdG9yUmVzdWx0ID0gY29tcGFyYXRvcihsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpO1xuICAgIC8vIENvbXBhcmF0b3JzIG1heSByZXR1cm4gbnVsbCwgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGdvIGJhY2sgdG8gZGVmYXVsdCBiZWhhdmlvci5cbiAgICBpZiAoY29tcGFyYXRvclJlc3VsdCA9PT0gZmFsc2UgfHwgY29tcGFyYXRvclJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgbWVtb2l6ZVNldChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSwgY29tcGFyYXRvclJlc3VsdCk7XG4gICAgICByZXR1cm4gY29tcGFyYXRvclJlc3VsdDtcbiAgICB9XG4gICAgLy8gVG8gYWxsb3cgY29tcGFyYXRvcnMgdG8gb3ZlcnJpZGUgKmFueSogYmVoYXZpb3IsIHdlIHJhbiB0aGVtIGZpcnN0LiBTaW5jZSBpdCBkaWRuJ3QgZGVjaWRlXG4gICAgLy8gd2hhdCB0byBkbywgd2UgbmVlZCB0byBtYWtlIHN1cmUgdG8gcmV0dXJuIHRoZSBiYXNpYyB0ZXN0cyBmaXJzdCBiZWZvcmUgd2UgbW92ZSBvbi5cbiAgICB2YXIgc2ltcGxlUmVzdWx0ID0gc2ltcGxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgICBpZiAoc2ltcGxlUmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAvLyBEb24ndCBtZW1vaXplIHRoaXMsIGl0IHRha2VzIGxvbmdlciB0byBzZXQvcmV0cmlldmUgdGhhbiB0byBqdXN0IGNvbXBhcmUuXG4gICAgICByZXR1cm4gc2ltcGxlUmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHZhciBsZWZ0SGFuZFR5cGUgPSB0eXBlKGxlZnRIYW5kT3BlcmFuZCk7XG4gIGlmIChsZWZ0SGFuZFR5cGUgIT09IHR5cGUocmlnaHRIYW5kT3BlcmFuZCkpIHtcbiAgICBtZW1vaXplU2V0KGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplLCBmYWxzZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVGVtcG9yYXJpbHkgc2V0IHRoZSBvcGVyYW5kcyBpbiB0aGUgbWVtb2l6ZSBvYmplY3QgdG8gcHJldmVudCBibG93aW5nIHRoZSBzdGFja1xuICBtZW1vaXplU2V0KGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplLCB0cnVlKTtcblxuICB2YXIgcmVzdWx0ID0gZXh0ZW5zaXZlRGVlcEVxdWFsQnlUeXBlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRUeXBlLCBvcHRpb25zKTtcbiAgbWVtb2l6ZVNldChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZXh0ZW5zaXZlRGVlcEVxdWFsQnlUeXBlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRUeXBlLCBvcHRpb25zKSB7XG4gIHN3aXRjaCAobGVmdEhhbmRUeXBlKSB7XG4gICAgY2FzZSAnU3RyaW5nJzpcbiAgICBjYXNlICdOdW1iZXInOlxuICAgIGNhc2UgJ0Jvb2xlYW4nOlxuICAgIGNhc2UgJ0RhdGUnOlxuICAgICAgLy8gSWYgdGhlc2UgdHlwZXMgYXJlIHRoZWlyIGluc3RhbmNlIHR5cGVzIChlLmcuIGBuZXcgTnVtYmVyYCkgdGhlbiByZS1kZWVwRXF1YWwgYWdhaW5zdCB0aGVpciB2YWx1ZXNcbiAgICAgIHJldHVybiBkZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kLnZhbHVlT2YoKSwgcmlnaHRIYW5kT3BlcmFuZC52YWx1ZU9mKCkpO1xuICAgIGNhc2UgJ1Byb21pc2UnOlxuICAgIGNhc2UgJ1N5bWJvbCc6XG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgIGNhc2UgJ1dlYWtNYXAnOlxuICAgIGNhc2UgJ1dlYWtTZXQnOlxuICAgIGNhc2UgJ0Vycm9yJzpcbiAgICAgIHJldHVybiBsZWZ0SGFuZE9wZXJhbmQgPT09IHJpZ2h0SGFuZE9wZXJhbmQ7XG4gICAgY2FzZSAnQXJndW1lbnRzJzpcbiAgICBjYXNlICdJbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4QXJyYXknOlxuICAgIGNhc2UgJ1VpbnQ4Q2xhbXBlZEFycmF5JzpcbiAgICBjYXNlICdJbnQxNkFycmF5JzpcbiAgICBjYXNlICdVaW50MTZBcnJheSc6XG4gICAgY2FzZSAnSW50MzJBcnJheSc6XG4gICAgY2FzZSAnVWludDMyQXJyYXknOlxuICAgIGNhc2UgJ0Zsb2F0MzJBcnJheSc6XG4gICAgY2FzZSAnRmxvYXQ2NEFycmF5JzpcbiAgICBjYXNlICdBcnJheSc6XG4gICAgICByZXR1cm4gaXRlcmFibGVFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xuICAgIGNhc2UgJ1JlZ0V4cCc6XG4gICAgICByZXR1cm4gcmVnZXhwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgICBjYXNlICdHZW5lcmF0b3InOlxuICAgICAgcmV0dXJuIGdlbmVyYXRvckVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gICAgY2FzZSAnRGF0YVZpZXcnOlxuICAgICAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobmV3IFVpbnQ4QXJyYXkobGVmdEhhbmRPcGVyYW5kLmJ1ZmZlciksIG5ldyBVaW50OEFycmF5KHJpZ2h0SGFuZE9wZXJhbmQuYnVmZmVyKSwgb3B0aW9ucyk7XG4gICAgY2FzZSAnQXJyYXlCdWZmZXInOlxuICAgICAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobmV3IFVpbnQ4QXJyYXkobGVmdEhhbmRPcGVyYW5kKSwgbmV3IFVpbnQ4QXJyYXkocmlnaHRIYW5kT3BlcmFuZCksIG9wdGlvbnMpO1xuICAgIGNhc2UgJ1NldCc6XG4gICAgICByZXR1cm4gZW50cmllc0VxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gICAgY2FzZSAnTWFwJzpcbiAgICAgIHJldHVybiBlbnRyaWVzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG9iamVjdEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gIH1cbn1cblxuLyohXG4gKiBDb21wYXJlIHR3byBSZWd1bGFyIEV4cHJlc3Npb25zIGZvciBlcXVhbGl0eS5cbiAqXG4gKiBAcGFyYW0ge1JlZ0V4cH0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge1JlZ0V4cH0gcmlnaHRIYW5kT3BlcmFuZFxuICogQHJldHVybiB7Qm9vbGVhbn0gcmVzdWx0XG4gKi9cblxuZnVuY3Rpb24gcmVnZXhwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKSB7XG4gIHJldHVybiBsZWZ0SGFuZE9wZXJhbmQudG9TdHJpbmcoKSA9PT0gcmlnaHRIYW5kT3BlcmFuZC50b1N0cmluZygpO1xufVxuXG4vKiFcbiAqIENvbXBhcmUgdHdvIFNldHMvTWFwcyBmb3IgZXF1YWxpdHkuIEZhc3RlciB0aGFuIG90aGVyIGVxdWFsaXR5IGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge1NldH0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge1NldH0gcmlnaHRIYW5kT3BlcmFuZFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAoT3B0aW9uYWwpXG4gKiBAcmV0dXJuIHtCb29sZWFufSByZXN1bHRcbiAqL1xuXG5mdW5jdGlvbiBlbnRyaWVzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFNldCNlbnRyaWVzIG9yIFNldCNAQGl0ZXJhdG9yLCBzbyB3ZSBuZWVkIG1hbnVhbGx5IHBvcHVsYXRlIHVzaW5nIFNldCNmb3JFYWNoXG4gIGlmIChsZWZ0SGFuZE9wZXJhbmQuc2l6ZSAhPT0gcmlnaHRIYW5kT3BlcmFuZC5zaXplKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChsZWZ0SGFuZE9wZXJhbmQuc2l6ZSA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHZhciBsZWZ0SGFuZEl0ZW1zID0gW107XG4gIHZhciByaWdodEhhbmRJdGVtcyA9IFtdO1xuICBsZWZ0SGFuZE9wZXJhbmQuZm9yRWFjaChmdW5jdGlvbiBnYXRoZXJFbnRyaWVzKGtleSwgdmFsdWUpIHtcbiAgICBsZWZ0SGFuZEl0ZW1zLnB1c2goWyBrZXksIHZhbHVlIF0pO1xuICB9KTtcbiAgcmlnaHRIYW5kT3BlcmFuZC5mb3JFYWNoKGZ1bmN0aW9uIGdhdGhlckVudHJpZXMoa2V5LCB2YWx1ZSkge1xuICAgIHJpZ2h0SGFuZEl0ZW1zLnB1c2goWyBrZXksIHZhbHVlIF0pO1xuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobGVmdEhhbmRJdGVtcy5zb3J0KCksIHJpZ2h0SGFuZEl0ZW1zLnNvcnQoKSwgb3B0aW9ucyk7XG59XG5cbi8qIVxuICogU2ltcGxlIGVxdWFsaXR5IGZvciBmbGF0IGl0ZXJhYmxlIG9iamVjdHMgc3VjaCBhcyBBcnJheXMsIFR5cGVkQXJyYXlzIG9yIE5vZGUuanMgYnVmZmVycy5cbiAqXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSBsZWZ0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7SXRlcmFibGV9IHJpZ2h0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gKE9wdGlvbmFsKVxuICogQHJldHVybiB7Qm9vbGVhbn0gcmVzdWx0XG4gKi9cblxuZnVuY3Rpb24gaXRlcmFibGVFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlbmd0aCA9IGxlZnRIYW5kT3BlcmFuZC5sZW5ndGg7XG4gIGlmIChsZW5ndGggIT09IHJpZ2h0SGFuZE9wZXJhbmQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChsZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAtMTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZFtpbmRleF0sIHJpZ2h0SGFuZE9wZXJhbmRbaW5kZXhdLCBvcHRpb25zKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qIVxuICogU2ltcGxlIGVxdWFsaXR5IGZvciBnZW5lcmF0b3Igb2JqZWN0cyBzdWNoIGFzIHRob3NlIHJldHVybmVkIGJ5IGdlbmVyYXRvciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHtJdGVyYWJsZX0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge0l0ZXJhYmxlfSByaWdodEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIChPcHRpb25hbClcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHJlc3VsdFxuICovXG5cbmZ1bmN0aW9uIGdlbmVyYXRvckVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucykge1xuICByZXR1cm4gaXRlcmFibGVFcXVhbChnZXRHZW5lcmF0b3JFbnRyaWVzKGxlZnRIYW5kT3BlcmFuZCksIGdldEdlbmVyYXRvckVudHJpZXMocmlnaHRIYW5kT3BlcmFuZCksIG9wdGlvbnMpO1xufVxuXG4vKiFcbiAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGhhcyBhbiBAQGl0ZXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgb2JqZWN0IGhhcyBhbiBAQGl0ZXJhdG9yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBoYXNJdGVyYXRvckZ1bmN0aW9uKHRhcmdldCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgdGFyZ2V0ID09PSAnb2JqZWN0JyAmJlxuICAgIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIHRhcmdldFtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKiFcbiAqIEdldHMgYWxsIGl0ZXJhdG9yIGVudHJpZXMgZnJvbSB0aGUgZ2l2ZW4gT2JqZWN0LiBJZiB0aGUgT2JqZWN0IGhhcyBubyBAQGl0ZXJhdG9yIGZ1bmN0aW9uLCByZXR1cm5zIGFuIGVtcHR5IGFycmF5LlxuICogVGhpcyB3aWxsIGNvbnN1bWUgdGhlIGl0ZXJhdG9yIC0gd2hpY2ggY291bGQgaGF2ZSBzaWRlIGVmZmVjdHMgZGVwZW5kaW5nIG9uIHRoZSBAQGl0ZXJhdG9yIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXRcbiAqIEByZXR1cm5zIHtBcnJheX0gYW4gYXJyYXkgb2YgZW50cmllcyBmcm9tIHRoZSBAQGl0ZXJhdG9yIGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRW50cmllcyh0YXJnZXQpIHtcbiAgaWYgKGhhc0l0ZXJhdG9yRnVuY3Rpb24odGFyZ2V0KSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZ2V0R2VuZXJhdG9yRW50cmllcyh0YXJnZXRbU3ltYm9sLml0ZXJhdG9yXSgpKTtcbiAgICB9IGNhdGNoIChpdGVyYXRvckVycm9yKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn1cblxuLyohXG4gKiBHZXRzIGFsbCBlbnRyaWVzIGZyb20gYSBHZW5lcmF0b3IuIFRoaXMgd2lsbCBjb25zdW1lIHRoZSBnZW5lcmF0b3IgLSB3aGljaCBjb3VsZCBoYXZlIHNpZGUgZWZmZWN0cy5cbiAqXG4gKiBAcGFyYW0ge0dlbmVyYXRvcn0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7QXJyYXl9IGFuIGFycmF5IG9mIGVudHJpZXMgZnJvbSB0aGUgR2VuZXJhdG9yLlxuICovXG5mdW5jdGlvbiBnZXRHZW5lcmF0b3JFbnRyaWVzKGdlbmVyYXRvcikge1xuICB2YXIgZ2VuZXJhdG9yUmVzdWx0ID0gZ2VuZXJhdG9yLm5leHQoKTtcbiAgdmFyIGFjY3VtdWxhdG9yID0gWyBnZW5lcmF0b3JSZXN1bHQudmFsdWUgXTtcbiAgd2hpbGUgKGdlbmVyYXRvclJlc3VsdC5kb25lID09PSBmYWxzZSkge1xuICAgIGdlbmVyYXRvclJlc3VsdCA9IGdlbmVyYXRvci5uZXh0KCk7XG4gICAgYWNjdW11bGF0b3IucHVzaChnZW5lcmF0b3JSZXN1bHQudmFsdWUpO1xuICB9XG4gIHJldHVybiBhY2N1bXVsYXRvcjtcbn1cblxuLyohXG4gKiBHZXRzIGFsbCBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIGtleXMgZnJvbSBhIHRhcmdldC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7QXJyYXl9IGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUga2V5cyBmcm9tIHRoZSB0YXJnZXQuXG4gKi9cbmZ1bmN0aW9uIGdldEVudW1lcmFibGVLZXlzKHRhcmdldCkge1xuICB2YXIga2V5cyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gdGFyZ2V0KSB7XG4gICAga2V5cy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59XG5cbi8qIVxuICogRGV0ZXJtaW5lcyBpZiB0d28gb2JqZWN0cyBoYXZlIG1hdGNoaW5nIHZhbHVlcywgZ2l2ZW4gYSBzZXQgb2Yga2V5cy4gRGVmZXJzIHRvIGRlZXBFcXVhbCBmb3IgdGhlIGVxdWFsaXR5IGNoZWNrIG9mXG4gKiBlYWNoIGtleS4gSWYgYW55IHZhbHVlIG9mIHRoZSBnaXZlbiBrZXkgaXMgbm90IGVxdWFsLCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgKGVhcmx5KS5cbiAqXG4gKiBAcGFyYW0ge01peGVkfSBsZWZ0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7TWl4ZWR9IHJpZ2h0SGFuZE9wZXJhbmRcbiAqIEBwYXJhbSB7QXJyYXl9IGtleXMgQW4gYXJyYXkgb2Yga2V5cyB0byBjb21wYXJlIHRoZSB2YWx1ZXMgb2YgbGVmdEhhbmRPcGVyYW5kIGFuZCByaWdodEhhbmRPcGVyYW5kIGFnYWluc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gKE9wdGlvbmFsKVxuICogQHJldHVybiB7Qm9vbGVhbn0gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGtleXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIGtleXMsIG9wdGlvbnMpIHtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChkZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kW2tleXNbaV1dLCByaWdodEhhbmRPcGVyYW5kW2tleXNbaV1dLCBvcHRpb25zKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qIVxuICogUmVjdXJzaXZlbHkgY2hlY2sgdGhlIGVxdWFsaXR5IG9mIHR3byBPYmplY3RzLiBPbmNlIGJhc2ljIHNhbWVuZXNzIGhhcyBiZWVuIGVzdGFibGlzaGVkIGl0IHdpbGwgZGVmZXIgdG8gYGRlZXBFcXVhbGBcbiAqIGZvciBlYWNoIGVudW1lcmFibGUga2V5IGluIHRoZSBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gbGVmdEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge01peGVkfSByaWdodEhhbmRPcGVyYW5kXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIChPcHRpb25hbClcbiAqIEByZXR1cm4ge0Jvb2xlYW59IHJlc3VsdFxuICovXG5cbmZ1bmN0aW9uIG9iamVjdEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucykge1xuICB2YXIgbGVmdEhhbmRLZXlzID0gZ2V0RW51bWVyYWJsZUtleXMobGVmdEhhbmRPcGVyYW5kKTtcbiAgdmFyIHJpZ2h0SGFuZEtleXMgPSBnZXRFbnVtZXJhYmxlS2V5cyhyaWdodEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kS2V5cy5sZW5ndGggJiYgbGVmdEhhbmRLZXlzLmxlbmd0aCA9PT0gcmlnaHRIYW5kS2V5cy5sZW5ndGgpIHtcbiAgICBsZWZ0SGFuZEtleXMuc29ydCgpO1xuICAgIHJpZ2h0SGFuZEtleXMuc29ydCgpO1xuICAgIGlmIChpdGVyYWJsZUVxdWFsKGxlZnRIYW5kS2V5cywgcmlnaHRIYW5kS2V5cykgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBrZXlzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBsZWZ0SGFuZEtleXMsIG9wdGlvbnMpO1xuICB9XG5cbiAgdmFyIGxlZnRIYW5kRW50cmllcyA9IGdldEl0ZXJhdG9yRW50cmllcyhsZWZ0SGFuZE9wZXJhbmQpO1xuICB2YXIgcmlnaHRIYW5kRW50cmllcyA9IGdldEl0ZXJhdG9yRW50cmllcyhyaWdodEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kRW50cmllcy5sZW5ndGggJiYgbGVmdEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gcmlnaHRIYW5kRW50cmllcy5sZW5ndGgpIHtcbiAgICBsZWZ0SGFuZEVudHJpZXMuc29ydCgpO1xuICAgIHJpZ2h0SGFuZEVudHJpZXMuc29ydCgpO1xuICAgIHJldHVybiBpdGVyYWJsZUVxdWFsKGxlZnRIYW5kRW50cmllcywgcmlnaHRIYW5kRW50cmllcywgb3B0aW9ucyk7XG4gIH1cblxuICBpZiAobGVmdEhhbmRLZXlzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgbGVmdEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgcmlnaHRIYW5kS2V5cy5sZW5ndGggPT09IDAgJiZcbiAgICAgIHJpZ2h0SGFuZEVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qIVxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBhIHByaW1pdGl2ZS5cbiAqXG4gKiBUaGlzIGludGVudGlvbmFsbHkgcmV0dXJucyB0cnVlIGZvciBhbGwgb2JqZWN0cyB0aGF0IGNhbiBiZSBjb21wYXJlZCBieSByZWZlcmVuY2UsXG4gKiBpbmNsdWRpbmcgZnVuY3Rpb25zIGFuZCBzeW1ib2xzLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufSByZXN1bHRcbiAqL1xuZnVuY3Rpb24gaXNQcmltaXRpdmUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCc7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qICFcbiAqIENoYWkgLSBnZXRGdW5jTmFtZSB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE2IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmdldEZ1bmNOYW1lKGNvbnN0cnVjdG9yRm4pXG4gKlxuICogUmV0dXJucyB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uLlxuICogV2hlbiBhIG5vbi1mdW5jdGlvbiBpbnN0YW5jZSBpcyBwYXNzZWQsIHJldHVybnMgYG51bGxgLlxuICogVGhpcyBhbHNvIGluY2x1ZGVzIGEgcG9seWZpbGwgZnVuY3Rpb24gaWYgYGFGdW5jLm5hbWVgIGlzIG5vdCBkZWZpbmVkLlxuICpcbiAqIEBuYW1lIGdldEZ1bmNOYW1lXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jdFxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG52YXIgdG9TdHJpbmcgPSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7XG52YXIgZnVuY3Rpb25OYW1lTWF0Y2ggPSAvXFxzKmZ1bmN0aW9uKD86XFxzfFxccypcXC9cXCpbXig/OipcXC8pXStcXCpcXC9cXHMqKSooW15cXHNcXChcXC9dKykvO1xuZnVuY3Rpb24gZ2V0RnVuY05hbWUoYUZ1bmMpIHtcbiAgaWYgKHR5cGVvZiBhRnVuYyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG5hbWUgPSAnJztcbiAgaWYgKHR5cGVvZiBGdW5jdGlvbi5wcm90b3R5cGUubmFtZSA9PT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGFGdW5jLm5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gSGVyZSB3ZSBydW4gYSBwb2x5ZmlsbCBpZiBGdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBgbmFtZWAgcHJvcGVydHkgYW5kIGlmIGFGdW5jLm5hbWUgaXMgbm90IGRlZmluZWRcbiAgICB2YXIgbWF0Y2ggPSB0b1N0cmluZy5jYWxsKGFGdW5jKS5tYXRjaChmdW5jdGlvbk5hbWVNYXRjaCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBuYW1lID0gbWF0Y2hbMV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIHdlJ3ZlIGdvdCBhIGBuYW1lYCBwcm9wZXJ0eSB3ZSBqdXN0IHVzZSBpdFxuICAgIG5hbWUgPSBhRnVuYy5uYW1lO1xuICB9XG5cbiAgcmV0dXJuIG5hbWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0RnVuY05hbWU7XG4iLCIvKiFcbiAqIENoYWkgLSBhZGRQcm9wZXJ0eSB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxudmFyIGNoYWkgPSByZXF1aXJlKCcuLi8uLi9jaGFpJyk7XG52YXIgZmxhZyA9IHJlcXVpcmUoJy4vZmxhZycpO1xudmFyIGlzUHJveHlFbmFibGVkID0gcmVxdWlyZSgnLi9pc1Byb3h5RW5hYmxlZCcpO1xudmFyIHRyYW5zZmVyRmxhZ3MgPSByZXF1aXJlKCcuL3RyYW5zZmVyRmxhZ3MnKTtcblxuLyoqXG4gKiAjIyMgLmFkZFByb3BlcnR5KGN0eCwgbmFtZSwgZ2V0dGVyKVxuICpcbiAqIEFkZHMgYSBwcm9wZXJ0eSB0byB0aGUgcHJvdG90eXBlIG9mIGFuIG9iamVjdC5cbiAqXG4gKiAgICAgdXRpbHMuYWRkUHJvcGVydHkoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCAnZm9vJywgZnVuY3Rpb24gKCkge1xuICogICAgICAgdmFyIG9iaiA9IHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcpO1xuICogICAgICAgbmV3IGNoYWkuQXNzZXJ0aW9uKG9iaikudG8uYmUuaW5zdGFuY2VvZihGb28pO1xuICogICAgIH0pO1xuICpcbiAqIENhbiBhbHNvIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gYGNoYWkuQXNzZXJ0aW9uYC5cbiAqXG4gKiAgICAgY2hhaS5Bc3NlcnRpb24uYWRkUHJvcGVydHkoJ2ZvbycsIGZuKTtcbiAqXG4gKiBUaGVuIGNhbiBiZSB1c2VkIGFzIGFueSBvdGhlciBhc3NlcnRpb24uXG4gKlxuICogICAgIGV4cGVjdChteUZvbykudG8uYmUuZm9vO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjdHggb2JqZWN0IHRvIHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyBhZGRlZFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgcHJvcGVydHkgdG8gYWRkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBnZXR0ZXIgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgbmFtZVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgYWRkUHJvcGVydHlcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhZGRQcm9wZXJ0eShjdHgsIG5hbWUsIGdldHRlcikge1xuICBnZXR0ZXIgPSBnZXR0ZXIgPT09IHVuZGVmaW5lZCA/IGZ1bmN0aW9uICgpIHt9IDogZ2V0dGVyO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIG5hbWUsXG4gICAgeyBnZXQ6IGZ1bmN0aW9uIHByb3BlcnR5R2V0dGVyKCkge1xuICAgICAgICAvLyBTZXR0aW5nIHRoZSBgc3NmaWAgZmxhZyB0byBgcHJvcGVydHlHZXR0ZXJgIGNhdXNlcyB0aGlzIGZ1bmN0aW9uIHRvXG4gICAgICAgIC8vIGJlIHRoZSBzdGFydGluZyBwb2ludCBmb3IgcmVtb3ZpbmcgaW1wbGVtZW50YXRpb24gZnJhbWVzIGZyb20gdGhlXG4gICAgICAgIC8vIHN0YWNrIHRyYWNlIG9mIGEgZmFpbGVkIGFzc2VydGlvbi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBzdGFydGluZyBwb2ludCBpZlxuICAgICAgICAvLyB0aGUgYGxvY2tTc2ZpYCBmbGFnIGlzbid0IHNldCBhbmQgcHJveHkgcHJvdGVjdGlvbiBpcyBkaXNhYmxlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSWYgdGhlIGBsb2NrU3NmaWAgZmxhZyBpcyBzZXQsIHRoZW4gZWl0aGVyIHRoaXMgYXNzZXJ0aW9uIGhhcyBiZWVuXG4gICAgICAgIC8vIG92ZXJ3cml0dGVuIGJ5IGFub3RoZXIgYXNzZXJ0aW9uLCBvciB0aGlzIGFzc2VydGlvbiBpcyBiZWluZyBpbnZva2VkXG4gICAgICAgIC8vIGZyb20gaW5zaWRlIG9mIGFub3RoZXIgYXNzZXJ0aW9uLiBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIGBzc2ZpYCBmbGFnXG4gICAgICAgIC8vIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uIEluIHRoZSBzZWNvbmRcbiAgICAgICAgLy8gY2FzZSwgdGhlIGBzc2ZpYCBmbGFnIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdXRlciBhc3NlcnRpb24uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIHByb3h5IHByb3RlY3Rpb24gaXMgZW5hYmxlZCwgdGhlbiB0aGUgYHNzZmlgIGZsYWcgaGFzIGFscmVhZHkgYmVlblxuICAgICAgICAvLyBzZXQgYnkgdGhlIHByb3h5IGdldHRlci5cbiAgICAgICAgaWYgKCFpc1Byb3h5RW5hYmxlZCgpICYmICFmbGFnKHRoaXMsICdsb2NrU3NmaScpKSB7XG4gICAgICAgICAgZmxhZyh0aGlzLCAnc3NmaScsIHByb3BlcnR5R2V0dGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciByZXN1bHQgPSBnZXR0ZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG5cbiAgICAgICAgdmFyIG5ld0Fzc2VydGlvbiA9IG5ldyBjaGFpLkFzc2VydGlvbigpO1xuICAgICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgICB9XG4gICAgLCBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59O1xuIiwiLyohXG4gKiBDaGFpIC0gYWRkTWV0aG9kIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG52YXIgYWRkTGVuZ3RoR3VhcmQgPSByZXF1aXJlKCcuL2FkZExlbmd0aEd1YXJkJyk7XG52YXIgY2hhaSA9IHJlcXVpcmUoJy4uLy4uL2NoYWknKTtcbnZhciBmbGFnID0gcmVxdWlyZSgnLi9mbGFnJyk7XG52YXIgcHJveGlmeSA9IHJlcXVpcmUoJy4vcHJveGlmeScpO1xudmFyIHRyYW5zZmVyRmxhZ3MgPSByZXF1aXJlKCcuL3RyYW5zZmVyRmxhZ3MnKTtcblxuLyoqXG4gKiAjIyMgLmFkZE1ldGhvZChjdHgsIG5hbWUsIG1ldGhvZClcbiAqXG4gKiBBZGRzIGEgbWV0aG9kIHRvIHRoZSBwcm90b3R5cGUgb2YgYW4gb2JqZWN0LlxuICpcbiAqICAgICB1dGlscy5hZGRNZXRob2QoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCAnZm9vJywgZnVuY3Rpb24gKHN0cikge1xuICogICAgICAgdmFyIG9iaiA9IHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcpO1xuICogICAgICAgbmV3IGNoYWkuQXNzZXJ0aW9uKG9iaikudG8uYmUuZXF1YWwoc3RyKTtcbiAqICAgICB9KTtcbiAqXG4gKiBDYW4gYWxzbyBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIGBjaGFpLkFzc2VydGlvbmAuXG4gKlxuICogICAgIGNoYWkuQXNzZXJ0aW9uLmFkZE1ldGhvZCgnZm9vJywgZm4pO1xuICpcbiAqIFRoZW4gY2FuIGJlIHVzZWQgYXMgYW55IG90aGVyIGFzc2VydGlvbi5cbiAqXG4gKiAgICAgZXhwZWN0KGZvb1N0cikudG8uYmUuZm9vKCdiYXInKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3R4IG9iamVjdCB0byB3aGljaCB0aGUgbWV0aG9kIGlzIGFkZGVkXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiBtZXRob2QgdG8gYWRkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgbmFtZVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgYWRkTWV0aG9kXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYWRkTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kKSB7XG4gIHZhciBtZXRob2RXcmFwcGVyID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIFNldHRpbmcgdGhlIGBzc2ZpYCBmbGFnIHRvIGBtZXRob2RXcmFwcGVyYCBjYXVzZXMgdGhpcyBmdW5jdGlvbiB0byBiZSB0aGVcbiAgICAvLyBzdGFydGluZyBwb2ludCBmb3IgcmVtb3ZpbmcgaW1wbGVtZW50YXRpb24gZnJhbWVzIGZyb20gdGhlIHN0YWNrIHRyYWNlIG9mXG4gICAgLy8gYSBmYWlsZWQgYXNzZXJ0aW9uLlxuICAgIC8vXG4gICAgLy8gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBzdGFydGluZyBwb2ludCBpZiB0aGVcbiAgICAvLyBgbG9ja1NzZmlgIGZsYWcgaXNuJ3Qgc2V0LlxuICAgIC8vXG4gICAgLy8gSWYgdGhlIGBsb2NrU3NmaWAgZmxhZyBpcyBzZXQsIHRoZW4gZWl0aGVyIHRoaXMgYXNzZXJ0aW9uIGhhcyBiZWVuXG4gICAgLy8gb3ZlcndyaXR0ZW4gYnkgYW5vdGhlciBhc3NlcnRpb24sIG9yIHRoaXMgYXNzZXJ0aW9uIGlzIGJlaW5nIGludm9rZWQgZnJvbVxuICAgIC8vIGluc2lkZSBvZiBhbm90aGVyIGFzc2VydGlvbi4gSW4gdGhlIGZpcnN0IGNhc2UsIHRoZSBgc3NmaWAgZmxhZyBoYXNcbiAgICAvLyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlXG4gICAgLy8gYHNzZmlgIGZsYWcgaGFzIGFscmVhZHkgYmVlbiBzZXQgYnkgdGhlIG91dGVyIGFzc2VydGlvbi5cbiAgICBpZiAoIWZsYWcodGhpcywgJ2xvY2tTc2ZpJykpIHtcbiAgICAgIGZsYWcodGhpcywgJ3NzZmknLCBtZXRob2RXcmFwcGVyKTtcbiAgICB9XG5cbiAgICB2YXIgcmVzdWx0ID0gbWV0aG9kLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIHJlc3VsdDtcblxuICAgIHZhciBuZXdBc3NlcnRpb24gPSBuZXcgY2hhaS5Bc3NlcnRpb24oKTtcbiAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgcmV0dXJuIG5ld0Fzc2VydGlvbjtcbiAgfTtcblxuICBhZGRMZW5ndGhHdWFyZChtZXRob2RXcmFwcGVyLCBuYW1lLCBmYWxzZSk7XG4gIGN0eFtuYW1lXSA9IHByb3hpZnkobWV0aG9kV3JhcHBlciwgbmFtZSk7XG59O1xuIiwiLyohXG4gKiBDaGFpIC0gb3ZlcndyaXRlUHJvcGVydHkgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbnZhciBjaGFpID0gcmVxdWlyZSgnLi4vLi4vY2hhaScpO1xudmFyIGZsYWcgPSByZXF1aXJlKCcuL2ZsYWcnKTtcbnZhciBpc1Byb3h5RW5hYmxlZCA9IHJlcXVpcmUoJy4vaXNQcm94eUVuYWJsZWQnKTtcbnZhciB0cmFuc2ZlckZsYWdzID0gcmVxdWlyZSgnLi90cmFuc2ZlckZsYWdzJyk7XG5cbi8qKlxuICogIyMjIC5vdmVyd3JpdGVQcm9wZXJ0eShjdHgsIG5hbWUsIGZuKVxuICpcbiAqIE92ZXJ3aXRlcyBhbiBhbHJlYWR5IGV4aXN0aW5nIHByb3BlcnR5IGdldHRlciBhbmQgcHJvdmlkZXNcbiAqIGFjY2VzcyB0byBwcmV2aW91cyB2YWx1ZS4gTXVzdCByZXR1cm4gZnVuY3Rpb24gdG8gdXNlIGFzIGdldHRlci5cbiAqXG4gKiAgICAgdXRpbHMub3ZlcndyaXRlUHJvcGVydHkoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCAnb2snLCBmdW5jdGlvbiAoX3N1cGVyKSB7XG4gKiAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICogICAgICAgICB2YXIgb2JqID0gdXRpbHMuZmxhZyh0aGlzLCAnb2JqZWN0Jyk7XG4gKiAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb28pIHtcbiAqICAgICAgICAgICBuZXcgY2hhaS5Bc3NlcnRpb24ob2JqLm5hbWUpLnRvLmVxdWFsKCdiYXInKTtcbiAqICAgICAgICAgfSBlbHNlIHtcbiAqICAgICAgICAgICBfc3VwZXIuY2FsbCh0aGlzKTtcbiAqICAgICAgICAgfVxuICogICAgICAgfVxuICogICAgIH0pO1xuICpcbiAqXG4gKiBDYW4gYWxzbyBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIGBjaGFpLkFzc2VydGlvbmAuXG4gKlxuICogICAgIGNoYWkuQXNzZXJ0aW9uLm92ZXJ3cml0ZVByb3BlcnR5KCdmb28nLCBmbik7XG4gKlxuICogVGhlbiBjYW4gYmUgdXNlZCBhcyBhbnkgb3RoZXIgYXNzZXJ0aW9uLlxuICpcbiAqICAgICBleHBlY3QobXlGb28pLnRvLmJlLm9rO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjdHggb2JqZWN0IHdob3NlIHByb3BlcnR5IGlzIHRvIGJlIG92ZXJ3cml0dGVuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiBwcm9wZXJ0eSB0byBvdmVyd3JpdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGdldHRlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBnZXR0ZXIgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgbmFtZVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgb3ZlcndyaXRlUHJvcGVydHlcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBvdmVyd3JpdGVQcm9wZXJ0eShjdHgsIG5hbWUsIGdldHRlcikge1xuICB2YXIgX2dldCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY3R4LCBuYW1lKVxuICAgICwgX3N1cGVyID0gZnVuY3Rpb24gKCkge307XG5cbiAgaWYgKF9nZXQgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIF9nZXQuZ2V0KVxuICAgIF9zdXBlciA9IF9nZXQuZ2V0XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwgbmFtZSxcbiAgICB7IGdldDogZnVuY3Rpb24gb3ZlcndyaXRpbmdQcm9wZXJ0eUdldHRlcigpIHtcbiAgICAgICAgLy8gU2V0dGluZyB0aGUgYHNzZmlgIGZsYWcgdG8gYG92ZXJ3cml0aW5nUHJvcGVydHlHZXR0ZXJgIGNhdXNlcyB0aGlzXG4gICAgICAgIC8vIGZ1bmN0aW9uIHRvIGJlIHRoZSBzdGFydGluZyBwb2ludCBmb3IgcmVtb3ZpbmcgaW1wbGVtZW50YXRpb24gZnJhbWVzXG4gICAgICAgIC8vIGZyb20gdGhlIHN0YWNrIHRyYWNlIG9mIGEgZmFpbGVkIGFzc2VydGlvbi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBzdGFydGluZyBwb2ludCBpZlxuICAgICAgICAvLyB0aGUgYGxvY2tTc2ZpYCBmbGFnIGlzbid0IHNldCBhbmQgcHJveHkgcHJvdGVjdGlvbiBpcyBkaXNhYmxlZC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSWYgdGhlIGBsb2NrU3NmaWAgZmxhZyBpcyBzZXQsIHRoZW4gZWl0aGVyIHRoaXMgYXNzZXJ0aW9uIGhhcyBiZWVuXG4gICAgICAgIC8vIG92ZXJ3cml0dGVuIGJ5IGFub3RoZXIgYXNzZXJ0aW9uLCBvciB0aGlzIGFzc2VydGlvbiBpcyBiZWluZyBpbnZva2VkXG4gICAgICAgIC8vIGZyb20gaW5zaWRlIG9mIGFub3RoZXIgYXNzZXJ0aW9uLiBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIGBzc2ZpYCBmbGFnXG4gICAgICAgIC8vIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uIEluIHRoZSBzZWNvbmRcbiAgICAgICAgLy8gY2FzZSwgdGhlIGBzc2ZpYCBmbGFnIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdXRlciBhc3NlcnRpb24uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIElmIHByb3h5IHByb3RlY3Rpb24gaXMgZW5hYmxlZCwgdGhlbiB0aGUgYHNzZmlgIGZsYWcgaGFzIGFscmVhZHkgYmVlblxuICAgICAgICAvLyBzZXQgYnkgdGhlIHByb3h5IGdldHRlci5cbiAgICAgICAgaWYgKCFpc1Byb3h5RW5hYmxlZCgpICYmICFmbGFnKHRoaXMsICdsb2NrU3NmaScpKSB7XG4gICAgICAgICAgZmxhZyh0aGlzLCAnc3NmaScsIG92ZXJ3cml0aW5nUHJvcGVydHlHZXR0ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0dGluZyB0aGUgYGxvY2tTc2ZpYCBmbGFnIHRvIGB0cnVlYCBwcmV2ZW50cyB0aGUgb3ZlcndyaXR0ZW5cbiAgICAgICAgLy8gYXNzZXJ0aW9uIGZyb20gY2hhbmdpbmcgdGhlIGBzc2ZpYCBmbGFnLiBCeSB0aGlzIHBvaW50LCB0aGUgYHNzZmlgXG4gICAgICAgIC8vIGZsYWcgaXMgYWxyZWFkeSBzZXQgdG8gdGhlIGNvcnJlY3Qgc3RhcnRpbmcgcG9pbnQgZm9yIHRoaXMgYXNzZXJ0aW9uLlxuICAgICAgICB2YXIgb3JpZ0xvY2tTc2ZpID0gZmxhZyh0aGlzLCAnbG9ja1NzZmknKTtcbiAgICAgICAgZmxhZyh0aGlzLCAnbG9ja1NzZmknLCB0cnVlKTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGdldHRlcihfc3VwZXIpLmNhbGwodGhpcyk7XG4gICAgICAgIGZsYWcodGhpcywgJ2xvY2tTc2ZpJywgb3JpZ0xvY2tTc2ZpKTtcblxuICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5ld0Fzc2VydGlvbiA9IG5ldyBjaGFpLkFzc2VydGlvbigpO1xuICAgICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgICB9XG4gICAgLCBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59O1xuIiwiLyohXG4gKiBDaGFpIC0gb3ZlcndyaXRlTWV0aG9kIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG52YXIgYWRkTGVuZ3RoR3VhcmQgPSByZXF1aXJlKCcuL2FkZExlbmd0aEd1YXJkJyk7XG52YXIgY2hhaSA9IHJlcXVpcmUoJy4uLy4uL2NoYWknKTtcbnZhciBmbGFnID0gcmVxdWlyZSgnLi9mbGFnJyk7XG52YXIgcHJveGlmeSA9IHJlcXVpcmUoJy4vcHJveGlmeScpO1xudmFyIHRyYW5zZmVyRmxhZ3MgPSByZXF1aXJlKCcuL3RyYW5zZmVyRmxhZ3MnKTtcblxuLyoqXG4gKiAjIyMgLm92ZXJ3cml0ZU1ldGhvZChjdHgsIG5hbWUsIGZuKVxuICpcbiAqIE92ZXJ3aXRlcyBhbiBhbHJlYWR5IGV4aXN0aW5nIG1ldGhvZCBhbmQgcHJvdmlkZXNcbiAqIGFjY2VzcyB0byBwcmV2aW91cyBmdW5jdGlvbi4gTXVzdCByZXR1cm4gZnVuY3Rpb25cbiAqIHRvIGJlIHVzZWQgZm9yIG5hbWUuXG4gKlxuICogICAgIHV0aWxzLm92ZXJ3cml0ZU1ldGhvZChjaGFpLkFzc2VydGlvbi5wcm90b3R5cGUsICdlcXVhbCcsIGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAqICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3RyKSB7XG4gKiAgICAgICAgIHZhciBvYmogPSB1dGlscy5mbGFnKHRoaXMsICdvYmplY3QnKTtcbiAqICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvbykge1xuICogICAgICAgICAgIG5ldyBjaGFpLkFzc2VydGlvbihvYmoudmFsdWUpLnRvLmVxdWFsKHN0cik7XG4gKiAgICAgICAgIH0gZWxzZSB7XG4gKiAgICAgICAgICAgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH1cbiAqICAgICB9KTtcbiAqXG4gKiBDYW4gYWxzbyBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIGBjaGFpLkFzc2VydGlvbmAuXG4gKlxuICogICAgIGNoYWkuQXNzZXJ0aW9uLm92ZXJ3cml0ZU1ldGhvZCgnZm9vJywgZm4pO1xuICpcbiAqIFRoZW4gY2FuIGJlIHVzZWQgYXMgYW55IG90aGVyIGFzc2VydGlvbi5cbiAqXG4gKiAgICAgZXhwZWN0KG15Rm9vKS50by5lcXVhbCgnYmFyJyk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGN0eCBvYmplY3Qgd2hvc2UgbWV0aG9kIGlzIHRvIGJlIG92ZXJ3cml0dGVuXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiBtZXRob2QgdG8gb3ZlcndyaXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgbmFtZVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgb3ZlcndyaXRlTWV0aG9kXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gb3ZlcndyaXRlTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kKSB7XG4gIHZhciBfbWV0aG9kID0gY3R4W25hbWVdXG4gICAgLCBfc3VwZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobmFtZSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICB9O1xuXG4gIGlmIChfbWV0aG9kICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBfbWV0aG9kKVxuICAgIF9zdXBlciA9IF9tZXRob2Q7XG5cbiAgdmFyIG92ZXJ3cml0aW5nTWV0aG9kV3JhcHBlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTZXR0aW5nIHRoZSBgc3NmaWAgZmxhZyB0byBgb3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyYCBjYXVzZXMgdGhpc1xuICAgIC8vIGZ1bmN0aW9uIHRvIGJlIHRoZSBzdGFydGluZyBwb2ludCBmb3IgcmVtb3ZpbmcgaW1wbGVtZW50YXRpb24gZnJhbWVzIGZyb21cbiAgICAvLyB0aGUgc3RhY2sgdHJhY2Ugb2YgYSBmYWlsZWQgYXNzZXJ0aW9uLlxuICAgIC8vXG4gICAgLy8gSG93ZXZlciwgd2Ugb25seSB3YW50IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGFzIHRoZSBzdGFydGluZyBwb2ludCBpZiB0aGVcbiAgICAvLyBgbG9ja1NzZmlgIGZsYWcgaXNuJ3Qgc2V0LlxuICAgIC8vXG4gICAgLy8gSWYgdGhlIGBsb2NrU3NmaWAgZmxhZyBpcyBzZXQsIHRoZW4gZWl0aGVyIHRoaXMgYXNzZXJ0aW9uIGhhcyBiZWVuXG4gICAgLy8gb3ZlcndyaXR0ZW4gYnkgYW5vdGhlciBhc3NlcnRpb24sIG9yIHRoaXMgYXNzZXJ0aW9uIGlzIGJlaW5nIGludm9rZWQgZnJvbVxuICAgIC8vIGluc2lkZSBvZiBhbm90aGVyIGFzc2VydGlvbi4gSW4gdGhlIGZpcnN0IGNhc2UsIHRoZSBgc3NmaWAgZmxhZyBoYXNcbiAgICAvLyBhbHJlYWR5IGJlZW4gc2V0IGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlXG4gICAgLy8gYHNzZmlgIGZsYWcgaGFzIGFscmVhZHkgYmVlbiBzZXQgYnkgdGhlIG91dGVyIGFzc2VydGlvbi5cbiAgICBpZiAoIWZsYWcodGhpcywgJ2xvY2tTc2ZpJykpIHtcbiAgICAgIGZsYWcodGhpcywgJ3NzZmknLCBvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIpO1xuICAgIH1cblxuICAgIC8vIFNldHRpbmcgdGhlIGBsb2NrU3NmaWAgZmxhZyB0byBgdHJ1ZWAgcHJldmVudHMgdGhlIG92ZXJ3cml0dGVuIGFzc2VydGlvblxuICAgIC8vIGZyb20gY2hhbmdpbmcgdGhlIGBzc2ZpYCBmbGFnLiBCeSB0aGlzIHBvaW50LCB0aGUgYHNzZmlgIGZsYWcgaXMgYWxyZWFkeVxuICAgIC8vIHNldCB0byB0aGUgY29ycmVjdCBzdGFydGluZyBwb2ludCBmb3IgdGhpcyBhc3NlcnRpb24uXG4gICAgdmFyIG9yaWdMb2NrU3NmaSA9IGZsYWcodGhpcywgJ2xvY2tTc2ZpJyk7XG4gICAgZmxhZyh0aGlzLCAnbG9ja1NzZmknLCB0cnVlKTtcbiAgICB2YXIgcmVzdWx0ID0gbWV0aG9kKF9zdXBlcikuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBmbGFnKHRoaXMsICdsb2NrU3NmaScsIG9yaWdMb2NrU3NmaSk7XG5cbiAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdmFyIG5ld0Fzc2VydGlvbiA9IG5ldyBjaGFpLkFzc2VydGlvbigpO1xuICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICB9XG5cbiAgYWRkTGVuZ3RoR3VhcmQob3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyLCBuYW1lLCBmYWxzZSk7XG4gIGN0eFtuYW1lXSA9IHByb3hpZnkob3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyLCBuYW1lKTtcbn07XG4iLCIvKiFcbiAqIENoYWkgLSBhZGRDaGFpbmluZ01ldGhvZCB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyohXG4gKiBNb2R1bGUgZGVwZW5kZW5jaWVzXG4gKi9cblxudmFyIGFkZExlbmd0aEd1YXJkID0gcmVxdWlyZSgnLi9hZGRMZW5ndGhHdWFyZCcpO1xudmFyIGNoYWkgPSByZXF1aXJlKCcuLi8uLi9jaGFpJyk7XG52YXIgZmxhZyA9IHJlcXVpcmUoJy4vZmxhZycpO1xudmFyIHByb3hpZnkgPSByZXF1aXJlKCcuL3Byb3hpZnknKTtcbnZhciB0cmFuc2ZlckZsYWdzID0gcmVxdWlyZSgnLi90cmFuc2ZlckZsYWdzJyk7XG5cbi8qIVxuICogTW9kdWxlIHZhcmlhYmxlc1xuICovXG5cbi8vIENoZWNrIHdoZXRoZXIgYE9iamVjdC5zZXRQcm90b3R5cGVPZmAgaXMgc3VwcG9ydGVkXG52YXIgY2FuU2V0UHJvdG90eXBlID0gdHlwZW9mIE9iamVjdC5zZXRQcm90b3R5cGVPZiA9PT0gJ2Z1bmN0aW9uJztcblxuLy8gV2l0aG91dCBgT2JqZWN0LnNldFByb3RvdHlwZU9mYCBzdXBwb3J0LCB0aGlzIG1vZHVsZSB3aWxsIG5lZWQgdG8gYWRkIHByb3BlcnRpZXMgdG8gYSBmdW5jdGlvbi5cbi8vIEhvd2V2ZXIsIHNvbWUgb2YgZnVuY3Rpb25zJyBvd24gcHJvcHMgYXJlIG5vdCBjb25maWd1cmFibGUgYW5kIHNob3VsZCBiZSBza2lwcGVkLlxudmFyIHRlc3RGbiA9IGZ1bmN0aW9uKCkge307XG52YXIgZXhjbHVkZU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdEZuKS5maWx0ZXIoZnVuY3Rpb24obmFtZSkge1xuICB2YXIgcHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRlc3RGbiwgbmFtZSk7XG5cbiAgLy8gTm90ZTogUGhhbnRvbUpTIDEueCBpbmNsdWRlcyBgY2FsbGVlYCBhcyBvbmUgb2YgYHRlc3RGbmAncyBvd24gcHJvcGVydGllcyxcbiAgLy8gYnV0IHRoZW4gcmV0dXJucyBgdW5kZWZpbmVkYCBhcyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgYGNhbGxlZWAuIEFzIGFcbiAgLy8gd29ya2Fyb3VuZCwgd2UgcGVyZm9ybSBhbiBvdGhlcndpc2UgdW5uZWNlc3NhcnkgdHlwZS1jaGVjayBmb3IgYHByb3BEZXNjYCxcbiAgLy8gYW5kIHRoZW4gZmlsdGVyIGl0IG91dCBpZiBpdCdzIG5vdCBhbiBvYmplY3QgYXMgaXQgc2hvdWxkIGJlLlxuICBpZiAodHlwZW9mIHByb3BEZXNjICE9PSAnb2JqZWN0JylcbiAgICByZXR1cm4gdHJ1ZTtcblxuICByZXR1cm4gIXByb3BEZXNjLmNvbmZpZ3VyYWJsZTtcbn0pO1xuXG4vLyBDYWNoZSBgRnVuY3Rpb25gIHByb3BlcnRpZXNcbnZhciBjYWxsICA9IEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLFxuICAgIGFwcGx5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O1xuXG4vKipcbiAqICMjIyAuYWRkQ2hhaW5hYmxlTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kLCBjaGFpbmluZ0JlaGF2aW9yKVxuICpcbiAqIEFkZHMgYSBtZXRob2QgdG8gYW4gb2JqZWN0LCBzdWNoIHRoYXQgdGhlIG1ldGhvZCBjYW4gYWxzbyBiZSBjaGFpbmVkLlxuICpcbiAqICAgICB1dGlscy5hZGRDaGFpbmFibGVNZXRob2QoY2hhaS5Bc3NlcnRpb24ucHJvdG90eXBlLCAnZm9vJywgZnVuY3Rpb24gKHN0cikge1xuICogICAgICAgdmFyIG9iaiA9IHV0aWxzLmZsYWcodGhpcywgJ29iamVjdCcpO1xuICogICAgICAgbmV3IGNoYWkuQXNzZXJ0aW9uKG9iaikudG8uYmUuZXF1YWwoc3RyKTtcbiAqICAgICB9KTtcbiAqXG4gKiBDYW4gYWxzbyBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIGBjaGFpLkFzc2VydGlvbmAuXG4gKlxuICogICAgIGNoYWkuQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZCgnZm9vJywgZm4sIGNoYWluaW5nQmVoYXZpb3IpO1xuICpcbiAqIFRoZSByZXN1bHQgY2FuIHRoZW4gYmUgdXNlZCBhcyBib3RoIGEgbWV0aG9kIGFzc2VydGlvbiwgZXhlY3V0aW5nIGJvdGggYG1ldGhvZGAgYW5kXG4gKiBgY2hhaW5pbmdCZWhhdmlvcmAsIG9yIGFzIGEgbGFuZ3VhZ2UgY2hhaW4sIHdoaWNoIG9ubHkgZXhlY3V0ZXMgYGNoYWluaW5nQmVoYXZpb3JgLlxuICpcbiAqICAgICBleHBlY3QoZm9vU3RyKS50by5iZS5mb28oJ2JhcicpO1xuICogICAgIGV4cGVjdChmb29TdHIpLnRvLmJlLmZvby5lcXVhbCgnZm9vJyk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGN0eCBvYmplY3QgdG8gd2hpY2ggdGhlIG1ldGhvZCBpcyBhZGRlZFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgbWV0aG9kIHRvIGFkZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gbWV0aG9kIGZ1bmN0aW9uIHRvIGJlIHVzZWQgZm9yIGBuYW1lYCwgd2hlbiBjYWxsZWRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNoYWluaW5nQmVoYXZpb3IgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIHByb3BlcnR5IGlzIGFjY2Vzc2VkXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBhZGRDaGFpbmFibGVNZXRob2RcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBhZGRDaGFpbmFibGVNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QsIGNoYWluaW5nQmVoYXZpb3IpIHtcbiAgaWYgKHR5cGVvZiBjaGFpbmluZ0JlaGF2aW9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgY2hhaW5pbmdCZWhhdmlvciA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgfVxuXG4gIHZhciBjaGFpbmFibGVCZWhhdmlvciA9IHtcbiAgICAgIG1ldGhvZDogbWV0aG9kXG4gICAgLCBjaGFpbmluZ0JlaGF2aW9yOiBjaGFpbmluZ0JlaGF2aW9yXG4gIH07XG5cbiAgLy8gc2F2ZSB0aGUgbWV0aG9kcyBzbyB3ZSBjYW4gb3ZlcndyaXRlIHRoZW0gbGF0ZXIsIGlmIHdlIG5lZWQgdG8uXG4gIGlmICghY3R4Ll9fbWV0aG9kcykge1xuICAgIGN0eC5fX21ldGhvZHMgPSB7fTtcbiAgfVxuICBjdHguX19tZXRob2RzW25hbWVdID0gY2hhaW5hYmxlQmVoYXZpb3I7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwgbmFtZSxcbiAgICB7IGdldDogZnVuY3Rpb24gY2hhaW5hYmxlTWV0aG9kR2V0dGVyKCkge1xuICAgICAgICBjaGFpbmFibGVCZWhhdmlvci5jaGFpbmluZ0JlaGF2aW9yLmNhbGwodGhpcyk7XG5cbiAgICAgICAgdmFyIGNoYWluYWJsZU1ldGhvZFdyYXBwZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyB0aGUgYHNzZmlgIGZsYWcgdG8gYGNoYWluYWJsZU1ldGhvZFdyYXBwZXJgIGNhdXNlcyB0aGlzXG4gICAgICAgICAgLy8gZnVuY3Rpb24gdG8gYmUgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciByZW1vdmluZyBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgIC8vIGZyYW1lcyBmcm9tIHRoZSBzdGFjayB0cmFjZSBvZiBhIGZhaWxlZCBhc3NlcnRpb24uXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBIb3dldmVyLCB3ZSBvbmx5IHdhbnQgdG8gdXNlIHRoaXMgZnVuY3Rpb24gYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGlmXG4gICAgICAgICAgLy8gdGhlIGBsb2NrU3NmaWAgZmxhZyBpc24ndCBzZXQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBJZiB0aGUgYGxvY2tTc2ZpYCBmbGFnIGlzIHNldCwgdGhlbiB0aGlzIGFzc2VydGlvbiBpcyBiZWluZ1xuICAgICAgICAgIC8vIGludm9rZWQgZnJvbSBpbnNpZGUgb2YgYW5vdGhlciBhc3NlcnRpb24uIEluIHRoaXMgY2FzZSwgdGhlIGBzc2ZpYFxuICAgICAgICAgIC8vIGZsYWcgaGFzIGFscmVhZHkgYmVlbiBzZXQgYnkgdGhlIG91dGVyIGFzc2VydGlvbi5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIE5vdGUgdGhhdCBvdmVyd3JpdGluZyBhIGNoYWluYWJsZSBtZXRob2QgbWVyZWx5IHJlcGxhY2VzIHRoZSBzYXZlZFxuICAgICAgICAgIC8vIG1ldGhvZHMgaW4gYGN0eC5fX21ldGhvZHNgIGluc3RlYWQgb2YgY29tcGxldGVseSByZXBsYWNpbmcgdGhlXG4gICAgICAgICAgLy8gb3ZlcndyaXR0ZW4gYXNzZXJ0aW9uLiBUaGVyZWZvcmUsIGFuIG92ZXJ3cml0aW5nIGFzc2VydGlvbiB3b24ndFxuICAgICAgICAgIC8vIHNldCB0aGUgYHNzZmlgIG9yIGBsb2NrU3NmaWAgZmxhZ3MuXG4gICAgICAgICAgaWYgKCFmbGFnKHRoaXMsICdsb2NrU3NmaScpKSB7XG4gICAgICAgICAgICBmbGFnKHRoaXMsICdzc2ZpJywgY2hhaW5hYmxlTWV0aG9kV3JhcHBlcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGNoYWluYWJsZUJlaGF2aW9yLm1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgbmV3QXNzZXJ0aW9uID0gbmV3IGNoYWkuQXNzZXJ0aW9uKCk7XG4gICAgICAgICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgICAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgICAgIH07XG5cbiAgICAgICAgYWRkTGVuZ3RoR3VhcmQoY2hhaW5hYmxlTWV0aG9kV3JhcHBlciwgbmFtZSwgdHJ1ZSk7XG5cbiAgICAgICAgLy8gVXNlIGBPYmplY3Quc2V0UHJvdG90eXBlT2ZgIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAoY2FuU2V0UHJvdG90eXBlKSB7XG4gICAgICAgICAgLy8gSW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIHRoZSBvYmplY3QgYnkgcmVwbGFjaW5nIHRoZSBgRnVuY3Rpb25gIHByb3RvdHlwZVxuICAgICAgICAgIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGBjYWxsYCBhbmQgYGFwcGx5YCBtZXRob2RzIGZyb20gYEZ1bmN0aW9uYFxuICAgICAgICAgIHByb3RvdHlwZS5jYWxsID0gY2FsbDtcbiAgICAgICAgICBwcm90b3R5cGUuYXBwbHkgPSBhcHBseTtcbiAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoY2hhaW5hYmxlTWV0aG9kV3JhcHBlciwgcHJvdG90eXBlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UsIHJlZGVmaW5lIGFsbCBwcm9wZXJ0aWVzIChzbG93ISlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIGFzc2VydGVyTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjdHgpO1xuICAgICAgICAgIGFzc2VydGVyTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoYXNzZXJ0ZXJOYW1lKSB7XG4gICAgICAgICAgICBpZiAoZXhjbHVkZU5hbWVzLmluZGV4T2YoYXNzZXJ0ZXJOYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcGQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGN0eCwgYXNzZXJ0ZXJOYW1lKTtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjaGFpbmFibGVNZXRob2RXcmFwcGVyLCBhc3NlcnRlck5hbWUsIHBkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgY2hhaW5hYmxlTWV0aG9kV3JhcHBlcik7XG4gICAgICAgIHJldHVybiBwcm94aWZ5KGNoYWluYWJsZU1ldGhvZFdyYXBwZXIpO1xuICAgICAgfVxuICAgICwgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xufTtcbiIsIi8qIVxuICogQ2hhaSAtIG92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE0IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxudmFyIGNoYWkgPSByZXF1aXJlKCcuLi8uLi9jaGFpJyk7XG52YXIgdHJhbnNmZXJGbGFncyA9IHJlcXVpcmUoJy4vdHJhbnNmZXJGbGFncycpO1xuXG4vKipcbiAqICMjIyAub3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kLCBjaGFpbmluZ0JlaGF2aW9yKVxuICpcbiAqIE92ZXJ3aXRlcyBhbiBhbHJlYWR5IGV4aXN0aW5nIGNoYWluYWJsZSBtZXRob2RcbiAqIGFuZCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHByZXZpb3VzIGZ1bmN0aW9uIG9yXG4gKiBwcm9wZXJ0eS4gIE11c3QgcmV0dXJuIGZ1bmN0aW9ucyB0byBiZSB1c2VkIGZvclxuICogbmFtZS5cbiAqXG4gKiAgICAgdXRpbHMub3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kKGNoYWkuQXNzZXJ0aW9uLnByb3RvdHlwZSwgJ2xlbmd0aE9mJyxcbiAqICAgICAgIGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAqICAgICAgIH1cbiAqICAgICAsIGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAqICAgICAgIH1cbiAqICAgICApO1xuICpcbiAqIENhbiBhbHNvIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gYGNoYWkuQXNzZXJ0aW9uYC5cbiAqXG4gKiAgICAgY2hhaS5Bc3NlcnRpb24ub3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kKCdmb28nLCBmbiwgZm4pO1xuICpcbiAqIFRoZW4gY2FuIGJlIHVzZWQgYXMgYW55IG90aGVyIGFzc2VydGlvbi5cbiAqXG4gKiAgICAgZXhwZWN0KG15Rm9vKS50by5oYXZlLmxlbmd0aE9mKDMpO1xuICogICAgIGV4cGVjdChteUZvbykudG8uaGF2ZS5sZW5ndGhPZi5hYm92ZSgzKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3R4IG9iamVjdCB3aG9zZSBtZXRob2QgLyBwcm9wZXJ0eSBpcyB0byBiZSBvdmVyd3JpdHRlblxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgb2YgbWV0aG9kIC8gcHJvcGVydHkgdG8gb3ZlcndyaXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2QgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZnVuY3Rpb24gdG8gYmUgdXNlZCBmb3IgbmFtZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2hhaW5pbmdCZWhhdmlvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBmdW5jdGlvbiB0byBiZSB1c2VkIGZvciBwcm9wZXJ0eVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kKGN0eCwgbmFtZSwgbWV0aG9kLCBjaGFpbmluZ0JlaGF2aW9yKSB7XG4gIHZhciBjaGFpbmFibGVCZWhhdmlvciA9IGN0eC5fX21ldGhvZHNbbmFtZV07XG5cbiAgdmFyIF9jaGFpbmluZ0JlaGF2aW9yID0gY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvcjtcbiAgY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvciA9IGZ1bmN0aW9uIG92ZXJ3cml0aW5nQ2hhaW5hYmxlTWV0aG9kR2V0dGVyKCkge1xuICAgIHZhciByZXN1bHQgPSBjaGFpbmluZ0JlaGF2aW9yKF9jaGFpbmluZ0JlaGF2aW9yKS5jYWxsKHRoaXMpO1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB2YXIgbmV3QXNzZXJ0aW9uID0gbmV3IGNoYWkuQXNzZXJ0aW9uKCk7XG4gICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gIH07XG5cbiAgdmFyIF9tZXRob2QgPSBjaGFpbmFibGVCZWhhdmlvci5tZXRob2Q7XG4gIGNoYWluYWJsZUJlaGF2aW9yLm1ldGhvZCA9IGZ1bmN0aW9uIG92ZXJ3cml0aW5nQ2hhaW5hYmxlTWV0aG9kV3JhcHBlcigpIHtcbiAgICB2YXIgcmVzdWx0ID0gbWV0aG9kKF9tZXRob2QpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHZhciBuZXdBc3NlcnRpb24gPSBuZXcgY2hhaS5Bc3NlcnRpb24oKTtcbiAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgcmV0dXJuIG5ld0Fzc2VydGlvbjtcbiAgfTtcbn07XG4iLCIvKiFcbiAqIENoYWkgLSBjb21wYXJlQnlJbnNwZWN0IHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTYgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKiFcbiAqIE1vZHVsZSBkZXBlbmRhbmNpZXNcbiAqL1xuXG52YXIgaW5zcGVjdCA9IHJlcXVpcmUoJy4vaW5zcGVjdCcpO1xuXG4vKipcbiAqICMjIyAuY29tcGFyZUJ5SW5zcGVjdChtaXhlZCwgbWl4ZWQpXG4gKlxuICogVG8gYmUgdXNlZCBhcyBhIGNvbXBhcmVGdW5jdGlvbiB3aXRoIEFycmF5LnByb3RvdHlwZS5zb3J0LiBDb21wYXJlcyBlbGVtZW50c1xuICogdXNpbmcgaW5zcGVjdCBpbnN0ZWFkIG9mIGRlZmF1bHQgYmVoYXZpb3Igb2YgdXNpbmcgdG9TdHJpbmcgc28gdGhhdCBTeW1ib2xzXG4gKiBhbmQgb2JqZWN0cyB3aXRoIGlycmVndWxhci9taXNzaW5nIHRvU3RyaW5nIGNhbiBzdGlsbCBiZSBzb3J0ZWQgd2l0aG91dCBhXG4gKiBUeXBlRXJyb3IuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0gZmlyc3QgZWxlbWVudCB0byBjb21wYXJlXG4gKiBAcGFyYW0ge01peGVkfSBzZWNvbmQgZWxlbWVudCB0byBjb21wYXJlXG4gKiBAcmV0dXJucyB7TnVtYmVyfSAtMSBpZiAnYScgc2hvdWxkIGNvbWUgYmVmb3JlICdiJzsgb3RoZXJ3aXNlIDEgXG4gKiBAbmFtZSBjb21wYXJlQnlJbnNwZWN0XG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY29tcGFyZUJ5SW5zcGVjdChhLCBiKSB7XG4gIHJldHVybiBpbnNwZWN0KGEpIDwgaW5zcGVjdChiKSA/IC0xIDogMTtcbn07XG4iLCIvKiFcbiAqIENoYWkgLSBnZXRPd25FbnVtZXJhYmxlUHJvcGVydHlTeW1ib2xzIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDExLTIwMTYgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAuZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyhvYmplY3QpXG4gKlxuICogVGhpcyBhbGxvd3MgdGhlIHJldHJpZXZhbCBvZiBkaXJlY3RseS1vd25lZCBlbnVtZXJhYmxlIHByb3BlcnR5IHN5bWJvbHMgb2YgYW5cbiAqIG9iamVjdC4gVGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzXG4gKiByZXR1cm5zIGJvdGggZW51bWVyYWJsZSBhbmQgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgc3ltYm9scy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAbmFtZSBnZXRPd25FbnVtZXJhYmxlUHJvcGVydHlTeW1ib2xzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyhvYmopIHtcbiAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gW107XG5cbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgc3ltKS5lbnVtZXJhYmxlO1xuICB9KTtcbn07XG4iLCIvKiFcbiAqIENoYWkgLSBnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcyB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMS0yMDE2IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyohXG4gKiBNb2R1bGUgZGVwZW5kYW5jaWVzXG4gKi9cblxudmFyIGdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMgPSByZXF1aXJlKCcuL2dldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMnKTtcblxuLyoqXG4gKiAjIyMgLmdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzKG9iamVjdClcbiAqXG4gKiBUaGlzIGFsbG93cyB0aGUgcmV0cmlldmFsIG9mIGRpcmVjdGx5LW93bmVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kXG4gKiBzeW1ib2xzIG9mIGFuIG9iamVjdC4gVGhpcyBmdW5jdGlvbiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBPYmplY3Qua2V5cyBvbmx5XG4gKiByZXR1cm5zIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMsIG5vdCBlbnVtZXJhYmxlIHByb3BlcnR5IHN5bWJvbHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iamVjdFxuICogQHJldHVybnMge0FycmF5fVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgZ2V0T3duRW51bWVyYWJsZVByb3BlcnRpZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcyhvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikuY29uY2F0KGdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMob2JqKSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKiAhXG4gKiBDaGFpIC0gY2hlY2tFcnJvciB1dGlsaXR5XG4gKiBDb3B5cmlnaHQoYykgMjAxMi0yMDE2IEpha2UgTHVlciA8amFrZUBhbG9naWNhbHBhcmFkb3guY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmNoZWNrRXJyb3JcbiAqXG4gKiBDaGVja3MgdGhhdCBhbiBlcnJvciBjb25mb3JtcyB0byBhIGdpdmVuIHNldCBvZiBjcml0ZXJpYSBhbmQvb3IgcmV0cmlldmVzIGluZm9ybWF0aW9uIGFib3V0IGl0LlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuLyoqXG4gKiAjIyMgLmNvbXBhdGlibGVJbnN0YW5jZSh0aHJvd24sIGVycm9yTGlrZSlcbiAqXG4gKiBDaGVja3MgaWYgdHdvIGluc3RhbmNlcyBhcmUgY29tcGF0aWJsZSAoc3RyaWN0IGVxdWFsKS5cbiAqIFJldHVybnMgZmFsc2UgaWYgZXJyb3JMaWtlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBFcnJvciwgYmVjYXVzZSBpbnN0YW5jZXNcbiAqIGNhbiBvbmx5IGJlIGNvbXBhdGlibGUgaWYgdGhleSdyZSBib3RoIGVycm9yIGluc3RhbmNlcy5cbiAqXG4gKiBAbmFtZSBjb21wYXRpYmxlSW5zdGFuY2VcbiAqIEBwYXJhbSB7RXJyb3J9IHRocm93biBlcnJvclxuICogQHBhcmFtIHtFcnJvcnxFcnJvckNvbnN0cnVjdG9yfSBlcnJvckxpa2Ugb2JqZWN0IHRvIGNvbXBhcmUgYWdhaW5zdFxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjb21wYXRpYmxlSW5zdGFuY2UodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgcmV0dXJuIGVycm9yTGlrZSBpbnN0YW5jZW9mIEVycm9yICYmIHRocm93biA9PT0gZXJyb3JMaWtlO1xufVxuXG4vKipcbiAqICMjIyAuY29tcGF0aWJsZUNvbnN0cnVjdG9yKHRocm93biwgZXJyb3JMaWtlKVxuICpcbiAqIENoZWNrcyBpZiB0d28gY29uc3RydWN0b3JzIGFyZSBjb21wYXRpYmxlLlxuICogVGhpcyBmdW5jdGlvbiBjYW4gcmVjZWl2ZSBlaXRoZXIgYW4gZXJyb3IgY29uc3RydWN0b3Igb3JcbiAqIGFuIGVycm9yIGluc3RhbmNlIGFzIHRoZSBgZXJyb3JMaWtlYCBhcmd1bWVudC5cbiAqIENvbnN0cnVjdG9ycyBhcmUgY29tcGF0aWJsZSBpZiB0aGV5J3JlIHRoZSBzYW1lIG9yIGlmIG9uZSBpc1xuICogYW4gaW5zdGFuY2Ugb2YgYW5vdGhlci5cbiAqXG4gKiBAbmFtZSBjb21wYXRpYmxlQ29uc3RydWN0b3JcbiAqIEBwYXJhbSB7RXJyb3J9IHRocm93biBlcnJvclxuICogQHBhcmFtIHtFcnJvcnxFcnJvckNvbnN0cnVjdG9yfSBlcnJvckxpa2Ugb2JqZWN0IHRvIGNvbXBhcmUgYWdhaW5zdFxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBjb21wYXRpYmxlQ29uc3RydWN0b3IodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgaWYgKGVycm9yTGlrZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgLy8gSWYgYGVycm9yTGlrZWAgaXMgYW4gaW5zdGFuY2Ugb2YgYW55IGVycm9yIHdlIGNvbXBhcmUgdGhlaXIgY29uc3RydWN0b3JzXG4gICAgcmV0dXJuIHRocm93bi5jb25zdHJ1Y3RvciA9PT0gZXJyb3JMaWtlLmNvbnN0cnVjdG9yIHx8IHRocm93biBpbnN0YW5jZW9mIGVycm9yTGlrZS5jb25zdHJ1Y3RvcjtcbiAgfSBlbHNlIGlmIChlcnJvckxpa2UucHJvdG90eXBlIGluc3RhbmNlb2YgRXJyb3IgfHwgZXJyb3JMaWtlID09PSBFcnJvcikge1xuICAgIC8vIElmIGBlcnJvckxpa2VgIGlzIGEgY29uc3RydWN0b3IgdGhhdCBpbmhlcml0cyBmcm9tIEVycm9yLCB3ZSBjb21wYXJlIGB0aHJvd25gIHRvIGBlcnJvckxpa2VgIGRpcmVjdGx5XG4gICAgcmV0dXJuIHRocm93bi5jb25zdHJ1Y3RvciA9PT0gZXJyb3JMaWtlIHx8IHRocm93biBpbnN0YW5jZW9mIGVycm9yTGlrZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiAjIyMgLmNvbXBhdGlibGVNZXNzYWdlKHRocm93biwgZXJyTWF0Y2hlcilcbiAqXG4gKiBDaGVja3MgaWYgYW4gZXJyb3IncyBtZXNzYWdlIGlzIGNvbXBhdGlibGUgd2l0aCBhIG1hdGNoZXIgKFN0cmluZyBvciBSZWdFeHApLlxuICogSWYgdGhlIG1lc3NhZ2UgY29udGFpbnMgdGhlIFN0cmluZyBvciBwYXNzZXMgdGhlIFJlZ0V4cCB0ZXN0LFxuICogaXQgaXMgY29uc2lkZXJlZCBjb21wYXRpYmxlLlxuICpcbiAqIEBuYW1lIGNvbXBhdGlibGVNZXNzYWdlXG4gKiBAcGFyYW0ge0Vycm9yfSB0aHJvd24gZXJyb3JcbiAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gZXJyTWF0Y2hlciB0byBsb29rIGZvciBpbnRvIHRoZSBtZXNzYWdlXG4gKiBAbmFtZXNwYWNlIFV0aWxzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGNvbXBhdGlibGVNZXNzYWdlKHRocm93biwgZXJyTWF0Y2hlcikge1xuICB2YXIgY29tcGFyaXNvblN0cmluZyA9IHR5cGVvZiB0aHJvd24gPT09ICdzdHJpbmcnID8gdGhyb3duIDogdGhyb3duLm1lc3NhZ2U7XG4gIGlmIChlcnJNYXRjaGVyIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgcmV0dXJuIGVyck1hdGNoZXIudGVzdChjb21wYXJpc29uU3RyaW5nKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyTWF0Y2hlciA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gY29tcGFyaXNvblN0cmluZy5pbmRleE9mKGVyck1hdGNoZXIpICE9PSAtMTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogIyMjIC5nZXRGdW5jdGlvbk5hbWUoY29uc3RydWN0b3JGbilcbiAqXG4gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24uXG4gKiBUaGlzIGFsc28gaW5jbHVkZXMgYSBwb2x5ZmlsbCBmdW5jdGlvbiBpZiBgY29uc3RydWN0b3JGbi5uYW1lYCBpcyBub3QgZGVmaW5lZC5cbiAqXG4gKiBAbmFtZSBnZXRGdW5jdGlvbk5hbWVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yRm5cbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbnZhciBmdW5jdGlvbk5hbWVNYXRjaCA9IC9cXHMqZnVuY3Rpb24oPzpcXHN8XFxzKlxcL1xcKlteKD86KlxcLyldK1xcKlxcL1xccyopKihbXlxcKFxcL10rKS87XG5mdW5jdGlvbiBnZXRGdW5jdGlvbk5hbWUoY29uc3RydWN0b3JGbikge1xuICB2YXIgbmFtZSA9ICcnO1xuICBpZiAodHlwZW9mIGNvbnN0cnVjdG9yRm4ubmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBIZXJlIHdlIHJ1biBhIHBvbHlmaWxsIGlmIGNvbnN0cnVjdG9yRm4ubmFtZSBpcyBub3QgZGVmaW5lZFxuICAgIHZhciBtYXRjaCA9IFN0cmluZyhjb25zdHJ1Y3RvckZuKS5tYXRjaChmdW5jdGlvbk5hbWVNYXRjaCk7XG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICBuYW1lID0gbWF0Y2hbMV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5hbWUgPSBjb25zdHJ1Y3RvckZuLm5hbWU7XG4gIH1cblxuICByZXR1cm4gbmFtZTtcbn1cblxuLyoqXG4gKiAjIyMgLmdldENvbnN0cnVjdG9yTmFtZShlcnJvckxpa2UpXG4gKlxuICogR2V0cyB0aGUgY29uc3RydWN0b3IgbmFtZSBmb3IgYW4gRXJyb3IgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IgaXRzZWxmLlxuICpcbiAqIEBuYW1lIGdldENvbnN0cnVjdG9yTmFtZVxuICogQHBhcmFtIHtFcnJvcnxFcnJvckNvbnN0cnVjdG9yfSBlcnJvckxpa2VcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZ2V0Q29uc3RydWN0b3JOYW1lKGVycm9yTGlrZSkge1xuICB2YXIgY29uc3RydWN0b3JOYW1lID0gZXJyb3JMaWtlO1xuICBpZiAoZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBjb25zdHJ1Y3Rvck5hbWUgPSBnZXRGdW5jdGlvbk5hbWUoZXJyb3JMaWtlLmNvbnN0cnVjdG9yKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3JMaWtlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gSWYgYGVycmAgaXMgbm90IGFuIGluc3RhbmNlIG9mIEVycm9yIGl0IGlzIGFuIGVycm9yIGNvbnN0cnVjdG9yIGl0c2VsZiBvciBhbm90aGVyIGZ1bmN0aW9uLlxuICAgIC8vIElmIHdlJ3ZlIGdvdCBhIGNvbW1vbiBmdW5jdGlvbiB3ZSBnZXQgaXRzIG5hbWUsIG90aGVyd2lzZSB3ZSBtYXkgbmVlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2VcbiAgICAvLyBvZiB0aGUgZXJyb3IganVzdCBpbiBjYXNlIGl0J3MgYSBwb29ybHktY29uc3RydWN0ZWQgZXJyb3IuIFBsZWFzZSBzZWUgY2hhaWpzL2NoYWkvaXNzdWVzLzQ1IHRvIGtub3cgbW9yZS5cbiAgICBjb25zdHJ1Y3Rvck5hbWUgPSBnZXRGdW5jdGlvbk5hbWUoZXJyb3JMaWtlKS50cmltKCkgfHxcbiAgICAgICAgZ2V0RnVuY3Rpb25OYW1lKG5ldyBlcnJvckxpa2UoKSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcFxuICB9XG5cbiAgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZTtcbn1cblxuLyoqXG4gKiAjIyMgLmdldE1lc3NhZ2UoZXJyb3JMaWtlKVxuICpcbiAqIEdldHMgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSBhbiBlcnJvci5cbiAqIElmIGBlcnJgIGlzIGEgU3RyaW5nIGl0c2VsZiwgd2UgcmV0dXJuIGl0LlxuICogSWYgdGhlIGVycm9yIGhhcyBubyBtZXNzYWdlLCB3ZSByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLlxuICpcbiAqIEBuYW1lIGdldE1lc3NhZ2VcbiAqIEBwYXJhbSB7RXJyb3J8U3RyaW5nfSBlcnJvckxpa2VcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZ2V0TWVzc2FnZShlcnJvckxpa2UpIHtcbiAgdmFyIG1zZyA9ICcnO1xuICBpZiAoZXJyb3JMaWtlICYmIGVycm9yTGlrZS5tZXNzYWdlKSB7XG4gICAgbXNnID0gZXJyb3JMaWtlLm1lc3NhZ2U7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVycm9yTGlrZSA9PT0gJ3N0cmluZycpIHtcbiAgICBtc2cgPSBlcnJvckxpa2U7XG4gIH1cblxuICByZXR1cm4gbXNnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29tcGF0aWJsZUluc3RhbmNlOiBjb21wYXRpYmxlSW5zdGFuY2UsXG4gIGNvbXBhdGlibGVDb25zdHJ1Y3RvcjogY29tcGF0aWJsZUNvbnN0cnVjdG9yLFxuICBjb21wYXRpYmxlTWVzc2FnZTogY29tcGF0aWJsZU1lc3NhZ2UsXG4gIGdldE1lc3NhZ2U6IGdldE1lc3NhZ2UsXG4gIGdldENvbnN0cnVjdG9yTmFtZTogZ2V0Q29uc3RydWN0b3JOYW1lLFxufTtcbiIsInZhciBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcbnZhciBmbGFnID0gcmVxdWlyZSgnLi9mbGFnJyk7XG52YXIgZ2V0UHJvcGVydGllcyA9IHJlcXVpcmUoJy4vZ2V0UHJvcGVydGllcycpO1xudmFyIGlzUHJveHlFbmFibGVkID0gcmVxdWlyZSgnLi9pc1Byb3h5RW5hYmxlZCcpO1xuXG4vKiFcbiAqIENoYWkgLSBwcm94aWZ5IHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAucHJveGlmeShvYmplY3QpXG4gKlxuICogUmV0dXJuIGEgcHJveHkgb2YgZ2l2ZW4gb2JqZWN0IHRoYXQgdGhyb3dzIGFuIGVycm9yIHdoZW4gYSBub24tZXhpc3RlbnRcbiAqIHByb3BlcnR5IGlzIHJlYWQuIEJ5IGRlZmF1bHQsIHRoZSByb290IGNhdXNlIGlzIGFzc3VtZWQgdG8gYmUgYSBtaXNzcGVsbGVkXG4gKiBwcm9wZXJ0eSwgYW5kIHRodXMgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIG9mZmVyIGEgcmVhc29uYWJsZSBzdWdnZXN0aW9uIGZyb21cbiAqIHRoZSBsaXN0IG9mIGV4aXN0aW5nIHByb3BlcnRpZXMuIEhvd2V2ZXIsIGlmIGEgbm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSBpc1xuICogcHJvdmlkZWQsIHRoZW4gdGhlIHJvb3QgY2F1c2UgaXMgaW5zdGVhZCBhIGZhaWx1cmUgdG8gaW52b2tlIGEgbm9uLWNoYWluYWJsZVxuICogbWV0aG9kIHByaW9yIHRvIHJlYWRpbmcgdGhlIG5vbi1leGlzdGVudCBwcm9wZXJ0eS5cbiAqIFxuICogSWYgcHJveGllcyBhcmUgdW5zdXBwb3J0ZWQgb3IgZGlzYWJsZWQgdmlhIHRoZSB1c2VyJ3MgQ2hhaSBjb25maWcsIHRoZW5cbiAqIHJldHVybiBvYmplY3Qgd2l0aG91dCBtb2RpZmljYXRpb24uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHBhcmFtIHtTdHJpbmd9IG5vbkNoYWluYWJsZU1ldGhvZE5hbWVcbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIHByb3hpZnlcbiAqL1xuXG52YXIgYnVpbHRpbnMgPSBbJ19fZmxhZ3MnLCAnX19tZXRob2RzJywgJ19vYmonLCAnYXNzZXJ0J107XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcHJveGlmeShvYmosIG5vbkNoYWluYWJsZU1ldGhvZE5hbWUpIHtcbiAgaWYgKCFpc1Byb3h5RW5hYmxlZCgpKSByZXR1cm4gb2JqO1xuXG4gIHJldHVybiBuZXcgUHJveHkob2JqLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiBwcm94eUdldHRlcih0YXJnZXQsIHByb3BlcnR5KSB7XG4gICAgICAvLyBUaGlzIGNoZWNrIGlzIGhlcmUgYmVjYXVzZSB3ZSBzaG91bGQgbm90IHRocm93IGVycm9ycyBvbiBTeW1ib2wgcHJvcGVydGllc1xuICAgICAgLy8gc3VjaCBhcyBgU3ltYm9sLnRvU3RyaW5nVGFnYC5cbiAgICAgIC8vIFRoZSB2YWx1ZXMgZm9yIHdoaWNoIGFuIGVycm9yIHNob3VsZCBiZSB0aHJvd24gY2FuIGJlIGNvbmZpZ3VyZWQgdXNpbmdcbiAgICAgIC8vIHRoZSBgY29uZmlnLnByb3h5RXhjbHVkZWRLZXlzYCBzZXR0aW5nLlxuICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBjb25maWcucHJveHlFeGNsdWRlZEtleXMuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xICYmXG4gICAgICAgICAgIVJlZmxlY3QuaGFzKHRhcmdldCwgcHJvcGVydHkpKSB7XG4gICAgICAgIC8vIFNwZWNpYWwgbWVzc2FnZSBmb3IgaW52YWxpZCBwcm9wZXJ0eSBhY2Nlc3Mgb2Ygbm9uLWNoYWluYWJsZSBtZXRob2RzLlxuICAgICAgICBpZiAobm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSkge1xuICAgICAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIENoYWkgcHJvcGVydHk6ICcgKyBub25DaGFpbmFibGVNZXRob2ROYW1lICsgJy4nICtcbiAgICAgICAgICAgIHByb3BlcnR5ICsgJy4gU2VlIGRvY3MgZm9yIHByb3BlciB1c2FnZSBvZiBcIicgK1xuICAgICAgICAgICAgbm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSArICdcIi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvcmRlcmVkUHJvcGVydGllcyA9IGdldFByb3BlcnRpZXModGFyZ2V0KS5maWx0ZXIoZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICAgICAgICByZXR1cm4gIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkocHJvcGVydHkpICYmXG4gICAgICAgICAgICBidWlsdGlucy5pbmRleE9mKHByb3BlcnR5KSA9PT0gLTE7XG4gICAgICAgIH0pLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgIHJldHVybiBzdHJpbmdEaXN0YW5jZShwcm9wZXJ0eSwgYSkgLSBzdHJpbmdEaXN0YW5jZShwcm9wZXJ0eSwgYik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChvcmRlcmVkUHJvcGVydGllcy5sZW5ndGggJiZcbiAgICAgICAgICAgIHN0cmluZ0Rpc3RhbmNlKG9yZGVyZWRQcm9wZXJ0aWVzWzBdLCBwcm9wZXJ0eSkgPCA0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIHByb3BlcnR5IGlzIHJlYXNvbmFibHkgY2xvc2UgdG8gYW4gZXhpc3RpbmcgQ2hhaSBwcm9wZXJ0eSxcbiAgICAgICAgICAvLyBzdWdnZXN0IHRoYXQgcHJvcGVydHkgdG8gdGhlIHVzZXIuXG4gICAgICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgQ2hhaSBwcm9wZXJ0eTogJyArIHByb3BlcnR5ICtcbiAgICAgICAgICAgICcuIERpZCB5b3UgbWVhbiBcIicgKyBvcmRlcmVkUHJvcGVydGllc1swXSArICdcIj8nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBDaGFpIHByb3BlcnR5OiAnICsgcHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVzZSB0aGlzIHByb3h5IGdldHRlciBhcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHJlbW92aW5nIGltcGxlbWVudGF0aW9uXG4gICAgICAvLyBmcmFtZXMgZnJvbSB0aGUgc3RhY2sgdHJhY2Ugb2YgYSBmYWlsZWQgYXNzZXJ0aW9uLiBGb3IgcHJvcGVydHlcbiAgICAgIC8vIGFzc2VydGlvbnMsIHRoaXMgcHJldmVudHMgdGhlIHByb3h5IGdldHRlciBmcm9tIHNob3dpbmcgdXAgaW4gdGhlIHN0YWNrXG4gICAgICAvLyB0cmFjZSBzaW5jZSBpdCdzIGludm9rZWQgYmVmb3JlIHRoZSBwcm9wZXJ0eSBnZXR0ZXIuIEZvciBtZXRob2QgYW5kXG4gICAgICAvLyBjaGFpbmFibGUgbWV0aG9kIGFzc2VydGlvbnMsIHRoaXMgZmxhZyB3aWxsIGVuZCB1cCBnZXR0aW5nIGNoYW5nZWQgdG9cbiAgICAgIC8vIHRoZSBtZXRob2Qgd3JhcHBlciwgd2hpY2ggaXMgZ29vZCBzaW5jZSB0aGlzIGZyYW1lIHdpbGwgbm8gbG9uZ2VyIGJlIGluXG4gICAgICAvLyB0aGUgc3RhY2sgb25jZSB0aGUgbWV0aG9kIGlzIGludm9rZWQuIE5vdGUgdGhhdCBDaGFpIGJ1aWx0aW4gYXNzZXJ0aW9uXG4gICAgICAvLyBwcm9wZXJ0aWVzIHN1Y2ggYXMgYF9fZmxhZ3NgIGFyZSBza2lwcGVkIHNpbmNlIHRoaXMgaXMgb25seSBtZWFudCB0b1xuICAgICAgLy8gY2FwdHVyZSB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgYW4gYXNzZXJ0aW9uLiBUaGlzIHN0ZXAgaXMgYWxzbyBza2lwcGVkXG4gICAgICAvLyBpZiB0aGUgYGxvY2tTc2ZpYCBmbGFnIGlzIHNldCwgdGh1cyBpbmRpY2F0aW5nIHRoYXQgdGhpcyBhc3NlcnRpb24gaXNcbiAgICAgIC8vIGJlaW5nIGNhbGxlZCBmcm9tIHdpdGhpbiBhbm90aGVyIGFzc2VydGlvbi4gSW4gdGhhdCBjYXNlLCB0aGUgYHNzZmlgXG4gICAgICAvLyBmbGFnIGlzIGFscmVhZHkgc2V0IHRvIHRoZSBvdXRlciBhc3NlcnRpb24ncyBzdGFydGluZyBwb2ludC5cbiAgICAgIGlmIChidWlsdGlucy5pbmRleE9mKHByb3BlcnR5KSA9PT0gLTEgJiYgIWZsYWcodGFyZ2V0LCAnbG9ja1NzZmknKSkge1xuICAgICAgICBmbGFnKHRhcmdldCwgJ3NzZmknLCBwcm94eUdldHRlcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiAjIHN0cmluZ0Rpc3RhbmNlKHN0ckEsIHN0ckIpXG4gKiBSZXR1cm4gdGhlIExldmVuc2h0ZWluIGRpc3RhbmNlIGJldHdlZW4gdHdvIHN0cmluZ3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyQVxuICogQHBhcmFtIHtzdHJpbmd9IHN0ckJcbiAqIEByZXR1cm4ge251bWJlcn0gdGhlIHN0cmluZyBkaXN0YW5jZSBiZXR3ZWVuIHN0ckEgYW5kIHN0ckJcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHN0cmluZ0Rpc3RhbmNlKHN0ckEsIHN0ckIsIG1lbW8pIHtcbiAgaWYgKCFtZW1vKSB7XG4gICAgLy8gYG1lbW9gIGlzIGEgdHdvLWRpbWVuc2lvbmFsIGFycmF5IGNvbnRhaW5pbmcgYSBjYWNoZSBvZiBkaXN0YW5jZXNcbiAgICAvLyBtZW1vW2ldW2pdIGlzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHN0ckEuc2xpY2UoMCwgaSkgYW5kXG4gICAgLy8gc3RyQi5zbGljZSgwLCBqKS5cbiAgICBtZW1vID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gc3RyQS5sZW5ndGg7IGkrKykge1xuICAgICAgbWVtb1tpXSA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIGlmICghbWVtb1tzdHJBLmxlbmd0aF0gfHwgIW1lbW9bc3RyQS5sZW5ndGhdW3N0ckIubGVuZ3RoXSkge1xuICAgIGlmIChzdHJBLmxlbmd0aCA9PT0gMCB8fCBzdHJCLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbWVtb1tzdHJBLmxlbmd0aF1bc3RyQi5sZW5ndGhdID0gTWF0aC5tYXgoc3RyQS5sZW5ndGgsIHN0ckIubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVtb1tzdHJBLmxlbmd0aF1bc3RyQi5sZW5ndGhdID0gTWF0aC5taW4oXG4gICAgICAgIHN0cmluZ0Rpc3RhbmNlKHN0ckEuc2xpY2UoMCwgLTEpLCBzdHJCLCBtZW1vKSArIDEsXG4gICAgICAgIHN0cmluZ0Rpc3RhbmNlKHN0ckEsIHN0ckIuc2xpY2UoMCwgLTEpLCBtZW1vKSArIDEsXG4gICAgICAgIHN0cmluZ0Rpc3RhbmNlKHN0ckEuc2xpY2UoMCwgLTEpLCBzdHJCLnNsaWNlKDAsIC0xKSwgbWVtbykgK1xuICAgICAgICAgIChzdHJBLnNsaWNlKC0xKSA9PT0gc3RyQi5zbGljZSgtMSkgPyAwIDogMSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lbW9bc3RyQS5sZW5ndGhdW3N0ckIubGVuZ3RoXTtcbn1cbiIsInZhciBjb25maWcgPSByZXF1aXJlKCcuLi9jb25maWcnKTtcblxudmFyIGZuTGVuZ3RoRGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZnVuY3Rpb24gKCkge30sICdsZW5ndGgnKTtcblxuLyohXG4gKiBDaGFpIC0gYWRkTGVuZ3RoR3VhcmQgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogIyMjIC5hZGRMZW5ndGhHdWFyZChmbiwgYXNzZXJ0aW9uTmFtZSwgaXNDaGFpbmFibGUpXG4gKlxuICogRGVmaW5lIGBsZW5ndGhgIGFzIGEgZ2V0dGVyIG9uIHRoZSBnaXZlbiB1bmludm9rZWQgbWV0aG9kIGFzc2VydGlvbi4gVGhlXG4gKiBnZXR0ZXIgYWN0cyBhcyBhIGd1YXJkIGFnYWluc3QgY2hhaW5pbmcgYGxlbmd0aGAgZGlyZWN0bHkgb2ZmIG9mIGFuIHVuaW52b2tlZFxuICogbWV0aG9kIGFzc2VydGlvbiwgd2hpY2ggaXMgYSBwcm9ibGVtIGJlY2F1c2UgaXQgcmVmZXJlbmNlcyBgZnVuY3Rpb25gJ3NcbiAqIGJ1aWx0LWluIGBsZW5ndGhgIHByb3BlcnR5IGluc3RlYWQgb2YgQ2hhaSdzIGBsZW5ndGhgIGFzc2VydGlvbi4gV2hlbiB0aGVcbiAqIGdldHRlciBjYXRjaGVzIHRoZSB1c2VyIG1ha2luZyB0aGlzIG1pc3Rha2UsIGl0IHRocm93cyBhbiBlcnJvciB3aXRoIGFcbiAqIGhlbHBmdWwgbWVzc2FnZS5cbiAqXG4gKiBUaGVyZSBhcmUgdHdvIHdheXMgaW4gd2hpY2ggdGhpcyBtaXN0YWtlIGNhbiBiZSBtYWRlLiBUaGUgZmlyc3Qgd2F5IGlzIGJ5XG4gKiBjaGFpbmluZyB0aGUgYGxlbmd0aGAgYXNzZXJ0aW9uIGRpcmVjdGx5IG9mZiBvZiBhbiB1bmludm9rZWQgY2hhaW5hYmxlXG4gKiBtZXRob2QuIEluIHRoaXMgY2FzZSwgQ2hhaSBzdWdnZXN0cyB0aGF0IHRoZSB1c2VyIHVzZSBgbGVuZ3RoT2ZgIGluc3RlYWQuIFRoZVxuICogc2Vjb25kIHdheSBpcyBieSBjaGFpbmluZyB0aGUgYGxlbmd0aGAgYXNzZXJ0aW9uIGRpcmVjdGx5IG9mZiBvZiBhbiB1bmludm9rZWRcbiAqIG5vbi1jaGFpbmFibGUgbWV0aG9kLiBOb24tY2hhaW5hYmxlIG1ldGhvZHMgbXVzdCBiZSBpbnZva2VkIHByaW9yIHRvXG4gKiBjaGFpbmluZy4gSW4gdGhpcyBjYXNlLCBDaGFpIHN1Z2dlc3RzIHRoYXQgdGhlIHVzZXIgY29uc3VsdCB0aGUgZG9jcyBmb3IgdGhlXG4gKiBnaXZlbiBhc3NlcnRpb24uXG4gKlxuICogSWYgdGhlIGBsZW5ndGhgIHByb3BlcnR5IG9mIGZ1bmN0aW9ucyBpcyB1bmNvbmZpZ3VyYWJsZSwgdGhlbiByZXR1cm4gYGZuYFxuICogd2l0aG91dCBtb2RpZmljYXRpb24uXG4gKlxuICogTm90ZSB0aGF0IGluIEVTNiwgdGhlIGZ1bmN0aW9uJ3MgYGxlbmd0aGAgcHJvcGVydHkgaXMgY29uZmlndXJhYmxlLCBzbyBvbmNlXG4gKiBzdXBwb3J0IGZvciBsZWdhY3kgZW52aXJvbm1lbnRzIGlzIGRyb3BwZWQsIENoYWkncyBgbGVuZ3RoYCBwcm9wZXJ0eSBjYW5cbiAqIHJlcGxhY2UgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uJ3MgYGxlbmd0aGAgcHJvcGVydHksIGFuZCB0aGlzIGxlbmd0aCBndWFyZCB3aWxsXG4gKiBubyBsb25nZXIgYmUgbmVjZXNzYXJ5LiBJbiB0aGUgbWVhbiB0aW1lLCBtYWludGFpbmluZyBjb25zaXN0ZW5jeSBhY3Jvc3MgYWxsXG4gKiBlbnZpcm9ubWVudHMgaXMgdGhlIHByaW9yaXR5LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcGFyYW0ge1N0cmluZ30gYXNzZXJ0aW9uTmFtZVxuICogQHBhcmFtIHtCb29sZWFufSBpc0NoYWluYWJsZVxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgYWRkTGVuZ3RoR3VhcmRcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGFkZExlbmd0aEd1YXJkIChmbiwgYXNzZXJ0aW9uTmFtZSwgaXNDaGFpbmFibGUpIHtcbiAgaWYgKCFmbkxlbmd0aERlc2MuY29uZmlndXJhYmxlKSByZXR1cm4gZm47XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCAnbGVuZ3RoJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKGlzQ2hhaW5hYmxlKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIENoYWkgcHJvcGVydHk6ICcgKyBhc3NlcnRpb25OYW1lICsgJy5sZW5ndGguIER1ZScgK1xuICAgICAgICAgICcgdG8gYSBjb21wYXRpYmlsaXR5IGlzc3VlLCBcImxlbmd0aFwiIGNhbm5vdCBkaXJlY3RseSBmb2xsb3cgXCInICtcbiAgICAgICAgICBhc3NlcnRpb25OYW1lICsgJ1wiLiBVc2UgXCInICsgYXNzZXJ0aW9uTmFtZSArICcubGVuZ3RoT2ZcIiBpbnN0ZWFkLicpO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBFcnJvcignSW52YWxpZCBDaGFpIHByb3BlcnR5OiAnICsgYXNzZXJ0aW9uTmFtZSArICcubGVuZ3RoLiBTZWUnICtcbiAgICAgICAgJyBkb2NzIGZvciBwcm9wZXIgdXNhZ2Ugb2YgXCInICsgYXNzZXJ0aW9uTmFtZSArICdcIi4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBmbjtcbn07XG4iLCJ2YXIgY29uZmlnID0gcmVxdWlyZSgnLi4vY29uZmlnJyk7XG5cbi8qIVxuICogQ2hhaSAtIGlzUHJveHlFbmFibGVkIGhlbHBlclxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogIyMjIC5pc1Byb3h5RW5hYmxlZCgpXG4gKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIENoYWkncyBwcm94eSBwcm90ZWN0aW9uIGZlYXR1cmUgaXMgZW5hYmxlZC4gSWZcbiAqIHByb3hpZXMgYXJlIHVuc3VwcG9ydGVkIG9yIGRpc2FibGVkIHZpYSB0aGUgdXNlcidzIENoYWkgY29uZmlnLCB0aGVuIHJldHVyblxuICogZmFsc2UuIE90aGVyd2lzZSwgcmV0dXJuIHRydWUuXG4gKlxuICogQG5hbWVzcGFjZSBVdGlsc1xuICogQG5hbWUgaXNQcm94eUVuYWJsZWRcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzUHJveHlFbmFibGVkKCkge1xuICByZXR1cm4gY29uZmlnLnVzZVByb3h5ICYmIFxuICAgIHR5cGVvZiBQcm94eSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgUmVmbGVjdCAhPT0gJ3VuZGVmaW5lZCc7XG59O1xuIiwiLyohXG4gKiBDaGFpIC0gaXNOYU4gdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNSBTYWt0aGlwcml5YW4gVmFpcmFtYW5pIDx0aGVjaGFyZ2luZ3ZvbGNhbm9AZ21haWwuY29tPlxuICogTUlUIExpY2Vuc2VkXG4gKi9cblxuLyoqXG4gKiAjIyMgLmlzTmFOKHZhbHVlKVxuICpcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgTmFOIG9yIG5vdC5cbiAqXG4gKiAgICAgdXRpbHMuaXNOYU4oTmFOKTsgLy8gdHJ1ZVxuICpcbiAqIEBwYXJhbSB7VmFsdWV9IFRoZSB2YWx1ZSB3aGljaCBoYXMgdG8gYmUgY2hlY2tlZCBpZiBpdCBpcyBOYU5cbiAqIEBuYW1lIGlzTmFOXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpc05hTih2YWx1ZSkge1xuICAvLyBSZWZlciBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtaXNuYW4tbnVtYmVyXG4gIC8vIHNlY3Rpb24ncyBOT1RFLlxuICByZXR1cm4gdmFsdWUgIT09IHZhbHVlO1xufVxuXG4vLyBJZiBFQ01BU2NyaXB0IDYncyBOdW1iZXIuaXNOYU4gaXMgcHJlc2VudCwgcHJlZmVyIHRoYXQuXG5tb2R1bGUuZXhwb3J0cyA9IE51bWJlci5pc05hTiB8fCBpc05hTjtcbiIsIi8qIVxuICogQ2hhaSAtIGdldFByb3BlcnRpZXMgdXRpbGl0eVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBKYWtlIEx1ZXIgPGpha2VAYWxvZ2ljYWxwYXJhZG94LmNvbT5cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbi8qKlxuICogIyMjIC5nZXRQcm9wZXJ0aWVzKG9iamVjdClcbiAqXG4gKiBUaGlzIGFsbG93cyB0aGUgcmV0cmlldmFsIG9mIHByb3BlcnR5IG5hbWVzIG9mIGFuIG9iamVjdCwgZW51bWVyYWJsZSBvciBub3QsXG4gKiBpbmhlcml0ZWQgb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIGdldFByb3BlcnRpZXNcbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBnZXRQcm9wZXJ0aWVzKG9iamVjdCkge1xuICB2YXIgcmVzdWx0ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KTtcblxuICBmdW5jdGlvbiBhZGRQcm9wZXJ0eShwcm9wZXJ0eSkge1xuICAgIGlmIChyZXN1bHQuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xKSB7XG4gICAgICByZXN1bHQucHVzaChwcm9wZXJ0eSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG4gIHdoaWxlIChwcm90byAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKS5mb3JFYWNoKGFkZFByb3BlcnR5KTtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8qIVxuICogQ2hhaSAtIGdldEVudW1lcmFibGVQcm9wZXJ0aWVzIHV0aWxpdHlcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgSmFrZSBMdWVyIDxqYWtlQGFsb2dpY2FscGFyYWRveC5jb20+XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4vKipcbiAqICMjIyAuZ2V0RW51bWVyYWJsZVByb3BlcnRpZXMob2JqZWN0KVxuICpcbiAqIFRoaXMgYWxsb3dzIHRoZSByZXRyaWV2YWwgb2YgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBhbiBvYmplY3QsXG4gKiBpbmhlcml0ZWQgb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBuYW1lc3BhY2UgVXRpbHNcbiAqIEBuYW1lIGdldEVudW1lcmFibGVQcm9wZXJ0aWVzXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZ2V0RW51bWVyYWJsZVByb3BlcnRpZXMob2JqZWN0KSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgZm9yICh2YXIgbmFtZSBpbiBvYmplY3QpIHtcbiAgICByZXN1bHQucHVzaChuYW1lKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiJdfQ== |
\ | No newline at end of file |