PageSourceSearch

https://www.hospitaldaluz.pt/DesktopModules/MVC/Highlights/js/Highlights.js?cdv=13067

js hospitaldaluz.pt collected 2026-10-02 06:02:35 UTC 121,934 bytes, 1,082 lines download raw bytes

1(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
2'use strict';
3
4Object.defineProperty(exports, "__esModule", {
5    value: true
6});
7exports.BaseContext = undefined;
8
9var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
10
11require('babel-polyfill');
12
13var _react = require('react');
14
15var _react2 = _interopRequireDefault(_react);
16
17function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
19function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
20
21function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
22
23function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
24
25var BaseContext = exports.BaseContext = _react2.default.createContext();
26
27var BaseProvider = function (_React$Component) {
28    _inherits(BaseProvider, _React$Component);
29
30    function BaseProvider(props) {
31        _classCallCheck(this, BaseProvider);
32
33        var _this = _possibleConstructorReturn(this, (BaseProvider.__proto__ || Object.getPrototypeOf(BaseProvider)).call(this, props));
34
35        _this.state = {};
36        return _this;
37    }
38
39    _createClass(BaseProvider, [{
40        key: 'render',
41        value: function render() {
42            return _react2.default.createElement(
43                BaseContext.Provider,
44                { value: { state: this.state, props: this.props } },
45                this.props.children
46            );
47        }
48    }]);
49
50    return BaseProvider;
51}(_react2.default.Component);
52
53exports.default = BaseProvider;
54
55},{"babel-polyfill":"babel-polyfill","react":"react"}],2:[function(require,module,exports){
56'use strict';
57
58require('babel-polyfill');
59
60var _react = require('react');
61
62var _react2 = _interopRequireDefault(_react);
63
64var _reactDom = require('react-dom');
65
66var _reactDom2 = _interopRequireDefault(_reactDom);
67
68var _BaseProvider = require('./BaseProvider');
69
70var _BaseProvider2 = _interopRequireDefault(_BaseProvider);
71
72var _context = require('../../../../../Website/WingmanControls/src/context');
73
74var _context2 = _interopRequireDefault(_context);
75
76var _Service = require('./Service');
77
78var _Service2 = _interopRequireDefault(_Service);
79
80var _View = require('./components/View');
81
82var _View2 = _interopRequireDefault(_View);
83
84function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
85
86var App = function App(props) {
87    return _react2.default.createElement(
88        _BaseProvider2.default,
89        props,
90        _react2.default.createElement(
91            _context2.default,
92            props,
93            _react2.default.createElement(_View2.default, null)
94        )
95    );
96};
97
98window.renderHighlights = function (el) {
99    _reactDom2.default.render(_react2.default.createElement(App, {
100        service: new _Service2.default($, $(el).data('servicemodulename'), $(el).data('currentmoduleid'), $(el).data('currenttabid'), $(el).data('currentportalid')),
101        security: $(el).data('security'),
102        resources: $(el).data('resources'),
103        language: $(el).data('language'),
104        perPage: $(el).data('paginationperpage'),
105        currentPage: $(el).data('currentpage'),
106        currentBasePath: $(el).data('currentbasepath'),
107        currentModuleId: $(el).data('currentmoduleid'),
108        currentTabId: $(el).data('currenttabid'),
109        currentPortalId: $(el).data('currentportalid'),
110        skinpath: $(el).data('skinpath')
111    }), el);
112};
113
114},{"../../../../../Website/WingmanControls/src/context":7,"./BaseProvider":1,"./Service":3,"./components/View":4,"babel-polyfill":"babel-polyfill","react":"react","react-dom":"react-dom"}],3:[function(require,module,exports){
115'use strict';
116
117Object.defineProperty(exports, "__esModule", {
118    value: true
119});
120
121var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
122
123require('babel-polyfill');
124
125function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
126
127var Service = function () {
128    function Service($, mname, mid, tid) {
129        _classCallCheck(this, Service);
130
131        this.moduleId = mid;
132        this.tabId = tid;
133        this.baseServicepath = $.dnnSF(mid).getServiceRoot(mname);
134    }
135
136    _createClass(Service, [{
137        key: 'ajaxCall',
138        value: function ajaxCall(type, controller, action, id, data, processData, contentType, success, fail) {
139            $.ajax({
140                type: type,
141                url: this.baseServicepath + controller + '/' + action + (id !== null ? '/' + id : ''),
142                beforeSend: this.setHeaders.bind(this),
143                data: data,
144                processData: processData,
145                contentType: contentType !== null ? contentType : 'application/x-www-form-urlencoded; charset=UTF-8'
146            }).done(function (retdata, status, request) {
147                if (success !== undefined) {
148                    success(retdata, request);
149                }
150            }).fail(function (xhr) {
151                if (fail !== undefined) {
152                    try {
153                        fail(JSON.parse(xhr.responseText));
154                    } catch (e) {
155                        fail({ Message: xhr.status + ' ' + xhr.statusText });
156                    }
157                }
158            });
159        }
160    }, {
161        key: 'setHeaders',
162        value: function setHeaders(xhr) {
163            if (this.moduleId) {
164                xhr.setRequestHeader("ModuleId", this.moduleId);
165            }
166
167            if (this.tabId) {
168                xhr.setRequestHeader("TabId", this.tabId);
169            }
170
171            var afValue = $.dnnSF(this.moduleId).getAntiForgeryValue();
172            if (afValue) {
173                xhr.setRequestHeader("RequestVerificationToken", afValue);
174            }
175        }
176    }, {
177        key: 'getList',
178        value: function getList(success, fail) {
179            this.ajaxCall('GET', 'Highlight', 'GetList', null, null, true, null, success, fail);
180        }
181    }]);
182
183    return Service;
184}();
185
186exports.default = Service;
187
188},{"babel-polyfill":"babel-polyfill"}],4:[function(require,module,exports){
189'use strict';
190
191Object.defineProperty(exports, "__esModule", {
192    value: true
193});
194
195var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
196
197var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
198
199require('babel-polyfill');
200
201var _react = require('react');
202
203var _react2 = _interopRequireDefault(_react);
204
205var _reactInlinesvg = require('react-inlinesvg');
206
207var _reactInlinesvg2 = _interopRequireDefault(_reactInlinesvg);
208
209var _BaseProvider = require('../BaseProvider');
210
211var _context = require('../../../../../../Website/WingmanControls/src/context');
212
213var _Highlights = require('../../../../../../Website/WingmanControls/src/Highlights');
214
215var _Highlights2 = _interopRequireDefault(_Highlights);
216
217var _ResponsiveImage = require('../../../../../../Website/WingmanControls/src/ResponsiveImage');
218
219var _ResponsiveImage2 = _interopRequireDefault(_ResponsiveImage);
220
221function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
222
223function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
224
225function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
226
227function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
228
229var View = function (_React$Component) {
230    _inherits(View, _React$Component);
231
232    function View(props) {
233        _classCallCheck(this, View);
234
235        var _this = _possibleConstructorReturn(this, (View.__proto__ || Object.getPrototypeOf(View)).call(this, props));
236
237        _this.state = {
238            list: [],
239            numberOfHighlights: 0,
240            error: null,
241            loading: true,
242            defaultLink: {
243                LinkTypeTypology: 0,
244                Url: ''
245            }
246        };
247        return _this;
248    }
249
250    _createClass(View, [{
251        key: 'componentDidMount',
252        value: function componentDidMount() {
253            this.fetchData();
254        }
255    }, {
256        key: 'fetchData',
257        value: function fetchData() {
258            var _this2 = this;
259
260            this.props.context.service.getList(function (data) {
261                var list = data.Result;
262                var numberOfHighlights = data.NumberOfHighlights;
263                var type = data.Type;
264                var title = data.Title;
265
266                _this2.setState({
267                    list: list,
268                    numberOfHighlights: numberOfHighlights,
269                    type: type,
270                    title: title,
271                    error: null,
272                    loading: false
273                });
274            }, function (error) {
275                _this2.setState({ loading: false, error: error });
276            });
277        }
278    }, {
279        key: 'getlayoutexception',
280        value: function getlayoutexception(length, index) {
281            if (length === 3) {
282                return [0, 1, 2].includes(index);
283            } else if (length === 5) {
284                return [2, 3, 4].includes(index);
285            } else if (length === 6) {
286                return [2, 3, 4, 5].includes(index);
287            } else if (length === 7) {
288                return [4, 5, 6].includes(index);
289            } else if (length === 8) {
290                return [4, 5, 6, 7].includes(index);
291            }
292        }
293    }, {
294        key: 'render',
295        value: function render() {
296            var _this3 = this;
297
298            var _state = this.state,
299                loading = _state.loading,
300                error = _state.error,
301                list = _state.list,
302                type = _state.type,
303                title = _state.title,
304                defaultLink = _state.defaultLink;
305
306
307            if (loading) {
308                return _react2.default.createElement('div', null);
309            }
310
311            if (error) {
312                return _react2.default.createElement('div', null);
313            }
314
315            switch (type) {
316                case 0:
317                    // Mini Highlights
318                    return _react2.default.createElement(_Highlights2.default, _extends({}, this.props, { list: list }));
319
320                default:
321                    {
322                        // Standard Highlights
323                        var responsiveImageConfiguration = [{
324                            min: 1,
325                            max: 575,
326                            size: [575, 259]
327                        }, {
328                            min: 576,
329                            max: 767,
330                            size: [767, 346]
331                        }, {
332                            min: 768,
333                            max: 1199,
334                            size: [598, 269]
335                        }, {
336                            min: 1200,
337                            max: 10000,
338                            size: [799, 360]
339                        }];
340
341                        return _react2.default.createElement(
342                            _react2.default.Fragment,
343                            null,
344                            title ? _react2.default.createElement(
345                                'div',
346                                { className: 'highlights-title big container-fluid' },
347                                _react2.default.createElement(
348                                    'h2',
349                                    { className: 'page-title' },
350                                    _react2.default.createElement(
351                                        'span',
352                                        { className: 'icon plus d-print-none' },
353                                        _react2.default.createElement(_reactInlinesvg2.default, { cacheGetRequests: true, src: siteData.skinpath.url + "assets/images/icons/plus.svg" })
354                                    ),
355                                    _react2.default.createElement(
356                                        'span',
357                                        { className: 'title' },
358                                        title
359                                    ),
360                                    this.props.skinContext.state.viewMode == "desktop" ? _react2.default.createElement(
361                                        'span',
362                                        { className: 'icon plus d-print-none' },
363                                        _react2.default.createElement(_reactInlinesvg2.default, { cacheGetRequests: true, src: siteData.skinpath.url + "assets/images/icons/plus.svg" })
364                                    ) : null
365                                )
366                            ) : null,
367                            _react2.default.createElement(
368                                'ul',
369                                { className: 'highlights-wrapper big container-fluid' },
370                                list.map(function (item, index) {
371                                    var link = item.Links || item.Link || defaultLink;
372                                    var linkType = item.LinkType;
373                                    var linkTypeTypology = link.LinkTypeTypology;
374                                    var iconPath = siteData.skinpath.url + "assets/images/icons/expand-icon.svg";
375                                    var iconClass = "icon-internal";
376
377                                    var isExternal = link.External;
378
379                                    if (linkType === 2) {
380                                        //isExternal = true;
381                                        iconPath = siteData.skinpath.url + "assets/images/icons/download-icon.svg";
382                                        iconClass = "icon-download";
383                                    } else {
384                                        if (linkTypeTypology > 2) {
385                                            //isExternal = true;
386                                            if (_this3.props.skinContext.state.viewMode === 'mobile') {
387                                                iconPath = siteData.skinpath.url + "assets/images/icons/expand-icon.svg";
388                                            } else {
389                                                iconPath = "";
390                                            }
391                                            iconClass = "icon-external";
392                                        } else {
393                                            //isExternal = false;
394                                        }
395                                    }
396
397                                    var externalLink = isExternal ? linkType === 2 ? { "rel": "external" } : { "rel": "external noopener noreferrer" } : {};
398                                    var downloadLink = linkType === 2 && isExternal === true ? { "download": "" } : {};
399
400                                    var classLink = "button";
401                                    if (_this3.props.skinContext.state.viewMode !== 'mobile') {
402                                        classLink = "button align-self-start secondary-theme";
403                                    } else {
404                                        classLink = item.ImagePath ? "button align-self-end secondary-icon-theme" : "button align-self-end outline-icon-theme";
405                                    }
406
407                                    var layoutexception = _this3.getlayoutexception(list.length, index);
408
409                                    return _react2.default.createElement(
410                                        'li',
411                                        { key: index, className: layoutexception ? 'max200' : 'teste' },
412                                        _react2.default.createElement(
413                                            'article',
414                                            { className: 'row highlights big' },
415                                            item.ImagePath ? _react2.default.createElement(
416                                                'div',
417                                                { className: 'img responsive-image-wrapper responsive-image-dark-mask' },
418                                                _react2.default.createElement(_ResponsiveImage2.default, {
419                                                    src: '' + item.ImagePath,
420                                                    alt: item.ImageAlt,
421                                                    configuration: responsiveImageConfiguration,
422                                                    mode: 'picture',
423                                                    cutType: 't'
424                                                })
425                                            ) : null,
426                                            _react2.default.createElement(
427                                                'div',
428                                                { className: 'col text d-flex flex-column' },
429                                                _react2.default.createElement(
430                                                    'h3',
431                                                    { className: 'title ' + (_this3.props.skinContext.state.viewMode === 'mobile' ? "mb-auto" : "") },
432                                                    _react2.default.createElement(
433                                                        'span',
434                                                        { className: 'icon plus d-print-none' },
435                                                        _react2.default.createElement(_reactInlinesvg2.default, { cacheGetRequests: true, src: siteData.skinpath.url + "assets/images/icons/plus.svg" })
436                                                    ),
437                                                    _react2.default.createElement(
438                                                        'span',
439                                                        { className: 'title-txt' },
440                                                        item.Title
441                                                    )
442                                                ),
443                                                _this3.props.skinContext.state.viewMode !== 'mobile' ? _react2.default.createElement('div', { className: 'lead-text mb-auto', dangerouslySetInnerHTML: { __html: item.Lead } }) : null,
444                                                link.Url ? _react2.default.createElement(
445                                                    'a',
446                                                    _extends({ href: link.Url, className: classLink, target: isExternal ? "_blank" : "_self" }, externalLink, downloadLink),
447                                                    _react2.default.createElement(
448                                                        'span',
449                                                        { className: _this3.props.skinContext.state.viewMode !== 'mobile' ? "txt-link" : "sr-only" },
450                                                        item.LinkCTA
451                                                    ),
452                                                    _this3.props.skinContext.state.viewMode !== 'mobile' ? linkType === 2 || linkTypeTypology > 2 ? iconPath != "" ? _react2.default.createElement(
453                                                        'span',
454                                                        { className: 'icon ' + iconClass },
455                                                        _react2.default.createElement(_reactInlinesvg2.default, { cacheGetRequests: true, src: iconPath })
456                                                    ) : null : null : _react2.default.createElement(
457                                                        'span',
458                                                        { className: 'icon ' + iconClass },
459                                                        _react2.default.createElement(_reactInlinesvg2.default, { cacheGetRequests: true, src: iconPath })
460                                                    )
461                                                ) : null
462                                            )
463                                        )
464                                    );
465                                })
466                            )
467                        );
468                    }
469            }
470        }
471    }]);
472
473    return View;
474}(_react2.default.Component);
475
476exports.default = function (props) {
477    return _react2.default.createElement(
478        _BaseProvider.BaseContext.Consumer,
479        null,
480        function (context) {
481            return _react2.default.createElement(
482                _context.SkinContext.Consumer,
483                null,
484                function (skinContext) {
485                    return _react2.default.createElement(View, _extends({}, props, { context: context.props, skinContext: skinContext }));
486                }
487            );
488        }
489    );
490};
491
492},{"../../../../../../Website/WingmanControls/src/Highlights":5,"../../../../../../Website/WingmanControls/src/ResponsiveImage":6,"../../../../../../Website/WingmanControls/src/context":7,"../BaseProvider":1,"babel-polyfill":"babel-polyfill","react":"react","react-inlinesvg":"react-inlinesvg"}],5:[function(require,module,exports){
493'use strict';
494
495Object.defineProperty(exports, "__esModule", {
496    value: true
497});
498
499var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
500
501var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
502
503require('babel-polyfill');
504
505var _react = require('react');
506
507var _react2 = _interopRequireDefault(_react);
508
509var _reactInlinesvg = require('react-inlinesvg');
510
511var _reactInlinesvg2 = _interopRequireDefault(_reactInlinesvg);
512
513function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
514
515function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
516
517function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
518
519function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { c
519onstructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
520
521var Highlights = function (_React$Component) {
522    _inherits(Highlights, _React$Component);
523
524    function Highlights(props) {
525        _classCallCheck(this, Highlights);
526
527        var _this = _possibleConstructorReturn(this, (Highlights.__proto__ || Object.getPrototypeOf(Highlights)).call(this, props));
528
529        _this.state = {
530            defaultLink: {
531                LinkTypeTypology: 0,
532                Url: ''
533            }
534        };
535        return _this;
536    }
537
538    _createClass(Highlights, [{
539        key: 'render',
540        value: function render() {
541            var _this2 = this;
542
543            var list = this.props.list;
544
545
546            return _react2.default.createElement(
547                'ul',
548                { className: 'highlights-wrapper container' },
549                list.map(function (item, index) {
550                    var link = item.Links || item.Link || _this2.state.defaultLink;
551                    if (item.Link != undefined && item.Link != null) {
552                        link = item.Link;
553                    }
554                    var linkType = item.LinkType;
555                    var linkTypeTypology = link.LinkTypeTypology;
556                    var iconPath = siteData.skinpath.url + "assets/images/icons/expand-icon.svg";
557                    var iconClass = "icon-internal";
558
559                    var isExternal = link.External;
560
561                    if (linkType === 2) {
562                        //isExternal = true;
563                        iconPath = siteData.skinpath.url + "assets/images/icons/download-icon.svg";
564                        iconClass = "icon-download";
565                    } else {
566                        if (linkTypeTypology > 2) {
567                            //isExternal = true;
568                            if (_this2.props.skinContext.state.viewMode === 'mobile') {
569                                iconPath = siteData.skinpath.url + "assets/images/icons/expand-icon.svg";
570                            } else {
571                                iconPath = "";
572                            }
573                            iconClass = "icon-external";
574                        }
575                    }
576
577                    var externalLink = isExternal ? linkType === 2 ? { "rel": "external" } : { "rel": "external noopener noreferrer" } : {};
578                    var downloadLink = linkType === 2 && isExternal === true ? { "download": "" } : {};
579
580                    var classLink = "button";
581                    if (_this2.props.skinContext.state.viewMode !== 'desktop') {
582                        classLink = "button outline-icon-theme align-self-end";
583                    } else {
584                        classLink = "button outline-theme align-self-end no-shadow";
585                    }
586
587                    return _react2.default.createElement(
588                        'li',
589                        { key: index },
590                        _react2.default.createElement(
591                            'article',
592                            { className: 'row highlights' },
593                            _react2.default.createElement(
594                                'h3',
595                                { className: 'col-10 col-sm-11 col-md-12 title' },
596                                item.Title
597                            ),
598                            _this2.props.skinContext.state.viewMode !== 'mobile' ? _react2.default.createElement('div', { className: 'col-md lead-text', dangerouslySetInnerHTML: { __html: item.Lead } }) : null,
599                            link.Url ? index === 0 ? list.length % 2 === 1 ? _this2.props.skinContext.state.viewMode !== 'desktop' ? _react2.default.createElement(
600                                'div',
601                                { className: 'col d-flex justify-content-end' },
602                                _react2.default.createElement(
603                                    'a',
604                                    _extends({ href: link.Url, className: classLink, target: isExternal ? "_blank" : "_self" }, externalLink, downloadLink),
605                                    _react2.default.createElement(
606                                        'span',
607                                        { className: 'icon ' + iconClass },
608                                        _react2.default.createElement(_reactInlinesvg2.default, { cacheGetRequests: true, src: iconPath })
609                                    ),
610                                    _react2.default.createElement(
611                                        'span',
612                                        { className: 'sr-only' },
613                                        item.LinkCTA
614                                    )
615                                )
616                            ) : _react2.default.createElement(
617                                'a',
618                                _extends({ href: link.Url, className: classLink, target: isExternal ? "_blank" : "_self" }, externalLink, downloadLink),
619                                _react2.default.createElement(
620                                    'span',
621                                    { className: 'txt-link' },
622                                    item.LinkCTA
623                                ),
624                                linkType === 2 ? _react2.default.createElement(
625                                    'span',
626                                    { className: 'icon ' + iconClass },
627                                    _react2.default.createElement(_reactInlinesvg2.default, { cacheGetRequests: true, src: iconPath })
628                                ) : null,
629                                linkType !== 2 && isExternal === true ? iconPath != "" ? _react2.default.createElement(
630                                    'span',
631                                    { className: 'icon ' + iconClass },
632                                    _react2.default.createElement(_reactInlinesvg2.default, { cacheGetRequests: true, src: iconPath })
633                                ) : null : null
634                            ) : _react2.default.createElement(
635                                'div',
636                                { className: 'd-flex justify-content-end ' + (_this2.props.skinContext.state.viewMode !== 'mobile' ? "col-auto" : "col") },
637                                _react2.default.createElement(
638                                    'a',
639                                    _extends({ href: link.Url, className: 'button outline-icon-theme al
639ign-self-end', target: isExternal ? "_blank" : "_self" }, externalLink, downloadLink),
640                                    _react2.default.createElement(
641                                        'span',
642                                        { className: 'icon ' + iconClass },
643                                        _react2.default.createElement(_reactInlinesvg2.default, { cacheGetRequests: true, src: iconPath })
644                                    ),
645                                    _react2.default.createElement(
646                                        'span',
647                                        { className: 'sr-only' },
648                                        item.LinkCTA
649                                    )
650                                )
651                            ) : _react2.default.createElement(
652                                'div',
653                                { className: 'd-flex justify-content-end ' + (_this2.props.skinContext.state.viewMode !== 'mobile' ? "col-auto" : "col") },
654                                _react2.default.createElement(
655                                    'a',
656                                    _extends({ href: link.Url, className: 'button outline-icon-theme align-self-end', target: isExternal ? "_blank" : "_self" }, externalLink, downloadLink),
657                                    _react2.default.createElement(
658                                        'span',
659                                        { className: 'icon ' + iconClass },
660                                        _react2.default.createElement(_reactInlinesvg2.default, { cacheGetRequests: true, src: iconPath })
661                                    ),
662                                    _react2.default.createElement(
663                                        'span',
664                                        { className: 'sr-only' },
665                                        item.LinkCTA
666                                    )
667                                )
668                            ) : null
669                        )
670                    );
671                })
672            );
673        }
674    }]);
675
676    return Highlights;
677}(_react2.default.Component);
678
679exports.default = Highlights;
680
681},{"babel-polyfill":"babel-polyfill","react":"react","react-inlinesvg":"react-inlinesvg"}],6:[function(require,module,exports){
682'use strict';
683
684Object.defineProperty(exports, "__esModule", {
685    value: true
686});
687
688var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
689
690require('babel-polyfill');
691
692var _react = require('react');
693
694var _react2 = _interopRequireDefault(_react);
695
696function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
697
698function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
699
700function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
701
702function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
703
704/**
705 * Responsive Image
706 * 
707 * const responsiveImageConfiguration = [
708 *      {max: 575, size: [575, 400]},
709 *      {min: 575, max: 767, size: [767, 400]},
710 *      {min: 767, max: 991, size: [991, 400]},
711 *      {min: 991, max: 1199, size: [1199, 400]},
712 *      {min: 1199, size: [1600, 444]}];
713 *
714 * mode: srcset (default) or picture
715 * 
716 * cutType:
717 *      case "r": op = ImageHandlerAction.ResizeImage;
718 *      case "c": op = ImageHandlerAction.CropImageFromCenter = From Center, Center;
719 *      case "t": op = ImageHandlerAction.CropImageFromTop = From Top, Left;
720 *      case "b": op = ImageHandlerAction.CropImageFromBottom = From Bottom, Right;
721 *      case "tc": op = ImageHandlerAction.CropImageFromTopCenter = From Top, Center;
722 *
723 * use it like: <ResponsiveImage src={`/DnnImageHandler.ashx?mode=file&file=${item.ImagePath}`} alt={item.ImageAlt} configuration={responsiveImageConfiguration} mode={'srcset'} cutType={'b'} />
724 */
725
726var ResponsiveImage = function (_React$Component) {
727    _inherits(ResponsiveImage, _React$Component);
728
729    function ResponsiveImage(props) {
730        _classCallCheck(this, ResponsiveImage);
731
732        var _this = _possibleConstructorReturn(this, (ResponsiveImage.__proto__ || Object.getPrototypeOf(ResponsiveImage)).call(this, props));
733
734        _this.getConfiguration = function () {
735            var set = _this.configuration;
736            var result = 0;
737
738            set.forEach(function (v) {
739                var min = v.min || v.max;
740                var max = v.max || v.min;
741
742                if (window.innerWidth < min || window.innerWidth > min && window.innerWidth < max || window.innerWidth > max) {
743                    // the bellow blows up on big resolutions
744                    //if ((window.innerWidth >= min && window.innerWidth <= max)) {
745                    result = v;
746                }
747            });
748
749            return result;
750        };
751
752        _this.renderPicture = function (currentConfiguration, src, finalAlt) {
753            var separator = void 0;
754            if (src != null && src != "undefined") separator = src.indexOf('?') > 0 ? '&' : '?';
755            return _react2.default.createElement(
756                'div',
757                { className: 'image-wrapper' },
758                _react2.default.createElement(
759                    'picture',
760                    null,
761                    _this.configuration.map(function (v, i) {
762                        var w = v.size[0];
763                        var h = v.size[1];
764
765                        var imageSrc = '' + encodeURI(src) + separator + 'w=' 
765+ w + '&h=' + h + '&op=' + _this.props.cutType + ' 1x';
766
767                        var minWidth = +v.min > 0 ? '(min-width: ' + v.min + 'px)' : null;
768                        var maxWidth = +v.max > 0 ? '(max-width: ' + v.max + 'px)' : null;
769                        var media = minWidth && maxWidth ? minWidth + ' and ' + maxWidth : (minWidth || maxWidth) + ' ' + w + 'px';
770
771                        return _react2.default.createElement('source', { key: i, srcSet: imageSrc, media: media });
772                    }),
773                    _react2.default.createElement('img', { loading: 'lazy', src: '' + encodeURI(src) + separator + 'w=' + currentConfiguration.size[0] + '&h=' + currentConfiguration.size[1] + '&op=' + _this.props.cutType, alt: finalAlt })
774                )
775            );
776        };
777
778        _this.renderSrcSet = function (currentConfiguration, src, finalAlt) {
779            var separator = src.indexOf('?') > 0 ? '&' : '?';
780            var srcSet = _this.configuration.map(function (v) {
781                return '' + encodeURI(src) + separator + 'w=' + v.size[0] + '&h=' + v.size[1] + '&op=' + _this.props.cutType + ' 1x';
782            }).reduce(function (acc, val) {
783                return acc + ',' + val;
784            });
785
786            var sizes = _this.configuration.map(function (v) {
787                var minWidth = +v.min > 0 ? '(min-width: ' + v.min + 'px)' : null;
788                var maxWidth = +v.max > 0 ? '(max-width: ' + v.max + 'px)' : null;
789
790                if (minWidth && maxWidth) {
791                    return minWidth + ' and ' + maxWidth + ' ' + v.size[0] + 'px';
792                }
793
794                return (minWidth || maxWidth) + ' ' + v.size[0] + 'px';
795            }).reduce(function (acc, val) {
796                return acc + ',' + val;
797            });
798
799            return _react2.default.createElement(
800                'div',
801                { className: 'image-wrapper' },
802                _react2.default.createElement('img', { loading: 'lazy', src: '' + encodeURI(src) + separator + 'w=' + currentConfiguration.size[0] + '&h=' + currentConfiguration.size[1] + '&op=' + _this.props.cutType, srcSet: srcSet, sizes: sizes, alt: finalAlt })
803            );
804        };
805
806        _this.state = {
807            loaded: false,
808            mounted: false
809        };
810
811        // the generated srcset output
812        _this.checkScroll = _this.checkScroll.bind(_this);
813        var defaultConfiguration = [{
814            min: 1,
815            max: 575,
816            size: [360, 288]
817        }, {
818            min: 576,
819            max: 991,
820            size: [360, 288]
821        }, {
822            min: 992,
823            max: 1199,
824            size: [480, 288]
825        }, {
826            min: 1200,
827            max: 10000,
828            size: [570, 288]
829        }];
830        var defaultMode = 'srcset';
831
832        _this.configuration = _this.props.configuration || defaultConfiguration;
833        _this.mode = _this.props.mode || defaultMode;
834        return _this;
835    }
836
837    _createClass(ResponsiveImage, [{
838        key: 'componentDidMount',
839        value: function componentDidMount() {
840            var _this2 = this;
841
842            this.setState({
843                mounted: true
844            });
845
846            if (this.props.lazy) {
847                this.checkScroll();
848
849                ['scroll'].map(function (ev) {
850                    return window.addEventListener(ev, _this2.checkScroll);
851                });
852            }
853        }
854    }, {
855        key: 'shouldComponentUpdate',
856        value: function shouldComponentUpdate() {
857            if (this.state.loaded === true) {
858                return false;
859            }
860
861            return true;
862        }
863    }, {
864        key: 'componentWillUnmount',
865        value: function componentWillUnmount() {
866            var _this3 = this;
867
868            ['scroll'].map(function (ev) {
869                return window.removeEventListener(ev, _this3.checkScroll);
870            });
871        }
872    }, {
873        key: 'checkScroll',
874        value: function checkScroll() {
875            var _this4 = this;
876
877            if (this.timer !== null) {
878                clearTimeout(this.timer);
879            }
880
881            this.timer = setTimeout(function () {
882                if (_this4.instance.getBoundingClientRect().top <= window.innerHeight) {
883
884                    ['scroll'].map(function (ev) {
885                        return window.removeEventListener(ev, _this4.checkScroll);
886                    });
887                }
888            }, 150);
889        }
890    }, {
891        key: 'render',
892        value: function render() {
893            var _props = this.props,
894                src = _props.src,
895                alt = _props.alt;
896
897            var currentConfiguration = this.getConfiguration();
898
899            var hasValue = function hasValue(v) {
900                return v !== null && v !== undefined;
901            };
902
903            var noAltText = siteData && siteData.resources && hasValue(siteData.resources.NoAltText) ? siteData.resources.NoAltText : '';
904
905            var finalAlt = hasValue(alt) ? alt : noAltText;
906
907            /*const finalAlt = alt ? alt : siteData.resources.NoAltText;*/
908
909            this.src = src;
910
911            switch (this.mode) {
912                case 'picture':
913                    return this.renderPicture(currentConfiguration, src, finalAlt);
914                case 'srcset':
915                    return this.renderSrcSet(currentConfiguration, src, finalAlt);
916                default:
917                    return null;
918            }
919        }
920    }]);
921
922    return ResponsiveImage;
923}(_react2.default.Component);
924
925exports.default = ResponsiveImage;
926
927},{"babel-polyfill":"babel-polyfill","react":"react"}],7:[function(require,module,exports){
928'use strict';
929
930Object.defineProperty(exports, "__esModule", {
931    value: true
932});
933exports.SkinContext = undefined;
934
935var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
936
937require('babel-polyfill');
938
939var _react = require('react');
940
941var _react2 = _interopRequireDefault(_react);
942
943function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
944
945function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
946
947function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
948
949function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
950
951//1 - Create Context
952var SkinContext = exports.SkinContext = _react2.default.createContext();
953
954//2 - Create a Provider Component
955
956var SkinProvider = function (_React$Component) {
957    _inherits(SkinProvider, _React$Component);
958
959    function SkinProvider() {
960        _classCallCheck(this, SkinProvider);
961
962        var _this = _possibleConstructorReturn(this, (SkinProvider.__proto__ || Object.getPrototypeOf(SkinProvider)).call(this));
963
964        _this.setKeyPressed = function (value) {
965            if (_this.state.keyPressed !== value) {
966                _this.setState({
967                    keyPressed: value
968                });
969            }
970        };
971
972        _this.handleModalEvent = function (value) {
973            if (value === true) {
974                document.getElementsByTagName('html')[0].classList.add('is-locked');
975            } else {
976                document.getElementsByTagName('html')[0].classList.remove('is-locked');
977            }
978        };
979
980        _this.handleKeyDownEvent = function (event) {
981            if (event.key === "Enter" || event.key === " " || event.key === "Escape") {
982                _this.setKeyPressed(true);
983            }
984        };
985
986        _this.getLayoutMode = function () {
987            var returnLayout = "";
988
989            if (window.innerWidth >= 768 && window.innerWidth < 992) {
990                returnLayout = "tablet";
991            } else if (window.innerWidth >= 992) {
992                returnLayout = "desktop";
993            } else {
994                returnLayout = "mobile";
995            }
996
997            return returnLayout;
998        };
999
1000        _this.handleResizeEvent = function () {
1001            clearTimeout(_this._resizeTimeout);
1002
1003            _this._resizeTimeout = setTimeout(function () {
1004                if (!_this._isMounted) return;
1005
1006                var currentViewMode = _this.state.viewMode;
1007
1008                if (window.innerWidth >= 768 && window.innerWidth < 992) {
1009                    if (currentViewMode !== 'tablet') {
1010                        _this.setState({ viewMode: 'tablet' });
1011                    }
1012                } else if (window.innerWidth >= 992) {
1013                    if (currentViewMode !== 'desktop') {
1014                        _this.setState({ viewMode: 'desktop' });
1015                    }
1016                } else {
1017                    if (currentViewMode !== 'mobile') {
1018                        _this.setState({ viewMode: 'mobile' });
1019                    }
1020                }
1021
1022                _this.setState({ windowWidthGlobal: window.innerWidth });
1023            }, 150);
1024        };
1025
1026        _this._isMounted = false;
1027
1028        /**
1029         * State
1030         */
1031        _this.state = {
1032            viewMode: _this.getLayoutMode(),
1033            keyPressed: false,
1034            windowWidthGlobal: window.innerWidth
1035        };
1036        return _this;
1037    }
1038
1039    /**
1040     * Methods
1041     */
1042
1043
1044    _createClass(SkinProvider, [{
1045        key: 'componentDidMount',
1046
1047
1048        /**
1049         * React Lifecycle Methods
1050         */
1051        value: function componentDidMount() {
1052            this._isMounted = true;
1053
1054            document.addEventListener('keydown', this.handleKeyDownEvent);
1055            window.addEventListener('resize', this.handleResizeEvent);
1056        }
1057    }, {
1058        key: 'componentWillUnmount',
1059        value: function componentWillUnmount() {
1060            this._isMounted = false;
1061
1062            document.removeEventListener('keydown', this.handleKeyDownEvent);
1063            window.removeEventListener('resize', this.handleResizeEvent);
1064        }
1065    }, {
1066        key: 'render',
1067        value: function render() {
1068            return _react2.default.createElement(
1069                SkinContext.Provider,
1070                { value: { state: this.state, setKeyPressed: this.setKeyPressed, handleModalEvent: this.handleModalEvent } },
1071                this.props.children
1072            );
1073        }
1074    }]);
1075
1076    return SkinProvider;
1077}(_react2.default.Component);
1078
1079exports.default = SkinProvider;
1080
1081},{"babel-polyfill":"babel-polyfill","react":"react"}]},{},[2])
1082//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJqcy9zcmMvQmFzZVByb3ZpZGVyLmpzIiwianMvc3JjL0hpZ2hsaWdodHMuanN4IiwianMvc3JjL1NlcnZpY2UuanMiLCJqcy9zcmMvY29tcG9uZW50cy9WaWV3LmpzIiwiLi4vLi4vLi4vV2Vic2l0ZS9XaW5nbWFuQ29udHJvbHMvc3JjL0hpZ2hsaWdodHMuanMiLCIuLi8uLi8uLi9XZWJzaXRlL1dpbmdtYW5Db250cm9scy9zcmMvUmVzcG9uc2l2ZUltYWdlLmpzIiwiLi4vLi4vLi4vV2Vic2l0ZS9XaW5nbWFuQ29udHJvbHMvc3JjL2NvbnRleHQuanN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0FDQUM7O0FBQ0Q7Ozs7Ozs7Ozs7OztBQUVPLElBQU0sb0NBQWMsZ0JBQU0sYUFBTixFQUFwQjs7SUFFRCxZOzs7QUFDRiwwQkFBWSxLQUFaLEVBQW1CO0FBQUE7O0FBQUEsZ0lBQ1QsS0FEUzs7QUFHZixjQUFLLEtBQUwsR0FBYSxFQUFiO0FBSGU7QUFLbEI7Ozs7aUNBRVE7QUFDTCxtQkFDSTtBQUFDLDJCQUFELENBQWEsUUFBYjtBQUFBLGtCQUFzQixPQUFPLEVBQUUsT0FBTyxLQUFLLEtBQWQsRUFBcUIsT0FBTyxLQUFLLEtBQWpDLEVBQTdCO0FBQ0sscUJBQUssS0FBTCxDQUFXO0FBRGhCLGFBREo7QUFLSDs7OztFQWRzQixnQkFBTSxTOztrQkFpQmxCLFk7Ozs7O0FDdEJmOztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTSxNQUFNLFNBQU4sR0FBTSxDQUFDLEtBQUQ7QUFBQSxXQUNSO0FBQUMsOEJBQUQ7QUFBa0IsYUFBbEI7QUFDSTtBQUFDLDZCQUFEO0FBQWtCLGlCQUFsQjtBQUNJLDBDQUFDLGNBQUQ7QUFESjtBQURKLEtBRFE7QUFBQSxDQUFaOztBQVFBLE9BQU8sZ0JB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IsS0FBbEI7O0FBRUE7OztBQUdBLGNBQUssS0FBTCxHQUFhO0FBQ1Qsc0JBQVUsTUFBSyxhQUFMLEVBREQ7QUFFVCx3QkFBWSxLQUZIO0FBR1QsK0JBQW1CLE9BQU87QUFIakIsU0FBYjtBQVJVO0FBYWI7O0FBRUQ7Ozs7Ozs7OztBQW1FQTs7OzRDQUdvQjtBQUNoQixpQkFBSyxVQUFMLEdBQWtCLElBQWxCOztBQUVBLHFCQUFTLGdCQUFULENBQTBCLFNBQTFCLEVBQXFDLEtBQUssa0JBQTFDO0FBQ0EsbUJBQU8sZ0JBQVAsQ0FBd0IsUUFBeEIsRUFBa0MsS0FBSyxpQkFBdkM7QUFDSDs7OytDQUVzQjtBQUNuQixpQkFBSyxVQUFMLEdBQWtCLEtBQWxCOztBQUVBLHFCQUFTLG1CQUFULENBQTZCLFNBQTdCLEVBQXdDLEtBQUssa0JBQTdDO0FBQ0EsbUJBQU8sbUJBQVAsQ0FBMkIsUUFBM0IsRUFBcUMsS0FBSyxpQkFBMUM7QUFDSDs7O2lDQUVRO0FBQ0wsbUJBQ0k7QUFBQywyQkFBRCxDQUFhLFFBQWI7QUFBQSxrQkFBc0IsT0FBTyxFQUFFLE9BQU8sS0FBSyxLQUFkLEVBQXFCLGVBQWUsS0FBSyxhQUF6QyxFQUF3RCxrQkFBa0IsS0FBSyxnQkFBL0UsRUFBN0I7QUFDSyxxQkFBSyxLQUFMLENBQVc7QUFEaEIsYUFESjtBQUtIOzs7O0VBMUdxQyxnQkFBTSxTOztrQkFBM0IsWSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIu+7v2ltcG9ydCAnYmFiZWwtcG9seWZpbGwnO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5cclxuZXhwb3J0IGNvbnN0IEJhc2VDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dCgpO1xyXG5cclxuY2xhc3MgQmFzZVByb3ZpZGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG5cclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgI
1082H07XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxCYXNlQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17eyBzdGF0ZTogdGhpcy5zdGF0ZSwgcHJvcHM6IHRoaXMucHJvcHMgfX0+XHJcbiAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5jaGlsZHJlbn1cclxuICAgICAgICAgICAgPC9CYXNlQ29udGV4dC5Qcm92aWRlcj5cclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCYXNlUHJvdmlkZXI7IiwiaW1wb3J0ICdiYWJlbC1wb2x5ZmlsbCc7XHJcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xyXG5cclxuaW1wb3J0IEJhc2VQcm92aWRlciBmcm9tICcuL0Jhc2VQcm92aWRlcic7XHJcbmltcG9ydCBTa2luUHJvdmlkZXIgZnJvbSAnLi4vLi4vLi4vLi4vLi4vV2Vic2l0ZS9XaW5nbWFuQ29udHJvbHMvc3JjL2NvbnRleHQnO1xyXG5pbXBvcnQgU2VydmljZSBmcm9tICcuL1NlcnZpY2UnO1xyXG5pbXBvcnQgVmlldyBmcm9tICcuL2NvbXBvbmVudHMvVmlldyc7XHJcblxyXG5jb25zdCBBcHAgPSAocHJvcHMpID0+IChcclxuICAgIDxCYXNlUHJvdmlkZXIgey4uLnByb3BzfT5cclxuICAgICAgICA8U2tpblByb3ZpZGVyIHsuLi5wcm9wc30+XHJcbiAgICAgICAgICAgIDxWaWV3IC8+XHJcbiAgICAgICAgPC9Ta2luUHJvdmlkZXI+XHJcbiAgICA8L0Jhc2VQcm92aWRlcj5cclxuKTtcclxuXHJcbndpbmRvdy5yZW5kZXJIaWdobGlnaHRzID0gZnVuY3Rpb24gKGVsKSB7XHJcbiAgICBSZWFjdERPTS5yZW5kZXIoXHJcbiAgICAgICAgPEFwcFxyXG4gICAgICAgICAgICBzZXJ2aWNlPXtuZXcgU2VydmljZSgkLCAkKGVsKS5kYXRhKCdzZXJ2aWNlbW9kdWxlbmFtZScpLCAkKGVsKS5kYXRhKCdjdXJyZW50bW9kdWxlaWQnKSwgJChlbCkuZGF0YSgnY3VycmVudHRhYmlkJyksICQoZWwpLmRhdGEoJ2N1cnJlbnRwb3J0YWxpZCcpKX1cclxuICAgICAgICAgICAgc2VjdXJpdHk9eyQoZWwpLmRhdGEoJ3NlY3VyaXR5Jyl9XHJcbiAgICAgICAgICAgIHJlc291cmNlcz17JChlbCkuZGF0YSgncmVzb3VyY2VzJyl9XHJcbiAgICAgICAgICAgIGxhbmd1YWdlPXskKGVsKS5kYXRhKCdsYW5ndWFnZScpfVxyXG4gICAgICAgICAgICBwZXJQYWdlPXskKGVsKS5kYXRhKCdwYWdpbmF0aW9ucGVycGFnZScpfVxyXG4gICAgICAgICAgICBjdXJyZW50UGFnZT17JChlbCkuZGF0YSgnY3VycmVudHBhZ2UnKX1cclxuICAgICAgICAgICAgY3VycmVudEJhc2VQYXRoPXskKGVsKS5kYXRhKCdjdXJyZW50YmFzZXBhdGgnKX1cclxuICAgICAgICAgICAgY3VycmVudE1vZHVsZUlkPXskKGVsKS5kYXRhKCdjdXJyZW50bW9kdWxlaWQnKX1cclxuICAgICAgICAgICAgY3VycmVudFRhYklkPXskKGVsKS5kYXRhKCdjdXJyZW50dGFiaWQnKX1cclxuICAgICAgICAgICAgY3VycmVudFBvcnRhbElkPXskKGVsKS5kYXRhKCdjdXJyZW50cG9ydGFsaWQnKX1cclxuICAgICAgICAgICAgc2tpbnBhdGg9eyQoZWwpLmRhdGEoJ3NraW5wYXRoJyl9XHJcbiAgICAgICAgLz4sIGVsKTtcclxufTsiLCJpbXBvcnQgJ2JhYmVsLXBvbHlmaWxsJztcclxuXHJcbmNsYXNzIFNlcnZpY2Uge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCQsIG1uYW1lLCBtaWQsIHRpZCkge1xyXG4gICAgICAgIHRoaXMubW9kdWxlSWQgPSBtaWQ7XHJcbiAgICAgICAgdGhpcy50YWJJZCA9IHRpZDtcclxuICAgICAgICB0aGlzLmJhc2VTZXJ2aWNlcGF0aCA9ICQuZG5uU0YobWlkKS5nZXRTZXJ2aWNlUm9vdChtbmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWpheENhbGwodHlwZSwgY29udHJvbGxlciwgYWN0aW9uLCBpZCwgZGF0YSwgcHJvY2Vzc0RhdGEsIGNvbnRlbnRUeXBlLCBzdWNjZXNzLCBmYWlsKSB7XHJcbiAgICAgICAgJC5hamF4KHtcclxuICAgICAgICAgICAgdHlwZTogdHlwZSxcclxuICAgICAgICAgICAgdXJsOiB0aGlzLmJhc2VTZXJ2aWNlcGF0aCArIGNvbnRyb2xsZXIgKyAnLycgKyBhY3Rpb24gKyAoaWQgIT09IG51bGwgPyAnLycgKyBpZCA6ICcnKSxcclxuICAgICAgICAgICAgYmVmb3JlU2VuZDogdGhpcy5zZXRIZWFkZXJzLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgIHByb2Nlc3NEYXRhOiBwcm9jZXNzRGF0YSxcclxuICAgICAgICAgICAgY29udGVudFR5cGU6IGNvbnRlbnRUeXBlICE9PSBudWxsID8gY29udGVudFR5cGUgOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04J1xyXG4gICAgICAgIH0pLmRvbmUoZnVuY3Rpb24gKHJldGRhdGEsIHN0YXR1cywgcmVxdWVzdCkge1xyXG4gICAgICAgICAgICBpZiAoc3VjY2VzcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBzdWNjZXNzKHJldGRhdGEsIHJlcXVlc3QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoeGhyKSB7XHJcbiAgICAgICAgICAgIGlmIChmYWlsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmFpbChKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmFpbCh7IE1lc3NhZ2U6IGAke3hoci5zdGF0dXN9ICR7eGhyLnN0YXR1c1RleHR9YCB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEhlYWRlcnMoeGhyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubW9kdWxlSWQpIHtcclxuICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJNb2R1bGVJZFwiLCB0aGlzLm1vZHVsZUlkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRhYklkKSB7XHJcbiAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiVGFiSWRcIiwgdGhpcy50YWJJZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2Y
1082XIgYWZWYWx1ZSA9ICQuZG5uU0YodGhpcy5tb2R1bGVJZCkuZ2V0QW50aUZvcmdlcnlWYWx1ZSgpO1xyXG4gICAgICAgIGlmIChhZlZhbHVlKSB7XHJcbiAgICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKFwiUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuXCIsIGFmVmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHRcclxuICAgIGdldExpc3Qoc3VjY2VzcywgZmFpbCkge1xyXG4gICAgICAgIHRoaXMuYWpheENhbGwoJ0dFVCcsICdIaWdobGlnaHQnLCAnR2V0TGlzdCcsIG51bGwsIG51bGwsIHRydWUsIG51bGwsIHN1Y2Nlc3MsIGZhaWwpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTZXJ2aWNlOyIsImltcG9ydCAnYmFiZWwtcG9seWZpbGwnO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgU1ZHIGZyb20gJ3JlYWN0LWlubGluZXN2Zyc7XHJcblxyXG5pbXBvcnQgeyBCYXNlQ29udGV4dCB9IGZyb20gJy4uL0Jhc2VQcm92aWRlcic7XHJcbmltcG9ydCB7IFNraW5Db250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vV2Vic2l0ZS9XaW5nbWFuQ29udHJvbHMvc3JjL2NvbnRleHQnO1xyXG5pbXBvcnQgSGlnaGxpZ2h0cyBmcm9tICcuLi8uLi8uLi8uLi8uLi8uLi9XZWJzaXRlL1dpbmdtYW5Db250cm9scy9zcmMvSGlnaGxpZ2h0cyc7XHJcbmltcG9ydCBSZXNwb25zaXZlSW1hZ2UgZnJvbSAnLi4vLi4vLi4vLi4vLi4vLi4vV2Vic2l0ZS9XaW5nbWFuQ29udHJvbHMvc3JjL1Jlc3BvbnNpdmVJbWFnZSc7XHJcblxyXG5jbGFzcyBWaWV3IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG5cclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBsaXN0OiBbXSxcclxuICAgICAgICAgICAgbnVtYmVyT2ZIaWdobGlnaHRzOiAwLFxyXG4gICAgICAgICAgICBlcnJvcjogbnVsbCxcclxuICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcclxuICAgICAgICAgICAgZGVmYXVsdExpbms6IHtcclxuICAgICAgICAgICAgICAgIExpbmtUeXBlVHlwb2xvZ3k6IDAsXHJcbiAgICAgICAgICAgICAgICBVcmw6ICcnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIHRoaXMuZmV0Y2hEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZmV0Y2hEYXRhKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMuY29udGV4dC5zZXJ2aWNlLmdldExpc3QoXHJcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gZGF0YS5SZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBudW1iZXJPZkhpZ2hsaWdodHMgPSBkYXRhLk51bWJlck9mSGlnaGxpZ2h0cztcclxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBkYXRhLlR5cGU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IGRhdGEuVGl0bGU7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgbGlzdCxcclxuICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkhpZ2hsaWdodHMsXHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBsb2FkaW5nOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGxvYWRpbmc6IGZhbHNlLCBlcnJvciB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0bGF5b3V0ZXhjZXB0aW9uKGxlbmd0aCwgaW5kZXgpIHtcclxuICAgICAgICBpZiAobGVuZ3RoID09PSAzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbMCwgMSwgMl0uaW5jbHVkZXMoaW5kZXgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSA1KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbMiwgMywgNF0uaW5jbHVkZXMoaW5kZXgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSA2KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbMiwgMywgNCwgNV0uaW5jbHVkZXMoaW5kZXgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSA3KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbNCwgNSwgNl0uaW5jbHVkZXMoaW5kZXgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobGVuZ3RoID09PSA4KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbNCwgNSwgNiw3XS5pbmNsdWRlcyhpbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCB7IGxvYWRpbmcsIGVycm9yLCBsaXN0LCB0eXBlLCB0aXRsZSwgZGVmYXVsdExpbmsgfSA9IHRoaXMuc3RhdGU7XHJcblxyXG4gICAgICAgIGlmIChsb2FkaW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiA8ZGl2IC8+O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiA8ZGl2IC8+O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMDogLy8gTWluaSBIaWdobGlnaHRzXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gPEhpZ2hsaWdodHMgey4uLnRoaXMucHJvcHN9IGxpc3Q9e2xpc3R9IC8+O1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDogeyAvLyBTdGFuZGFyZCBIaWdobGlnaHRzXHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zaXZlSW1hZ2VDb25maWd1cmF0aW9uID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWluOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXg6IDU3NSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogWzU3NSwgMjU5XVxyXG4gICAgICAgICAgICAgICAgICAgI
1082H0sXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW46IDU3NixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiA3NjcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IFs3NjcsIDM0Nl1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWluOiA3NjgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heDogMTE5OSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogWzU5OCwgMjY5XVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW46IDEyMDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heDogMTAwMDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IFs3OTksIDM2MF1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBdO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgPFJlYWN0LkZyYWdtZW50PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7dGl0bGUgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoaWdobGlnaHRzLXRpdGxlIGJpZyBjb250YWluZXItZmx1aWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwicGFnZS10aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpY29uIHBsdXMgZC1wcmludC1ub25lXCI+PFNWRyBjYWNoZUdldFJlcXVlc3RzPXt0cnVlfSBzcmM9e3NpdGVEYXRhLnNraW5wYXRoLnVybCArIFwiYXNzZXRzL2ltYWdlcy9pY29ucy9wbHVzLnN2Z1wifSAvPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGl0bGVcIj57dGl0bGV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dGhpcy5wcm9wcy5za2luQ29udGV4dC5zdGF0ZS52aWV3TW9kZSA9PSBcImRlc2t0b3BcIiA/IDxzcGFuIGNsYXNzTmFtZT1cImljb24gcGx1cyBkLXByaW50LW5vbmVcIj48U1ZHIGNhY2hlR2V0UmVxdWVzdHM9e3RydWV9IHNyYz17c2l0ZURhdGEuc2tpbnBhdGgudXJsICsgXCJhc3NldHMvaW1hZ2VzL2ljb25zL3BsdXMuc3ZnXCJ9IC8+PC9zcGFuPiA6IG51bGx9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzTmFtZT1cImhpZ2hsaWdodHMtd3JhcHBlciBiaWcgY29udGFpbmVyLWZsdWlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gaXRlbS5MaW5rcyB8fCBpdGVtLkxpbmsgfHwgZGVmYXVsdExpbms7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rVHlwZSA9IGl0ZW0uTGlua1R5cGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rVHlwZVR5cG9sb2d5ID0gbGluay5MaW5rVHlwZVR5cG9sb2d5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvblBhdGggPSBzaXRlRGF0YS5za2lucGF0aC51cmwgKyBcImFzc2V0cy9pbWFnZXMvaWNvbnMvZXhwYW5kLWljb24uc3ZnXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uQ2xhc3MgPSBcImljb24taW50ZXJuYWxcIjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc0V4dGVybmFsID0gbGluay5FeHRlcm5hbDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5rVHlwZSA9PT0gMikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pc0V4dGVybmFsID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25QYXRoID0gc2l0ZURhdGEuc2tpbnBhdGgudXJsICsgXCJhc3NldHMvaW1hZ2VzL2ljb25zL2Rvd25sb2FkLWljb24uc3ZnXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uQ2xhc3MgPSBcImljb24tZG93bmxvYWRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5rVHlwZVR5cG9sb2d5ID4gMikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaXNFeHRlcm5hbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuc2tpbkNvbnRleHQuc3RhdGUudmlld01vZGUgPT09ICdtb2JpbGUnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25QYXRoID0gc2l0ZURhdGEuc2tpbnBhdGgudXJsICsgXCJhc3NldHMvaW1hZ2VzL2ljb25zL2V4cGFuZC1pY29uLnN2Z1wiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25QYXRoID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkNsYXNzID0gXCJpY29uLWV4dGVybmFsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaXNFeHRlcm5hbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXh0ZXJuYWxMaW5rID0gaXNFeHRlcm5hbCA/IGxpbmtUeXBlID09PSA
1082yID8geyBcInJlbFwiOiBcImV4dGVybmFsXCIgfSA6IHsgXCJyZWxcIjogXCJleHRlcm5hbCBub29wZW5lciBub3JlZmVycmVyXCIgfSA6IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRMaW5rID0gbGlua1R5cGUgPT09IDIgJiYgaXNFeHRlcm5hbCA9PT0gdHJ1ZSA/IHsgXCJkb3dubG9hZFwiOiBcIlwiIH0gOiB7fTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbGFzc0xpbmsgPSBcImJ1dHRvblwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5za2luQ29udGV4dC5zdGF0ZS52aWV3TW9kZSAhPT0gJ21vYmlsZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTGluayA9IFwiYnV0dG9uIGFsaWduLXNlbGYtc3RhcnQgc2Vjb25kYXJ5LXRoZW1lXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0xpbmsgPSBpdGVtLkltYWdlUGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJidXR0b24gYWxpZ24tc2VsZi1lbmQgc2Vjb25kYXJ5LWljb24tdGhlbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJidXR0b24gYWxpZ24tc2VsZi1lbmQgb3V0bGluZS1pY29uLXRoZW1lXCI7X
1082HJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGF5b3V0ZXhjZXB0aW9uID0gdGhpcy5nZXRsYXlvdXRleGNlcHRpb24obGlzdC5sZW5ndGgsIGluZGV4KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkga2V5PXtpbmRleH0gY2xhc3NOYW1lPXtsYXlvdXRleGNlcHRpb24gPyAnbWF4MjAwJzogJ3Rlc3RlJ30+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGljbGUgY2xhc3NOYW1lPVwicm93IGhpZ2hsaWdodHMgYmlnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpdGVtLkltYWdlUGF0aFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyA8ZGl2IGNsYXNzTmFtZT1cImltZyByZXNwb25zaXZlLWltYWdlLXdyYXBwZXIgcmVzcG9uc2l2ZS1pbWFnZS1kYXJrLW1hc2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UmVzcG9uc2l2ZUltYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz17YCR7aXRlbS5JbWFnZVBhdGh9YH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PXtpdGVtLkltYWdlQWx0fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uPXtyZXNwb25zaXZlSW1hZ2VDb25maWd1cmF0aW9ufVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlPXsncGljdHVyZSd9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dFR5cGU9eyd0J31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImNvbCB0ZXh0IGQtZmxleCBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT17YHRpdGxlICR7dGhpcy5wcm9wcy5za2luQ29udGV4dC5zdGF0ZS52aWV3TW9kZSA9PT0gJ21vYmlsZScgPyBcIm1iLWF1dG9cIiA6IFwiXCJ9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaWNvbiBwbHVzIGQtcHJpbnQtbm9uZVwiPjxTVkcgY2FjaGVHZXRSZXF1ZXN0cz17dHJ1ZX0gc3JjPXtzaXRlRGF0YS5za2lucGF0aC51cmwgKyBcImFzc2V0cy9pbWFnZXMvaWNvbnMvcGx1cy5zdmdcIn0gLz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGl0bGUtdHh0XCI+e2l0ZW0uVGl0bGV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLnNraW5Db250ZXh0LnN0YXRlLnZpZXdNb2RlICE9PSAnbW9iaWxlJyA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsZWFkLXRleHQgbWItYXV0b1wiIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogaXRlbS5MZWFkIH19IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bGluay5VcmxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDxhIGhyZWY9e2xpbmsuVXJsfSBjbGFzc05hbWU9e2NsYXNzTGlua30gdGFyZ2V0PXtpc0V4dGVybmFsID8gXCJfYmxhbmtcIiA6IFwiX3NlbGZcIn0gey4uLmV4dGVybmFsTGlua30gey4uLmRvd25sb2FkTGlua30+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5za2luQ29udGV4dC5zdGF0ZS52aWV3TW9kZSAhPT0gJ21vYmlsZScgPyBcInR4dC1saW5rXCIgOiBcInNyLW9ubHlcIn0+e2l0ZW0uTGlua0NUQX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLnNraW5Db250ZXh0LnN0YXRlLnZpZXdNb2RlICE9PSAnbW9iaWxlJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsaW5rVHlwZSA9PT0gMiB8fCBsaW5rVHlwZVR5cG9sb2d5ID4gMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGljb25QYXRoICE9IFwiXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gPHNwYW4gY2xhc3NOYW1lPXtgaWNvbiAke2ljb25DbGFzc31gfT48U1ZHIGNhY2hlR2V0UmVxdWVzdHM9e3RydWV9IHNyYz17aWNvblBhdGh9IC8+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogPHNwYW4gY2xhc3NOYW1lPXtgaWNvbiAke2ljb25DbGFzc31gfT48U1ZHIGNhY2hlR2V0UmVxdWVzdHM9e3RydWV9IHNyYz17aWNvblBhdGh9IC8+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGljbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
1082H0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IChwcm9wcykgPT5cclxuICAgIDxCYXNlQ29udGV4dC5Db25zdW1lcj5cclxuICAgICAgICB7Y29udGV4dCA9PlxyXG4gICAgICAgICAgICA8U2tpbkNvbnRleHQuQ29uc3VtZXI+XHJcbiAgICAgICAgICAgICAgICB7c2tpbkNvbnRleHQgPT5cclxuICAgICAgICAgICAgICAgICAgICA8VmlldyB7Li4ucHJvcHN9IGNvbnRleHQ9e2NvbnRleHQucHJvcHN9IHNraW5Db250ZXh0PXtza2luQ29udGV4dH0gLz5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9Ta2luQ29udGV4dC5Db25zdW1lcj5cclxuICAgICAgICB9XHJcbiAgICA8L0Jhc2VDb250ZXh0LkNvbnN1bWVyPjtcclxuIiwiaW1wb3J0ICdiYWJlbC1wb2x5ZmlsbCc7XHJcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XHJcbmltcG9ydCBTVkcgZnJvbSAncmVhY3QtaW5saW5lc3ZnJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhpZ2hsaWdodHMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRlZmF1bHRMaW5rOiB7XHJcbiAgICAgICAgICAgICAgICBMaW5rVHlwZVR5cG9sb2d5OiAwLFxyXG4gICAgICAgICAgICAgICAgVXJsOiAnJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0aGlzLnByb3BzO1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwiaGlnaGxpZ2h0cy13cmFwcGVyIGNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGxpc3QubWFwKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IGl0ZW0uTGlua3MgfHwgaXRlbS5MaW5rIHx8IHRoaXMuc3RhdGUuZGVmYXVsdExpbms7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLkxpbmsgIT0gdW5kZWZpbmVkICYmIGl0ZW0uTGluayAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rID0gaXRlbS5MaW5rO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rVHlwZSA9IGl0ZW0uTGlua1R5cGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rVHlwZVR5cG9sb2d5ID0gbGluay5MaW5rVHlwZVR5cG9sb2d5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWNvblBhdGggPSBzaXRlRGF0YS5za2lucGF0aC51cmwgKyBcImFzc2V0cy9pbWFnZXMvaWNvbnMvZXhwYW5kLWljb24uc3ZnXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uQ2xhc3MgPSBcImljb24taW50ZXJuYWxcIjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc0V4dGVybmFsID0gbGluay5FeHRlcm5hbDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlua1R5cGUgPT09IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaXNFeHRlcm5hbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uUGF0aCA9IHNpdGVEYXRhLnNraW5wYXRoLnVybCArIFwiYXNzZXRzL2ltYWdlcy9pY29ucy9kb3dubG9hZC1pY29uLnN2Z1wiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkNsYXNzID0gXCJpY29uLWRvd25sb2FkXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlua1R5cGVUeXBvbG9neSA+IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lzRXh0ZXJuYWwgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLnNraW5Db250ZXh0LnN0YXRlLnZpZXdNb2RlID09PSAnbW9iaWxlJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uUGF0aCA9IHNpdGVEYXRhLnNraW5wYXRoLnVybCArIFwiYXNzZXRzL2ltYWdlcy9pY29ucy9leHBhbmQtaWNvbi5zdmdcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uUGF0aCA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25DbGFzcyA9IFwiaWNvbi1leHRlcm5hbFwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXh0ZXJuYWxMaW5rID0gaXNFeHRlcm5hbCA/IGxpbmtUeXBlID09PSAyID8geyBcInJlbFwiOiBcImV4dGVybmFsXCIgfSA6IHsgXCJyZWxcIjogXCJleHRlcm5hbCBub29wZW5lciBub3JlZmVycmVyXCIgfSA6IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRMaW5rID0gbGlua1R5cGUgPT09IDIgJiYgaXNFeHRlcm5hbCA9PT0gdHJ1ZSA/IHsgXCJkb3dubG9hZFwiOiBcIlwiIH0gOiB7fTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbGFzc0xpbmsgPSBcImJ1dHRvblwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5za2luQ29udGV4dC5zdGF0ZS52aWV3TW9kZSAhPT0gJ2Rlc2t0b3AnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0xpbmsgPSBcImJ1dHRvbiBvdXRsaW5lLWljb24tdGhlbWUgYWxpZ24tc2VsZi1lbmRcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTGluayA9IFwiYnV0dG9uIG91dGxpbmUtdGhlbWUgYWxpZ24tc2VsZi1lbmQgbm8tc2hhZG93XCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgI
1082H1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkga2V5PXtpbmRleH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGljbGUgY2xhc3NOYW1lPVwicm93IGhpZ2hsaWdodHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cImNvbC0xMCBjb2wtc20tMTEgY29sLW1kLTEyIHRpdGxlXCI+e2l0ZW0uVGl0bGV9PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMuc2tpbkNvbnRleHQuc3RhdGUudmlld01vZGUgIT09ICdtb2JpbGUnID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLW1kIGxlYWQtdGV4dFwiIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7IF9faHRtbDogaXRlbS5MZWFkIH19IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2xpbmsuVXJsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGluZGV4ID09PSAwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsaXN0Lmxlbmd0aCAlIDIgPT09IDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnByb3BzLnNraW5Db250ZXh0LnN0YXRlLnZpZXdNb2RlICE9PSAnZGVza3RvcCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gPGRpdiBjbGFzc05hbWU9XCJjb2wgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPXtsaW5rLlVybH0gY2xhc3NOYW1lPXtjbGFzc0xpbmt9IHRhcmdldD17aXNFeHRlcm5hbCA/IFwiX2JsYW5rXCIgOiBcIl9zZWxmXCJ9IHsuLi5leHRlcm5hbExpbmt9IHsuLi5kb3dubG9hZExpbmt9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2BpY29uICR7aWNvbkNsYXNzfWB9PjxTVkcgY2FjaGVHZXRSZXF1ZXN0cz17dHJ1ZX0gc3JjPXtpY29uUGF0aH0gLz48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInNyLW9ubHlcIj57aXRlbS5MaW5rQ1RBfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogPGEgaHJlZj17bGluay5Vcmx9IGNsYXNzTmFtZT17Y2xhc3NMaW5rfSB0YXJnZXQ9e2lzRXh0ZXJuYWwgPyBcIl9ibGFua1wiIDogXCJfc2VsZlwifSB7Li4uZXh0ZXJuYWxMaW5rfSB7Li4uZG93bmxvYWRMaW5rfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0eHQtbGlua1wiPntpdGVtLkxpbmtDVEF9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtsaW5rVHlwZSA9PT0gMlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDxzcGFuIGNsYXNzTmFtZT17YGljb24gJHtpY29uQ2xhc3N9YH0+PFNWRyBjYWNoZUdldFJlcXVlc3RzPXt0cnVlfSBzcmM9e2ljb25QYXRofSAvPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtsaW5rVHlwZSAhPT0gMiAmJiBpc0V4dGVybmFsID09PSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKGljb25QYXRoICE9IFwiXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDxzcGFuIGNsYXNzTmFtZT17YGljb24gJHtpY29uQ2xhc3N9YH0+PFNWRyBjYWNoZUdldFJlcXVlc3RzPXt0cnVlfSBzcmM9e2ljb25QYXRofSAvPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogPGRpdiBjbGFzc05hbWU9e2BkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCAke3RoaXMucHJvcHMuc2tpbkNvbnRleHQuc3RhdGUudmlld01vZGUgIT09ICdtb2JpbGUnID8gXCJjb2wtYXV0b1wiIDogXCJjb2xcIn1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9e2xpbmsuVXJsfSBjbGFzc05hbWU9XCJidXR0b24gb3V0bGluZS1pY29uLXRoZW1lIGFsaWduLXNlbGYtZW5kXCIgdGFyZ2V0PXtpc0V4dGVybmFsID8gXCJfYmxhbmtcIiA6IFwiX3NlbGZcIn0gey4uLmV4dGVybmFsTGlua30gey4uLmRvd25sb2FkTGlua30+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtgaWNvbiAke2ljb25DbGFzc31gfT48U1ZHIGNhY2hlR2V0UmVxdWVzdHM9e3RydWV9IHNyYz17aWNvblBhdGh9IC8+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInNyLW9ubHlcIj57aXRlbS5MaW5rQ1RBfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA8ZGl2IGNsYXNzTmFtZT17YGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kICR7dGhpcy5wcm9wcy5za2luQ29udGV4dC5zdGF0ZS52aWV3TW9kZSAhPT0gJ21vYmlsZScgPyBcImNvbC1hdXRvXCIgOiBcImNvbFwifWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPXtsaW5rLlVybH0gY2xhc3NOYW1lPVwiYnV0dG9uIG91dGxpbmUtaWNvbi10aGVtZSBhbGlnbi1zZWxmLWVuZFwiIHRhcmdldD17aXNFeHRlcm5hbCA/IFwiX2JsYW5rXCIgOiBcIl9zZWxmXCJ9IHsuLi5leHRlcm5hbExpbmt9IHsuLi5kb3dubG9hZExpbmt9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPXtgaWNvbiAke2ljb25DbGFzc31gfT48U1ZHIGNhY2hlR2V0UmVxdWVzdHM9e3RydWV9IHNyYz17aWNvblBhdGh9IC8+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwic3Itb25seVwiPntpdGVtLkxpbmtDVEF9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWNsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgI
1082H1cclxuICAgICAgICAgICAgPC91bD5cclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IFwiYmFiZWwtcG9seWZpbGxcIjtcclxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcclxuXHJcbi8qKlxyXG4gKiBSZXNwb25zaXZlIEltYWdlXHJcbiAqIFxyXG4gKiBjb25zdCByZXNwb25zaXZlSW1hZ2VDb25maWd1cmF0aW9uID0gW1xyXG4gKiAgICAgIHttYXg6IDU3NSwgc2l6ZTogWzU3NSwgNDAwXX0sXHJcbiAqICAgICAge21pbjogNTc1LCBtYXg6IDc2Nywgc2l6ZTogWzc2NywgNDAwXX0sXHJcbiAqICAgICAge21pbjogNzY3LCBtYXg6IDk5MSwgc2l6ZTogWzk5MSwgNDAwXX0sXHJcbiAqICAgICAge21pbjogOTkxLCBtYXg6IDExOTksIHNpemU6IFsxMTk5LCA0MDBdfSxcclxuICogICAgICB7bWluOiAxMTk5LCBzaXplOiBbMTYwMCwgNDQ0XX1dO1xyXG4gKlxyXG4gKiBtb2RlOiBzcmNzZXQgKGRlZmF1bHQpIG9yIHBpY3R1cmVcclxuICogXHJcbiAqIGN1dFR5cGU6XHJcbiAqICAgICAgY2FzZSBcInJcIjogb3AgPSBJbWFnZUhhbmRsZXJBY3Rpb24uUmVzaXplSW1hZ2U7XHJcbiAqICAgICAgY2FzZSBcImNcIjogb3AgPSBJbWFnZUhhbmRsZXJBY3Rpb24uQ3JvcEltYWdlRnJvbUNlbnRlciA9IEZyb20gQ2VudGVyLCBDZW50ZXI7XHJcbiAqICAgICAgY2FzZSBcInRcIjogb3AgPSBJbWFnZUhhbmRsZXJBY3Rpb24uQ3JvcEltYWdlRnJvbVRvcCA9IEZyb20gVG9wLCBMZWZ0O1xyXG4gKiAgICAgIGNhc2UgXCJiXCI6IG9wID0gSW1hZ2VIYW5kbGVyQWN0aW9uLkNyb3BJbWFnZUZyb21Cb3R0b20gPSBGcm9tIEJvdHRvbSwgUmlnaHQ7XHJcbiAqICAgICAgY2FzZSBcInRjXCI6IG9wID0gSW1hZ2VIYW5kbGVyQWN0aW9uLkNyb3BJbWFnZUZyb21Ub3BDZW50ZXIgPSBGcm9tIFRvcCwgQ2VudGVyO1xyXG4gKlxyXG4gKiB1c2UgaXQgbGlrZTogPFJlc3BvbnNpdmVJbWFnZSBzcmM9e2AvRG5uSW1hZ2VIYW5kbGVyLmFzaHg/bW9kZT1maWxlJmZpbGU9JHtpdGVtLkltYWdlUGF0aH1gfSBhbHQ9e2l0ZW0uSW1hZ2VBbHR9IGNvbmZpZ3VyYXRpb249e3Jlc3BvbnNpdmVJbWFnZUNvbmZpZ3VyYXRpb259IG1vZGU9eydzcmNzZXQnfSBjdXRUeXBlPXsnYid9IC8+XHJcbiAqL1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVzcG9uc2l2ZUltYWdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG5cclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBsb2FkZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICBtb3VudGVkOiBmYWxzZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIHRoZSBnZW5lcmF0ZWQgc3Jjc2V0IG91dHB1dFxyXG4gICAgICAgIHRoaXMuY2hlY2tTY3JvbGwgPSB0aGlzLmNoZWNrU2Nyb2xsLmJpbmQodGhpcyk7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdENvbmZpZ3VyYXRpb24gPSBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG1pbjogMSxcclxuICAgICAgICAgICAgICAgIG1heDogNTc1LFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogWzM2MCwgMjg4XVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBtaW46IDU3NixcclxuICAgICAgICAgICAgICAgIG1heDogOTkxLFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogWzM2MCwgMjg4XVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBtaW46IDk5MixcclxuICAgICAgICAgICAgICAgIG1heDogMTE5OSxcclxuICAgICAgICAgICAgICAgIHNpemU6IFs0ODAsIDI4OF1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbWluOiAxMjAwLFxyXG4gICAgICAgICAgICAgICAgbWF4OiAxMDAwMCxcclxuICAgICAgICAgICAgICAgIHNpemU6IFs1NzAsIDI4OF1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF07XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdE1vZGUgPSAnc3Jjc2V0JztcclxuXHJcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gdGhpcy5wcm9wcy5jb25maWd1cmF0aW9uIHx8IGRlZmF1bHRDb25maWd1cmF0aW9uO1xyXG4gICAgICAgIHRoaXMubW9kZSA9IHRoaXMucHJvcHMubW9kZSB8fCBkZWZhdWx0TW9kZTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgbW91bnRlZDogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5sYXp5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTY3JvbGwoKTtcclxuXHJcbiAgICAgICAgICAgIFsnc2Nyb2xsJ10ubWFwKChldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2LCB0aGlzLmNoZWNrU2Nyb2xsKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5sb2FkZWQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgWydzY3JvbGwnXS5tYXAoKGV2KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihldiwgdGhpcy5jaGVja1Njcm9sbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tTY3JvbGwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudGltZXIgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnN0YW5jZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgPD0gd2luZG93LmlubmVySGVpZ2h0KSB7XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIFsnc2Nyb2xsJ10ubWFwKChldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgI
1082HJldHVybiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihldiwgdGhpcy5jaGVja1Njcm9sbCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIDE1MCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29uZmlndXJhdGlvbiA9ICgpID0+IHtcclxuICAgICAgICBjb25zdCBzZXQgPSB0aGlzLmNvbmZpZ3VyYXRpb247XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XHJcbiAgICAgICAgXHJcbiAgICAgICAgc2V0LmZvckVhY2goKHYpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbWluID0gdi5taW4gfHwgdi5tYXg7XHJcbiAgICAgICAgICAgIGNvbnN0IG1heCA9IHYubWF4IHx8IHYubWluO1xyXG5cclxuICAgICAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgbWluIHx8ICh3aW5kb3cuaW5uZXJXaWR0aCA+IG1pbiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IG1heCkgfHwgd2luZG93LmlubmVyV2lkdGggPiBtYXgpIHtcclxuICAgICAgICAgICAgLy8gdGhlIGJlbGxvdyBibG93cyB1cCBvbiBiaWcgcmVzb2x1dGlvbnNcclxuICAgICAgICAgICAgLy9pZiAoKHdpbmRvdy5pbm5lcldpZHRoID49IG1pbiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8PSBtYXgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB2O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyUGljdHVyZSA9IChjdXJyZW50Q29uZmlndXJhdGlvbiwgc3JjLCBmaW5hbEFsdCkgPT4ge1xyXG4gICAgICAgIGxldCBzZXBhcmF0b3I7XHJcbiAgICAgICAgaWYoc3JjICE9IG51bGwgJiYgc3JjICE9IFwidW5kZWZpbmVkXCIgKVxyXG4gICAgICAgICAgICBzZXBhcmF0b3IgPSBzcmMuaW5kZXhPZignPycpID4gMCA/ICcmJyA6ICc/JztcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImltYWdlLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgIDxwaWN0dXJlPlxyXG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLmNvbmZpZ3VyYXRpb24ubWFwKCh2LCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHcgPSB2LnNpemVbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGggPSB2LnNpemVbMV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZVNyYyA9IGAke2VuY29kZVVSSShzcmMpfSR7c2VwYXJhdG9yfXc9JHt3fSZoPSR7aH0mb3A9JHt0aGlzLnByb3BzLmN1dFR5cGV9IDF4YDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbldpZHRoID0gK3YubWluID4gMCA/IGAobWluLXdpZHRoOiAke3YubWlufXB4KWAgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9ICt2Lm1heCA+IDAgPyBgKG1heC13aWR0aDogJHt2Lm1heH1weClgIDogbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVkaWEgPSAobWluV2lkdGggJiYgbWF4V2lkdGgpID8gYCR7bWluV2lkdGh9IGFuZCAke21heFdpZHRofWAgOiBgJHttaW5XaWR0aCB8fCBtYXhXaWR0aH0gJHt3fXB4YDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8c291cmNlIGtleT17aX0gc3JjU2V0PXtpbWFnZVNyY30gbWVkaWE9e21lZGlhfSAvPjtcclxuICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGxvYWRpbmc9XCJsYXp5XCIgc3JjPXtgJHtlbmNvZGVVUkkoc3JjKX0ke3NlcGFyYXRvcn13PSR7Y3VycmVudENvbmZpZ3VyYXRpb24uc2l6ZVswXX0maD0ke2N1cnJlbnRDb25maWd1cmF0aW9uLnNpemVbMV19Jm9wPSR7dGhpcy5wcm9wcy5jdXRUeXBlfWB9IGFsdD17ZmluYWxBbHR9IC8+XHJcbiAgICAgICAgICAgICAgICA8L3BpY3R1cmU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyU3JjU2V0ID0gKGN1cnJlbnRDb25maWd1cmF0aW9uLCBzcmMsIGZpbmFsQWx0KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gc3JjLmluZGV4T2YoJz8nKSA+IDAgPyAnJicgOiAnPyc7XHJcbiAgICAgICAgY29uc3Qgc3JjU2V0ID0gdGhpcy5jb25maWd1cmF0aW9uXHJcbiAgICAgICAgICAgIC5tYXAoKHYpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBgJHtlbmNvZGVVUkkoc3JjKX0ke3NlcGFyYXRvcn13PSR7di5zaXplWzBdfSZoPSR7di5zaXplWzFdfSZvcD0ke3RoaXMucHJvcHMuY3V0VHlwZX0gMXhgO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAucmVkdWNlKChhY2MsIHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYyArICcsJyArIHZhbDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNpemVzID0gdGhpcy5jb25maWd1cmF0aW9uXHJcbiAgICAgICAgICAgIC5tYXAoKHYpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1pbldpZHRoID0gK3YubWluID4gMCA/IGAobWluLXdpZHRoOiAke3YubWlufXB4KWAgOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWF4V2lkdGggPSArdi5tYXggPiAwID8gYChtYXgtd2lkdGg6ICR7di5tYXh9cHgpYCA6IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKG1pbldpZHRoICYmIG1heFdpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke21pbldpZHRofSBhbmQgJHttYXhXaWR0aH0gJHt2LnNpemVbMF19cHhgO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBgJHttaW5XaWR0aCB8fCBtYXhXaWR0aH0gJHt2LnNpemVbMF19cHhgO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAucmVkdWNlKChhY2MsIHZhbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYyArICcsJyArIHZhbDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW1hZ2Utd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBsb2FkaW5nPVwibGF6eVwiIHNyYz17YCR7ZW5jb2RlVVJJKHNyYyl9JHtzZXBhcmF0b3J9dz0ke2N1cnJlbnRDb25maWd1cmF0aW9uLnNpemVbMF19Jmg9JHtjdXJyZW50Q29uZmlndXJhdGlvbi5zaXplWzFdfSZvcD0ke3RoaXMucHJvcHMuY3V0VHlwZX1gfSBzcmNTZXQ9e3NyY1NldH0gc2l6ZXM9e3NpemVzfSBhbHQ9e2ZpbmFsQWx0fSAvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCB7IHNyYywgYWx0IH0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb25maWd1cmF0aW9uID0gdGhpcy5nZXRDb25maWd1cmF0aW9uKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhhc1ZhbHVlID0gdiA9PiB2ICE9PSBudWxsICYmIHYgIT09IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgY29uc3Qgbm9BbHRUZXh0ID1cclxuICAgICAgICAgICAgc2l0ZURhdGEgJiYgc2l0ZURhdGEucmVzb3VyY2VzICYmIGhhc1ZhbHVlKHNpdGVEYXRhLnJlc291cmNlcy5Ob0FsdFRleHQpXHJcbiAgICAgICAgICAgICAgICA/IHNpdGVEYXRhLnJlc291cmNlcy5Ob0FsdFRleHRcclxuICAgICAgICAgICAgICAgIDogJyc7XHJcblxyXG4gICAgICAgIGNvbnN0IGZpbmFsQWx0ID0gaGFzVmFsdWUoYWx0KSA/IGFsdCA6IG5vQWx0VGV4dDtcclxuXHJcbiAgICAgICAgLypjb25zdCBmaW5hbEFsdCA9IGFsdCA/IGFsdCA6IHNpdGVEYXRhLnJlc291cmNlcy5Ob0FsdFRleHQ7Ki9cclxuXHJcbiAgICAgICAgdGhpcy5zcmMgPSBzcmM7XHJcblxyXG4gICAgICAgI
1082HN3aXRjaCh0aGlzLm1vZGUpe1xyXG4gICAgICAgICAgICBjYXNlICdwaWN0dXJlJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlclBpY3R1cmUoY3VycmVudENvbmZpZ3VyYXRpb24sIHNyYywgZmluYWxBbHQpO1xyXG4gICAgICAgICAgICBjYXNlICdzcmNzZXQnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyU3JjU2V0KGN1cnJlbnRDb25maWd1cmF0aW9uLCBzcmMsIGZpbmFsQWx0KTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0iLCJpbXBvcnQgXCJiYWJlbC1wb2x5ZmlsbFwiO1xyXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xyXG5cclxuXHJcbi8vMSAtIENyZWF0ZSBDb250ZXh0XHJcbmV4cG9ydCBjb25zdCBTa2luQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoKTtcclxuXHJcbi8vMiAtIENyZWF0ZSBhIFByb3ZpZGVyIENvbXBvbmVudFxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTa2luUHJvdmlkZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNNb3VudGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFN0YXRlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgdmlld01vZGU6IHRoaXMuZ2V0TGF5b3V0TW9kZSgpLFxyXG4gICAgICAgICAgICBrZXlQcmVzc2VkOiBmYWxzZSxcclxuICAgICAgICAgICAgd2luZG93V2lkdGhHbG9iYWw6IHdpbmRvdy5pbm5lcldpZHRoXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZHNcclxuICAgICAqL1xyXG4gICAgc2V0S2V5UHJlc3NlZCA9ICh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmtleVByZXNzZWQgIT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAga2V5UHJlc3NlZDogdmFsdWVcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZU1vZGFsRXZlbnQgPSAodmFsdWUpID0+IHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXS5jbGFzc0xpc3QuYWRkKCdpcy1sb2NrZWQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkb2
1082N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpWzBdLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWxvY2tlZCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVLZXlEb3duRXZlbnQgPSAoZXZlbnQpID0+IHtcclxuICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIkVudGVyXCIgfHwgZXZlbnQua2V5ID09PSBcIiBcIiB8fCBldmVudC5rZXkgPT09IFwiRXNjYXBlXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRLZXlQcmVzc2VkKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRMYXlvdXRNb2RlID0gKCkgPT4ge1xyXG4gICAgICAgIHZhciByZXR1cm5MYXlvdXQgPSBcIlwiO1xyXG5cclxuICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPj0gNzY4ICYmIHdpbmRvdy5pbm5lcldpZHRoIDwgOTkyKSB7XHJcbiAgICAgICAgICAgIHJldHVybkxheW91dCA9IFwidGFibGV0XCI7XHJcbiAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA+PSA5OTIpIHtcclxuICAgICAgICAgICAgcmV0dXJuTGF5b3V0ID0gXCJkZXNrdG9wXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuTGF5b3V0ID0gXCJtb2JpbGVcIjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXR1cm5MYXlvdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlUmVzaXplRXZlbnQgPSAoKSA9PiB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Jlc2l6ZVRpbWVvdXQpO1xyXG5cclxuICAgICAgICB0aGlzLl9yZXNpemVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5faXNNb3VudGVkKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Vmlld01vZGUgPSB0aGlzLnN0YXRlLnZpZXdNb2RlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoID49IDc2OCAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IDk5Mikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWaWV3TW9kZSAhPT0gJ3RhYmxldCcpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgdmlld01vZGU6ICd0YWJsZXQnIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5pbm5lcldpZHRoID49IDk5Mikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWaWV3TW9kZSAhPT0gJ2Rlc2t0b3AnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHZpZXdNb2RlOiAnZGVza3RvcCcgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZpZXdNb2RlICE9PSAnbW9iaWxlJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyB2aWV3TW9kZTogJ21vYmlsZScgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyB3aW5kb3dXaWR0aEdsb2JhbDogd2luZG93LmlubmVyV2lkdGggfSk7XHJcblxyXG4gICAgICAgIH0sIDE1MCk7XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlYWN0IExpZmVjeWNsZSBNZXRob2RzXHJcbiAgICAgKi9cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIHRoaXMuX2lzTW91bnRlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleURvd25FdmVudCk7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuaGFuZGxlUmVzaXplRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIHRoaXMuX2lzTW91bnRlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBkb2
1082N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlEb3duRXZlbnQpO1xyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmhhbmRsZVJlc2l6ZUV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPFNraW5Db250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7IHN0YXRlOiB0aGlzLnN0YXRlLCBzZXRLZXlQcmVzc2VkOiB0aGlzLnNldEtleVByZXNzZWQsIGhhbmRsZU1vZGFsRXZlbnQ6IHRoaXMuaGFuZGxlTW9kYWxFdmVudCB9fT5cclxuICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxyXG4gICAgICAgICAgICA8L1NraW5Db250ZXh0LlByb3ZpZGVyPlxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iXX0=

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.