Files
icehrm/web/dist/login.js
2021-07-01 15:51:04 +05:30

10497 lines
1.2 MiB
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(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){
"use strict";
$(document).ready(function () {
$(window).keydown(function (event) {
if (event.keyCode == 13) {
event.preventDefault();
return false;
}
});
$('#password').keydown(function (event) {
if (event.keyCode == 13) {
submitLogin();
return false;
}
});
});
window.showForgotPassword = function () {
$('#loginForm').hide();
$('#requestPasswordChangeForm').show();
};
window.requestPasswordChange = function () {
$('#requestPasswordChangeFormAlert').hide();
var id = $('#usernameChange').val();
if (id === '') {
return false;
}
$.post('service.php', {
a: 'rpc',
id: id
}, function (data) {
if (data.status == 'SUCCESS') {
$('#requestPasswordChangeFormAlert').show();
$('#requestPasswordChangeFormAlert').html(data.message);
} else {
$('#requestPasswordChangeFormAlert').show();
$('#requestPasswordChangeFormAlert').html(data.message);
}
}, 'json');
};
window.changePassword = function (key) {
$('#newPasswordFormAlert').hide();
var password = $('#password').val();
var passwordValidation = function passwordValidation(str) {
return str.length > 7;
};
if (!passwordValidation(password)) {
$('#newPasswordFormAlert').show();
$('#newPasswordFormAlert').html('Password should be longer than 7 characters');
return;
}
$.post('service.php', {
a: 'rsp',
key: key,
pwd: password,
now: '1'
}, function (data) {
if (data.status == 'SUCCESS') {
top.location.href = 'login.php?c=1';
} else {
$('#newPasswordFormAlert').show();
$('#newPasswordFormAlert').html(data.message);
}
}, 'json');
};
window.submitLogin = function () {
var username = $('#username').val();
var password = $('#password').val();
if (username === '' || password === '') {
return false;
}
try {
localStorage.clear();
} catch (e) {}
$('#loginForm').submit();
};
window.authGoogle = function () {
window.location.href = "".concat(window.location.href.split('login.php')[0], "login.php?google=1");
};
},{}],2:[function(require,module,exports){
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
/* ===================================================
* bootstrap-transition.js v2.1.1
* http://twitter.github.com/bootstrap/javascript.html#transitions
* ===================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
$(function () {
"use strict"; // jshint ;_;
/* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
* ======================================================= */
$.support.transition = function () {
var transitionEnd = function () {
var el = document.createElement('bootstrap'),
transEndEventNames = {
'WebkitTransition': 'webkitTransitionEnd',
'MozTransition': 'transitionend',
'OTransition': 'oTransitionEnd otransitionend',
'transition': 'transitionend'
},
name;
for (name in transEndEventNames) {
if (el.style[name] !== undefined) {
return transEndEventNames[name];
}
}
}();
return transitionEnd && {
end: transitionEnd
};
}();
});
}(window.jQuery);
/* ==========================================================
* bootstrap-alert.js v2.1.1
* http://twitter.github.com/bootstrap/javascript.html#alerts
* ==========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* ALERT CLASS DEFINITION
* ====================== */
var dismiss = '[data-dismiss="alert"]',
Alert = function Alert(el) {
$(el).on('click', dismiss, this.close);
};
Alert.prototype.close = function (e) {
var $this = $(this),
selector = $this.attr('data-target'),
$parent;
if (!selector) {
selector = $this.attr('href');
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ''); //strip for ie7
}
$parent = $(selector);
e && e.preventDefault();
$parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent());
$parent.trigger(e = $.Event('close'));
if (e.isDefaultPrevented()) return;
$parent.removeClass('in');
function removeElement() {
$parent.trigger('closed').remove();
}
$.support.transition && $parent.hasClass('fade') ? $parent.on($.support.transition.end, removeElement) : removeElement();
};
/* ALERT PLUGIN DEFINITION
* ======================= */
$.fn.alert = function (option) {
return this.each(function () {
var $this = $(this),
data = $this.data('alert');
if (!data) $this.data('alert', data = new Alert(this));
if (typeof option == 'string') data[option].call($this);
});
};
$.fn.alert.Constructor = Alert;
/* ALERT DATA-API
* ============== */
$(function () {
$('body').on('click.alert.data-api', dismiss, Alert.prototype.close);
});
}(window.jQuery);
/* ============================================================
* bootstrap-button.js v2.1.1
* http://twitter.github.com/bootstrap/javascript.html#buttons
* ============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function ($) {
"use strict"; // jshint ;_;
/* BUTTON PUBLIC CLASS DEFINITION
* ============================== */
var Button = function Button(element, options) {
this.$element = $(element);
this.options = $.extend({}, $.fn.button.defaults, options);
};
Button.prototype.setState = function (state) {
var d = 'disabled',
$el = this.$element,
data = $el.data(),
val = $el.is('input') ? 'val' : 'html';
state = state + 'Text';
data.resetText || $el.data('resetText', $el[val]());
$el[val](data[state] || this.options[state]); // push to event loop to allow forms to submit
setTimeout(function () {
state == 'loadingText' ? $el.addClass(d).attr(d, d) : $el.removeClass(d).removeAttr(d);
}, 0);
};
Button.prototype.toggle = function () {
var $parent = this.$element.closest('[data-toggle="buttons-radio"]');
$parent && $parent.find('.active').removeClass('active');
this.$element.toggleClass('active');
};
/* BUTTON PLUGIN DEFINITION
* ======================== */
$.fn.button = function (option) {
return this.each(function () {
var $this = $(this),
data = $this.data('button'),
options = _typeof(option) == 'object' && option;
if (!data) $this.data('button', data = new Button(this, options));
if (option == 'toggle') data.toggle();else if (option) data.setState(option);
});
};
$.fn.button.defaults = {
loadingText: 'loading...'
};
$.fn.button.Constructor = Button;
/* BUTTON DATA-API
* =============== */
$(function () {
$('body').on('click.button.data-api', '[data-toggle^=button]', function (e) {
var $btn = $(e.target);
if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn');
$btn.button('toggle');
});
});
}(window.jQuery);
/* ==========================================================
* bootstrap-carousel.js v2.1.1
* http://twitter.github.com/bootstrap/javascript.html#carousel
* ==========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* CAROUSEL CLASS DEFINITION
* ========================= */
var Carousel = function Carousel(element, options) {
this.$element = $(element);
this.options = options;
this.options.slide && this.slide(this.options.slide);
this.options.pause == 'hover' && this.$element.on('mouseenter', $.proxy(this.pause, this)).on('mouseleave', $.proxy(this.cycle, this));
};
Carousel.prototype = {
cycle: function cycle(e) {
if (!e) this.paused = false;
this.options.interval && !this.paused && (this.interval = setInterval($.proxy(this.next, this), this.options.interval));
return this;
},
to: function to(pos) {
var $active = this.$element.find('.item.active'),
children = $active.parent().children(),
activePos = children.index($active),
that = this;
if (pos > children.length - 1 || pos < 0) return;
if (this.sliding) {
return this.$element.one('slid', function () {
that.to(pos);
});
}
if (activePos == pos) {
return this.pause().cycle();
}
return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]));
},
pause: function pause(e) {
if (!e) this.paused = true;
if (this.$element.find('.next, .prev').length && $.support.transition.end) {
this.$element.trigger($.support.transition.end);
this.cycle();
}
clearInterval(this.interval);
this.interval = null;
return this;
},
next: function next() {
if (this.sliding) return;
return this.slide('next');
},
prev: function prev() {
if (this.sliding) return;
return this.slide('prev');
},
slide: function slide(type, next) {
var $active = this.$element.find('.item.active'),
$next = next || $active[type](),
isCycling = this.interval,
direction = type == 'next' ? 'left' : 'right',
fallback = type == 'next' ? 'first' : 'last',
that = this,
e = $.Event('slide', {
relatedTarget: $next[0]
});
this.sliding = true;
isCycling && this.pause();
$next = $next.length ? $next : this.$element.find('.item')[fallback]();
if ($next.hasClass('active')) return;
if ($.support.transition && this.$element.hasClass('slide')) {
this.$element.trigger(e);
if (e.isDefaultPrevented()) return;
$next.addClass(type);
$next[0].offsetWidth; // force reflow
$active.addClass(direction);
$next.addClass(direction);
this.$element.one($.support.transition.end, function () {
$next.removeClass([type, direction].join(' ')).addClass('active');
$active.removeClass(['active', direction].join(' '));
that.sliding = false;
setTimeout(function () {
that.$element.trigger('slid');
}, 0);
});
} else {
this.$element.trigger(e);
if (e.isDefaultPrevented()) return;
$active.removeClass('active');
$next.addClass('active');
this.sliding = false;
this.$element.trigger('slid');
}
isCycling && this.cycle();
return this;
}
};
/* CAROUSEL PLUGIN DEFINITION
* ========================== */
$.fn.carousel = function (option) {
return this.each(function () {
var $this = $(this),
data = $this.data('carousel'),
options = $.extend({}, $.fn.carousel.defaults, _typeof(option) == 'object' && option),
action = typeof option == 'string' ? option : options.slide;
if (!data) $this.data('carousel', data = new Carousel(this, options));
if (typeof option == 'number') data.to(option);else if (action) data[action]();else if (options.interval) data.cycle();
});
};
$.fn.carousel.defaults = {
interval: 5000,
pause: 'hover'
};
$.fn.carousel.Constructor = Carousel;
/* CAROUSEL DATA-API
* ================= */
$(function () {
$('body').on('click.carousel.data-api', '[data-slide]', function (e) {
var $this = $(this),
href,
$target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
,
options = !$target.data('modal') && $.extend({}, $target.data(), $this.data());
$target.carousel(options);
e.preventDefault();
});
});
}(window.jQuery);
/* =============================================================
* bootstrap-collapse.js v2.1.1
* http://twitter.github.com/bootstrap/javascript.html#collapse
* =============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function ($) {
"use strict"; // jshint ;_;
/* COLLAPSE PUBLIC CLASS DEFINITION
* ================================ */
var Collapse = function Collapse(element, options) {
this.$element = $(element);
this.options = $.extend({}, $.fn.collapse.defaults, options);
if (this.options.parent) {
this.$parent = $(this.options.parent);
}
this.options.toggle && this.toggle();
};
Collapse.prototype = {
constructor: Collapse,
dimension: function dimension() {
var hasWidth = this.$element.hasClass('width');
return hasWidth ? 'width' : 'height';
},
show: function show() {
var dimension, scroll, actives, hasData;
if (this.transitioning) return;
dimension = this.dimension();
scroll = $.camelCase(['scroll', dimension].join('-'));
actives = this.$parent && this.$parent.find('> .accordion-group > .in');
if (actives && actives.length) {
hasData = actives.data('collapse');
if (hasData && hasData.transitioning) return;
actives.collapse('hide');
hasData || actives.data('collapse', null);
}
this.$element[dimension](0);
this.transition('addClass', $.Event('show'), 'shown');
$.support.transition && this.$element[dimension](this.$element[0][scroll]);
},
hide: function hide() {
var dimension;
if (this.transitioning) return;
dimension = this.dimension();
this.reset(this.$element[dimension]());
this.transition('removeClass', $.Event('hide'), 'hidden');
this.$element[dimension](0);
},
reset: function reset(size) {
var dimension = this.dimension();
this.$element.removeClass('collapse')[dimension](size || 'auto')[0].offsetWidth;
this.$element[size !== null ? 'addClass' : 'removeClass']('collapse');
return this;
},
transition: function transition(method, startEvent, completeEvent) {
var that = this,
complete = function complete() {
if (startEvent.type == 'show') that.reset();
that.transitioning = 0;
that.$element.trigger(completeEvent);
};
this.$element.trigger(startEvent);
if (startEvent.isDefaultPrevented()) return;
this.transitioning = 1;
this.$element[method]('in');
$.support.transition && this.$element.hasClass('collapse') ? this.$element.one($.support.transition.end, complete) : complete();
},
toggle: function toggle() {
this[this.$element.hasClass('in') ? 'hide' : 'show']();
}
};
/* COLLAPSIBLE PLUGIN DEFINITION
* ============================== */
$.fn.collapse = function (option) {
return this.each(function () {
var $this = $(this),
data = $this.data('collapse'),
options = _typeof(option) == 'object' && option;
if (!data) $this.data('collapse', data = new Collapse(this, options));
if (typeof option == 'string') data[option]();
});
};
$.fn.collapse.defaults = {
toggle: true
};
$.fn.collapse.Constructor = Collapse;
/* COLLAPSIBLE DATA-API
* ==================== */
$(function () {
$('body').on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
var $this = $(this),
href,
target = $this.attr('data-target') || e.preventDefault() || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
,
option = $(target).data('collapse') ? 'toggle' : $this.data();
$this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed');
$(target).collapse(option);
});
});
}(window.jQuery);
/* ============================================================
* bootstrap-dropdown.js v2.1.1
* http://twitter.github.com/bootstrap/javascript.html#dropdowns
* ============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function ($) {
"use strict"; // jshint ;_;
/* DROPDOWN CLASS DEFINITION
* ========================= */
var toggle = '[data-toggle=dropdown]',
Dropdown = function Dropdown(element) {
var $el = $(element).on('click.dropdown.data-api', this.toggle);
$('html').on('click.dropdown.data-api', function () {
$el.parent().removeClass('open');
});
};
Dropdown.prototype = {
constructor: Dropdown,
toggle: function toggle(e) {
var $this = $(this),
$parent,
isActive;
if ($this.is('.disabled, :disabled')) return;
$parent = getParent($this);
isActive = $parent.hasClass('open');
clearMenus();
if (!isActive) {
$parent.toggleClass('open');
$this.focus();
}
return false;
},
keydown: function keydown(e) {
var $this, $items, $active, $parent, isActive, index;
if (!/(38|40|27)/.test(e.keyCode)) return;
$this = $(this);
e.preventDefault();
e.stopPropagation();
if ($this.is('.disabled, :disabled')) return;
$parent = getParent($this);
isActive = $parent.hasClass('open');
if (!isActive || isActive && e.keyCode == 27) return $this.click();
$items = $('[role=menu] li:not(.divider) a', $parent);
if (!$items.length) return;
index = $items.index($items.filter(':focus'));
if (e.keyCode == 38 && index > 0) index--; // up
if (e.keyCode == 40 && index < $items.length - 1) index++; // down
if (!~index) index = 0;
$items.eq(index).focus();
}
};
function clearMenus() {
getParent($(toggle)).removeClass('open');
}
function getParent($this) {
var selector = $this.attr('data-target'),
$parent;
if (!selector) {
selector = $this.attr('href');
selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, ''); //strip for ie7
}
$parent = $(selector);
$parent.length || ($parent = $this.parent());
return $parent;
}
/* DROPDOWN PLUGIN DEFINITION
* ========================== */
$.fn.dropdown = function (option) {
return this.each(function () {
var $this = $(this),
data = $this.data('dropdown');
if (!data) $this.data('dropdown', data = new Dropdown(this));
if (typeof option == 'string') data[option].call($this);
});
};
$.fn.dropdown.Constructor = Dropdown;
/* APPLY TO STANDARD DROPDOWN ELEMENTS
* =================================== */
$(function () {
$('html').on('click.dropdown.data-Api touchstart.dropdown.data-Api', clearMenus);
$('body').on('click.dropdown touchstart.dropdown.data-api', '.dropdown form', function (e) {
e.stopPropagation();
}).on('click.dropdown.data-Api touchstart.dropdown.data-Api', toggle, Dropdown.prototype.toggle).on('keydown.dropdown.data-Api touchstart.dropdown.data-Api', toggle + ', [role=menu]', Dropdown.prototype.keydown);
});
}(window.jQuery);
/* =========================================================
* bootstrap-modal.js v2.1.1
* http://twitter.github.com/bootstrap/javascript.html#modals
* =========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================= */
!function ($) {
"use strict"; // jshint ;_;
/* MODAL CLASS DEFINITION
* ====================== */
var Modal = function Modal(element, options) {
this.options = options;
this.$element = $(element).delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this));
this.options.remote && this.$element.find('.modal-body').load(this.options.remote);
};
Modal.prototype = {
constructor: Modal,
toggle: function toggle() {
return this[!this.isShown ? 'show' : 'hide']();
},
show: function show() {
var that = this,
e = $.Event('show');
this.$element.trigger(e);
if (this.isShown || e.isDefaultPrevented()) return;
$('body').addClass('modal-open');
this.isShown = true;
this.escape();
this.backdrop(function () {
var transition = $.support.transition && that.$element.hasClass('fade');
if (!that.$element.parent().length) {
that.$element.appendTo(document.body); //don't move modals dom position
}
that.$element.show();
if (transition) {
that.$element[0].offsetWidth; // force reflow
}
that.$element.addClass('in').attr('aria-hidden', false).focus();
that.enforceFocus();
transition ? that.$element.one($.support.transition.end, function () {
that.$element.trigger('shown');
}) : that.$element.trigger('shown');
});
},
hide: function hide(e) {
e && e.preventDefault();
var that = this;
e = $.Event('hide');
this.$element.trigger(e);
if (!this.isShown || e.isDefaultPrevented()) return;
this.isShown = false;
$('body').removeClass('modal-open');
this.escape();
$(document).off('focusin.modal');
this.$element.removeClass('in').attr('aria-hidden', true);
$.support.transition && this.$element.hasClass('fade') ? this.hideWithTransition() : this.hideModal();
},
enforceFocus: function enforceFocus() {
var that = this;
$(document).on('focusin.modal', function (e) {
if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
that.$element.focus();
}
});
},
escape: function escape() {
var that = this;
if (this.isShown && this.options.keyboard) {
this.$element.on('keyup.dismiss.modal', function (e) {
e.which == 27 && that.hide();
});
} else if (!this.isShown) {
this.$element.off('keyup.dismiss.modal');
}
},
hideWithTransition: function hideWithTransition() {
var that = this,
timeout = setTimeout(function () {
that.$element.off($.support.transition.end);
that.hideModal();
}, 500);
this.$element.one($.support.transition.end, function () {
clearTimeout(timeout);
that.hideModal();
});
},
hideModal: function hideModal(that) {
this.$element.hide().trigger('hidden');
this.backdrop();
},
removeBackdrop: function removeBackdrop() {
this.$backdrop.remove();
this.$backdrop = null;
},
backdrop: function backdrop(callback) {
var that = this,
animate = this.$element.hasClass('fade') ? 'fade' : '';
if (this.isShown && this.options.backdrop) {
var doAnimate = $.support.transition && animate;
this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />').appendTo(document.body);
if (this.options.backdrop != 'static') {
this.$backdrop.click($.proxy(this.hide, this));
}
if (doAnimate) this.$backdrop[0].offsetWidth; // force reflow
this.$backdrop.addClass('in');
doAnimate ? this.$backdrop.one($.support.transition.end, callback) : callback();
} else if (!this.isShown && this.$backdrop) {
this.$backdrop.removeClass('in');
$.support.transition && this.$element.hasClass('fade') ? this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) : this.removeBackdrop();
} else if (callback) {
callback();
}
}
};
/* MODAL PLUGIN DEFINITION
* ======================= */
$.fn.modal = function (option) {
return this.each(function () {
var $this = $(this),
data = $this.data('modal'),
options = $.extend({}, $.fn.modal.defaults, $this.data(), _typeof(option) == 'object' && option);
if (!data) $this.data('modal', data = new Modal(this, options));
if (typeof option == 'string') data[option]();else if (options.show) data.show();
});
};
$.fn.modal.defaults = {
backdrop: true,
keyboard: true,
show: true
};
$.fn.modal.Constructor = Modal;
/* MODAL DATA-API
* ============== */
$(function () {
$('body').on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
var $this = $(this),
href = $this.attr('href'),
$target = $($this.attr('data-target') || href && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
,
option = $target.data('modal') ? 'toggle' : $.extend({
remote: !/#/.test(href) && href
}, $target.data(), $this.data());
e.preventDefault();
$target.modal(option).one('hide', function () {
$this.focus();
});
});
});
}(window.jQuery);
/* ===========================================================
* bootstrap-tooltip.js v2.1.1
* http://twitter.github.com/bootstrap/javascript.html#tooltips
* Inspired by the original jQuery.tipsy by Jason Frame
* ===========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* TOOLTIP PUBLIC CLASS DEFINITION
* =============================== */
var Tooltip = function Tooltip(element, options) {
this.init('tooltip', element, options);
};
Tooltip.prototype = {
constructor: Tooltip,
init: function init(type, element, options) {
var eventIn, eventOut;
this.type = type;
this.$element = $(element);
this.options = this.getOptions(options);
this.enabled = true;
if (this.options.trigger == 'click') {
this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this));
} else if (this.options.trigger != 'manual') {
eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus';
eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur';
this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this));
this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this));
}
this.options.selector ? this._options = $.extend({}, this.options, {
trigger: 'manual',
selector: ''
}) : this.fixTitle();
},
getOptions: function getOptions(options) {
options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data());
if (options.delay && typeof options.delay == 'number') {
options.delay = {
show: options.delay,
hide: options.delay
};
}
return options;
},
enter: function enter(e) {
var self = $(e.currentTarget)[this.type](this._options).data(this.type);
if (!self.options.delay || !self.options.delay.show) return self.show();
clearTimeout(this.timeout);
self.hoverState = 'in';
this.timeout = setTimeout(function () {
if (self.hoverState == 'in') self.show();
}, self.options.delay.show);
},
leave: function leave(e) {
var self = $(e.currentTarget)[this.type](this._options).data(this.type);
if (this.timeout) clearTimeout(this.timeout);
if (!self.options.delay || !self.options.delay.hide) return self.hide();
self.hoverState = 'out';
this.timeout = setTimeout(function () {
if (self.hoverState == 'out') self.hide();
}, self.options.delay.hide);
},
show: function show() {
var $tip, inside, pos, actualWidth, actualHeight, placement, tp;
if (this.hasContent() && this.enabled) {
$tip = this.tip();
this.setContent();
if (this.options.animation) {
$tip.addClass('fade');
}
placement = typeof this.options.placement == 'function' ? this.options.placement.call(this, $tip[0], this.$element[0]) : this.options.placement;
inside = /in/.test(placement);
$tip.remove().css({
top: 0,
left: 0,
display: 'block'
}).appendTo(inside ? this.$element : document.body);
pos = this.getPosition(inside);
actualWidth = $tip[0].offsetWidth;
actualHeight = $tip[0].offsetHeight;
switch (inside ? placement.split(' ')[1] : placement) {
case 'bottom':
tp = {
top: pos.top + pos.height,
left: pos.left + pos.width / 2 - actualWidth / 2
};
break;
case 'top':
tp = {
top: pos.top - actualHeight,
left: pos.left + pos.width / 2 - actualWidth / 2
};
break;
case 'left':
tp = {
top: pos.top + pos.height / 2 - actualHeight / 2,
left: pos.left - actualWidth
};
break;
case 'right':
tp = {
top: pos.top + pos.height / 2 - actualHeight / 2,
left: pos.left + pos.width
};
break;
}
$tip.css(tp).addClass(placement).addClass('in');
}
},
setContent: function setContent() {
var $tip = this.tip(),
title = this.getTitle();
$tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title);
$tip.removeClass('fade in top bottom left right');
},
hide: function hide() {
var that = this,
$tip = this.tip();
$tip.removeClass('in');
function removeWithAnimation() {
var timeout = setTimeout(function () {
$tip.off($.support.transition.end).remove();
}, 500);
$tip.one($.support.transition.end, function () {
clearTimeout(timeout);
$tip.remove();
});
}
$.support.transition && this.$tip.hasClass('fade') ? removeWithAnimation() : $tip.remove();
return this;
},
fixTitle: function fixTitle() {
var $e = this.$element;
if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
$e.attr('data-original-title', $e.attr('title') || '').removeAttr('title');
}
},
hasContent: function hasContent() {
return this.getTitle();
},
getPosition: function getPosition(inside) {
return $.extend({}, inside ? {
top: 0,
left: 0
} : this.$element.offset(), {
width: this.$element[0].offsetWidth,
height: this.$element[0].offsetHeight
});
},
getTitle: function getTitle() {
var title,
$e = this.$element,
o = this.options;
title = $e.attr('data-original-title') || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title);
return title;
},
tip: function tip() {
return this.$tip = this.$tip || $(this.options.template);
},
validate: function validate() {
if (!this.$element[0].parentNode) {
this.hide();
this.$element = null;
this.options = null;
}
},
enable: function enable() {
this.enabled = true;
},
disable: function disable() {
this.enabled = false;
},
toggleEnabled: function toggleEnabled() {
this.enabled = !this.enabled;
},
toggle: function toggle() {
this[this.tip().hasClass('in') ? 'hide' : 'show']();
},
destroy: function destroy() {
this.hide().$element.off('.' + this.type).removeData(this.type);
}
};
/* TOOLTIP PLUGIN DEFINITION
* ========================= */
$.fn.tooltip = function (option) {
return this.each(function () {
var $this = $(this),
data = $this.data('tooltip'),
options = _typeof(option) == 'object' && option;
if (!data) $this.data('tooltip', data = new Tooltip(this, options));
if (typeof option == 'string') data[option]();
});
};
$.fn.tooltip.Constructor = Tooltip;
$.fn.tooltip.defaults = {
animation: true,
placement: 'top',
selector: false,
template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
trigger: 'hover',
title: '',
delay: 0,
html: true
};
}(window.jQuery);
/* ===========================================================
* bootstrap-popover.js v2.1.1
* http://twitter.github.com/bootstrap/javascript.html#popovers
* ===========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* POPOVER PUBLIC CLASS DEFINITION
* =============================== */
var Popover = function Popover(element, options) {
this.init('popover', element, options);
};
/* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
========================================== */
Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
constructor: Popover,
setContent: function setContent() {
var $tip = this.tip(),
title = this.getTitle(),
content = this.getContent();
$tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title);
$tip.find('.popover-content > *')[this.options.html ? 'html' : 'text'](content);
$tip.removeClass('fade top bottom left right in');
},
hasContent: function hasContent() {
return this.getTitle() || this.getContent();
},
getContent: function getContent() {
var content,
$e = this.$element,
o = this.options;
content = $e.attr('data-content') || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content);
return content;
},
tip: function tip() {
if (!this.$tip) {
this.$tip = $(this.options.template);
}
return this.$tip;
},
destroy: function destroy() {
this.hide().$element.off('.' + this.type).removeData(this.type);
}
});
/* POPOVER PLUGIN DEFINITION
* ======================= */
$.fn.popover = function (option) {
return this.each(function () {
var $this = $(this),
data = $this.data('popover'),
options = _typeof(option) == 'object' && option;
if (!data) $this.data('popover', data = new Popover(this, options));
if (typeof option == 'string') data[option]();
});
};
$.fn.popover.Constructor = Popover;
$.fn.popover.defaults = $.extend({}, $.fn.tooltip.defaults, {
placement: 'right',
trigger: 'click',
content: '',
template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
});
}(window.jQuery);
/* =============================================================
* bootstrap-scrollspy.js v2.1.1
* http://twitter.github.com/bootstrap/javascript.html#scrollspy
* =============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* SCROLLSPY CLASS DEFINITION
* ========================== */
function ScrollSpy(element, options) {
var process = $.proxy(this.process, this),
$element = $(element).is('body') ? $(window) : $(element),
href;
this.options = $.extend({}, $.fn.scrollspy.defaults, options);
this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process);
this.selector = (this.options.target || (href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
|| '') + ' .nav li > a';
this.$body = $('body');
this.refresh();
this.process();
}
ScrollSpy.prototype = {
constructor: ScrollSpy,
refresh: function refresh() {
var self = this,
$targets;
this.offsets = $([]);
this.targets = $([]);
$targets = this.$body.find(this.selector).map(function () {
var $el = $(this),
href = $el.data('target') || $el.attr('href'),
$href = /^#\w/.test(href) && $(href);
return $href && $href.length && [[$href.position().top, href]] || null;
}).sort(function (a, b) {
return a[0] - b[0];
}).each(function () {
self.offsets.push(this[0]);
self.targets.push(this[1]);
});
},
process: function process() {
var scrollTop = this.$scrollElement.scrollTop() + this.options.offset,
scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight,
maxScroll = scrollHeight - this.$scrollElement.height(),
offsets = this.offsets,
targets = this.targets,
activeTarget = this.activeTarget,
i;
if (scrollTop >= maxScroll) {
return activeTarget != (i = targets.last()[0]) && this.activate(i);
}
for (i = offsets.length; i--;) {
activeTarget != targets[i] && scrollTop >= offsets[i] && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) && this.activate(targets[i]);
}
},
activate: function activate(target) {
var active, selector;
this.activeTarget = target;
$(this.selector).parent('.active').removeClass('active');
selector = this.selector + '[data-target="' + target + '"],' + this.selector + '[href="' + target + '"]';
active = $(selector).parent('li').addClass('active');
if (active.parent('.dropdown-menu').length) {
active = active.closest('li.dropdown').addClass('active');
}
active.trigger('activate');
}
};
/* SCROLLSPY PLUGIN DEFINITION
* =========================== */
$.fn.scrollspy = function (option) {
return this.each(function () {
var $this = $(this),
data = $this.data('scrollspy'),
options = _typeof(option) == 'object' && option;
if (!data) $this.data('scrollspy', data = new ScrollSpy(this, options));
if (typeof option == 'string') data[option]();
});
};
$.fn.scrollspy.Constructor = ScrollSpy;
$.fn.scrollspy.defaults = {
offset: 10
};
/* SCROLLSPY DATA-API
* ================== */
$(window).on('load', function () {
$('[data-spy="scroll"]').each(function () {
var $spy = $(this);
$spy.scrollspy($spy.data());
});
});
}(window.jQuery);
/* ========================================================
* bootstrap-tab.js v2.1.1
* http://twitter.github.com/bootstrap/javascript.html#tabs
* ========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ======================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* TAB CLASS DEFINITION
* ==================== */
var Tab = function Tab(element) {
this.element = $(element);
};
Tab.prototype = {
constructor: Tab,
show: function show() {
var $this = this.element,
$ul = $this.closest('ul:not(.dropdown-menu)'),
selector = $this.attr('data-target'),
previous,
$target,
e;
if (!selector) {
selector = $this.attr('href');
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, ''); //strip for ie7
}
if ($this.parent('li').hasClass('active')) return;
previous = $ul.find('.active a').last()[0];
e = $.Event('show', {
relatedTarget: previous
});
$this.trigger(e);
if (e.isDefaultPrevented()) return;
$target = $(selector);
this.activate($this.parent('li'), $ul);
this.activate($target, $target.parent(), function () {
$this.trigger({
type: 'shown',
relatedTarget: previous
});
});
},
activate: function activate(element, container, callback) {
var $active = container.find('> .active'),
transition = callback && $.support.transition && $active.hasClass('fade');
function next() {
$active.removeClass('active').find('> .dropdown-menu > .active').removeClass('active');
element.addClass('active');
if (transition) {
element[0].offsetWidth; // reflow for transition
element.addClass('in');
} else {
element.removeClass('fade');
}
if (element.parent('.dropdown-menu')) {
element.closest('li.dropdown').addClass('active');
}
callback && callback();
}
transition ? $active.one($.support.transition.end, next) : next();
$active.removeClass('in');
}
};
/* TAB PLUGIN DEFINITION
* ===================== */
$.fn.tab = function (option) {
return this.each(function () {
var $this = $(this),
data = $this.data('tab');
if (!data) $this.data('tab', data = new Tab(this));
if (typeof option == 'string') data[option]();
});
};
$.fn.tab.Constructor = Tab;
/* TAB DATA-API
* ============ */
$(function () {
$('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
e.preventDefault();
$(this).tab('show');
});
});
}(window.jQuery);
/* =============================================================
* bootstrap-typeahead.js v2.1.1
* http://twitter.github.com/bootstrap/javascript.html#typeahead
* =============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function ($) {
"use strict"; // jshint ;_;
/* TYPEAHEAD PUBLIC CLASS DEFINITION
* ================================= */
var Typeahead = function Typeahead(element, options) {
this.$element = $(element);
this.options = $.extend({}, $.fn.typeahead.defaults, options);
this.matcher = this.options.matcher || this.matcher;
this.sorter = this.options.sorter || this.sorter;
this.highlighter = this.options.highlighter || this.highlighter;
this.updater = this.options.updater || this.updater;
this.$menu = $(this.options.menu).appendTo('body');
this.source = this.options.source;
this.shown = false;
this.listen();
};
Typeahead.prototype = {
constructor: Typeahead,
select: function select() {
var val = this.$menu.find('.active').attr('data-value');
this.$element.val(this.updater(val)).change();
return this.hide();
},
updater: function updater(item) {
return item;
},
show: function show() {
var pos = $.extend({}, this.$element.offset(), {
height: this.$element[0].offsetHeight
});
this.$menu.css({
top: pos.top + pos.height,
left: pos.left
});
this.$menu.show();
this.shown = true;
return this;
},
hide: function hide() {
this.$menu.hide();
this.shown = false;
return this;
},
lookup: function lookup(event) {
var items;
this.query = this.$element.val();
if (!this.query || this.query.length < this.options.minLength) {
return this.shown ? this.hide() : this;
}
items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source;
return items ? this.process(items) : this;
},
process: function process(items) {
var that = this;
items = $.grep(items, function (item) {
return that.matcher(item);
});
items = this.sorter(items);
if (!items.length) {
return this.shown ? this.hide() : this;
}
return this.render(items.slice(0, this.options.items)).show();
},
matcher: function matcher(item) {
return ~item.toLowerCase().indexOf(this.query.toLowerCase());
},
sorter: function sorter(items) {
var beginswith = [],
caseSensitive = [],
caseInsensitive = [],
item;
while (item = items.shift()) {
if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item);else if (~item.indexOf(this.query)) caseSensitive.push(item);else caseInsensitive.push(item);
}
return beginswith.concat(caseSensitive, caseInsensitive);
},
highlighter: function highlighter(item) {
var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&');
return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
return '<strong>' + match + '</strong>';
});
},
render: function render(items) {
var that = this;
items = $(items).map(function (i, item) {
i = $(that.options.item).attr('data-value', item);
i.find('a').html(that.highlighter(item));
return i[0];
});
items.first().addClass('active');
this.$menu.html(items);
return this;
},
next: function next(event) {
var active = this.$menu.find('.active').removeClass('active'),
next = active.next();
if (!next.length) {
next = $(this.$menu.find('li')[0]);
}
next.addClass('active');
},
prev: function prev(event) {
var active = this.$menu.find('.active').removeClass('active'),
prev = active.prev();
if (!prev.length) {
prev = this.$menu.find('li').last();
}
prev.addClass('active');
},
listen: function listen() {
this.$element.on('blur', $.proxy(this.blur, this)).on('keypress', $.proxy(this.keypress, this)).on('keyup', $.proxy(this.keyup, this));
if ($.browser.chrome || $.browser.webkit || $.browser.msie) {
this.$element.on('keydown', $.proxy(this.keydown, this));
}
this.$menu.on('click', $.proxy(this.click, this)).on('mouseenter', 'li', $.proxy(this.mouseenter, this));
},
move: function move(e) {
if (!this.shown) return;
switch (e.keyCode) {
case 9: // tab
case 13: // enter
case 27:
// escape
e.preventDefault();
break;
case 38:
// up arrow
e.preventDefault();
this.prev();
break;
case 40:
// down arrow
e.preventDefault();
this.next();
break;
}
e.stopPropagation();
},
keydown: function keydown(e) {
this.suppressKeyPressRepeat = !~$.inArray(e.keyCode, [40, 38, 9, 13, 27]);
this.move(e);
},
keypress: function keypress(e) {
if (this.suppressKeyPressRepeat) return;
this.move(e);
},
keyup: function keyup(e) {
switch (e.keyCode) {
case 40: // down arrow
case 38:
// up arrow
break;
case 9: // tab
case 13:
// enter
if (!this.shown) return;
this.select();
break;
case 27:
// escape
if (!this.shown) return;
this.hide();
break;
default:
this.lookup();
}
e.stopPropagation();
e.preventDefault();
},
blur: function blur(e) {
var that = this;
setTimeout(function () {
that.hide();
}, 150);
},
click: function click(e) {
e.stopPropagation();
e.preventDefault();
this.select();
},
mouseenter: function mouseenter(e) {
this.$menu.find('.active').removeClass('active');
$(e.currentTarget).addClass('active');
}
};
/* TYPEAHEAD PLUGIN DEFINITION
* =========================== */
$.fn.typeahead = function (option) {
return this.each(function () {
var $this = $(this),
data = $this.data('typeahead'),
options = _typeof(option) == 'object' && option;
if (!data) $this.data('typeahead', data = new Typeahead(this, options));
if (typeof option == 'string') data[option]();
});
};
$.fn.typeahead.defaults = {
source: [],
items: 8,
menu: '<ul class="typeahead dropdown-menu"></ul>',
item: '<li><a href="#"></a></li>',
minLength: 1
};
$.fn.typeahead.Constructor = Typeahead;
/* TYPEAHEAD DATA-API
* ================== */
$(function () {
$('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
var $this = $(this);
if ($this.data('typeahead')) return;
e.preventDefault();
$this.typeahead($this.data());
});
});
}(window.jQuery);
/* ==========================================================
* bootstrap-affix.js v2.1.1
* http://twitter.github.com/bootstrap/javascript.html#affix
* ==========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* AFFIX CLASS DEFINITION
* ====================== */
var Affix = function Affix(element, options) {
this.options = $.extend({}, $.fn.affix.defaults, options);
this.$window = $(window).on('scroll.affix.data-api', $.proxy(this.checkPosition, this));
this.$element = $(element);
this.checkPosition();
};
Affix.prototype.checkPosition = function () {
if (!this.$element.is(':visible')) return;
var scrollHeight = $(document).height(),
scrollTop = this.$window.scrollTop(),
position = this.$element.offset(),
offset = this.options.offset,
offsetBottom = offset.bottom,
offsetTop = offset.top,
reset = 'affix affix-top affix-bottom',
affix;
if (_typeof(offset) != 'object') offsetBottom = offsetTop = offset;
if (typeof offsetTop == 'function') offsetTop = offset.top();
if (typeof offsetBottom == 'function') offsetBottom = offset.bottom();
affix = this.unpin != null && scrollTop + this.unpin <= position.top ? false : offsetBottom != null && position.top + this.$element.height() >= scrollHeight - offsetBottom ? 'bottom' : offsetTop != null && scrollTop <= offsetTop ? 'top' : false;
if (this.affixed === affix) return;
this.affixed = affix;
this.unpin = affix == 'bottom' ? position.top - scrollTop : null;
this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''));
};
/* AFFIX PLUGIN DEFINITION
* ======================= */
$.fn.affix = function (option) {
return this.each(function () {
var $this = $(this),
data = $this.data('affix'),
options = _typeof(option) == 'object' && option;
if (!data) $this.data('affix', data = new Affix(this, options));
if (typeof option == 'string') data[option]();
});
};
$.fn.affix.Constructor = Affix;
$.fn.affix.defaults = {
offset: 0
};
/* AFFIX DATA-API
* ============== */
$(window).on('load', function () {
$('[data-spy="affix"]').each(function () {
var $spy = $(this),
data = $spy.data();
data.offset = data.offset || {};
data.offsetBottom && (data.offset.bottom = data.offsetBottom);
data.offsetTop && (data.offset.top = data.offsetTop);
$spy.affix(data);
});
});
}(window.jQuery);
},{}],3:[function(require,module,exports){
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
/*!
* jQuery JavaScript Library v1.8.1
* http://jquery.com/
*
* Includes Sizzle.js
* http://sizzlejs.com/
*
* Copyright 2012 jQuery Foundation and other contributors
* Released under the MIT license
* http://jquery.org/license
*
* Date: Thu Aug 30 2012 17:17:22 GMT-0400 (Eastern Daylight Time)
*/
(function (window, undefined) {
var // A central reference to the root jQuery(document)
rootjQuery,
// The deferred used on DOM ready
readyList,
// Use the correct document accordingly with window argument (sandbox)
document = window.document,
location = window.location,
navigator = window.navigator,
// Map over jQuery in case of overwrite
_jQuery = window.jQuery,
// Map over the $ in case of overwrite
_$ = window.$,
// Save a reference to some core methods
core_push = Array.prototype.push,
core_slice = Array.prototype.slice,
core_indexOf = Array.prototype.indexOf,
core_toString = Object.prototype.toString,
core_hasOwn = Object.prototype.hasOwnProperty,
core_trim = String.prototype.trim,
// Define a local copy of jQuery
jQuery = function jQuery(selector, context) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init(selector, context, rootjQuery);
},
// Used for matching numbers
core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
// Used for detecting and trimming whitespace
core_rnotwhite = /\S/,
core_rspace = /\s+/,
// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
// A simple way to check for HTML strings
// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
// Match a standalone tag
rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
// JSON RegExp
rvalidchars = /^[\],:{}\s]*$/,
rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
// Matches dashed string for camelizing
rmsPrefix = /^-ms-/,
rdashAlpha = /-([\da-z])/gi,
// Used by jQuery.camelCase as callback to replace()
fcamelCase = function fcamelCase(all, letter) {
return (letter + "").toUpperCase();
},
// The ready event handler and self cleanup method
DOMContentLoaded = function DOMContentLoaded() {
if (document.addEventListener) {
document.removeEventListener("DOMContentLoaded", DOMContentLoaded, false);
jQuery.ready();
} else if (document.readyState === "complete") {
// we're here because readyState === "complete" in oldIE
// which is good enough for us to call the dom ready!
document.detachEvent("onreadystatechange", DOMContentLoaded);
jQuery.ready();
}
},
// [[Class]] -> type pairs
class2type = {};
jQuery.fn = jQuery.prototype = {
constructor: jQuery,
init: function init(selector, context, rootjQuery) {
var match, elem, ret, doc; // Handle $(""), $(null), $(undefined), $(false)
if (!selector) {
return this;
} // Handle $(DOMElement)
if (selector.nodeType) {
this.context = this[0] = selector;
this.length = 1;
return this;
} // Handle HTML strings
if (typeof selector === "string") {
if (selector.charAt(0) === "<" && selector.charAt(selector.length - 1) === ">" && selector.length >= 3) {
// Assume that strings that start and end with <> are HTML and skip the regex check
match = [null, selector, null];
} else {
match = rquickExpr.exec(selector);
} // Match html or make sure no context is specified for #id
if (match && (match[1] || !context)) {
// HANDLE: $(html) -> $(array)
if (match[1]) {
context = context instanceof jQuery ? context[0] : context;
doc = context && context.nodeType ? context.ownerDocument || context : document; // scripts is true for back-compat
selector = jQuery.parseHTML(match[1], doc, true);
if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
this.attr.call(selector, context, true);
}
return jQuery.merge(this, selector); // HANDLE: $(#id)
} else {
elem = document.getElementById(match[2]); // Check parentNode to catch when Blackberry 4.6 returns
// nodes that are no longer in the document #6963
if (elem && elem.parentNode) {
// Handle the case where IE and Opera return items
// by name instead of ID
if (elem.id !== match[2]) {
return rootjQuery.find(selector);
} // Otherwise, we inject the element directly into the jQuery object
this.length = 1;
this[0] = elem;
}
this.context = document;
this.selector = selector;
return this;
} // HANDLE: $(expr, $(...))
} else if (!context || context.jquery) {
return (context || rootjQuery).find(selector); // HANDLE: $(expr, context)
// (which is just equivalent to: $(context).find(expr)
} else {
return this.constructor(context).find(selector);
} // HANDLE: $(function)
// Shortcut for document ready
} else if (jQuery.isFunction(selector)) {
return rootjQuery.ready(selector);
}
if (selector.selector !== undefined) {
this.selector = selector.selector;
this.context = selector.context;
}
return jQuery.makeArray(selector, this);
},
// Start with an empty selector
selector: "",
// The current version of jQuery being used
jquery: "1.8.1",
// The default length of a jQuery object is 0
length: 0,
// The number of elements contained in the matched element set
size: function size() {
return this.length;
},
toArray: function toArray() {
return core_slice.call(this);
},
// Get the Nth element in the matched element set OR
// Get the whole matched element set as a clean array
get: function get(num) {
return num == null ? // Return a 'clean' array
this.toArray() : // Return just the object
num < 0 ? this[this.length + num] : this[num];
},
// Take an array of elements and push it onto the stack
// (returning the new matched element set)
pushStack: function pushStack(elems, name, selector) {
// Build a new jQuery matched element set
var ret = jQuery.merge(this.constructor(), elems); // Add the old object onto the stack (as a reference)
ret.prevObject = this;
ret.context = this.context;
if (name === "find") {
ret.selector = this.selector + (this.selector ? " " : "") + selector;
} else if (name) {
ret.selector = this.selector + "." + name + "(" + selector + ")";
} // Return the newly-formed element set
return ret;
},
// Execute a callback for every element in the matched set.
// (You can seed the arguments with an array of args, but this is
// only used internally.)
each: function each(callback, args) {
return jQuery.each(this, callback, args);
},
ready: function ready(fn) {
// Add the callback
jQuery.ready.promise().done(fn);
return this;
},
eq: function eq(i) {
i = +i;
return i === -1 ? this.slice(i) : this.slice(i, i + 1);
},
first: function first() {
return this.eq(0);
},
last: function last() {
return this.eq(-1);
},
slice: function slice() {
return this.pushStack(core_slice.apply(this, arguments), "slice", core_slice.call(arguments).join(","));
},
map: function map(callback) {
return this.pushStack(jQuery.map(this, function (elem, i) {
return callback.call(elem, i, elem);
}));
},
end: function end() {
return this.prevObject || this.constructor(null);
},
// For internal use only.
// Behaves like an Array's method, not like a jQuery method.
push: core_push,
sort: [].sort,
splice: [].splice
}; // Give the init function the jQuery prototype for later instantiation
jQuery.fn.init.prototype = jQuery.fn;
jQuery.extend = jQuery.fn.extend = function () {
var options,
name,
src,
copy,
copyIsArray,
clone,
target = arguments[0] || {},
i = 1,
length = arguments.length,
deep = false; // Handle a deep copy situation
if (typeof target === "boolean") {
deep = target;
target = arguments[1] || {}; // skip the boolean and the target
i = 2;
} // Handle case when target is a string or something (possible in deep copy)
if (_typeof(target) !== "object" && !jQuery.isFunction(target)) {
target = {};
} // extend jQuery itself if only one argument is passed
if (length === i) {
target = this;
--i;
}
for (; i < length; i++) {
// Only deal with non-null/undefined values
if ((options = arguments[i]) != null) {
// Extend the base object
for (name in options) {
src = target[name];
copy = options[name]; // Prevent never-ending loop
if (target === copy) {
continue;
} // Recurse if we're merging plain objects or arrays
if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {
if (copyIsArray) {
copyIsArray = false;
clone = src && jQuery.isArray(src) ? src : [];
} else {
clone = src && jQuery.isPlainObject(src) ? src : {};
} // Never move original objects, clone them
target[name] = jQuery.extend(deep, clone, copy); // Don't bring in undefined values
} else if (copy !== undefined) {
target[name] = copy;
}
}
}
} // Return the modified object
return target;
};
jQuery.extend({
noConflict: function noConflict(deep) {
if (window.$ === jQuery) {
window.$ = _$;
}
if (deep && window.jQuery === jQuery) {
window.jQuery = _jQuery;
}
return jQuery;
},
// Is the DOM ready to be used? Set to true once it occurs.
isReady: false,
// A counter to track how many items to wait for before
// the ready event fires. See #6781
readyWait: 1,
// Hold (or release) the ready event
holdReady: function holdReady(hold) {
if (hold) {
jQuery.readyWait++;
} else {
jQuery.ready(true);
}
},
// Handle when the DOM is ready
ready: function ready(wait) {
// Abort if there are pending holds or we're already ready
if (wait === true ? --jQuery.readyWait : jQuery.isReady) {
return;
} // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
if (!document.body) {
return setTimeout(jQuery.ready, 1);
} // Remember that the DOM is ready
jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be
if (wait !== true && --jQuery.readyWait > 0) {
return;
} // If there are functions bound, to execute
readyList.resolveWith(document, [jQuery]); // Trigger any bound ready events
if (jQuery.fn.trigger) {
jQuery(document).trigger("ready").off("ready");
}
},
// See test/unit/core.js for details concerning isFunction.
// Since version 1.3, DOM methods and functions like alert
// aren't supported. They return false on IE (#2968).
isFunction: function isFunction(obj) {
return jQuery.type(obj) === "function";
},
isArray: Array.isArray || function (obj) {
return jQuery.type(obj) === "array";
},
isWindow: function isWindow(obj) {
return obj != null && obj == obj.window;
},
isNumeric: function isNumeric(obj) {
return !isNaN(parseFloat(obj)) && isFinite(obj);
},
type: function type(obj) {
return obj == null ? String(obj) : class2type[core_toString.call(obj)] || "object";
},
isPlainObject: function isPlainObject(obj) {
// Must be an Object.
// Because of IE, we also have to check the presence of the constructor property.
// Make sure that DOM nodes and window objects don't pass through, as well
if (!obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) {
return false;
}
try {
// Not own constructor property must be Object
if (obj.constructor && !core_hasOwn.call(obj, "constructor") && !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) {
return false;
}
} catch (e) {
// IE8,9 Will throw exceptions on certain host objects #9897
return false;
} // Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
var key;
for (key in obj) {}
return key === undefined || core_hasOwn.call(obj, key);
},
isEmptyObject: function isEmptyObject(obj) {
var name;
for (name in obj) {
return false;
}
return true;
},
error: function error(msg) {
throw new Error(msg);
},
// data: string of html
// context (optional): If specified, the fragment will be created in this context, defaults to document
// scripts (optional): If true, will include scripts passed in the html string
parseHTML: function parseHTML(data, context, scripts) {
var parsed;
if (!data || typeof data !== "string") {
return null;
}
if (typeof context === "boolean") {
scripts = context;
context = 0;
}
context = context || document; // Single tag
if (parsed = rsingleTag.exec(data)) {
return [context.createElement(parsed[1])];
}
parsed = jQuery.buildFragment([data], context, scripts ? null : []);
return jQuery.merge([], (parsed.cacheable ? jQuery.clone(parsed.fragment) : parsed.fragment).childNodes);
},
parseJSON: function parseJSON(data) {
if (!data || typeof data !== "string") {
return null;
} // Make sure leading/trailing whitespace is removed (IE can't handle it)
data = jQuery.trim(data); // Attempt to parse using the native JSON parser first
if (window.JSON && window.JSON.parse) {
return window.JSON.parse(data);
} // Make sure the incoming data is actual JSON
// Logic borrowed from http://json.org/json2.js
if (rvalidchars.test(data.replace(rvalidescape, "@").replace(rvalidtokens, "]").replace(rvalidbraces, ""))) {
return new Function("return " + data)();
}
jQuery.error("Invalid JSON: " + data);
},
// Cross-browser xml parsing
parseXML: function parseXML(data) {
var xml, tmp;
if (!data || typeof data !== "string") {
return null;
}
try {
if (window.DOMParser) {
// Standard
tmp = new DOMParser();
xml = tmp.parseFromString(data, "text/xml");
} else {
// IE
xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = "false";
xml.loadXML(data);
}
} catch (e) {
xml = undefined;
}
if (!xml || !xml.documentElement || xml.getElementsByTagName("parsererror").length) {
jQuery.error("Invalid XML: " + data);
}
return xml;
},
noop: function noop() {},
// Evaluates a script in a global context
// Workarounds based on findings by Jim Driscoll
// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
globalEval: function globalEval(data) {
if (data && core_rnotwhite.test(data)) {
// We use execScript on Internet Explorer
// We use an anonymous function so that context is window
// rather than jQuery in Firefox
(window.execScript || function (data) {
window["eval"].call(window, data);
})(data);
}
},
// Convert dashed to camelCase; used by the css and data modules
// Microsoft forgot to hump their vendor prefix (#9572)
camelCase: function camelCase(string) {
return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);
},
nodeName: function nodeName(elem, name) {
return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
},
// args is for internal usage only
each: function each(obj, callback, args) {
var name,
i = 0,
length = obj.length,
isObj = length === undefined || jQuery.isFunction(obj);
if (args) {
if (isObj) {
for (name in obj) {
if (callback.apply(obj[name], args) === false) {
break;
}
}
} else {
for (; i < length;) {
if (callback.apply(obj[i++], args) === false) {
break;
}
}
} // A special, fast, case for the most common use of each
} else {
if (isObj) {
for (name in obj) {
if (callback.call(obj[name], name, obj[name]) === false) {
break;
}
}
} else {
for (; i < length;) {
if (callback.call(obj[i], i, obj[i++]) === false) {
break;
}
}
}
}
return obj;
},
// Use native String.trim function wherever possible
trim: core_trim && !core_trim.call("\uFEFF\xA0") ? function (text) {
return text == null ? "" : core_trim.call(text);
} : // Otherwise use our own trimming functionality
function (text) {
return text == null ? "" : text.toString().replace(rtrim, "");
},
// results is for internal usage only
makeArray: function makeArray(arr, results) {
var type,
ret = results || [];
if (arr != null) {
// The window, strings (and functions) also have 'length'
// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
type = jQuery.type(arr);
if (arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow(arr)) {
core_push.call(ret, arr);
} else {
jQuery.merge(ret, arr);
}
}
return ret;
},
inArray: function inArray(elem, arr, i) {
var len;
if (arr) {
if (core_indexOf) {
return core_indexOf.call(arr, elem, i);
}
len = arr.length;
i = i ? i < 0 ? Math.max(0, len + i) : i : 0;
for (; i < len; i++) {
// Skip accessing in sparse arrays
if (i in arr && arr[i] === elem) {
return i;
}
}
}
return -1;
},
merge: function merge(first, second) {
var l = second.length,
i = first.length,
j = 0;
if (typeof l === "number") {
for (; j < l; j++) {
first[i++] = second[j];
}
} else {
while (second[j] !== undefined) {
first[i++] = second[j++];
}
}
first.length = i;
return first;
},
grep: function grep(elems, callback, inv) {
var retVal,
ret = [],
i = 0,
length = elems.length;
inv = !!inv; // Go through the array, only saving the items
// that pass the validator function
for (; i < length; i++) {
retVal = !!callback(elems[i], i);
if (inv !== retVal) {
ret.push(elems[i]);
}
}
return ret;
},
// arg is for internal usage only
map: function map(elems, callback, arg) {
var value,
key,
ret = [],
i = 0,
length = elems.length,
// jquery objects are treated as arrays
isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && (length > 0 && elems[0] && elems[length - 1] || length === 0 || jQuery.isArray(elems)); // Go through the array, translating each of the items to their
if (isArray) {
for (; i < length; i++) {
value = callback(elems[i], i, arg);
if (value != null) {
ret[ret.length] = value;
}
} // Go through every key on the object,
} else {
for (key in elems) {
value = callback(elems[key], key, arg);
if (value != null) {
ret[ret.length] = value;
}
}
} // Flatten any nested arrays
return ret.concat.apply([], ret);
},
// A global GUID counter for objects
guid: 1,
// Bind a function to a context, optionally partially applying any
// arguments.
proxy: function proxy(fn, context) {
var tmp, args, proxy;
if (typeof context === "string") {
tmp = fn[context];
context = fn;
fn = tmp;
} // Quick check to determine if target is callable, in the spec
// this throws a TypeError, but we will just return undefined.
if (!jQuery.isFunction(fn)) {
return undefined;
} // Simulated bind
args = core_slice.call(arguments, 2);
proxy = function proxy() {
return fn.apply(context, args.concat(core_slice.call(arguments)));
}; // Set the guid of unique handler to the same of original handler, so it can be removed
proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
return proxy;
},
// Multifunctional method to get and set values of a collection
// The value/s can optionally be executed if it's a function
access: function access(elems, fn, key, value, chainable, emptyGet, pass) {
var exec,
bulk = key == null,
i = 0,
length = elems.length; // Sets many values
if (key && _typeof(key) === "object") {
for (i in key) {
jQuery.access(elems, fn, i, key[i], 1, emptyGet, value);
}
chainable = 1; // Sets one value
} else if (value !== undefined) {
// Optionally, function values get executed if exec is true
exec = pass === undefined && jQuery.isFunction(value);
if (bulk) {
// Bulk operations only iterate when executing function values
if (exec) {
exec = fn;
fn = function fn(elem, key, value) {
return exec.call(jQuery(elem), value);
}; // Otherwise they run against the entire set
} else {
fn.call(elems, value);
fn = null;
}
}
if (fn) {
for (; i < length; i++) {
fn(elems[i], key, exec ? value.call(elems[i], i, fn(elems[i], key)) : value, pass);
}
}
chainable = 1;
}
return chainable ? elems : // Gets
bulk ? fn.call(elems) : length ? fn(elems[0], key) : emptyGet;
},
now: function now() {
return new Date().getTime();
}
});
jQuery.ready.promise = function (obj) {
if (!readyList) {
readyList = jQuery.Deferred(); // Catch cases where $(document).ready() is called after the browser event has already occurred.
// we once tried to use readyState "interactive" here, but it caused issues like the one
// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
if (document.readyState === "complete") {
// Handle it asynchronously to allow scripts the opportunity to delay ready
setTimeout(jQuery.ready, 1); // Standards-based browsers support DOMContentLoaded
} else if (document.addEventListener) {
// Use the handy event callback
document.addEventListener("DOMContentLoaded", DOMContentLoaded, false); // A fallback to window.onload, that will always work
window.addEventListener("load", jQuery.ready, false); // If IE event model is used
} else {
// Ensure firing before onload, maybe late but safe also for iframes
document.attachEvent("onreadystatechange", DOMContentLoaded); // A fallback to window.onload, that will always work
window.attachEvent("onload", jQuery.ready); // If IE and not a frame
// continually check to see if the document is ready
var top = false;
try {
top = window.frameElement == null && document.documentElement;
} catch (e) {}
if (top && top.doScroll) {
(function doScrollCheck() {
if (!jQuery.isReady) {
try {
// Use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
top.doScroll("left");
} catch (e) {
return setTimeout(doScrollCheck, 50);
} // and execute any waiting functions
jQuery.ready();
}
})();
}
}
}
return readyList.promise(obj);
}; // Populate the class2type map
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function (i, name) {
class2type["[object " + name + "]"] = name.toLowerCase();
}); // All jQuery objects should point back to these
rootjQuery = jQuery(document); // String to Object options format cache
var optionsCache = {}; // Convert String-formatted options into Object-formatted ones and store in cache
function createOptions(options) {
var object = optionsCache[options] = {};
jQuery.each(options.split(core_rspace), function (_, flag) {
object[flag] = true;
});
return object;
}
/*
* Create a callback list using the following parameters:
*
* options: an optional list of space-separated options that will change how
* the callback list behaves or a more traditional option object
*
* By default a callback list will act like an event callback list and can be
* "fired" multiple times.
*
* Possible options:
*
* once: will ensure the callback list can only be fired once (like a Deferred)
*
* memory: will keep track of previous values and will call any callback added
* after the list has been fired right away with the latest "memorized"
* values (like a Deferred)
*
* unique: will ensure a callback can only be added once (no duplicate in the list)
*
* stopOnFalse: interrupt callings when a callback returns false
*
*/
jQuery.Callbacks = function (options) {
// Convert options from String-formatted to Object-formatted if needed
// (we check in cache first)
options = typeof options === "string" ? optionsCache[options] || createOptions(options) : jQuery.extend({}, options);
var // Last fire value (for non-forgettable lists)
memory,
// Flag to know if list was already fired
_fired,
// Flag to know if list is currently firing
firing,
// First callback to fire (used internally by add and fireWith)
firingStart,
// End of the loop when firing
firingLength,
// Index of currently firing callback (modified by remove if needed)
firingIndex,
// Actual callback list
list = [],
// Stack of fire calls for repeatable lists
stack = !options.once && [],
// Fire callbacks
fire = function fire(data) {
memory = options.memory && data;
_fired = true;
firingIndex = firingStart || 0;
firingStart = 0;
firingLength = list.length;
firing = true;
for (; list && firingIndex < firingLength; firingIndex++) {
if (list[firingIndex].apply(data[0], data[1]) === false && options.stopOnFalse) {
memory = false; // To prevent further calls using add
break;
}
}
firing = false;
if (list) {
if (stack) {
if (stack.length) {
fire(stack.shift());
}
} else if (memory) {
list = [];
} else {
self.disable();
}
}
},
// Actual Callbacks object
self = {
// Add a callback or a collection of callbacks to the list
add: function add() {
if (list) {
// First, we save the current length
var start = list.length;
(function add(args) {
jQuery.each(args, function (_, arg) {
var type = jQuery.type(arg);
if (type === "function" && (!options.unique || !self.has(arg))) {
list.push(arg);
} else if (arg && arg.length && type !== "string") {
// Inspect recursively
add(arg);
}
});
})(arguments); // Do we need to add the callbacks to the
// current firing batch?
if (firing) {
firingLength = list.length; // With memory, if we're not firing then
// we should call right away
} else if (memory) {
firingStart = start;
fire(memory);
}
}
return this;
},
// Remove a callback from the list
remove: function remove() {
if (list) {
jQuery.each(arguments, function (_, arg) {
var index;
while ((index = jQuery.inArray(arg, list, index)) > -1) {
list.splice(index, 1); // Handle firing indexes
if (firing) {
if (index <= firingLength) {
firingLength--;
}
if (index <= firingIndex) {
firingIndex--;
}
}
}
});
}
return this;
},
// Control if a given callback is in the list
has: function has(fn) {
return jQuery.inArray(fn, list) > -1;
},
// Remove all callbacks from the list
empty: function empty() {
list = [];
return this;
},
// Have the list do nothing anymore
disable: function disable() {
list = stack = memory = undefined;
return this;
},
// Is it disabled?
disabled: function disabled() {
return !list;
},
// Lock the list in its current state
lock: function lock() {
stack = undefined;
if (!memory) {
self.disable();
}
return this;
},
// Is it locked?
locked: function locked() {
return !stack;
},
// Call all callbacks with the given context and arguments
fireWith: function fireWith(context, args) {
args = args || [];
args = [context, args.slice ? args.slice() : args];
if (list && (!_fired || stack)) {
if (firing) {
stack.push(args);
} else {
fire(args);
}
}
return this;
},
// Call all the callbacks with the given arguments
fire: function fire() {
self.fireWith(this, arguments);
return this;
},
// To know if the callbacks have already been called at least once
fired: function fired() {
return !!_fired;
}
};
return self;
};
jQuery.extend({
Deferred: function Deferred(func) {
var tuples = [// action, add listener, listener list, final state
["resolve", "done", jQuery.Callbacks("once memory"), "resolved"], ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"], ["notify", "progress", jQuery.Callbacks("memory")]],
_state = "pending",
_promise = {
state: function state() {
return _state;
},
always: function always() {
deferred.done(arguments).fail(arguments);
return this;
},
then: function then()
/* fnDone, fnFail, fnProgress */
{
var fns = arguments;
return jQuery.Deferred(function (newDefer) {
jQuery.each(tuples, function (i, tuple) {
var action = tuple[0],
fn = fns[i]; // deferred[ done | fail | progress ] for forwarding actions to newDefer
deferred[tuple[1]](jQuery.isFunction(fn) ? function () {
var returned = fn.apply(this, arguments);
if (returned && jQuery.isFunction(returned.promise)) {
returned.promise().done(newDefer.resolve).fail(newDefer.reject).progress(newDefer.notify);
} else {
newDefer[action + "With"](this === deferred ? newDefer : this, [returned]);
}
} : newDefer[action]);
});
fns = null;
}).promise();
},
// Get a promise for this deferred
// If obj is provided, the promise aspect is added to the object
promise: function promise(obj) {
return _typeof(obj) === "object" ? jQuery.extend(obj, _promise) : _promise;
}
},
deferred = {}; // Keep pipe for back-compat
_promise.pipe = _promise.then; // Add list-specific methods
jQuery.each(tuples, function (i, tuple) {
var list = tuple[2],
stateString = tuple[3]; // promise[ done | fail | progress ] = list.add
_promise[tuple[1]] = list.add; // Handle state
if (stateString) {
list.add(function () {
// state = [ resolved | rejected ]
_state = stateString; // [ reject_list | resolve_list ].disable; progress_list.lock
}, tuples[i ^ 1][2].disable, tuples[2][2].lock);
} // deferred[ resolve | reject | notify ] = list.fire
deferred[tuple[0]] = list.fire;
deferred[tuple[0] + "With"] = list.fireWith;
}); // Make the deferred a promise
_promise.promise(deferred); // Call given func if any
if (func) {
func.call(deferred, deferred);
} // All done!
return deferred;
},
// Deferred helper
when: function when(subordinate
/* , ..., subordinateN */
) {
var i = 0,
resolveValues = core_slice.call(arguments),
length = resolveValues.length,
// the count of uncompleted subordinates
remaining = length !== 1 || subordinate && jQuery.isFunction(subordinate.promise) ? length : 0,
// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
// Update function for both resolve and progress values
updateFunc = function updateFunc(i, contexts, values) {
return function (value) {
contexts[i] = this;
values[i] = arguments.length > 1 ? core_slice.call(arguments) : value;
if (values === progressValues) {
deferred.notifyWith(contexts, values);
} else if (! --remaining) {
deferred.resolveWith(contexts, values);
}
};
},
progressValues,
progressContexts,
resolveContexts; // add listeners to Deferred subordinates; treat others as resolved
if (length > 1) {
progressValues = new Array(length);
progressContexts = new Array(length);
resolveContexts = new Array(length);
for (; i < length; i++) {
if (resolveValues[i] && jQuery.isFunction(resolveValues[i].promise)) {
resolveValues[i].promise().done(updateFunc(i, resolveContexts, resolveValues)).fail(deferred.reject).progress(updateFunc(i, progressContexts, progressValues));
} else {
--remaining;
}
}
} // if we're not waiting on anything, resolve the master
if (!remaining) {
deferred.resolveWith(resolveContexts, resolveValues);
}
return deferred.promise();
}
});
jQuery.support = function () {
var support,
all,
a,
select,
opt,
input,
fragment,
eventName,
i,
isSupported,
clickFn,
div = document.createElement("div"); // Preliminary tests
div.setAttribute("className", "t");
div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
all = div.getElementsByTagName("*");
a = div.getElementsByTagName("a")[0];
a.style.cssText = "top:1px;float:left;opacity:.5"; // Can't get basic test support
if (!all || !all.length || !a) {
return {};
} // First batch of supports tests
select = document.createElement("select");
opt = select.appendChild(document.createElement("option"));
input = div.getElementsByTagName("input")[0];
support = {
// IE strips leading whitespace when .innerHTML is used
leadingWhitespace: div.firstChild.nodeType === 3,
// Make sure that tbody elements aren't automatically inserted
// IE will insert them into empty tables
tbody: !div.getElementsByTagName("tbody").length,
// Make sure that link elements get serialized correctly by innerHTML
// This requires a wrapper element in IE
htmlSerialize: !!div.getElementsByTagName("link").length,
// Get the style information from getAttribute
// (IE uses .cssText instead)
style: /top/.test(a.getAttribute("style")),
// Make sure that URLs aren't manipulated
// (IE normalizes it by default)
hrefNormalized: a.getAttribute("href") === "/a",
// Make sure that element opacity exists
// (IE uses filter instead)
// Use a regex to work around a WebKit issue. See #5145
opacity: /^0.5/.test(a.style.opacity),
// Verify style float existence
// (IE uses styleFloat instead of cssFloat)
cssFloat: !!a.style.cssFloat,
// Make sure that if no value is specified for a checkbox
// that it defaults to "on".
// (WebKit defaults to "" instead)
checkOn: input.value === "on",
// Make sure that a selected-by-default option has a working selected property.
// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
optSelected: opt.selected,
// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
getSetAttribute: div.className !== "t",
// Tests for enctype support on a form(#6743)
enctype: !!document.createElement("form").enctype,
// Makes sure cloning an html5 element does not cause problems
// Where outerHTML is undefined, this still works
html5Clone: document.createElement("nav").cloneNode(true).outerHTML !== "<:nav></:nav>",
// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
boxModel: document.compatMode === "CSS1Compat",
// Will be defined later
submitBubbles: true,
changeBubbles: true,
focusinBubbles: false,
deleteExpando: true,
noCloneEvent: true,
inlineBlockNeedsLayout: false,
shrinkWrapBlocks: false,
reliableMarginRight: true,
boxSizingReliable: true,
pixelPosition: false
}; // Make sure checked status is properly cloned
input.checked = true;
support.noCloneChecked = input.cloneNode(true).checked; // Make sure that the options inside disabled selects aren't marked as disabled
// (WebKit marks them as disabled)
select.disabled = true;
support.optDisabled = !opt.disabled; // Test to see if it's possible to delete an expando from an element
// Fails in Internet Explorer
try {
delete div.test;
} catch (e) {
support.deleteExpando = false;
}
if (!div.addEventListener && div.attachEvent && div.fireEvent) {
div.attachEvent("onclick", clickFn = function clickFn() {
// Cloning a node shouldn't copy over any
// bound event handlers (IE does this)
support.noCloneEvent = false;
});
div.cloneNode(true).fireEvent("onclick");
div.detachEvent("onclick", clickFn);
} // Check if a radio maintains its value
// after being appended to the DOM
input = document.createElement("input");
input.value = "t";
input.setAttribute("type", "radio");
support.radioValue = input.value === "t";
input.setAttribute("checked", "checked"); // #11217 - WebKit loses check when the name is after the checked attribute
input.setAttribute("name", "t");
div.appendChild(input);
fragment = document.createDocumentFragment();
fragment.appendChild(div.lastChild); // WebKit doesn't clone checked state correctly in fragments
support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; // Check if a disconnected checkbox will retain its checked
// value of true after appended to the DOM (IE6/7)
support.appendChecked = input.checked;
fragment.removeChild(input);
fragment.appendChild(div); // Technique from Juriy Zaytsev
// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
// We only care about the case where non-standard event systems
// are used, namely in IE. Short-circuiting here helps us to
// avoid an eval call (in setAttribute) which can cause CSP
// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
if (div.attachEvent) {
for (i in {
submit: true,
change: true,
focusin: true
}) {
eventName = "on" + i;
isSupported = eventName in div;
if (!isSupported) {
div.setAttribute(eventName, "return;");
isSupported = typeof div[eventName] === "function";
}
support[i + "Bubbles"] = isSupported;
}
} // Run tests that need a body at doc ready
jQuery(function () {
var container,
div,
tds,
marginDiv,
divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
body = document.getElementsByTagName("body")[0];
if (!body) {
// Return for frameset docs that don't have a body
return;
}
container = document.createElement("div");
container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
body.insertBefore(container, body.firstChild); // Construct the test element
div = document.createElement("div");
container.appendChild(div); // Check if table cells still have offsetWidth/Height when they are set
// to display:none and there are still other visible table cells in a
// table row; if so, offsetWidth/Height are not reliable for use when
// determining if an element has been hidden directly using
// display:none (it is still safe to use offsets if a parent element is
// hidden; don safety goggles and see bug #4512 for more information).
// (only IE 8 fails this test)
div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
tds = div.getElementsByTagName("td");
tds[0].style.cssText = "padding:0;margin:0;border:0;display:none";
isSupported = tds[0].offsetHeight === 0;
tds[0].style.display = "";
tds[1].style.display = "none"; // Check if empty table cells still have offsetWidth/Height
// (IE <= 8 fail this test)
support.reliableHiddenOffsets = isSupported && tds[0].offsetHeight === 0; // Check box-sizing and margin behavior
div.innerHTML = "";
div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
support.boxSizing = div.offsetWidth === 4;
support.doesNotIncludeMarginInBodyOffset = body.offsetTop !== 1; // NOTE: To any future maintainer, we've window.getComputedStyle
// because jsdom on node.js will break without it.
if (window.getComputedStyle) {
support.pixelPosition = (window.getComputedStyle(div, null) || {}).top !== "1%";
support.boxSizingReliable = (window.getComputedStyle(div, null) || {
width: "4px"
}).width === "4px"; // Check if div with explicit width and no margin-right incorrectly
// gets computed margin-right based on width of container. For more
// info see bug #3333
// Fails in WebKit before Feb 2011 nightlies
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
marginDiv = document.createElement("div");
marginDiv.style.cssText = div.style.cssText = divReset;
marginDiv.style.marginRight = marginDiv.style.width = "0";
div.style.width = "1px";
div.appendChild(marginDiv);
support.reliableMarginRight = !parseFloat((window.getComputedStyle(marginDiv, null) || {}).marginRight);
}
if (typeof div.style.zoom !== "undefined") {
// Check if natively block-level elements act like inline-block
// elements when setting their display to 'inline' and giving
// them layout
// (IE < 8 does this)
div.innerHTML = "";
div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
support.inlineBlockNeedsLayout = div.offsetWidth === 3; // Check if elements with layout shrink-wrap their children
// (IE 6 does this)
div.style.display = "block";
div.style.overflow = "visible";
div.innerHTML = "<div></div>";
div.firstChild.style.width = "5px";
support.shrinkWrapBlocks = div.offsetWidth !== 3;
container.style.zoom = 1;
} // Null elements to avoid leaks in IE
body.removeChild(container);
container = div = tds = marginDiv = null;
}); // Null elements to avoid leaks in IE
fragment.removeChild(div);
all = a = select = opt = input = fragment = div = null;
return support;
}();
var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
rmultiDash = /([A-Z])/g;
jQuery.extend({
cache: {},
deletedIds: [],
// Please use with caution
uuid: 0,
// Unique for each copy of jQuery on the page
// Non-digits removed to match rinlinejQuery
expando: "jQuery" + (jQuery.fn.jquery + Math.random()).replace(/\D/g, ""),
// The following elements throw uncatchable exceptions if you
// attempt to add expando properties to them.
noData: {
"embed": true,
// Ban all objects except for Flash (which handle expandos)
"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
"applet": true
},
hasData: function hasData(elem) {
elem = elem.nodeType ? jQuery.cache[elem[jQuery.expando]] : elem[jQuery.expando];
return !!elem && !isEmptyDataObject(elem);
},
data: function data(elem, name, _data, pvt
/* Internal Use Only */
) {
if (!jQuery.acceptData(elem)) {
return;
}
var thisCache,
ret,
internalKey = jQuery.expando,
getByName = typeof name === "string",
// We have to handle DOM nodes and JS objects differently because IE6-7
// can't GC object references properly across the DOM-JS boundary
isNode = elem.nodeType,
// Only DOM nodes need the global jQuery cache; JS object data is
// attached directly to the object so GC can occur automatically
cache = isNode ? jQuery.cache : elem,
// Only defining an ID for JS objects if its cache already exists allows
// the code to shortcut on the same path as a DOM node with no cache
id = isNode ? elem[internalKey] : elem[internalKey] && internalKey; // Avoid doing any more work than we need to when trying to get data on an
// object that has no data at all
if ((!id || !cache[id] || !pvt && !cache[id].data) && getByName && _data === undefined) {
return;
}
if (!id) {
// Only DOM nodes need a new unique ID for each element since their data
// ends up in the global cache
if (isNode) {
elem[internalKey] = id = jQuery.deletedIds.pop() || ++jQuery.uuid;
} else {
id = internalKey;
}
}
if (!cache[id]) {
cache[id] = {}; // Avoids exposing jQuery metadata on plain JS objects when the object
// is serialized using JSON.stringify
if (!isNode) {
cache[id].toJSON = jQuery.noop;
}
} // An object can be passed to jQuery.data instead of a key/value pair; this gets
// shallow copied over onto the existing cache
if (_typeof(name) === "object" || typeof name === "function") {
if (pvt) {
cache[id] = jQuery.extend(cache[id], name);
} else {
cache[id].data = jQuery.extend(cache[id].data, name);
}
}
thisCache = cache[id]; // jQuery data() is stored in a separate object inside the object's internal data
// cache in order to avoid key collisions between internal data and user-defined
// data.
if (!pvt) {
if (!thisCache.data) {
thisCache.data = {};
}
thisCache = thisCache.data;
}
if (_data !== undefined) {
thisCache[jQuery.camelCase(name)] = _data;
} // Check for both converted-to-camel and non-converted data property names
// If a data property was specified
if (getByName) {
// First Try to find as-is property data
ret = thisCache[name]; // Test for null|undefined property data
if (ret == null) {
// Try to find the camelCased property
ret = thisCache[jQuery.camelCase(name)];
}
} else {
ret = thisCache;
}
return ret;
},
removeData: function removeData(elem, name, pvt
/* Internal Use Only */
) {
if (!jQuery.acceptData(elem)) {
return;
}
var thisCache,
i,
l,
isNode = elem.nodeType,
// See jQuery.data for more information
cache = isNode ? jQuery.cache : elem,
id = isNode ? elem[jQuery.expando] : jQuery.expando; // If there is already no cache entry for this object, there is no
// purpose in continuing
if (!cache[id]) {
return;
}
if (name) {
thisCache = pvt ? cache[id] : cache[id].data;
if (thisCache) {
// Support array or space separated string names for data keys
if (!jQuery.isArray(name)) {
// try the string as a key before any manipulation
if (name in thisCache) {
name = [name];
} else {
// split the camel cased version by spaces unless a key with the spaces exists
name = jQuery.camelCase(name);
if (name in thisCache) {
name = [name];
} else {
name = name.split(" ");
}
}
}
for (i = 0, l = name.length; i < l; i++) {
delete thisCache[name[i]];
} // If there is no data left in the cache, we want to continue
// and let the cache object itself get destroyed
if (!(pvt ? isEmptyDataObject : jQuery.isEmptyObject)(thisCache)) {
return;
}
}
} // See jQuery.data for more information
if (!pvt) {
delete cache[id].data; // Don't destroy the parent cache unless the internal data object
// had been the only thing left in it
if (!isEmptyDataObject(cache[id])) {
return;
}
} // Destroy the cache
if (isNode) {
jQuery.cleanData([elem], true); // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
} else if (jQuery.support.deleteExpando || cache != cache.window) {
delete cache[id]; // When all else fails, null
} else {
cache[id] = null;
}
},
// For internal use only.
_data: function _data(elem, name, data) {
return jQuery.data(elem, name, data, true);
},
// A method for determining if a DOM node can handle the data expando
acceptData: function acceptData(elem) {
var noData = elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]; // nodes accept data unless otherwise specified; rejection can be conditional
return !noData || noData !== true && elem.getAttribute("classid") === noData;
}
});
jQuery.fn.extend({
data: function data(key, value) {
var parts,
part,
attr,
name,
l,
elem = this[0],
i = 0,
data = null; // Gets all values
if (key === undefined) {
if (this.length) {
data = jQuery.data(elem);
if (elem.nodeType === 1 && !jQuery._data(elem, "parsedAttrs")) {
attr = elem.attributes;
for (l = attr.length; i < l; i++) {
name = attr[i].name;
if (name.indexOf("data-") === 0) {
name = jQuery.camelCase(name.substring(5));
dataAttr(elem, name, data[name]);
}
}
jQuery._data(elem, "parsedAttrs", true);
}
}
return data;
} // Sets multiple values
if (_typeof(key) === "object") {
return this.each(function () {
jQuery.data(this, key);
});
}
parts = key.split(".", 2);
parts[1] = parts[1] ? "." + parts[1] : "";
part = parts[1] + "!";
return jQuery.access(this, function (value) {
if (value === undefined) {
data = this.triggerHandler("getData" + part, [parts[0]]); // Try to fetch any internally stored data first
if (data === undefined && elem) {
data = jQuery.data(elem, key);
data = dataAttr(elem, key, data);
}
return data === undefined && parts[1] ? this.data(parts[0]) : data;
}
parts[1] = value;
this.each(function () {
var self = jQuery(this);
self.triggerHandler("setData" + part, parts);
jQuery.data(this, key, value);
self.triggerHandler("changeData" + part, parts);
});
}, null, value, arguments.length > 1, null, false);
},
removeData: function removeData(key) {
return this.each(function () {
jQuery.removeData(this, key);
});
}
});
function dataAttr(elem, key, data) {
// If nothing was found internally, try to fetch any
// data from the HTML5 data-* attribute
if (data === undefined && elem.nodeType === 1) {
var name = "data-" + key.replace(rmultiDash, "-$1").toLowerCase();
data = elem.getAttribute(name);
if (typeof data === "string") {
try {
data = data === "true" ? true : data === "false" ? false : data === "null" ? null : // Only convert to a number if it doesn't change the string
+data + "" === data ? +data : rbrace.test(data) ? jQuery.parseJSON(data) : data;
} catch (e) {} // Make sure we set the data so it isn't changed later
jQuery.data(elem, key, data);
} else {
data = undefined;
}
}
return data;
} // checks a cache object for emptiness
function isEmptyDataObject(obj) {
var name;
for (name in obj) {
// if the public data object is empty, the private is still empty
if (name === "data" && jQuery.isEmptyObject(obj[name])) {
continue;
}
if (name !== "toJSON") {
return false;
}
}
return true;
}
jQuery.extend({
queue: function queue(elem, type, data) {
var queue;
if (elem) {
type = (type || "fx") + "queue";
queue = jQuery._data(elem, type); // Speed up dequeue by getting out quickly if this is just a lookup
if (data) {
if (!queue || jQuery.isArray(data)) {
queue = jQuery._data(elem, type, jQuery.makeArray(data));
} else {
queue.push(data);
}
}
return queue || [];
}
},
dequeue: function dequeue(elem, type) {
type = type || "fx";
var queue = jQuery.queue(elem, type),
startLength = queue.length,
fn = queue.shift(),
hooks = jQuery._queueHooks(elem, type),
next = function next() {
jQuery.dequeue(elem, type);
}; // If the fx queue is dequeued, always remove the progress sentinel
if (fn === "inprogress") {
fn = queue.shift();
startLength--;
}
if (fn) {
// Add a progress sentinel to prevent the fx queue from being
// automatically dequeued
if (type === "fx") {
queue.unshift("inprogress");
} // clear up the last queue stop function
delete hooks.stop;
fn.call(elem, next, hooks);
}
if (!startLength && hooks) {
hooks.empty.fire();
}
},
// not intended for public consumption - generates a queueHooks object, or returns the current one
_queueHooks: function _queueHooks(elem, type) {
var key = type + "queueHooks";
return jQuery._data(elem, key) || jQuery._data(elem, key, {
empty: jQuery.Callbacks("once memory").add(function () {
jQuery.removeData(elem, type + "queue", true);
jQuery.removeData(elem, key, true);
})
});
}
});
jQuery.fn.extend({
queue: function queue(type, data) {
var setter = 2;
if (typeof type !== "string") {
data = type;
type = "fx";
setter--;
}
if (arguments.length < setter) {
return jQuery.queue(this[0], type);
}
return data === undefined ? this : this.each(function () {
var queue = jQuery.queue(this, type, data); // ensure a hooks for this queue
jQuery._queueHooks(this, type);
if (type === "fx" && queue[0] !== "inprogress") {
jQuery.dequeue(this, type);
}
});
},
dequeue: function dequeue(type) {
return this.each(function () {
jQuery.dequeue(this, type);
});
},
// Based off of the plugin by Clint Helfers, with permission.
// http://blindsignals.com/index.php/2009/07/jquery-delay/
delay: function delay(time, type) {
time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
type = type || "fx";
return this.queue(type, function (next, hooks) {
var timeout = setTimeout(next, time);
hooks.stop = function () {
clearTimeout(timeout);
};
});
},
clearQueue: function clearQueue(type) {
return this.queue(type || "fx", []);
},
// Get a promise resolved when queues of a certain type
// are emptied (fx is the type by default)
promise: function promise(type, obj) {
var tmp,
count = 1,
defer = jQuery.Deferred(),
elements = this,
i = this.length,
resolve = function resolve() {
if (! --count) {
defer.resolveWith(elements, [elements]);
}
};
if (typeof type !== "string") {
obj = type;
type = undefined;
}
type = type || "fx";
while (i--) {
tmp = jQuery._data(elements[i], type + "queueHooks");
if (tmp && tmp.empty) {
count++;
tmp.empty.add(resolve);
}
}
resolve();
return defer.promise(obj);
}
});
var nodeHook,
boolHook,
fixSpecified,
rclass = /[\t\r\n]/g,
rreturn = /\r/g,
rtype = /^(?:button|input)$/i,
rfocusable = /^(?:button|input|object|select|textarea)$/i,
rclickable = /^a(?:rea|)$/i,
rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
getSetAttribute = jQuery.support.getSetAttribute;
jQuery.fn.extend({
attr: function attr(name, value) {
return jQuery.access(this, jQuery.attr, name, value, arguments.length > 1);
},
removeAttr: function removeAttr(name) {
return this.each(function () {
jQuery.removeAttr(this, name);
});
},
prop: function prop(name, value) {
return jQuery.access(this, jQuery.prop, name, value, arguments.length > 1);
},
removeProp: function removeProp(name) {
name = jQuery.propFix[name] || name;
return this.each(function () {
// try/catch handles cases where IE balks (such as removing a property on window)
try {
this[name] = undefined;
delete this[name];
} catch (e) {}
});
},
addClass: function addClass(value) {
var classNames, i, l, elem, setClass, c, cl;
if (jQuery.isFunction(value)) {
return this.each(function (j) {
jQuery(this).addClass(value.call(this, j, this.className));
});
}
if (value && typeof value === "string") {
classNames = value.split(core_rspace);
for (i = 0, l = this.length; i < l; i++) {
elem = this[i];
if (elem.nodeType === 1) {
if (!elem.className && classNames.length === 1) {
elem.className = value;
} else {
setClass = " " + elem.className + " ";
for (c = 0, cl = classNames.length; c < cl; c++) {
if (!~setClass.indexOf(" " + classNames[c] + " ")) {
setClass += classNames[c] + " ";
}
}
elem.className = jQuery.trim(setClass);
}
}
}
}
return this;
},
removeClass: function removeClass(value) {
var removes, className, elem, c, cl, i, l;
if (jQuery.isFunction(value)) {
return this.each(function (j) {
jQuery(this).removeClass(value.call(this, j, this.className));
});
}
if (value && typeof value === "string" || value === undefined) {
removes = (value || "").split(core_rspace);
for (i = 0, l = this.length; i < l; i++) {
elem = this[i];
if (elem.nodeType === 1 && elem.className) {
className = (" " + elem.className + " ").replace(rclass, " "); // loop over each item in the removal list
for (c = 0, cl = removes.length; c < cl; c++) {
// Remove until there is nothing to remove,
while (className.indexOf(" " + removes[c] + " ") > -1) {
className = className.replace(" " + removes[c] + " ", " ");
}
}
elem.className = value ? jQuery.trim(className) : "";
}
}
}
return this;
},
toggleClass: function toggleClass(value, stateVal) {
var type = _typeof(value),
isBool = typeof stateVal === "boolean";
if (jQuery.isFunction(value)) {
return this.each(function (i) {
jQuery(this).toggleClass(value.call(this, i, this.className, stateVal), stateVal);
});
}
return this.each(function () {
if (type === "string") {
// toggle individual class names
var className,
i = 0,
self = jQuery(this),
state = stateVal,
classNames = value.split(core_rspace);
while (className = classNames[i++]) {
// check each className given, space separated list
state = isBool ? state : !self.hasClass(className);
self[state ? "addClass" : "removeClass"](className);
}
} else if (type === "undefined" || type === "boolean") {
if (this.className) {
// store className if set
jQuery._data(this, "__className__", this.className);
} // toggle whole className
this.className = this.className || value === false ? "" : jQuery._data(this, "__className__") || "";
}
});
},
hasClass: function hasClass(selector) {
var className = " " + selector + " ",
i = 0,
l = this.length;
for (; i < l; i++) {
if (this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf(className) > -1) {
return true;
}
}
return false;
},
val: function val(value) {
var hooks,
ret,
isFunction,
elem = this[0];
if (!arguments.length) {
if (elem) {
hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()];
if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) {
return ret;
}
ret = elem.value;
return typeof ret === "string" ? // handle most common string cases
ret.replace(rreturn, "") : // handle cases where value is null/undef or number
ret == null ? "" : ret;
}
return;
}
isFunction = jQuery.isFunction(value);
return this.each(function (i) {
var val,
self = jQuery(this);
if (this.nodeType !== 1) {
return;
}
if (isFunction) {
val = value.call(this, i, self.val());
} else {
val = value;
} // Treat null/undefined as ""; convert numbers to string
if (val == null) {
val = "";
} else if (typeof val === "number") {
val += "";
} else if (jQuery.isArray(val)) {
val = jQuery.map(val, function (value) {
return value == null ? "" : value + "";
});
}
hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()]; // If set returns undefined, fall back to normal setting
if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) {
this.value = val;
}
});
}
});
jQuery.extend({
valHooks: {
option: {
get: function get(elem) {
// attributes.value is undefined in Blackberry 4.7 but
// uses .value. See #6932
var val = elem.attributes.value;
return !val || val.specified ? elem.value : elem.text;
}
},
select: {
get: function get(elem) {
var value,
i,
max,
option,
index = elem.selectedIndex,
values = [],
options = elem.options,
one = elem.type === "select-one"; // Nothing was selected
if (index < 0) {
return null;
} // Loop through all the selected options
i = one ? index : 0;
max = one ? index + 1 : options.length;
for (; i < max; i++) {
option = options[i]; // Don't return options that are disabled or in a disabled optgroup
if (option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName(option.parentNode, "optgroup"))) {
// Get the specific value for the option
value = jQuery(option).val(); // We don't need an array for one selects
if (one) {
return value;
} // Multi-Selects return an array
values.push(value);
}
} // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
if (one && !values.length && options.length) {
return jQuery(options[index]).val();
}
return values;
},
set: function set(elem, value) {
var values = jQuery.makeArray(value);
jQuery(elem).find("option").each(function () {
this.selected = jQuery.inArray(jQuery(this).val(), values) >= 0;
});
if (!values.length) {
elem.selectedIndex = -1;
}
return values;
}
}
},
// Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
attrFn: {},
attr: function attr(elem, name, value, pass) {
var ret,
hooks,
notxml,
nType = elem.nodeType; // don't get/set attributes on text, comment and attribute nodes
if (!elem || nType === 3 || nType === 8 || nType === 2) {
return;
}
if (pass && jQuery.isFunction(jQuery.fn[name])) {
return jQuery(elem)[name](value);
} // Fallback to prop when attributes are not supported
if (typeof elem.getAttribute === "undefined") {
return jQuery.prop(elem, name, value);
}
notxml = nType !== 1 || !jQuery.isXMLDoc(elem); // All attributes are lowercase
// Grab necessary hook if one is defined
if (notxml) {
name = name.toLowerCase();
hooks = jQuery.attrHooks[name] || (rboolean.test(name) ? boolHook : nodeHook);
}
if (value !== undefined) {
if (value === null) {
jQuery.removeAttr(elem, name);
return;
} else if (hooks && "set" in hooks && notxml && (ret = hooks.set(elem, value, name)) !== undefined) {
return ret;
} else {
elem.setAttribute(name, "" + value);
return value;
}
} else if (hooks && "get" in hooks && notxml && (ret = hooks.get(elem, name)) !== null) {
return ret;
} else {
ret = elem.getAttribute(name); // Non-existent attributes return null, we normalize to undefined
return ret === null ? undefined : ret;
}
},
removeAttr: function removeAttr(elem, value) {
var propName,
attrNames,
name,
isBool,
i = 0;
if (value && elem.nodeType === 1) {
attrNames = value.split(core_rspace);
for (; i < attrNames.length; i++) {
name = attrNames[i];
if (name) {
propName = jQuery.propFix[name] || name;
isBool = rboolean.test(name); // See #9699 for explanation of this approach (setting first, then removal)
// Do not do this for boolean attributes (see #10870)
if (!isBool) {
jQuery.attr(elem, name, "");
}
elem.removeAttribute(getSetAttribute ? name : propName); // Set corresponding property to false for boolean attributes
if (isBool && propName in elem) {
elem[propName] = false;
}
}
}
}
},
attrHooks: {
type: {
set: function set(elem, value) {
// We can't allow the type property to be changed (since it causes problems in IE)
if (rtype.test(elem.nodeName) && elem.parentNode) {
jQuery.error("type property can't be changed");
} else if (!jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input")) {
// Setting the type on a radio button after the value resets the value in IE6-9
// Reset value to it's default in case type is set after value
// This is for element creation
var val = elem.value;
elem.setAttribute("type", value);
if (val) {
elem.value = val;
}
return value;
}
}
},
// Use the value property for back compat
// Use the nodeHook for button elements in IE6/7 (#1954)
value: {
get: function get(elem, name) {
if (nodeHook && jQuery.nodeName(elem, "button")) {
return nodeHook.get(elem, name);
}
return name in elem ? elem.value : null;
},
set: function set(elem, value, name) {
if (nodeHook && jQuery.nodeName(elem, "button")) {
return nodeHook.set(elem, value, name);
} // Does not return so that setAttribute is also used
elem.value = value;
}
}
},
propFix: {
tabindex: "tabIndex",
readonly: "readOnly",
"for": "htmlFor",
"class": "className",
maxlength: "maxLength",
cellspacing: "cellSpacing",
cellpadding: "cellPadding",
rowspan: "rowSpan",
colspan: "colSpan",
usemap: "useMap",
frameborder: "frameBorder",
contenteditable: "contentEditable"
},
prop: function prop(elem, name, value) {
var ret,
hooks,
notxml,
nType = elem.nodeType; // don't get/set properties on text, comment and attribute nodes
if (!elem || nType === 3 || nType === 8 || nType === 2) {
return;
}
notxml = nType !== 1 || !jQuery.isXMLDoc(elem);
if (notxml) {
// Fix name and attach hooks
name = jQuery.propFix[name] || name;
hooks = jQuery.propHooks[name];
}
if (value !== undefined) {
if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) {
return ret;
} else {
return elem[name] = value;
}
} else {
if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
return ret;
} else {
return elem[name];
}
}
},
propHooks: {
tabIndex: {
get: function get(elem) {
// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
var attributeNode = elem.getAttributeNode("tabindex");
return attributeNode && attributeNode.specified ? parseInt(attributeNode.value, 10) : rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href ? 0 : undefined;
}
}
}
}); // Hook for boolean attributes
boolHook = {
get: function get(elem, name) {
// Align boolean attributes with corresponding properties
// Fall back to attribute presence where some booleans are not supported
var attrNode,
property = jQuery.prop(elem, name);
return property === true || typeof property !== "boolean" && (attrNode = elem.getAttributeNode(name)) && attrNode.nodeValue !== false ? name.toLowerCase() : undefined;
},
set: function set(elem, value, name) {
var propName;
if (value === false) {
// Remove boolean attributes when set to false
jQuery.removeAttr(elem, name);
} else {
// value is true since we know at this point it's type boolean and not false
// Set boolean attributes to the same name and set the DOM property
propName = jQuery.propFix[name] || name;
if (propName in elem) {
// Only set the IDL specifically if it already exists on the element
elem[propName] = true;
}
elem.setAttribute(name, name.toLowerCase());
}
return name;
}
}; // IE6/7 do not support getting/setting some attributes with get/setAttribute
if (!getSetAttribute) {
fixSpecified = {
name: true,
id: true,
coords: true
}; // Use this for any attribute in IE6/7
// This fixes almost every IE6/7 issue
nodeHook = jQuery.valHooks.button = {
get: function get(elem, name) {
var ret;
ret = elem.getAttributeNode(name);
return ret && (fixSpecified[name] ? ret.value !== "" : ret.specified) ? ret.value : undefined;
},
set: function set(elem, value, name) {
// Set the existing or create a new attribute node
var ret = elem.getAttributeNode(name);
if (!ret) {
ret = document.createAttribute(name);
elem.setAttributeNode(ret);
}
return ret.value = value + "";
}
}; // Set width and height to auto instead of 0 on empty string( Bug #8150 )
// This is for removals
jQuery.each(["width", "height"], function (i, name) {
jQuery.attrHooks[name] = jQuery.extend(jQuery.attrHooks[name], {
set: function set(elem, value) {
if (value === "") {
elem.setAttribute(name, "auto");
return value;
}
}
});
}); // Set contenteditable to false on removals(#10429)
// Setting to empty string throws an error as an invalid value
jQuery.attrHooks.contenteditable = {
get: nodeHook.get,
set: function set(elem, value, name) {
if (value === "") {
value = "false";
}
nodeHook.set(elem, value, name);
}
};
} // Some attributes require a special call on IE
if (!jQuery.support.hrefNormalized) {
jQuery.each(["href", "src", "width", "height"], function (i, name) {
jQuery.attrHooks[name] = jQuery.extend(jQuery.attrHooks[name], {
get: function get(elem) {
var ret = elem.getAttribute(name, 2);
return ret === null ? undefined : ret;
}
});
});
}
if (!jQuery.support.style) {
jQuery.attrHooks.style = {
get: function get(elem) {
// Return undefined in the case of empty string
// Normalize to lowercase since IE uppercases css property names
return elem.style.cssText.toLowerCase() || undefined;
},
set: function set(elem, value) {
return elem.style.cssText = "" + value;
}
};
} // Safari mis-reports the default selected property of an option
// Accessing the parent's selectedIndex property fixes it
if (!jQuery.support.optSelected) {
jQuery.propHooks.selected = jQuery.extend(jQuery.propHooks.selected, {
get: function get(elem) {
var parent = elem.parentNode;
if (parent) {
parent.selectedIndex; // Make sure that it also works with optgroups, see #5701
if (parent.parentNode) {
parent.parentNode.selectedIndex;
}
}
return null;
}
});
} // IE6/7 call enctype encoding
if (!jQuery.support.enctype) {
jQuery.propFix.enctype = "encoding";
} // Radios and checkboxes getter/setter
if (!jQuery.support.checkOn) {
jQuery.each(["radio", "checkbox"], function () {
jQuery.valHooks[this] = {
get: function get(elem) {
// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
return elem.getAttribute("value") === null ? "on" : elem.value;
}
};
});
}
jQuery.each(["radio", "checkbox"], function () {
jQuery.valHooks[this] = jQuery.extend(jQuery.valHooks[this], {
set: function set(elem, value) {
if (jQuery.isArray(value)) {
return elem.checked = jQuery.inArray(jQuery(elem).val(), value) >= 0;
}
}
});
});
var rformElems = /^(?:textarea|input|select)$/i,
rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
rkeyEvent = /^key/,
rmouseEvent = /^(?:mouse|contextmenu)|click/,
rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
hoverHack = function hoverHack(events) {
return jQuery.event.special.hover ? events : events.replace(rhoverHack, "mouseenter$1 mouseleave$1");
};
/*
* Helper functions for managing events -- not part of the public interface.
* Props to Dean Edwards' addEvent library for many of the ideas.
*/
jQuery.event = {
add: function add(elem, types, handler, data, selector) {
var elemData, _eventHandle, events, t, tns, type, namespaces, handleObj, handleObjIn, handlers, special; // Don't attach events to noData or text/comment nodes (allow plain objects tho)
if (elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data(elem))) {
return;
} // Caller can pass in an object of custom data in lieu of the handler
if (handler.handler) {
handleObjIn = handler;
handler = handleObjIn.handler;
selector = handleObjIn.selector;
} // Make sure that the handler has a unique ID, used to find/remove it later
if (!handler.guid) {
handler.guid = jQuery.guid++;
} // Init the element's event structure and main handler, if this is the first
events = elemData.events;
if (!events) {
elemData.events = events = {};
}
_eventHandle = elemData.handle;
if (!_eventHandle) {
elemData.handle = _eventHandle = function eventHandle(e) {
// Discard the second event of a jQuery.event.trigger() and
// when an event is called after a page has unloaded
return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply(_eventHandle.elem, arguments) : undefined;
}; // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
_eventHandle.elem = elem;
} // Handle multiple events separated by a space
// jQuery(...).bind("mouseover mouseout", fn);
types = jQuery.trim(hoverHack(types)).split(" ");
for (t = 0; t < types.length; t++) {
tns = rtypenamespace.exec(types[t]) || [];
type = tns[1];
namespaces = (tns[2] || "").split(".").sort(); // If event changes its type, use the special event handlers for the changed type
special = jQuery.event.special[type] || {}; // If selector defined, determine special event api type, otherwise given type
type = (selector ? special.delegateType : special.bindType) || type; // Update special based on newly reset type
special = jQuery.event.special[type] || {}; // handleObj is passed to all event handlers
handleObj = jQuery.extend({
type: type,
origType: tns[1],
data: data,
handler: handler,
guid: handler.guid,
selector: selector,
namespace: namespaces.join(".")
}, handleObjIn); // Init the event handler queue if we're the first
handlers = events[type];
if (!handlers) {
handlers = events[type] = [];
handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false
if (!special.setup || special.setup.call(elem, data, namespaces, _eventHandle) === false) {
// Bind the global event handler to the element
if (elem.addEventListener) {
elem.addEventListener(type, _eventHandle, false);
} else if (elem.attachEvent) {
elem.attachEvent("on" + type, _eventHandle);
}
}
}
if (special.add) {
special.add.call(elem, handleObj);
if (!handleObj.handler.guid) {
handleObj.handler.guid = handler.guid;
}
} // Add to the element's handler list, delegates in front
if (selector) {
handlers.splice(handlers.delegateCount++, 0, handleObj);
} else {
handlers.push(handleObj);
} // Keep track of which events have ever been used, for event optimization
jQuery.event.global[type] = true;
} // Nullify elem to prevent memory leaks in IE
elem = null;
},
global: {},
// Detach an event or set of events from an element
remove: function remove(elem, types, handler, selector, mappedTypes) {
var t,
tns,
type,
origType,
namespaces,
origCount,
j,
events,
special,
eventType,
handleObj,
elemData = jQuery.hasData(elem) && jQuery._data(elem);
if (!elemData || !(events = elemData.events)) {
return;
} // Once for each type.namespace in types; type may be omitted
types = jQuery.trim(hoverHack(types || "")).split(" ");
for (t = 0; t < types.length; t++) {
tns = rtypenamespace.exec(types[t]) || [];
type = origType = tns[1];
namespaces = tns[2]; // Unbind all events (on this namespace, if provided) for the element
if (!type) {
for (type in events) {
jQuery.event.remove(elem, type + types[t], handler, selector, true);
}
continue;
}
special = jQuery.event.special[type] || {};
type = (selector ? special.delegateType : special.bindType) || type;
eventType = events[type] || [];
origCount = eventType.length;
namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null; // Remove matching events
for (j = 0; j < eventType.length; j++) {
handleObj = eventType[j];
if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!namespaces || namespaces.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) {
eventType.splice(j--, 1);
if (handleObj.selector) {
eventType.delegateCount--;
}
if (special.remove) {
special.remove.call(elem, handleObj);
}
}
} // Remove generic event handler if we removed something and no more handlers exist
// (avoids potential for endless recursion during removal of special event handlers)
if (eventType.length === 0 && origCount !== eventType.length) {
if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {
jQuery.removeEvent(elem, type, elemData.handle);
}
delete events[type];
}
} // Remove the expando if it's no longer used
if (jQuery.isEmptyObject(events)) {
delete elemData.handle; // removeData also checks for emptiness and clears the expando if empty
// so use it instead of delete
jQuery.removeData(elem, "events", true);
}
},
// Events that are safe to short-circuit if no handlers are attached.
// Native DOM events should not be added, they may have inline handlers.
customEvent: {
"getData": true,
"setData": true,
"changeData": true
},
trigger: function trigger(event, data, elem, onlyHandlers) {
// Don't do events on text and comment nodes
if (elem && (elem.nodeType === 3 || elem.nodeType === 8)) {
return;
} // Event object or event type
var cache,
exclusive,
i,
cur,
old,
ontype,
special,
handle,
eventPath,
bubbleType,
type = event.type || event,
namespaces = []; // focus/blur morphs to focusin/out; ensure we're not firing them right now
if (rfocusMorph.test(type + jQuery.event.triggered)) {
return;
}
if (type.indexOf("!") >= 0) {
// Exclusive events trigger only for the exact event (no namespaces)
type = type.slice(0, -1);
exclusive = true;
}
if (type.indexOf(".") >= 0) {
// Namespaced trigger; create a regexp to match event type in handle()
namespaces = type.split(".");
type = namespaces.shift();
namespaces.sort();
}
if ((!elem || jQuery.event.customEvent[type]) && !jQuery.event.global[type]) {
// No jQuery handlers for this event type, and it can't have inline handlers
return;
} // Caller can pass in an Event, Object, or just an event type string
event = _typeof(event) === "object" ? // jQuery.Event object
event[jQuery.expando] ? event : // Object literal
new jQuery.Event(type, event) : // Just the event type (string)
new jQuery.Event(type);
event.type = type;
event.isTrigger = true;
event.exclusive = exclusive;
event.namespace = namespaces.join(".");
event.namespace_re = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
ontype = type.indexOf(":") < 0 ? "on" + type : ""; // Handle a global trigger
if (!elem) {
// TODO: Stop taunting the data cache; remove global events and always attach to document
cache = jQuery.cache;
for (i in cache) {
if (cache[i].events && cache[i].events[type]) {
jQuery.event.trigger(event, data, cache[i].handle.elem, true);
}
}
return;
} // Clean up the event in case it is being reused
event.result = undefined;
if (!event.target) {
event.target = elem;
} // Clone any incoming data and prepend the event, creating the handler arg list
data = data != null ? jQuery.makeArray(data) : [];
data.unshift(event); // Allow special events to draw outside the lines
special = jQuery.event.special[type] || {};
if (special.trigger && special.trigger.apply(elem, data) === false) {
return;
} // Determine event propagation path in advance, per W3C events spec (#9951)
// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
eventPath = [[elem, special.bindType || type]];
if (!onlyHandlers && !special.noBubble && !jQuery.isWindow(elem)) {
bubbleType = special.delegateType || type;
cur = rfocusMorph.test(bubbleType + type) ? elem : elem.parentNode;
for (old = elem; cur; cur = cur.parentNode) {
eventPath.push([cur, bubbleType]);
old = cur;
} // Only add window if we got to document (e.g., not plain obj or detached DOM)
if (old === (elem.ownerDocument || document)) {
eventPath.push([old.defaultView || old.parentWindow || window, bubbleType]);
}
} // Fire handlers on the event path
for (i = 0; i < eventPath.length && !event.isPropagationStopped(); i++) {
cur = eventPath[i][0];
event.type = eventPath[i][1];
handle = (jQuery._data(cur, "events") || {})[event.type] && jQuery._data(cur, "handle");
if (handle) {
handle.apply(cur, data);
} // Note that this is a bare JS function and not a jQuery handler
handle = ontype && cur[ontype];
if (handle && jQuery.acceptData(cur) && handle.apply(cur, data) === false) {
event.preventDefault();
}
}
event.type = type; // If nobody prevented the default action, do it now
if (!onlyHandlers && !event.isDefaultPrevented()) {
if ((!special._default || special._default.apply(elem.ownerDocument, data) === false) && !(type === "click" && jQuery.nodeName(elem, "a")) && jQuery.acceptData(elem)) {
// Call a native DOM method on the target with the same name name as the event.
// Can't use an .isFunction() check here because IE6/7 fails that test.
// Don't do default actions on window, that's where global variables be (#6170)
// IE<9 dies on focus/blur to hidden element (#1486)
if (ontype && elem[type] && (type !== "focus" && type !== "blur" || event.target.offsetWidth !== 0) && !jQuery.isWindow(elem)) {
// Don't re-trigger an onFOO event when we call its FOO() method
old = elem[ontype];
if (old) {
elem[ontype] = null;
} // Prevent re-triggering of the same event, since we already bubbled it above
jQuery.event.triggered = type;
elem[type]();
jQuery.event.triggered = undefined;
if (old) {
elem[ontype] = old;
}
}
}
}
return event.result;
},
dispatch: function dispatch(event) {
// Make a writable jQuery.Event from the native event object
event = jQuery.event.fix(event || window.event);
var i,
j,
cur,
ret,
selMatch,
matched,
matches,
handleObj,
sel,
related,
handlers = (jQuery._data(this, "events") || {})[event.type] || [],
delegateCount = handlers.delegateCount,
args = [].slice.call(arguments),
run_all = !event.exclusive && !event.namespace,
special = jQuery.event.special[event.type] || {},
handlerQueue = []; // Use the fix-ed jQuery.Event rather than the (read-only) native event
args[0] = event;
event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired
if (special.preDispatch && special.preDispatch.call(this, event) === false) {
return;
} // Determine handlers that should run if there are delegated events
// Avoid non-left-click bubbling in Firefox (#3861)
if (delegateCount && !(event.button && event.type === "click")) {
for (cur = event.target; cur != this; cur = cur.parentNode || this) {
// Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
if (cur.disabled !== true || event.type !== "click") {
selMatch = {};
matches = [];
for (i = 0; i < delegateCount; i++) {
handleObj = handlers[i];
sel = handleObj.selector;
if (selMatch[sel] === undefined) {
selMatch[sel] = jQuery(sel, this).index(cur) >= 0;
}
if (selMatch[sel]) {
matches.push(handleObj);
}
}
if (matches.length) {
handlerQueue.push({
elem: cur,
matches: matches
});
}
}
}
} // Add the remaining (directly-bound) handlers
if (handlers.length > delegateCount) {
handlerQueue.push({
elem: this,
matches: handlers.slice(delegateCount)
});
} // Run delegates first; they may want to stop propagation beneath us
for (i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++) {
matched = handlerQueue[i];
event.currentTarget = matched.elem;
for (j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++) {
handleObj = matched.matches[j]; // Triggered event must either 1) be non-exclusive and have no namespace, or
// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
if (run_all || !event.namespace && !handleObj.namespace || event.namespace_re && event.namespace_re.test(handleObj.namespace)) {
event.data = handleObj.data;
event.handleObj = handleObj;
ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args);
if (ret !== undefined) {
event.result = ret;
if (ret === false) {
event.preventDefault();
event.stopPropagation();
}
}
}
}
} // Call the postDispatch hook for the mapped type
if (special.postDispatch) {
special.postDispatch.call(this, event);
}
return event.result;
},
// Includes some event props shared by KeyEvent and MouseEvent
// *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
fixHooks: {},
keyHooks: {
props: "char charCode key keyCode".split(" "),
filter: function filter(event, original) {
// Add which for key events
if (event.which == null) {
event.which = original.charCode != null ? original.charCode : original.keyCode;
}
return event;
}
},
mouseHooks: {
props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
filter: function filter(event, original) {
var eventDoc,
doc,
body,
button = original.button,
fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available
if (event.pageX == null && original.clientX != null) {
eventDoc = event.target.ownerDocument || document;
doc = eventDoc.documentElement;
body = eventDoc.body;
event.pageX = original.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
event.pageY = original.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
} // Add relatedTarget, if necessary
if (!event.relatedTarget && fromElement) {
event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
} // Add which for click: 1 === left; 2 === middle; 3 === right
// Note: button is not normalized, so don't use it
if (!event.which && button !== undefined) {
event.which = button & 1 ? 1 : button & 2 ? 3 : button & 4 ? 2 : 0;
}
return event;
}
},
fix: function fix(event) {
if (event[jQuery.expando]) {
return event;
} // Create a writable copy of the event object and normalize some properties
var i,
prop,
originalEvent = event,
fixHook = jQuery.event.fixHooks[event.type] || {},
copy = fixHook.props ? this.props.concat(fixHook.props) : this.props;
event = jQuery.Event(originalEvent);
for (i = copy.length; i;) {
prop = copy[--i];
event[prop] = originalEvent[prop];
} // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
if (!event.target) {
event.target = originalEvent.srcElement || document;
} // Target should not be a text node (#504, Safari)
if (event.target.nodeType === 3) {
event.target = event.target.parentNode;
} // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
event.metaKey = !!event.metaKey;
return fixHook.filter ? fixHook.filter(event, originalEvent) : event;
},
special: {
load: {
// Prevent triggered image.load events from bubbling to window.load
noBubble: true
},
focus: {
delegateType: "focusin"
},
blur: {
delegateType: "focusout"
},
beforeunload: {
setup: function setup(data, namespaces, eventHandle) {
// We only want to do this special case on windows
if (jQuery.isWindow(this)) {
this.onbeforeunload = eventHandle;
}
},
teardown: function teardown(namespaces, eventHandle) {
if (this.onbeforeunload === eventHandle) {
this.onbeforeunload = null;
}
}
}
},
simulate: function simulate(type, elem, event, bubble) {
// Piggyback on a donor event to simulate a different one.
// Fake originalEvent to avoid donor's stopPropagation, but if the
// simulated event prevents default then we do the same on the donor.
var e = jQuery.extend(new jQuery.Event(), event, {
type: type,
isSimulated: true,
originalEvent: {}
});
if (bubble) {
jQuery.event.trigger(e, null, elem);
} else {
jQuery.event.dispatch.call(elem, e);
}
if (e.isDefaultPrevented()) {
event.preventDefault();
}
}
}; // Some plugins are using, but it's undocumented/deprecated and will be removed.
// The 1.7 special event interface should provide all the hooks needed now.
jQuery.event.handle = jQuery.event.dispatch;
jQuery.removeEvent = document.removeEventListener ? function (elem, type, handle) {
if (elem.removeEventListener) {
elem.removeEventListener(type, handle, false);
}
} : function (elem, type, handle) {
var name = "on" + type;
if (elem.detachEvent) {
// #8545, #7054, preventing memory leaks for custom events in IE6-8
// detachEvent needed property on element, by name of that event, to properly expose it to GC
if (typeof elem[name] === "undefined") {
elem[name] = null;
}
elem.detachEvent(name, handle);
}
};
jQuery.Event = function (src, props) {
// Allow instantiation without the 'new' keyword
if (!(this instanceof jQuery.Event)) {
return new jQuery.Event(src, props);
} // Event object
if (src && src.type) {
this.originalEvent = src;
this.type = src.type; // Events bubbling up the document may have been marked as prevented
// by a handler lower down the tree; reflect the correct value.
this.isDefaultPrevented = src.defaultPrevented || src.returnValue === false || src.getPreventDefault && src.getPreventDefault() ? returnTrue : returnFalse; // Event type
} else {
this.type = src;
} // Put explicitly provided properties onto the event object
if (props) {
jQuery.extend(this, props);
} // Create a timestamp if incoming event doesn't have one
this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed
this[jQuery.expando] = true;
};
function returnFalse() {
return false;
}
function returnTrue() {
return true;
} // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
jQuery.Event.prototype = {
preventDefault: function preventDefault() {
this.isDefaultPrevented = returnTrue;
var e = this.originalEvent;
if (!e) {
return;
} // if preventDefault exists run it on the original event
if (e.preventDefault) {
e.preventDefault(); // otherwise set the returnValue property of the original event to false (IE)
} else {
e.returnValue = false;
}
},
stopPropagation: function stopPropagation() {
this.isPropagationStopped = returnTrue;
var e = this.originalEvent;
if (!e) {
return;
} // if stopPropagation exists run it on the original event
if (e.stopPropagation) {
e.stopPropagation();
} // otherwise set the cancelBubble property of the original event to true (IE)
e.cancelBubble = true;
},
stopImmediatePropagation: function stopImmediatePropagation() {
this.isImmediatePropagationStopped = returnTrue;
this.stopPropagation();
},
isDefaultPrevented: returnFalse,
isPropagationStopped: returnFalse,
isImmediatePropagationStopped: returnFalse
}; // Create mouseenter/leave events using mouseover/out and event-time checks
jQuery.each({
mouseenter: "mouseover",
mouseleave: "mouseout"
}, function (orig, fix) {
jQuery.event.special[orig] = {
delegateType: fix,
bindType: fix,
handle: function handle(event) {
var ret,
target = this,
related = event.relatedTarget,
handleObj = event.handleObj,
selector = handleObj.selector; // For mousenter/leave call the handler if related is outside the target.
// NB: No relatedTarget if the mouse left/entered the browser window
if (!related || related !== target && !jQuery.contains(target, related)) {
event.type = handleObj.origType;
ret = handleObj.handler.apply(this, arguments);
event.type = fix;
}
return ret;
}
};
}); // IE submit delegation
if (!jQuery.support.submitBubbles) {
jQuery.event.special.submit = {
setup: function setup() {
// Only need this for delegated form submit events
if (jQuery.nodeName(this, "form")) {
return false;
} // Lazy-add a submit handler when a descendant form may potentially be submitted
jQuery.event.add(this, "click._submit keypress._submit", function (e) {
// Node name check avoids a VML-related crash in IE (#9807)
var elem = e.target,
form = jQuery.nodeName(elem, "input") || jQuery.nodeName(elem, "button") ? elem.form : undefined;
if (form && !jQuery._data(form, "_submit_attached")) {
jQuery.event.add(form, "submit._submit", function (event) {
event._submit_bubble = true;
});
jQuery._data(form, "_submit_attached", true);
}
}); // return undefined since we don't need an event listener
},
postDispatch: function postDispatch(event) {
// If form was submitted by the user, bubble the event up the tree
if (event._submit_bubble) {
delete event._submit_bubble;
if (this.parentNode && !event.isTrigger) {
jQuery.event.simulate("submit", this.parentNode, event, true);
}
}
},
teardown: function teardown() {
// Only need this for delegated form submit events
if (jQuery.nodeName(this, "form")) {
return false;
} // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
jQuery.event.remove(this, "._submit");
}
};
} // IE change delegation and checkbox/radio fix
if (!jQuery.support.changeBubbles) {
jQuery.event.special.change = {
setup: function setup() {
if (rformElems.test(this.nodeName)) {
// IE doesn't fire change on a check/radio until blur; trigger it on click
// after a propertychange. Eat the blur-change in special.change.handle.
// This still fires onchange a second time for check/radio after blur.
if (this.type === "checkbox" || this.type === "radio") {
jQuery.event.add(this, "propertychange._change", function (event) {
if (event.originalEvent.propertyName === "checked") {
this._just_changed = true;
}
});
jQuery.event.add(this, "click._change", function (event) {
if (this._just_changed && !event.isTrigger) {
this._just_changed = false;
} // Allow triggered, simulated change events (#11500)
jQuery.event.simulate("change", this, event, true);
});
}
return false;
} // Delegated event; lazy-add a change handler on descendant inputs
jQuery.event.add(this, "beforeactivate._change", function (e) {
var elem = e.target;
if (rformElems.test(elem.nodeName) && !jQuery._data(elem, "_change_attached")) {
jQuery.event.add(elem, "change._change", function (event) {
if (this.parentNode && !event.isSimulated && !event.isTrigger) {
jQuery.event.simulate("change", this.parentNode, event, true);
}
});
jQuery._data(elem, "_change_attached", true);
}
});
},
handle: function handle(event) {
var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above
if (this !== elem || event.isSimulated || event.isTrigger || elem.type !== "radio" && elem.type !== "checkbox") {
return event.handleObj.handler.apply(this, arguments);
}
},
teardown: function teardown() {
jQuery.event.remove(this, "._change");
return !rformElems.test(this.nodeName);
}
};
} // Create "bubbling" focus and blur events
if (!jQuery.support.focusinBubbles) {
jQuery.each({
focus: "focusin",
blur: "focusout"
}, function (orig, fix) {
// Attach a single capturing handler while someone wants focusin/focusout
var attaches = 0,
handler = function handler(event) {
jQuery.event.simulate(fix, event.target, jQuery.event.fix(event), true);
};
jQuery.event.special[fix] = {
setup: function setup() {
if (attaches++ === 0) {
document.addEventListener(orig, handler, true);
}
},
teardown: function teardown() {
if (--attaches === 0) {
document.removeEventListener(orig, handler, true);
}
}
};
});
}
jQuery.fn.extend({
on: function on(types, selector, data, fn,
/*INTERNAL*/
one) {
var origFn, type; // Types can be a map of types/handlers
if (_typeof(types) === "object") {
// ( types-Object, selector, data )
if (typeof selector !== "string") {
// && selector != null
// ( types-Object, data )
data = data || selector;
selector = undefined;
}
for (type in types) {
this.on(type, selector, data, types[type], one);
}
return this;
}
if (data == null && fn == null) {
// ( types, fn )
fn = selector;
data = selector = undefined;
} else if (fn == null) {
if (typeof selector === "string") {
// ( types, selector, fn )
fn = data;
data = undefined;
} else {
// ( types, data, fn )
fn = data;
data = selector;
selector = undefined;
}
}
if (fn === false) {
fn = returnFalse;
} else if (!fn) {
return this;
}
if (one === 1) {
origFn = fn;
fn = function fn(event) {
// Can use an empty set, since event contains the info
jQuery().off(event);
return origFn.apply(this, arguments);
}; // Use same guid so caller can remove using origFn
fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);
}
return this.each(function () {
jQuery.event.add(this, types, fn, data, selector);
});
},
one: function one(types, selector, data, fn) {
return this.on(types, selector, data, fn, 1);
},
off: function off(types, selector, fn) {
var handleObj, type;
if (types && types.preventDefault && types.handleObj) {
// ( event ) dispatched jQuery.Event
handleObj = types.handleObj;
jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler);
return this;
}
if (_typeof(types) === "object") {
// ( types-object [, selector] )
for (type in types) {
this.off(type, selector, types[type]);
}
return this;
}
if (selector === false || typeof selector === "function") {
// ( types [, fn] )
fn = selector;
selector = undefined;
}
if (fn === false) {
fn = returnFalse;
}
return this.each(function () {
jQuery.event.remove(this, types, fn, selector);
});
},
bind: function bind(types, data, fn) {
return this.on(types, null, data, fn);
},
unbind: function unbind(types, fn) {
return this.off(types, null, fn);
},
live: function live(types, data, fn) {
jQuery(this.context).on(types, this.selector, data, fn);
return this;
},
die: function die(types, fn) {
jQuery(this.context).off(types, this.selector || "**", fn);
return this;
},
delegate: function delegate(selector, types, data, fn) {
return this.on(types, selector, data, fn);
},
undelegate: function undelegate(selector, types, fn) {
// ( namespace ) or ( selector, types [, fn] )
return arguments.length == 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn);
},
trigger: function trigger(type, data) {
return this.each(function () {
jQuery.event.trigger(type, data, this);
});
},
triggerHandler: function triggerHandler(type, data) {
if (this[0]) {
return jQuery.event.trigger(type, data, this[0], true);
}
},
toggle: function toggle(fn) {
// Save reference to arguments for access in closure
var args = arguments,
guid = fn.guid || jQuery.guid++,
i = 0,
toggler = function toggler(event) {
// Figure out which function to execute
var lastToggle = (jQuery._data(this, "lastToggle" + fn.guid) || 0) % i;
jQuery._data(this, "lastToggle" + fn.guid, lastToggle + 1); // Make sure that clicks stop
event.preventDefault(); // and execute the function
return args[lastToggle].apply(this, arguments) || false;
}; // link all the functions, so any of them can unbind this click handler
toggler.guid = guid;
while (i < args.length) {
args[i++].guid = guid;
}
return this.click(toggler);
},
hover: function hover(fnOver, fnOut) {
return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);
}
});
jQuery.each(("blur focus focusin focusout load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error contextmenu").split(" "), function (i, name) {
// Handle event binding
jQuery.fn[name] = function (data, fn) {
if (fn == null) {
fn = data;
data = null;
}
return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name);
};
if (rkeyEvent.test(name)) {
jQuery.event.fixHooks[name] = jQuery.event.keyHooks;
}
if (rmouseEvent.test(name)) {
jQuery.event.fixHooks[name] = jQuery.event.mouseHooks;
}
});
/*!
* Sizzle CSS Selector Engine
* Copyright 2012 jQuery Foundation and other contributors
* Released under the MIT license
* http://sizzlejs.com/
*/
(function (window, undefined) {
var dirruns,
cachedruns,
assertGetIdNotName,
Expr,
getText,
isXML,
contains,
compile,
sortOrder,
hasDuplicate,
baseHasDuplicate = true,
strundefined = "undefined",
expando = ("sizcache" + Math.random()).replace(".", ""),
document = window.document,
docElem = document.documentElement,
done = 0,
slice = [].slice,
push = [].push,
// Augment a function for special use by Sizzle
markFunction = function markFunction(fn, value) {
fn[expando] = value || true;
return fn;
},
createCache = function createCache() {
var cache = {},
keys = [];
return markFunction(function (key, value) {
// Only keep the most recent entries
if (keys.push(key) > Expr.cacheLength) {
delete cache[keys.shift()];
}
return cache[key] = value;
}, cache);
},
classCache = createCache(),
tokenCache = createCache(),
compilerCache = createCache(),
// Regex
// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
whitespace = "[\\x20\\t\\r\\n\\f]",
// http://www.w3.org/TR/css3-syntax/#characters
characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",
// Loosely modeled on CSS identifier characters
// An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)
// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
identifier = characterEncoding.replace("w", "w#"),
// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
operators = "([*^$|!~]?=)",
attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
// Prefer arguments not in parens/brackets,
// then attribute selectors and non-pseudos (denoted by :),
// then anything else
// These preferences are here to reduce the number of selectors
// needing tokenize in the PSEUDO preFilter
pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",
// For matchExpr.POS and matchExpr.needsContext
pos = ":(nth|eq|gt|lt|first|last|even|odd)(?:\\(((?:-\\d)?\\d*)\\)|)(?=[^-]|$)",
// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"),
rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"),
rcombinators = new RegExp("^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*"),
rpseudo = new RegExp(pseudos),
// Easily-parseable/retrievable ID or TAG or CLASS selectors
rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,
rnot = /^:not/,
rsibling = /[\x20\t\r\n\f]*[+~]/,
rendsWithNot = /:not\($/,
rheader = /h\d/i,
rinputs = /input|select|textarea|button/i,
rbackslash = /\\(?!\\)/g,
matchExpr = {
"ID": new RegExp("^#(" + characterEncoding + ")"),
"CLASS": new RegExp("^\\.(" + characterEncoding + ")"),
"NAME": new RegExp("^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]"),
"TAG": new RegExp("^(" + characterEncoding.replace("w", "w*") + ")"),
"ATTR": new RegExp("^" + attributes),
"PSEUDO": new RegExp("^" + pseudos),
"CHILD": new RegExp("^:(only|nth|last|first)-child(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
"POS": new RegExp(pos, "ig"),
// For use in libraries implementing .is()
"needsContext": new RegExp("^" + whitespace + "*[>+~]|" + pos, "i")
},
// Support
// Used for testing something on an element
assert = function assert(fn) {
var div = document.createElement("div");
try {
return fn(div);
} catch (e) {
return false;
} finally {
// release memory in IE
div = null;
}
},
// Check if getElementsByTagName("*") returns only elements
assertTagNameNoComments = assert(function (div) {
div.appendChild(document.createComment(""));
return !div.getElementsByTagName("*").length;
}),
// Check if getAttribute returns normalized href attributes
assertHrefNotNormalized = assert(function (div) {
div.innerHTML = "<a href='#'></a>";
return div.firstChild && _typeof(div.firstChild.getAttribute) !== strundefined && div.firstChild.getAttribute("href") === "#";
}),
// Check if attributes should be retrieved by attribute nodes
assertAttributes = assert(function (div) {
div.innerHTML = "<select></select>";
var type = _typeof(div.lastChild.getAttribute("multiple")); // IE8 returns a string for some attributes even when not present
return type !== "boolean" && type !== "string";
}),
// Check if getElementsByClassName can be trusted
assertUsableClassName = assert(function (div) {
// Opera can't find a second classname (in 9.6)
div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
if (!div.getElementsByClassName || !div.getElementsByClassName("e").length) {
return false;
} // Safari 3.2 caches class attributes and doesn't catch changes
div.lastChild.className = "e";
return div.getElementsByClassName("e").length === 2;
}),
// Check if getElementById returns elements by name
// Check if getElementsByName privileges form controls or returns elements by ID
assertUsableName = assert(function (div) {
// Inject content
div.id = expando + 0;
div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
docElem.insertBefore(div, docElem.firstChild); // Test
var pass = document.getElementsByName && // buggy browsers will return fewer than the correct 2
document.getElementsByName(expando).length === 2 + // buggy browsers will return more than the correct 0
document.getElementsByName(expando + 0).length;
assertGetIdNotName = !document.getElementById(expando); // Cleanup
docElem.removeChild(div);
return pass;
}); // If slice is not available, provide a backup
try {
slice.call(docElem.childNodes, 0)[0].nodeType;
} catch (e) {
slice = function slice(i) {
var elem,
results = [];
for (; elem = this[i]; i++) {
results.push(elem);
}
return results;
};
}
function Sizzle(selector, context, results, seed) {
results = results || [];
context = context || document;
var match,
elem,
xml,
m,
nodeType = context.nodeType;
if (nodeType !== 1 && nodeType !== 9) {
return [];
}
if (!selector || typeof selector !== "string") {
return results;
}
xml = isXML(context);
if (!xml && !seed) {
if (match = rquickExpr.exec(selector)) {
// Speed-up: Sizzle("#ID")
if (m = match[1]) {
if (nodeType === 9) {
elem = context.getElementById(m); // Check parentNode to catch when Blackberry 4.6 returns
// nodes that are no longer in the document #6963
if (elem && elem.parentNode) {
// Handle the case where IE, Opera, and Webkit return items
// by name instead of ID
if (elem.id === m) {
results.push(elem);
return results;
}
} else {
return results;
}
} else {
// Context is not a document
if (context.ownerDocument && (elem = context.ownerDocument.getElementById(m)) && contains(context, elem) && elem.id === m) {
results.push(elem);
return results;
}
} // Speed-up: Sizzle("TAG")
} else if (match[2]) {
push.apply(results, slice.call(context.getElementsByTagName(selector), 0));
return results; // Speed-up: Sizzle(".CLASS")
} else if ((m = match[3]) && assertUsableClassName && context.getElementsByClassName) {
push.apply(results, slice.call(context.getElementsByClassName(m), 0));
return results;
}
}
} // All others
return select(selector, context, results, seed, xml);
}
Sizzle.matches = function (expr, elements) {
return Sizzle(expr, null, null, elements);
};
Sizzle.matchesSelector = function (elem, expr) {
return Sizzle(expr, null, null, [elem]).length > 0;
}; // Returns a function to use in pseudos for input types
function createInputPseudo(type) {
return function (elem) {
var name = elem.nodeName.toLowerCase();
return name === "input" && elem.type === type;
};
} // Returns a function to use in pseudos for buttons
function createButtonPseudo(type) {
return function (elem) {
var name = elem.nodeName.toLowerCase();
return (name === "input" || name === "button") && elem.type === type;
};
}
/**
* Utility function for retrieving the text value of an array of DOM nodes
* @param {Array|Element} elem
*/
getText = Sizzle.getText = function (elem) {
var node,
ret = "",
i = 0,
nodeType = elem.nodeType;
if (nodeType) {
if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
// Use textContent for elements
// innerText usage removed for consistency of new lines (see #11153)
if (typeof elem.textContent === "string") {
return elem.textContent;
} else {
// Traverse its children
for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
ret += getText(elem);
}
}
} else if (nodeType === 3 || nodeType === 4) {
return elem.nodeValue;
} // Do not include comment or processing instruction nodes
} else {
// If no nodeType, this is expected to be an array
for (; node = elem[i]; i++) {
// Do not traverse comment nodes
ret += getText(node);
}
}
return ret;
};
isXML = Sizzle.isXML = function isXML(elem) {
// documentElement is verified for cases where it doesn't yet exist
// (such as loading iframes in IE - #4833)
var documentElement = elem && (elem.ownerDocument || elem).documentElement;
return documentElement ? documentElement.nodeName !== "HTML" : false;
}; // Element contains another
contains = Sizzle.contains = docElem.contains ? function (a, b) {
var adown = a.nodeType === 9 ? a.documentElement : a,
bup = b && b.parentNode;
return a === bup || !!(bup && bup.nodeType === 1 && adown.contains && adown.contains(bup));
} : docElem.compareDocumentPosition ? function (a, b) {
return b && !!(a.compareDocumentPosition(b) & 16);
} : function (a, b) {
while (b = b.parentNode) {
if (b === a) {
return true;
}
}
return false;
};
Sizzle.attr = function (elem, name) {
var attr,
xml = isXML(elem);
if (!xml) {
name = name.toLowerCase();
}
if (Expr.attrHandle[name]) {
return Expr.attrHandle[name](elem);
}
if (assertAttributes || xml) {
return elem.getAttribute(name);
}
attr = elem.getAttributeNode(name);
return attr ? typeof elem[name] === "boolean" ? elem[name] ? name : null : attr.specified ? attr.value : null : null;
};
Expr = Sizzle.selectors = {
// Can be adjusted by the user
cacheLength: 50,
createPseudo: markFunction,
match: matchExpr,
order: new RegExp("ID|TAG" + (assertUsableName ? "|NAME" : "") + (assertUsableClassName ? "|CLASS" : "")),
// IE6/7 return a modified href
attrHandle: assertHrefNotNormalized ? {} : {
"href": function href(elem) {
return elem.getAttribute("href", 2);
},
"type": function type(elem) {
return elem.getAttribute("type");
}
},
find: {
"ID": assertGetIdNotName ? function (id, context, xml) {
if (_typeof(context.getElementById) !== strundefined && !xml) {
var m = context.getElementById(id); // Check parentNode to catch when Blackberry 4.6 returns
// nodes that are no longer in the document #6963
return m && m.parentNode ? [m] : [];
}
} : function (id, context, xml) {
if (_typeof(context.getElementById) !== strundefined && !xml) {
var m = context.getElementById(id);
return m ? m.id === id || _typeof(m.getAttributeNode) !== strundefined && m.getAttributeNode("id").value === id ? [m] : undefined : [];
}
},
"TAG": assertTagNameNoComments ? function (tag, context) {
if (_typeof(context.getElementsByTagName) !== strundefined) {
return context.getElementsByTagName(tag);
}
} : function (tag, context) {
var results = context.getElementsByTagName(tag); // Filter out possible comments
if (tag === "*") {
var elem,
tmp = [],
i = 0;
for (; elem = results[i]; i++) {
if (elem.nodeType === 1) {
tmp.push(elem);
}
}
return tmp;
}
return results;
},
"NAME": function NAME(tag, context) {
if (_typeof(context.getElementsByName) !== strundefined) {
return context.getElementsByName(name);
}
},
"CLASS": function CLASS(className, context, xml) {
if (_typeof(context.getElementsByClassName) !== strundefined && !xml) {
return context.getElementsByClassName(className);
}
}
},
relative: {
">": {
dir: "parentNode",
first: true
},
" ": {
dir: "parentNode"
},
"+": {
dir: "previousSibling",
first: true
},
"~": {
dir: "previousSibling"
}
},
preFilter: {
"ATTR": function ATTR(match) {
match[1] = match[1].replace(rbackslash, ""); // Move the given value to match[3] whether quoted or unquoted
match[3] = (match[4] || match[5] || "").replace(rbackslash, "");
if (match[2] === "~=") {
match[3] = " " + match[3] + " ";
}
return match.slice(0, 4);
},
"CHILD": function CHILD(match) {
/* matches from matchExpr.CHILD
1 type (only|nth|...)
2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
3 xn-component of xn+y argument ([+-]?\d*n|)
4 sign of xn-component
5 x of xn-component
6 sign of y-component
7 y of y-component
*/
match[1] = match[1].toLowerCase();
if (match[1] === "nth") {
// nth-child requires argument
if (!match[2]) {
Sizzle.error(match[0]);
} // numeric x and y parameters for Expr.filter.CHILD
// remember that false/true cast respectively to 0/1
match[3] = +(match[3] ? match[4] + (match[5] || 1) : 2 * (match[2] === "even" || match[2] === "odd"));
match[4] = +(match[6] + match[7] || match[2] === "odd"); // other types prohibit arguments
} else if (match[2]) {
Sizzle.error(match[0]);
}
return match;
},
"PSEUDO": function PSEUDO(match, context, xml) {
var unquoted, excess;
if (matchExpr["CHILD"].test(match[0])) {
return null;
}
if (match[3]) {
match[2] = match[3];
} else if (unquoted = match[4]) {
// Only check arguments that contain a pseudo
if (rpseudo.test(unquoted) && ( // Get excess from tokenize (recursively)
excess = tokenize(unquoted, context, xml, true)) && ( // advance to the next closing parenthesis
excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {
// excess is a negative index
unquoted = unquoted.slice(0, excess);
match[0] = match[0].slice(0, excess);
}
match[2] = unquoted;
} // Return only captures needed by the pseudo filter method (type and argument)
return match.slice(0, 3);
}
},
filter: {
"ID": assertGetIdNotName ? function (id) {
id = id.replace(rbackslash, "");
return function (elem) {
return elem.getAttribute("id") === id;
};
} : function (id) {
id = id.replace(rbackslash, "");
return function (elem) {
var node = _typeof(elem.getAttributeNode) !== strundefined && elem.getAttributeNode("id");
return node && node.value === id;
};
},
"TAG": function TAG(nodeName) {
if (nodeName === "*") {
return function () {
return true;
};
}
nodeName = nodeName.replace(rbackslash, "").toLowerCase();
return function (elem) {
return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
};
},
"CLASS": function CLASS(className) {
var pattern = classCache[expando][className];
if (!pattern) {
pattern = classCache(className, new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)"));
}
return function (elem) {
return pattern.test(elem.className || _typeof(elem.getAttribute) !== strundefined && elem.getAttribute("class") || "");
};
},
"ATTR": function ATTR(name, operator, check) {
if (!operator) {
return function (elem) {
return Sizzle.attr(elem, name) != null;
};
}
return function (elem) {
var result = Sizzle.attr(elem, name),
value = result + "";
if (result == null) {
return operator === "!=";
}
switch (operator) {
case "=":
return value === check;
case "!=":
return value !== check;
case "^=":
return check && value.indexOf(check) === 0;
case "*=":
return check && value.indexOf(check) > -1;
case "$=":
return check && value.substr(value.length - check.length) === check;
case "~=":
return (" " + value + " ").indexOf(check) > -1;
case "|=":
return value === check || value.substr(0, check.length + 1) === check + "-";
}
};
},
"CHILD": function CHILD(type, argument, first, last) {
if (type === "nth") {
var doneName = done++;
return function (elem) {
var parent,
diff,
count = 0,
node = elem;
if (first === 1 && last === 0) {
return true;
}
parent = elem.parentNode;
if (parent && (parent[expando] !== doneName || !elem.sizset)) {
for (node = parent.firstChild; node; node = node.nextSibling) {
if (node.nodeType === 1) {
node.sizset = ++count;
if (node === elem) {
break;
}
}
}
parent[expando] = doneName;
}
diff = elem.sizset - last;
if (first === 0) {
return diff === 0;
} else {
return diff % first === 0 && diff / first >= 0;
}
};
}
return function (elem) {
var node = elem;
switch (type) {
case "only":
case "first":
while (node = node.previousSibling) {
if (node.nodeType === 1) {
return false;
}
}
if (type === "first") {
return true;
}
node = elem;
/* falls through */
case "last":
while (node = node.nextSibling) {
if (node.nodeType === 1) {
return false;
}
}
return true;
}
};
},
"PSEUDO": function PSEUDO(pseudo, argument, context, xml) {
// pseudo-class names are case-insensitive
// http://www.w3.org/TR/selectors/#pseudo-classes
// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
var args,
fn = Expr.pseudos[pseudo] || Expr.pseudos[pseudo.toLowerCase()];
if (!fn) {
Sizzle.error("unsupported pseudo: " + pseudo);
} // The user may use createPseudo to indicate that
// arguments are needed to create the filter function
// just as Sizzle does
if (!fn[expando]) {
if (fn.length > 1) {
args = [pseudo, pseudo, "", argument];
return function (elem) {
return fn(elem, 0, args);
};
}
return fn;
}
return fn(argument, context, xml);
}
},
pseudos: {
"not": markFunction(function (selector, context, xml) {
// Trim the selector passed to compile
// to avoid treating leading and trailing
// spaces as combinators
var matcher = compile(selector.replace(rtrim, "$1"), context, xml);
return function (elem) {
return !matcher(elem);
};
}),
"enabled": function enabled(elem) {
return elem.disabled === false;
},
"disabled": function disabled(elem) {
return elem.disabled === true;
},
"checked": function checked(elem) {
// In CSS3, :checked should return both checked and selected elements
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
var nodeName = elem.nodeName.toLowerCase();
return nodeName === "input" && !!elem.checked || nodeName === "option" && !!elem.selected;
},
"selected": function selected(elem) {
// Accessing this property makes selected-by-default
// options in Safari work properly
if (elem.parentNode) {
elem.parentNode.selectedIndex;
}
return elem.selected === true;
},
"parent": function parent(elem) {
return !Expr.pseudos["empty"](elem);
},
"empty": function empty(elem) {
// http://www.w3.org/TR/selectors/#empty-pseudo
// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
// not comment, processing instructions, or others
// Thanks to Diego Perini for the nodeName shortcut
// Greater than "@" means alpha characters (specifically not starting with "#" or "?")
var nodeType;
elem = elem.firstChild;
while (elem) {
if (elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4) {
return false;
}
elem = elem.nextSibling;
}
return true;
},
"contains": markFunction(function (text) {
return function (elem) {
return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1;
};
}),
"has": markFunction(function (selector) {
return function (elem) {
return Sizzle(selector, elem).length > 0;
};
}),
"header": function header(elem) {
return rheader.test(elem.nodeName);
},
"text": function text(elem) {
var type, attr; // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
// use getAttribute instead to test this case
return elem.nodeName.toLowerCase() === "input" && (type = elem.type) === "text" && ((attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type);
},
// Input types
"radio": createInputPseudo("radio"),
"checkbox": createInputPseudo("checkbox"),
"file": createInputPseudo("file"),
"password": createInputPseudo("password"),
"image": createInputPseudo("image"),
"submit": createButtonPseudo("submit"),
"reset": createButtonPseudo("reset"),
"button": function button(elem) {
var name = elem.nodeName.toLowerCase();
return name === "input" && elem.type === "button" || name === "button";
},
"input": function input(elem) {
return rinputs.test(elem.nodeName);
},
"focus": function focus(elem) {
var doc = elem.ownerDocument;
return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);
},
"active": function active(elem) {
return elem === elem.ownerDocument.activeElement;
}
},
setFilters: {
"first": function first(elements, argument, not) {
return not ? elements.slice(1) : [elements[0]];
},
"last": function last(elements, argument, not) {
var elem = elements.pop();
return not ? elements : [elem];
},
"even": function even(elements, argument, not) {
var results = [],
i = not ? 1 : 0,
len = elements.length;
for (; i < len; i = i + 2) {
results.push(elements[i]);
}
return results;
},
"odd": function odd(elements, argument, not) {
var results = [],
i = not ? 0 : 1,
len = elements.length;
for (; i < len; i = i + 2) {
results.push(elements[i]);
}
return results;
},
"lt": function lt(elements, argument, not) {
return not ? elements.slice(+argument) : elements.slice(0, +argument);
},
"gt": function gt(elements, argument, not) {
return not ? elements.slice(0, +argument + 1) : elements.slice(+argument + 1);
},
"eq": function eq(elements, argument, not) {
var elem = elements.splice(+argument, 1);
return not ? elements : elem;
}
}
};
function siblingCheck(a, b, ret) {
if (a === b) {
return ret;
}
var cur = a.nextSibling;
while (cur) {
if (cur === b) {
return -1;
}
cur = cur.nextSibling;
}
return 1;
}
sortOrder = docElem.compareDocumentPosition ? function (a, b) {
if (a === b) {
hasDuplicate = true;
return 0;
}
return (!a.compareDocumentPosition || !b.compareDocumentPosition ? a.compareDocumentPosition : a.compareDocumentPosition(b) & 4) ? -1 : 1;
} : function (a, b) {
// The nodes are identical, we can exit early
if (a === b) {
hasDuplicate = true;
return 0; // Fallback to using sourceIndex (in IE) if it's available on both nodes
} else if (a.sourceIndex && b.sourceIndex) {
return a.sourceIndex - b.sourceIndex;
}
var al,
bl,
ap = [],
bp = [],
aup = a.parentNode,
bup = b.parentNode,
cur = aup; // If the nodes are siblings (or identical) we can do a quick check
if (aup === bup) {
return siblingCheck(a, b); // If no parents were found then the nodes are disconnected
} else if (!aup) {
return -1;
} else if (!bup) {
return 1;
} // Otherwise they're somewhere else in the tree so we need
// to build up a full list of the parentNodes for comparison
while (cur) {
ap.unshift(cur);
cur = cur.parentNode;
}
cur = bup;
while (cur) {
bp.unshift(cur);
cur = cur.parentNode;
}
al = ap.length;
bl = bp.length; // Start walking down the tree looking for a discrepancy
for (var i = 0; i < al && i < bl; i++) {
if (ap[i] !== bp[i]) {
return siblingCheck(ap[i], bp[i]);
}
} // We ended someplace up the tree so do a sibling check
return i === al ? siblingCheck(a, bp[i], -1) : siblingCheck(ap[i], b, 1);
}; // Always assume the presence of duplicates if sort doesn't
// pass them to our comparison function (as in Google Chrome).
[0, 0].sort(sortOrder);
baseHasDuplicate = !hasDuplicate; // Document sorting and removing duplicates
Sizzle.uniqueSort = function (results) {
var elem,
i = 1;
hasDuplicate = baseHasDuplicate;
results.sort(sortOrder);
if (hasDuplicate) {
for (; elem = results[i]; i++) {
if (elem === results[i - 1]) {
results.splice(i--, 1);
}
}
}
return results;
};
Sizzle.error = function (msg) {
throw new Error("Syntax error, unrecognized expression: " + msg);
};
function tokenize(selector, context, xml, parseOnly) {
var matched,
match,
tokens,
type,
soFar,
groups,
group,
i,
preFilters,
filters,
checkContext = !xml && context !== document,
// Token cache should maintain spaces
key = (checkContext ? "<s>" : "") + selector.replace(rtrim, "$1<s>"),
cached = tokenCache[expando][key];
if (cached) {
return parseOnly ? 0 : slice.call(cached, 0);
}
soFar = selector;
groups = [];
i = 0;
preFilters = Expr.preFilter;
filters = Expr.filter;
while (soFar) {
// Comma and first run
if (!matched || (match = rcomma.exec(soFar))) {
if (match) {
soFar = soFar.slice(match[0].length);
tokens.selector = group;
}
groups.push(tokens = []);
group = ""; // Need to make sure we're within a narrower context if necessary
// Adding a descendant combinator will generate what is needed
if (checkContext) {
soFar = " " + soFar;
}
}
matched = false; // Combinators
if (match = rcombinators.exec(soFar)) {
group += match[0];
soFar = soFar.slice(match[0].length); // Cast descendant combinators to space
matched = tokens.push({
part: match.pop().replace(rtrim, " "),
string: match[0],
captures: match
});
} // Filters
for (type in filters) {
if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match, context, xml)))) {
group += match[0];
soFar = soFar.slice(match[0].length);
matched = tokens.push({
part: type,
string: match.shift(),
captures: match
});
}
}
if (!matched) {
break;
}
} // Attach the full group as a selector
if (group) {
tokens.selector = group;
} // Return the length of the invalid excess
// if we're just parsing
// Otherwise, throw an error or return tokens
return parseOnly ? soFar.length : soFar ? Sizzle.error(selector) : // Cache the tokens
slice.call(tokenCache(key, groups), 0);
}
function addCombinator(matcher, combinator, context, xml) {
var dir = combinator.dir,
doneName = done++;
if (!matcher) {
// If there is no matcher to check, check against the context
matcher = function matcher(elem) {
return elem === context;
};
}
return combinator.first ? function (elem) {
while (elem = elem[dir]) {
if (elem.nodeType === 1) {
return matcher(elem) && elem;
}
}
} : xml ? function (elem) {
while (elem = elem[dir]) {
if (elem.nodeType === 1) {
if (matcher(elem)) {
return elem;
}
}
}
} : function (elem) {
var cache,
dirkey = doneName + "." + dirruns,
cachedkey = dirkey + "." + cachedruns;
while (elem = elem[dir]) {
if (elem.nodeType === 1) {
if ((cache = elem[expando]) === cachedkey) {
return elem.sizset;
} else if (typeof cache === "string" && cache.indexOf(dirkey) === 0) {
if (elem.sizset) {
return elem;
}
} else {
elem[expando] = cachedkey;
if (matcher(elem)) {
elem.sizset = true;
return elem;
}
elem.sizset = false;
}
}
}
};
}
function addMatcher(higher, deeper) {
return higher ? function (elem) {
var result = deeper(elem);
return result && higher(result === true ? elem : result);
} : deeper;
} // ["TAG", ">", "ID", " ", "CLASS"]
function matcherFromTokens(tokens, context, xml) {
var token,
matcher,
i = 0;
for (; token = tokens[i]; i++) {
if (Expr.relative[token.part]) {
matcher = addCombinator(matcher, Expr.relative[token.part], context, xml);
} else {
matcher = addMatcher(matcher, Expr.filter[token.part].apply(null, token.captures.concat(context, xml)));
}
}
return matcher;
}
function matcherFromGroupMatchers(matchers) {
return function (elem) {
var matcher,
j = 0;
for (; matcher = matchers[j]; j++) {
if (matcher(elem)) {
return true;
}
}
return false;
};
}
compile = Sizzle.compile = function (selector, context, xml) {
var group,
i,
len,
cached = compilerCache[expando][selector]; // Return a cached group function if already generated (context dependent)
if (cached && cached.context === context) {
return cached;
} // Generate a function of recursive functions that can be used to check each element
group = tokenize(selector, context, xml);
for (i = 0, len = group.length; i < len; i++) {
group[i] = matcherFromTokens(group[i], context, xml);
} // Cache the compiled function
cached = compilerCache(selector, matcherFromGroupMatchers(group));
cached.context = context;
cached.runs = cached.dirruns = 0;
return cached;
};
function multipleContexts(selector, contexts, results, seed) {
var i = 0,
len = contexts.length;
for (; i < len; i++) {
Sizzle(selector, contexts[i], results, seed);
}
}
function handlePOSGroup(selector, posfilter, argument, contexts, seed, not) {
var results,
fn = Expr.setFilters[posfilter.toLowerCase()];
if (!fn) {
Sizzle.error(posfilter);
}
if (selector || !(results = seed)) {
multipleContexts(selector || "*", contexts, results = [], seed);
}
return results.length > 0 ? fn(results, argument, not) : [];
}
function handlePOS(groups, context, results, seed) {
var group,
part,
j,
groupLen,
token,
selector,
anchor,
elements,
match,
matched,
lastIndex,
currentContexts,
not,
i = 0,
len = groups.length,
rpos = matchExpr["POS"],
// This is generated here in case matchExpr["POS"] is extended
rposgroups = new RegExp("^" + rpos.source + "(?!" + whitespace + ")", "i"),
// This is for making sure non-participating
// matching groups are represented cross-browser (IE6-8)
setUndefined = function setUndefined() {
var i = 1,
len = arguments.length - 2;
for (; i < len; i++) {
if (arguments[i] === undefined) {
match[i] = undefined;
}
}
};
for (; i < len; i++) {
group = groups[i];
part = "";
elements = seed;
for (j = 0, groupLen = group.length; j < groupLen; j++) {
token = group[j];
selector = token.string;
if (token.part === "PSEUDO") {
// Reset regex index to 0
rpos.exec("");
anchor = 0;
while (match = rpos.exec(selector)) {
matched = true;
lastIndex = rpos.lastIndex = match.index + match[0].length;
if (lastIndex > anchor) {
part += selector.slice(anchor, match.index);
anchor = lastIndex;
currentContexts = [context];
if (rcombinators.test(part)) {
if (elements) {
currentContexts = elements;
}
elements = seed;
}
if (not = rendsWithNot.test(part)) {
part = part.slice(0, -5).replace(rcombinators, "$&*");
anchor++;
}
if (match.length > 1) {
match[0].replace(rposgroups, setUndefined);
}
elements = handlePOSGroup(part, match[1], match[2], currentContexts, elements, not);
}
part = "";
}
}
if (!matched) {
part += selector;
}
matched = false;
}
if (part) {
if (rcombinators.test(part)) {
multipleContexts(part, elements || [context], results, seed);
} else {
Sizzle(part, context, results, seed ? seed.concat(elements) : elements);
}
} else {
push.apply(results, elements);
}
} // Do not sort if this is a single filter
return len === 1 ? results : Sizzle.uniqueSort(results);
}
function select(selector, context, results, seed, xml) {
// Remove excessive whitespace
selector = selector.replace(rtrim, "$1");
var elements,
matcher,
cached,
elem,
i,
tokens,
token,
lastToken,
findContext,
type,
match = tokenize(selector, context, xml),
contextNodeType = context.nodeType; // POS handling
if (matchExpr["POS"].test(selector)) {
return handlePOS(match, context, results, seed);
}
if (seed) {
elements = slice.call(seed, 0); // To maintain document order, only narrow the
// set if there is one group
} else if (match.length === 1) {
// Take a shortcut and set the context if the root selector is an ID
if ((tokens = slice.call(match[0], 0)).length > 2 && (token = tokens[0]).part === "ID" && contextNodeType === 9 && !xml && Expr.relative[tokens[1].part]) {
context = Expr.find["ID"](token.captures[0].replace(rbackslash, ""), context, xml)[0];
if (!context) {
return results;
}
selector = selector.slice(tokens.shift().string.length);
}
findContext = (match = rsibling.exec(tokens[0].string)) && !match.index && context.parentNode || context; // Reduce the set if possible
lastToken = "";
for (i = tokens.length - 1; i >= 0; i--) {
token = tokens[i];
type = token.part;
lastToken = token.string + lastToken;
if (Expr.relative[type]) {
break;
}
if (Expr.order.test(type)) {
elements = Expr.find[type](token.captures[0].replace(rbackslash, ""), findContext, xml);
if (elements == null) {
continue;
} else {
selector = selector.slice(0, selector.length - lastToken.length) + lastToken.replace(matchExpr[type], "");
if (!selector) {
push.apply(results, slice.call(elements, 0));
}
break;
}
}
}
} // Only loop over the given elements once
if (selector) {
matcher = compile(selector, context, xml);
dirruns = matcher.dirruns++;
if (elements == null) {
elements = Expr.find["TAG"]("*", rsibling.test(selector) && context.parentNode || context);
}
for (i = 0; elem = elements[i]; i++) {
cachedruns = matcher.runs++;
if (matcher(elem)) {
results.push(elem);
}
}
}
return results;
}
if (document.querySelectorAll) {
(function () {
var disconnectedMatch,
oldSelect = select,
rescape = /'|\\/g,
rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
rbuggyQSA = [],
// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
// A support test would require too much code (would include document ready)
// just skip matchesSelector for :active
rbuggyMatches = [":active"],
matches = docElem.matchesSelector || docElem.mozMatchesSelector || docElem.webkitMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector; // Build QSA regex
// Regex strategy adopted from Diego Perini
assert(function (div) {
// Select is set to empty string on purpose
// This is to test IE's treatment of not explictly
// setting a boolean content attribute,
// since its presence should be enough
// http://bugs.jquery.com/ticket/12359
div.innerHTML = "<select><option selected=''></option></select>"; // IE8 - Some boolean attributes are not treated correctly
if (!div.querySelectorAll("[selected]").length) {
rbuggyQSA.push("\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)");
} // Webkit/Opera - :checked should return selected option elements
// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
// IE8 throws error here (do not put tests after this one)
if (!div.querySelectorAll(":checked").length) {
rbuggyQSA.push(":checked");
}
});
assert(function (div) {
// Opera 10-12/IE9 - ^= $= *= and empty values
// Should not select anything
div.innerHTML = "<p test=''></p>";
if (div.querySelectorAll("[test^='']").length) {
rbuggyQSA.push("[*^$]=" + whitespace + "*(?:\"\"|'')");
} // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
// IE8 throws error here (do not put tests after this one)
div.innerHTML = "<input type='hidden'/>";
if (!div.querySelectorAll(":enabled").length) {
rbuggyQSA.push(":enabled", ":disabled");
}
});
rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));
select = function select(selector, context, results, seed, xml) {
// Only use querySelectorAll when not filtering,
// when this is not xml,
// and when no QSA bugs apply
if (!seed && !xml && (!rbuggyQSA || !rbuggyQSA.test(selector))) {
if (context.nodeType === 9) {
try {
push.apply(results, slice.call(context.querySelectorAll(selector), 0));
return results;
} catch (qsaError) {} // qSA works strangely on Element-rooted queries
// We can work around this by specifying an extra ID on the root
// and working up from there (Thanks to Andrew Dupont for the technique)
// IE 8 doesn't work on object elements
} else if (context.nodeType === 1 && context.nodeName.toLowerCase() !== "object") {
var groups,
i,
len,
old = context.getAttribute("id"),
nid = old || expando,
newContext = rsibling.test(selector) && context.parentNode || context;
if (old) {
nid = nid.replace(rescape, "\\$&");
} else {
context.setAttribute("id", nid);
}
groups = tokenize(selector, context, xml); // Trailing space is unnecessary
// There is always a context check
nid = "[id='" + nid + "']";
for (i = 0, len = groups.length; i < len; i++) {
groups[i] = nid + groups[i].selector;
}
try {
push.apply(results, slice.call(newContext.querySelectorAll(groups.join(",")), 0));
return results;
} catch (qsaError) {} finally {
if (!old) {
context.removeAttribute("id");
}
}
}
}
return oldSelect(selector, context, results, seed, xml);
};
if (matches) {
assert(function (div) {
// Check to see if it's possible to do matchesSelector
// on a disconnected node (IE 9)
disconnectedMatch = matches.call(div, "div"); // This should fail with an exception
// Gecko does not error, returns false instead
try {
matches.call(div, "[test!='']:sizzle");
rbuggyMatches.push(matchExpr["PSEUDO"].source, matchExpr["POS"].source, "!=");
} catch (e) {}
}); // rbuggyMatches always contains :active, so no need for a length check
rbuggyMatches =
/* rbuggyMatches.length && */
new RegExp(rbuggyMatches.join("|"));
Sizzle.matchesSelector = function (elem, expr) {
// Make sure that attribute selectors are quoted
expr = expr.replace(rattributeQuotes, "='$1']"); // rbuggyMatches always contains :active, so no need for an existence check
if (!isXML(elem) && !rbuggyMatches.test(expr) && (!rbuggyQSA || !rbuggyQSA.test(expr))) {
try {
var ret = matches.call(elem, expr); // IE 9's matchesSelector returns false on disconnected nodes
if (ret || disconnectedMatch || // As well, disconnected nodes are said to be in a document
// fragment in IE 9
elem.document && elem.document.nodeType !== 11) {
return ret;
}
} catch (e) {}
}
return Sizzle(expr, null, null, [elem]).length > 0;
};
}
})();
} // Deprecated
Expr.setFilters["nth"] = Expr.setFilters["eq"]; // Back-compat
Expr.filters = Expr.pseudos; // Override sizzle attribute retrieval
Sizzle.attr = jQuery.attr;
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[":"] = jQuery.expr.pseudos;
jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;
})(window);
var runtil = /Until$/,
rparentsprev = /^(?:parents|prev(?:Until|All))/,
isSimple = /^.[^:#\[\.,]*$/,
rneedsContext = jQuery.expr.match.needsContext,
// methods guaranteed to produce a unique set when starting from a unique set
guaranteedUnique = {
children: true,
contents: true,
next: true,
prev: true
};
jQuery.fn.extend({
find: function find(selector) {
var i,
l,
length,
n,
r,
ret,
self = this;
if (typeof selector !== "string") {
return jQuery(selector).filter(function () {
for (i = 0, l = self.length; i < l; i++) {
if (jQuery.contains(self[i], this)) {
return true;
}
}
});
}
ret = this.pushStack("", "find", selector);
for (i = 0, l = this.length; i < l; i++) {
length = ret.length;
jQuery.find(selector, this[i], ret);
if (i > 0) {
// Make sure that the results are unique
for (n = length; n < ret.length; n++) {
for (r = 0; r < length; r++) {
if (ret[r] === ret[n]) {
ret.splice(n--, 1);
break;
}
}
}
}
}
return ret;
},
has: function has(target) {
var i,
targets = jQuery(target, this),
len = targets.length;
return this.filter(function () {
for (i = 0; i < len; i++) {
if (jQuery.contains(this, targets[i])) {
return true;
}
}
});
},
not: function not(selector) {
return this.pushStack(winnow(this, selector, false), "not", selector);
},
filter: function filter(selector) {
return this.pushStack(winnow(this, selector, true), "filter", selector);
},
is: function is(selector) {
return !!selector && (typeof selector === "string" ? // If this is a positional/relative selector, check membership in the returned set
// so $("p:first").is("p:last") won't return true for a doc with two "p".
rneedsContext.test(selector) ? jQuery(selector, this.context).index(this[0]) >= 0 : jQuery.filter(selector, this).length > 0 : this.filter(selector).length > 0);
},
closest: function closest(selectors, context) {
var cur,
i = 0,
l = this.length,
ret = [],
pos = rneedsContext.test(selectors) || typeof selectors !== "string" ? jQuery(selectors, context || this.context) : 0;
for (; i < l; i++) {
cur = this[i];
while (cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11) {
if (pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors)) {
ret.push(cur);
break;
}
cur = cur.parentNode;
}
}
ret = ret.length > 1 ? jQuery.unique(ret) : ret;
return this.pushStack(ret, "closest", selectors);
},
// Determine the position of an element within
// the matched set of elements
index: function index(elem) {
// No argument, return index in parent
if (!elem) {
return this[0] && this[0].parentNode ? this.prevAll().length : -1;
} // index in selector
if (typeof elem === "string") {
return jQuery.inArray(this[0], jQuery(elem));
} // Locate the position of the desired element
return jQuery.inArray( // If it receives a jQuery object, the first element is used
elem.jquery ? elem[0] : elem, this);
},
add: function add(selector, context) {
var set = typeof selector === "string" ? jQuery(selector, context) : jQuery.makeArray(selector && selector.nodeType ? [selector] : selector),
all = jQuery.merge(this.get(), set);
return this.pushStack(isDisconnected(set[0]) || isDisconnected(all[0]) ? all : jQuery.unique(all));
},
addBack: function addBack(selector) {
return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector));
}
});
jQuery.fn.andSelf = jQuery.fn.addBack; // A painfully simple check to see if an element is disconnected
// from a document (should be improved, where feasible).
function isDisconnected(node) {
return !node || !node.parentNode || node.parentNode.nodeType === 11;
}
function sibling(cur, dir) {
do {
cur = cur[dir];
} while (cur && cur.nodeType !== 1);
return cur;
}
jQuery.each({
parent: function parent(elem) {
var parent = elem.parentNode;
return parent && parent.nodeType !== 11 ? parent : null;
},
parents: function parents(elem) {
return jQuery.dir(elem, "parentNode");
},
parentsUntil: function parentsUntil(elem, i, until) {
return jQuery.dir(elem, "parentNode", until);
},
next: function next(elem) {
return sibling(elem, "nextSibling");
},
prev: function prev(elem) {
return sibling(elem, "previousSibling");
},
nextAll: function nextAll(elem) {
return jQuery.dir(elem, "nextSibling");
},
prevAll: function prevAll(elem) {
return jQuery.dir(elem, "previousSibling");
},
nextUntil: function nextUntil(elem, i, until) {
return jQuery.dir(elem, "nextSibling", until);
},
prevUntil: function prevUntil(elem, i, until) {
return jQuery.dir(elem, "previousSibling", until);
},
siblings: function siblings(elem) {
return jQuery.sibling((elem.parentNode || {}).firstChild, elem);
},
children: function children(elem) {
return jQuery.sibling(elem.firstChild);
},
contents: function contents(elem) {
return jQuery.nodeName(elem, "iframe") ? elem.contentDocument || elem.contentWindow.document : jQuery.merge([], elem.childNodes);
}
}, function (name, fn) {
jQuery.fn[name] = function (until, selector) {
var ret = jQuery.map(this, fn, until);
if (!runtil.test(name)) {
selector = until;
}
if (selector && typeof selector === "string") {
ret = jQuery.filter(selector, ret);
}
ret = this.length > 1 && !guaranteedUnique[name] ? jQuery.unique(ret) : ret;
if (this.length > 1 && rparentsprev.test(name)) {
ret = ret.reverse();
}
return this.pushStack(ret, name, core_slice.call(arguments).join(","));
};
});
jQuery.extend({
filter: function filter(expr, elems, not) {
if (not) {
expr = ":not(" + expr + ")";
}
return elems.length === 1 ? jQuery.find.matchesSelector(elems[0], expr) ? [elems[0]] : [] : jQuery.find.matches(expr, elems);
},
dir: function dir(elem, _dir, until) {
var matched = [],
cur = elem[_dir];
while (cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery(cur).is(until))) {
if (cur.nodeType === 1) {
matched.push(cur);
}
cur = cur[_dir];
}
return matched;
},
sibling: function sibling(n, elem) {
var r = [];
for (; n; n = n.nextSibling) {
if (n.nodeType === 1 && n !== elem) {
r.push(n);
}
}
return r;
}
}); // Implement the identical functionality for filter and not
function winnow(elements, qualifier, keep) {
// Can't pass null or undefined to indexOf in Firefox 4
// Set to 0 to skip string check
qualifier = qualifier || 0;
if (jQuery.isFunction(qualifier)) {
return jQuery.grep(elements, function (elem, i) {
var retVal = !!qualifier.call(elem, i, elem);
return retVal === keep;
});
} else if (qualifier.nodeType) {
return jQuery.grep(elements, function (elem, i) {
return elem === qualifier === keep;
});
} else if (typeof qualifier === "string") {
var filtered = jQuery.grep(elements, function (elem) {
return elem.nodeType === 1;
});
if (isSimple.test(qualifier)) {
return jQuery.filter(qualifier, filtered, !keep);
} else {
qualifier = jQuery.filter(qualifier, filtered);
}
}
return jQuery.grep(elements, function (elem, i) {
return jQuery.inArray(elem, qualifier) >= 0 === keep;
});
}
function createSafeFragment(document) {
var list = nodeNames.split("|"),
safeFrag = document.createDocumentFragment();
if (safeFrag.createElement) {
while (list.length) {
safeFrag.createElement(list.pop());
}
}
return safeFrag;
}
var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
rleadingWhitespace = /^\s+/,
rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
rtagName = /<([\w:]+)/,
rtbody = /<tbody/i,
rhtml = /<|&#?\w+;/,
rnoInnerhtml = /<(?:script|style|link)/i,
rnocache = /<(?:script|object|embed|option|style)/i,
rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
rcheckableType = /^(?:checkbox|radio)$/,
// checked="checked" or checked
rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
rscriptType = /\/(java|ecma)script/i,
rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
wrapMap = {
option: [1, "<select multiple='multiple'>", "</select>"],
legend: [1, "<fieldset>", "</fieldset>"],
thead: [1, "<table>", "</table>"],
tr: [2, "<table><tbody>", "</tbody></table>"],
td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
col: [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"],
area: [1, "<map>", "</map>"],
_default: [0, "", ""]
},
safeFragment = createSafeFragment(document),
fragmentDiv = safeFragment.appendChild(document.createElement("div"));
wrapMap.optgroup = wrapMap.option;
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td; // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
// unless wrapped in a div with non-breaking characters in front of it.
if (!jQuery.support.htmlSerialize) {
wrapMap._default = [1, "X<div>", "</div>"];
}
jQuery.fn.extend({
text: function text(value) {
return jQuery.access(this, function (value) {
return value === undefined ? jQuery.text(this) : this.empty().append((this[0] && this[0].ownerDocument || document).createTextNode(value));
}, null, value, arguments.length);
},
wrapAll: function wrapAll(html) {
if (jQuery.isFunction(html)) {
return this.each(function (i) {
jQuery(this).wrapAll(html.call(this, i));
});
}
if (this[0]) {
// The elements to wrap the target around
var wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);
if (this[0].parentNode) {
wrap.insertBefore(this[0]);
}
wrap.map(function () {
var elem = this;
while (elem.firstChild && elem.firstChild.nodeType === 1) {
elem = elem.firstChild;
}
return elem;
}).append(this);
}
return this;
},
wrapInner: function wrapInner(html) {
if (jQuery.isFunction(html)) {
return this.each(function (i) {
jQuery(this).wrapInner(html.call(this, i));
});
}
return this.each(function () {
var self = jQuery(this),
contents = self.contents();
if (contents.length) {
contents.wrapAll(html);
} else {
self.append(html);
}
});
},
wrap: function wrap(html) {
var isFunction = jQuery.isFunction(html);
return this.each(function (i) {
jQuery(this).wrapAll(isFunction ? html.call(this, i) : html);
});
},
unwrap: function unwrap() {
return this.parent().each(function () {
if (!jQuery.nodeName(this, "body")) {
jQuery(this).replaceWith(this.childNodes);
}
}).end();
},
append: function append() {
return this.domManip(arguments, true, function (elem) {
if (this.nodeType === 1 || this.nodeType === 11) {
this.appendChild(elem);
}
});
},
prepend: function prepend() {
return this.domManip(arguments, true, function (elem) {
if (this.nodeType === 1 || this.nodeType === 11) {
this.insertBefore(elem, this.firstChild);
}
});
},
before: function before() {
if (!isDisconnected(this[0])) {
return this.domManip(arguments, false, function (elem) {
this.parentNode.insertBefore(elem, this);
});
}
if (arguments.length) {
var set = jQuery.clean(arguments);
return this.pushStack(jQuery.merge(set, this), "before", this.selector);
}
},
after: function after() {
if (!isDisconnected(this[0])) {
return this.domManip(arguments, false, function (elem) {
this.parentNode.insertBefore(elem, this.nextSibling);
});
}
if (arguments.length) {
var set = jQuery.clean(arguments);
return this.pushStack(jQuery.merge(this, set), "after", this.selector);
}
},
// keepData is for internal use only--do not document
remove: function remove(selector, keepData) {
var elem,
i = 0;
for (; (elem = this[i]) != null; i++) {
if (!selector || jQuery.filter(selector, [elem]).length) {
if (!keepData && elem.nodeType === 1) {
jQuery.cleanData(elem.getElementsByTagName("*"));
jQuery.cleanData([elem]);
}
if (elem.parentNode) {
elem.parentNode.removeChild(elem);
}
}
}
return this;
},
empty: function empty() {
var elem,
i = 0;
for (; (elem = this[i]) != null; i++) {
// Remove element nodes and prevent memory leaks
if (elem.nodeType === 1) {
jQuery.cleanData(elem.getElementsByTagName("*"));
} // Remove any remaining nodes
while (elem.firstChild) {
elem.removeChild(elem.firstChild);
}
}
return this;
},
clone: function clone(dataAndEvents, deepDataAndEvents) {
dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
return this.map(function () {
return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
});
},
html: function html(value) {
return jQuery.access(this, function (value) {
var elem = this[0] || {},
i = 0,
l = this.length;
if (value === undefined) {
return elem.nodeType === 1 ? elem.innerHTML.replace(rinlinejQuery, "") : undefined;
} // See if we can take a shortcut and just use innerHTML
if (typeof value === "string" && !rnoInnerhtml.test(value) && (jQuery.support.htmlSerialize || !rnoshimcache.test(value)) && (jQuery.support.leadingWhitespace || !rleadingWhitespace.test(value)) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) {
value = value.replace(rxhtmlTag, "<$1></$2>");
try {
for (; i < l; i++) {
// Remove element nodes and prevent memory leaks
elem = this[i] || {};
if (elem.nodeType === 1) {
jQuery.cleanData(elem.getElementsByTagName("*"));
elem.innerHTML = value;
}
}
elem = 0; // If using innerHTML throws an exception, use the fallback method
} catch (e) {}
}
if (elem) {
this.empty().append(value);
}
}, null, value, arguments.length);
},
replaceWith: function replaceWith(value) {
if (!isDisconnected(this[0])) {
// Make sure that the elements are removed from the DOM before they are inserted
// this can help fix replacing a parent with child elements
if (jQuery.isFunction(value)) {
return this.each(function (i) {
var self = jQuery(this),
old = self.html();
self.replaceWith(value.call(this, i, old));
});
}
if (typeof value !== "string") {
value = jQuery(value).detach();
}
return this.each(function () {
var next = this.nextSibling,
parent = this.parentNode;
jQuery(this).remove();
if (next) {
jQuery(next).before(value);
} else {
jQuery(parent).append(value);
}
});
}
return this.length ? this.pushStack(jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value) : this;
},
detach: function detach(selector) {
return this.remove(selector, true);
},
domManip: function domManip(args, table, callback) {
// Flatten any nested arrays
args = [].concat.apply([], args);
var results,
first,
fragment,
iNoClone,
i = 0,
value = args[0],
scripts = [],
l = this.length; // We can't cloneNode fragments that contain checked, in WebKit
if (!jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test(value)) {
return this.each(function () {
jQuery(this).domManip(args, table, callback);
});
}
if (jQuery.isFunction(value)) {
return this.each(function (i) {
var self = jQuery(this);
args[0] = value.call(this, i, table ? self.html() : undefined);
self.domManip(args, table, callback);
});
}
if (this[0]) {
results = jQuery.buildFragment(args, this, scripts);
fragment = results.fragment;
first = fragment.firstChild;
if (fragment.childNodes.length === 1) {
fragment = first;
}
if (first) {
table = table && jQuery.nodeName(first, "tr"); // Use the original fragment for the last item instead of the first because it can end up
// being emptied incorrectly in certain situations (#8070).
// Fragments from the fragment cache must always be cloned and never used in place.
for (iNoClone = results.cacheable || l - 1; i < l; i++) {
callback.call(table && jQuery.nodeName(this[i], "table") ? findOrAppend(this[i], "tbody") : this[i], i === iNoClone ? fragment : jQuery.clone(fragment, true, true));
}
} // Fix #11809: Avoid leaking memory
fragment = first = null;
if (scripts.length) {
jQuery.each(scripts, function (i, elem) {
if (elem.src) {
if (jQuery.ajax) {
jQuery.ajax({
url: elem.src,
type: "GET",
dataType: "script",
async: false,
global: false,
"throws": true
});
} else {
jQuery.error("no ajax");
}
} else {
jQuery.globalEval((elem.text || elem.textContent || elem.innerHTML || "").replace(rcleanScript, ""));
}
if (elem.parentNode) {
elem.parentNode.removeChild(elem);
}
});
}
}
return this;
}
});
function findOrAppend(elem, tag) {
return elem.getElementsByTagName(tag)[0] || elem.appendChild(elem.ownerDocument.createElement(tag));
}
function cloneCopyEvent(src, dest) {
if (dest.nodeType !== 1 || !jQuery.hasData(src)) {
return;
}
var type,
i,
l,
oldData = jQuery._data(src),
curData = jQuery._data(dest, oldData),
events = oldData.events;
if (events) {
delete curData.handle;
curData.events = {};
for (type in events) {
for (i = 0, l = events[type].length; i < l; i++) {
jQuery.event.add(dest, type, events[type][i]);
}
}
} // make the cloned public data object a copy from the original
if (curData.data) {
curData.data = jQuery.extend({}, curData.data);
}
}
function cloneFixAttributes(src, dest) {
var nodeName; // We do not need to do anything for non-Elements
if (dest.nodeType !== 1) {
return;
} // clearAttributes removes the attributes, which we don't want,
// but also removes the attachEvent events, which we *do* want
if (dest.clearAttributes) {
dest.clearAttributes();
} // mergeAttributes, in contrast, only merges back on the
// original attributes, not the events
if (dest.mergeAttributes) {
dest.mergeAttributes(src);
}
nodeName = dest.nodeName.toLowerCase();
if (nodeName === "object") {
// IE6-10 improperly clones children of object elements using classid.
// IE10 throws NoModificationAllowedError if parent is null, #12132.
if (dest.parentNode) {
dest.outerHTML = src.outerHTML;
} // This path appears unavoidable for IE9. When cloning an object
// element in IE9, the outerHTML strategy above is not sufficient.
// If the src has innerHTML and the destination does not,
// copy the src.innerHTML into the dest.innerHTML. #10324
if (jQuery.support.html5Clone && src.innerHTML && !jQuery.trim(dest.innerHTML)) {
dest.innerHTML = src.innerHTML;
}
} else if (nodeName === "input" && rcheckableType.test(src.type)) {
// IE6-8 fails to persist the checked state of a cloned checkbox
// or radio button. Worse, IE6-7 fail to give the cloned element
// a checked appearance if the defaultChecked value isn't also set
dest.defaultChecked = dest.checked = src.checked; // IE6-7 get confused and end up setting the value of a cloned
// checkbox/radio button to an empty string instead of "on"
if (dest.value !== src.value) {
dest.value = src.value;
} // IE6-8 fails to return the selected option to the default selected
// state when cloning options
} else if (nodeName === "option") {
dest.selected = src.defaultSelected; // IE6-8 fails to set the defaultValue to the correct value when
// cloning other types of input fields
} else if (nodeName === "input" || nodeName === "textarea") {
dest.defaultValue = src.defaultValue; // IE blanks contents when cloning scripts
} else if (nodeName === "script" && dest.text !== src.text) {
dest.text = src.text;
} // Event data gets referenced instead of copied if the expando
// gets copied too
dest.removeAttribute(jQuery.expando);
}
jQuery.buildFragment = function (args, context, scripts) {
var fragment,
cacheable,
cachehit,
first = args[0]; // Set context from what may come in as undefined or a jQuery collection or a node
// Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
// also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
context = context || document;
context = !context.nodeType && context[0] || context;
context = context.ownerDocument || context; // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
// Cloning options loses the selected state, so don't cache them
// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
if (args.length === 1 && typeof first === "string" && first.length < 512 && context === document && first.charAt(0) === "<" && !rnocache.test(first) && (jQuery.support.checkClone || !rchecked.test(first)) && (jQuery.support.html5Clone || !rnoshimcache.test(first))) {
// Mark cacheable and look for a hit
cacheable = true;
fragment = jQuery.fragments[first];
cachehit = fragment !== undefined;
}
if (!fragment) {
fragment = context.createDocumentFragment();
jQuery.clean(args, context, fragment, scripts); // Update the cache, but only store false
// unless this is a second parsing of the same content
if (cacheable) {
jQuery.fragments[first] = cachehit && fragment;
}
}
return {
fragment: fragment,
cacheable: cacheable
};
};
jQuery.fragments = {};
jQuery.each({
appendTo: "append",
prependTo: "prepend",
insertBefore: "before",
insertAfter: "after",
replaceAll: "replaceWith"
}, function (name, original) {
jQuery.fn[name] = function (selector) {
var elems,
i = 0,
ret = [],
insert = jQuery(selector),
l = insert.length,
parent = this.length === 1 && this[0].parentNode;
if ((parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1) {
insert[original](this[0]);
return this;
} else {
for (; i < l; i++) {
elems = (i > 0 ? this.clone(true) : this).get();
jQuery(insert[i])[original](elems);
ret = ret.concat(elems);
}
return this.pushStack(ret, name, insert.selector);
}
};
});
function getAll(elem) {
if (typeof elem.getElementsByTagName !== "undefined") {
return elem.getElementsByTagName("*");
} else if (typeof elem.querySelectorAll !== "undefined") {
return elem.querySelectorAll("*");
} else {
return [];
}
} // Used in clean, fixes the defaultChecked property
function fixDefaultChecked(elem) {
if (rcheckableType.test(elem.type)) {
elem.defaultChecked = elem.checked;
}
}
jQuery.extend({
clone: function clone(elem, dataAndEvents, deepDataAndEvents) {
var srcElements, destElements, i, clone;
if (jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test("<" + elem.nodeName + ">")) {
clone = elem.cloneNode(true); // IE<=8 does not properly clone detached, unknown element nodes
} else {
fragmentDiv.innerHTML = elem.outerHTML;
fragmentDiv.removeChild(clone = fragmentDiv.firstChild);
}
if ((!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) {
// IE copies events bound via attachEvent when using cloneNode.
// Calling detachEvent on the clone will also remove the events
// from the original. In order to get around this, we use some
// proprietary methods to clear the events. Thanks to MooTools
// guys for this hotness.
cloneFixAttributes(elem, clone); // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
srcElements = getAll(elem);
destElements = getAll(clone); // Weird iteration because IE will replace the length property
// with an element if you are cloning the body and one of the
// elements on the page has a name or id of "length"
for (i = 0; srcElements[i]; ++i) {
// Ensure that the destination node is not null; Fixes #9587
if (destElements[i]) {
cloneFixAttributes(srcElements[i], destElements[i]);
}
}
} // Copy the events from the original to the clone
if (dataAndEvents) {
cloneCopyEvent(elem, clone);
if (deepDataAndEvents) {
srcElements = getAll(elem);
destElements = getAll(clone);
for (i = 0; srcElements[i]; ++i) {
cloneCopyEvent(srcElements[i], destElements[i]);
}
}
}
srcElements = destElements = null; // Return the cloned set
return clone;
},
clean: function clean(elems, context, fragment, scripts) {
var i,
j,
elem,
tag,
wrap,
depth,
div,
hasBody,
tbody,
len,
handleScript,
jsTags,
safe = context === document && safeFragment,
ret = []; // Ensure that context is a document
if (!context || typeof context.createDocumentFragment === "undefined") {
context = document;
} // Use the already-created safe fragment if context permits
for (i = 0; (elem = elems[i]) != null; i++) {
if (typeof elem === "number") {
elem += "";
}
if (!elem) {
continue;
} // Convert html string into DOM nodes
if (typeof elem === "string") {
if (!rhtml.test(elem)) {
elem = context.createTextNode(elem);
} else {
// Ensure a safe container in which to render the html
safe = safe || createSafeFragment(context);
div = context.createElement("div");
safe.appendChild(div); // Fix "XHTML"-style tags in all browsers
elem = elem.replace(rxhtmlTag, "<$1></$2>"); // Go to html and back, then peel off extra wrappers
tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase();
wrap = wrapMap[tag] || wrapMap._default;
depth = wrap[0];
div.innerHTML = wrap[1] + elem + wrap[2]; // Move to the right depth
while (depth--) {
div = div.lastChild;
} // Remove IE's autoinserted <tbody> from table fragments
if (!jQuery.support.tbody) {
// String was a <table>, *may* have spurious <tbody>
hasBody = rtbody.test(elem);
tbody = tag === "table" && !hasBody ? div.firstChild && div.firstChild.childNodes : // String was a bare <thead> or <tfoot>
wrap[1] === "<table>" && !hasBody ? div.childNodes : [];
for (j = tbody.length - 1; j >= 0; --j) {
if (jQuery.nodeName(tbody[j], "tbody") && !tbody[j].childNodes.length) {
tbody[j].parentNode.removeChild(tbody[j]);
}
}
} // IE completely kills leading whitespace when innerHTML is used
if (!jQuery.support.leadingWhitespace && rleadingWhitespace.test(elem)) {
div.insertBefore(context.createTextNode(rleadingWhitespace.exec(elem)[0]), div.firstChild);
}
elem = div.childNodes; // Take out of fragment container (we need a fresh div each time)
div.parentNode.removeChild(div);
}
}
if (elem.nodeType) {
ret.push(elem);
} else {
jQuery.merge(ret, elem);
}
} // Fix #11356: Clear elements from safeFragment
if (div) {
elem = div = safe = null;
} // Reset defaultChecked for any radios and checkboxes
// about to be appended to the DOM in IE 6/7 (#8060)
if (!jQuery.support.appendChecked) {
for (i = 0; (elem = ret[i]) != null; i++) {
if (jQuery.nodeName(elem, "input")) {
fixDefaultChecked(elem);
} else if (typeof elem.getElementsByTagName !== "undefined") {
jQuery.grep(elem.getElementsByTagName("input"), fixDefaultChecked);
}
}
} // Append elements to a provided document fragment
if (fragment) {
// Special handling of each script element
handleScript = function handleScript(elem) {
// Check if we consider it executable
if (!elem.type || rscriptType.test(elem.type)) {
// Detach the script and store it in the scripts array (if provided) or the fragment
// Return truthy to indicate that it has been handled
return scripts ? scripts.push(elem.parentNode ? elem.parentNode.removeChild(elem) : elem) : fragment.appendChild(elem);
}
};
for (i = 0; (elem = ret[i]) != null; i++) {
// Check if we're done after handling an executable script
if (!(jQuery.nodeName(elem, "script") && handleScript(elem))) {
// Append to fragment and handle embedded scripts
fragment.appendChild(elem);
if (typeof elem.getElementsByTagName !== "undefined") {
// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
jsTags = jQuery.grep(jQuery.merge([], elem.getElementsByTagName("script")), handleScript); // Splice the scripts into ret after their former ancestor and advance our index beyond them
ret.splice.apply(ret, [i + 1, 0].concat(jsTags));
i += jsTags.length;
}
}
}
}
return ret;
},
cleanData: function cleanData(elems,
/* internal */
acceptData) {
var data,
id,
elem,
type,
i = 0,
internalKey = jQuery.expando,
cache = jQuery.cache,
deleteExpando = jQuery.support.deleteExpando,
special = jQuery.event.special;
for (; (elem = elems[i]) != null; i++) {
if (acceptData || jQuery.acceptData(elem)) {
id = elem[internalKey];
data = id && cache[id];
if (data) {
if (data.events) {
for (type in data.events) {
if (special[type]) {
jQuery.event.remove(elem, type); // This is a shortcut to avoid jQuery.event.remove's overhead
} else {
jQuery.removeEvent(elem, type, data.handle);
}
}
} // Remove cache only if it was not already removed by jQuery.event.remove
if (cache[id]) {
delete cache[id]; // IE does not allow us to delete expando properties from nodes,
// nor does it have a removeAttribute function on Document nodes;
// we must handle all of these cases
if (deleteExpando) {
delete elem[internalKey];
} else if (elem.removeAttribute) {
elem.removeAttribute(internalKey);
} else {
elem[internalKey] = null;
}
jQuery.deletedIds.push(id);
}
}
}
}
}
}); // Limit scope pollution from any deprecated API
(function () {
var matched, browser; // Use of jQuery.browser is frowned upon.
// More details: http://api.jquery.com/jQuery.browser
// jQuery.uaMatch maintained for back-compat
jQuery.uaMatch = function (ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || /(webkit)[ \/]([\w.]+)/.exec(ua) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || /(msie) ([\w.]+)/.exec(ua) || ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || [];
return {
browser: match[1] || "",
version: match[2] || "0"
};
};
matched = jQuery.uaMatch(navigator.userAgent);
browser = {};
if (matched.browser) {
browser[matched.browser] = true;
browser.version = matched.version;
} // Chrome is Webkit, but Webkit is also Safari.
if (browser.chrome) {
browser.webkit = true;
} else if (browser.webkit) {
browser.safari = true;
}
jQuery.browser = browser;
jQuery.sub = function () {
function jQuerySub(selector, context) {
return new jQuerySub.fn.init(selector, context);
}
jQuery.extend(true, jQuerySub, this);
jQuerySub.superclass = this;
jQuerySub.fn = jQuerySub.prototype = this();
jQuerySub.fn.constructor = jQuerySub;
jQuerySub.sub = this.sub;
jQuerySub.fn.init = function init(selector, context) {
if (context && context instanceof jQuery && !(context instanceof jQuerySub)) {
context = jQuerySub(context);
}
return jQuery.fn.init.call(this, selector, context, rootjQuerySub);
};
jQuerySub.fn.init.prototype = jQuerySub.fn;
var rootjQuerySub = jQuerySub(document);
return jQuerySub;
};
})();
var curCSS,
iframe,
iframeDoc,
ralpha = /alpha\([^)]*\)/i,
ropacity = /opacity=([^)]*)/,
rposition = /^(top|right|bottom|left)$/,
// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
rdisplayswap = /^(none|table(?!-c[ea]).+)/,
rmargin = /^margin/,
rnumsplit = new RegExp("^(" + core_pnum + ")(.*)$", "i"),
rnumnonpx = new RegExp("^(" + core_pnum + ")(?!px)[a-z%]+$", "i"),
rrelNum = new RegExp("^([-+])=(" + core_pnum + ")", "i"),
elemdisplay = {},
cssShow = {
position: "absolute",
visibility: "hidden",
display: "block"
},
cssNormalTransform = {
letterSpacing: 0,
fontWeight: 400
},
cssExpand = ["Top", "Right", "Bottom", "Left"],
cssPrefixes = ["Webkit", "O", "Moz", "ms"],
eventsToggle = jQuery.fn.toggle; // return a css property mapped to a potentially vendor prefixed property
function vendorPropName(style, name) {
// shortcut for names that are not vendor prefixed
if (name in style) {
return name;
} // check for vendor prefixed names
var capName = name.charAt(0).toUpperCase() + name.slice(1),
origName = name,
i = cssPrefixes.length;
while (i--) {
name = cssPrefixes[i] + capName;
if (name in style) {
return name;
}
}
return origName;
}
function isHidden(elem, el) {
elem = el || elem;
return jQuery.css(elem, "display") === "none" || !jQuery.contains(elem.ownerDocument, elem);
}
function showHide(elements, show) {
var elem,
display,
values = [],
index = 0,
length = elements.length;
for (; index < length; index++) {
elem = elements[index];
if (!elem.style) {
continue;
}
values[index] = jQuery._data(elem, "olddisplay");
if (show) {
// Reset the inline display of this element to learn if it is
// being hidden by cascaded rules or not
if (!values[index] && elem.style.display === "none") {
elem.style.display = "";
} // Set elements which have been overridden with display: none
// in a stylesheet to whatever the default browser style is
// for such an element
if (elem.style.display === "" && isHidden(elem)) {
values[index] = jQuery._data(elem, "olddisplay", css_defaultDisplay(elem.nodeName));
}
} else {
display = curCSS(elem, "display");
if (!values[index] && display !== "none") {
jQuery._data(elem, "olddisplay", display);
}
}
} // Set the display of most of the elements in a second loop
// to avoid the constant reflow
for (index = 0; index < length; index++) {
elem = elements[index];
if (!elem.style) {
continue;
}
if (!show || elem.style.display === "none" || elem.style.display === "") {
elem.style.display = show ? values[index] || "" : "none";
}
}
return elements;
}
jQuery.fn.extend({
css: function css(name, value) {
return jQuery.access(this, function (elem, name, value) {
return value !== undefined ? jQuery.style(elem, name, value) : jQuery.css(elem, name);
}, name, value, arguments.length > 1);
},
show: function show() {
return showHide(this, true);
},
hide: function hide() {
return showHide(this);
},
toggle: function toggle(state, fn2) {
var bool = typeof state === "boolean";
if (jQuery.isFunction(state) && jQuery.isFunction(fn2)) {
return eventsToggle.apply(this, arguments);
}
return this.each(function () {
if (bool ? state : isHidden(this)) {
jQuery(this).show();
} else {
jQuery(this).hide();
}
});
}
});
jQuery.extend({
// Add in style property hooks for overriding the default
// behavior of getting and setting a style property
cssHooks: {
opacity: {
get: function get(elem, computed) {
if (computed) {
// We should always get a number back from opacity
var ret = curCSS(elem, "opacity");
return ret === "" ? "1" : ret;
}
}
}
},
// Exclude the following css properties to add px
cssNumber: {
"fillOpacity": true,
"fontWeight": true,
"lineHeight": true,
"opacity": true,
"orphans": true,
"widows": true,
"zIndex": true,
"zoom": true
},
// Add in properties whose names you wish to fix before
// setting or getting the value
cssProps: {
// normalize float css property
"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
},
// Get and set the style property on a DOM Node
style: function style(elem, name, value, extra) {
// Don't set styles on text and comment nodes
if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {
return;
} // Make sure that we're working with the right name
var ret,
type,
hooks,
origName = jQuery.camelCase(name),
style = elem.style;
name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(style, origName)); // gets hook for the prefixed version
// followed by the unprefixed version
hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; // Check if we're setting a value
if (value !== undefined) {
type = _typeof(value); // convert relative number strings (+= or -=) to relative numbers. #7345
if (type === "string" && (ret = rrelNum.exec(value))) {
value = (ret[1] + 1) * ret[2] + parseFloat(jQuery.css(elem, name)); // Fixes bug #9237
type = "number";
} // Make sure that NaN and null values aren't set. See: #7116
if (value == null || type === "number" && isNaN(value)) {
return;
} // If a number was passed in, add 'px' to the (except for certain CSS properties)
if (type === "number" && !jQuery.cssNumber[origName]) {
value += "px";
} // If a hook was provided, use that value, otherwise just set the specified value
if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== undefined) {
// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
// Fixes bug #5509
try {
style[name] = value;
} catch (e) {}
}
} else {
// If a hook was provided get the non-computed value from there
if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) {
return ret;
} // Otherwise just get the value from the style object
return style[name];
}
},
css: function css(elem, name, numeric, extra) {
var val,
num,
hooks,
origName = jQuery.camelCase(name); // Make sure that we're working with the right name
name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(elem.style, origName)); // gets hook for the prefixed version
// followed by the unprefixed version
hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; // If a hook was provided get the computed value from there
if (hooks && "get" in hooks) {
val = hooks.get(elem, true, extra);
} // Otherwise, if a way to get the computed value exists, use that
if (val === undefined) {
val = curCSS(elem, name);
} //convert "normal" to computed value
if (val === "normal" && name in cssNormalTransform) {
val = cssNormalTransform[name];
} // Return, converting to number if forced or a qualifier was provided and val looks numeric
if (numeric || extra !== undefined) {
num = parseFloat(val);
return numeric || jQuery.isNumeric(num) ? num || 0 : val;
}
return val;
},
// A method for quickly swapping in/out CSS properties to get correct calculations
swap: function swap(elem, options, callback) {
var ret,
name,
old = {}; // Remember the old values, and insert the new ones
for (name in options) {
old[name] = elem.style[name];
elem.style[name] = options[name];
}
ret = callback.call(elem); // Revert the old values
for (name in options) {
elem.style[name] = old[name];
}
return ret;
}
}); // NOTE: To any future maintainer, we've window.getComputedStyle
// because jsdom on node.js will break without it.
if (window.getComputedStyle) {
curCSS = function curCSS(elem, name) {
var ret,
width,
minWidth,
maxWidth,
computed = window.getComputedStyle(elem, null),
style = elem.style;
if (computed) {
ret = computed[name];
if (ret === "" && !jQuery.contains(elem.ownerDocument, elem)) {
ret = jQuery.style(elem, name);
} // A tribute to the "awesome hack by Dean Edwards"
// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
if (rnumnonpx.test(ret) && rmargin.test(name)) {
width = style.width;
minWidth = style.minWidth;
maxWidth = style.maxWidth;
style.minWidth = style.maxWidth = style.width = ret;
ret = computed.width;
style.width = width;
style.minWidth = minWidth;
style.maxWidth = maxWidth;
}
}
return ret;
};
} else if (document.documentElement.currentStyle) {
curCSS = function curCSS(elem, name) {
var left,
rsLeft,
ret = elem.currentStyle && elem.currentStyle[name],
style = elem.style; // Avoid setting ret to empty string here
// so we don't default to auto
if (ret == null && style && style[name]) {
ret = style[name];
} // From the awesome hack by Dean Edwards
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
// If we're not dealing with a regular pixel number
// but a number that has a weird ending, we need to convert it to pixels
// but not position css attributes, as those are proportional to the parent element instead
// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
if (rnumnonpx.test(ret) && !rposition.test(name)) {
// Remember the original values
left = style.left;
rsLeft = elem.runtimeStyle && elem.runtimeStyle.left; // Put in the new values to get a computed value out
if (rsLeft) {
elem.runtimeStyle.left = elem.currentStyle.left;
}
style.left = name === "fontSize" ? "1em" : ret;
ret = style.pixelLeft + "px"; // Revert the changed values
style.left = left;
if (rsLeft) {
elem.runtimeStyle.left = rsLeft;
}
}
return ret === "" ? "auto" : ret;
};
}
function setPositiveNumber(elem, value, subtract) {
var matches = rnumsplit.exec(value);
return matches ? Math.max(0, matches[1] - (subtract || 0)) + (matches[2] || "px") : value;
}
function augmentWidthOrHeight(elem, name, extra, isBorderBox) {
var i = extra === (isBorderBox ? "border" : "content") ? // If we already have the right measurement, avoid augmentation
4 : // Otherwise initialize for horizontal or vertical properties
name === "width" ? 1 : 0,
val = 0;
for (; i < 4; i += 2) {
// both box models exclude margin, so add it if we want it
if (extra === "margin") {
// we use jQuery.css instead of curCSS here
// because of the reliableMarginRight CSS hook!
val += jQuery.css(elem, extra + cssExpand[i], true);
} // From this point on we use curCSS for maximum performance (relevant in animations)
if (isBorderBox) {
// border-box includes padding, so remove it if we want content
if (extra === "content") {
val -= parseFloat(curCSS(elem, "padding" + cssExpand[i])) || 0;
} // at this point, extra isn't border nor margin, so remove border
if (extra !== "margin") {
val -= parseFloat(curCSS(elem, "border" + cssExpand[i] + "Width")) || 0;
}
} else {
// at this point, extra isn't content, so add padding
val += parseFloat(curCSS(elem, "padding" + cssExpand[i])) || 0; // at this point, extra isn't content nor padding, so add border
if (extra !== "padding") {
val += parseFloat(curCSS(elem, "border" + cssExpand[i] + "Width")) || 0;
}
}
}
return val;
}
function getWidthOrHeight(elem, name, extra) {
// Start with offset property, which is equivalent to the border-box value
var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
valueIsBorderBox = true,
isBorderBox = jQuery.support.boxSizing && jQuery.css(elem, "boxSizing") === "border-box"; // some non-html elements return undefined for offsetWidth, so check for null/undefined
// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
if (val <= 0 || val == null) {
// Fall back to computed then uncomputed css if necessary
val = curCSS(elem, name);
if (val < 0 || val == null) {
val = elem.style[name];
} // Computed unit is not pixels. Stop here and return.
if (rnumnonpx.test(val)) {
return val;
} // we need the check for style in case a browser which returns unreliable values
// for getComputedStyle silently falls back to the reliable elem.style
valueIsBorderBox = isBorderBox && (jQuery.support.boxSizingReliable || val === elem.style[name]); // Normalize "", auto, and prepare for extra
val = parseFloat(val) || 0;
} // use the active box-sizing model to add/subtract irrelevant styles
return val + augmentWidthOrHeight(elem, name, extra || (isBorderBox ? "border" : "content"), valueIsBorderBox) + "px";
} // Try to determine the default display value of an element
function css_defaultDisplay(nodeName) {
if (elemdisplay[nodeName]) {
return elemdisplay[nodeName];
}
var elem = jQuery("<" + nodeName + ">").appendTo(document.body),
display = elem.css("display");
elem.remove(); // If the simple way fails,
// get element's real default display by attaching it to a temp iframe
if (display === "none" || display === "") {
// Use the already-created iframe if possible
iframe = document.body.appendChild(iframe || jQuery.extend(document.createElement("iframe"), {
frameBorder: 0,
width: 0,
height: 0
})); // Create a cacheable copy of the iframe document on first call.
// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
// document to it; WebKit & Firefox won't allow reusing the iframe document.
if (!iframeDoc || !iframe.createElement) {
iframeDoc = (iframe.contentWindow || iframe.contentDocument).document;
iframeDoc.write("<!doctype html><html><body>");
iframeDoc.close();
}
elem = iframeDoc.body.appendChild(iframeDoc.createElement(nodeName));
display = curCSS(elem, "display");
document.body.removeChild(iframe);
} // Store the correct default display
elemdisplay[nodeName] = display;
return display;
}
jQuery.each(["height", "width"], function (i, name) {
jQuery.cssHooks[name] = {
get: function get(elem, computed, extra) {
if (computed) {
// certain elements can have dimension info if we invisibly show them
// however, it must have a current display style that would benefit from this
if (elem.offsetWidth === 0 && rdisplayswap.test(curCSS(elem, "display"))) {
return jQuery.swap(elem, cssShow, function () {
return getWidthOrHeight(elem, name, extra);
});
} else {
return getWidthOrHeight(elem, name, extra);
}
}
},
set: function set(elem, value, extra) {
return setPositiveNumber(elem, value, extra ? augmentWidthOrHeight(elem, name, extra, jQuery.support.boxSizing && jQuery.css(elem, "boxSizing") === "border-box") : 0);
}
};
});
if (!jQuery.support.opacity) {
jQuery.cssHooks.opacity = {
get: function get(elem, computed) {
// IE uses filters for opacity
return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ? 0.01 * parseFloat(RegExp.$1) + "" : computed ? "1" : "";
},
set: function set(elem, value) {
var style = elem.style,
currentStyle = elem.currentStyle,
opacity = jQuery.isNumeric(value) ? "alpha(opacity=" + value * 100 + ")" : "",
filter = currentStyle && currentStyle.filter || style.filter || ""; // IE has trouble with opacity if it does not have layout
// Force it by setting the zoom level
style.zoom = 1; // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
if (value >= 1 && jQuery.trim(filter.replace(ralpha, "")) === "" && style.removeAttribute) {
// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
// if "filter:" is present at all, clearType is disabled, we want to avoid this
// style.removeAttribute is IE Only, but so apparently is this code path...
style.removeAttribute("filter"); // if there there is no filter style applied in a css rule, we are done
if (currentStyle && !currentStyle.filter) {
return;
}
} // otherwise, set new filter values
style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : filter + " " + opacity;
}
};
} // These hooks cannot be added until DOM ready because the support test
// for it is not run until after DOM ready
jQuery(function () {
if (!jQuery.support.reliableMarginRight) {
jQuery.cssHooks.marginRight = {
get: function get(elem, computed) {
// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
// Work around by temporarily setting element display to inline-block
return jQuery.swap(elem, {
"display": "inline-block"
}, function () {
if (computed) {
return curCSS(elem, "marginRight");
}
});
}
};
} // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
// getComputedStyle returns percent when specified for top/left/bottom/right
// rather than make the css module depend on the offset module, we just check for it here
if (!jQuery.support.pixelPosition && jQuery.fn.position) {
jQuery.each(["top", "left"], function (i, prop) {
jQuery.cssHooks[prop] = {
get: function get(elem, computed) {
if (computed) {
var ret = curCSS(elem, prop); // if curCSS returns percentage, fallback to offset
return rnumnonpx.test(ret) ? jQuery(elem).position()[prop] + "px" : ret;
}
}
};
});
}
});
if (jQuery.expr && jQuery.expr.filters) {
jQuery.expr.filters.hidden = function (elem) {
return elem.offsetWidth === 0 && elem.offsetHeight === 0 || !jQuery.support.reliableHiddenOffsets && (elem.style && elem.style.display || curCSS(elem, "display")) === "none";
};
jQuery.expr.filters.visible = function (elem) {
return !jQuery.expr.filters.hidden(elem);
};
} // These hooks are used by animate to expand properties
jQuery.each({
margin: "",
padding: "",
border: "Width"
}, function (prefix, suffix) {
jQuery.cssHooks[prefix + suffix] = {
expand: function expand(value) {
var i,
// assumes a single number if not a string
parts = typeof value === "string" ? value.split(" ") : [value],
expanded = {};
for (i = 0; i < 4; i++) {
expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0];
}
return expanded;
}
};
if (!rmargin.test(prefix)) {
jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
}
});
var r20 = /%20/g,
rbracket = /\[\]$/,
rCRLF = /\r?\n/g,
rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
rselectTextarea = /^(?:select|textarea)/i;
jQuery.fn.extend({
serialize: function serialize() {
return jQuery.param(this.serializeArray());
},
serializeArray: function serializeArray() {
return this.map(function () {
return this.elements ? jQuery.makeArray(this.elements) : this;
}).filter(function () {
return this.name && !this.disabled && (this.checked || rselectTextarea.test(this.nodeName) || rinput.test(this.type));
}).map(function (i, elem) {
var val = jQuery(this).val();
return val == null ? null : jQuery.isArray(val) ? jQuery.map(val, function (val, i) {
return {
name: elem.name,
value: val.replace(rCRLF, "\r\n")
};
}) : {
name: elem.name,
value: val.replace(rCRLF, "\r\n")
};
}).get();
}
}); //Serialize an array of form elements or a set of
//key/values into a query string
jQuery.param = function (a, traditional) {
var prefix,
s = [],
add = function add(key, value) {
// If value is a function, invoke it and return its value
value = jQuery.isFunction(value) ? value() : value == null ? "" : value;
s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
}; // Set traditional to true for jQuery <= 1.3.2 behavior.
if (traditional === undefined) {
traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
} // If an array was passed in, assume that it is an array of form elements.
if (jQuery.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) {
// Serialize the form elements
jQuery.each(a, function () {
add(this.name, this.value);
});
} else {
// If traditional, encode the "old" way (the way 1.3.2 or older
// did it), otherwise encode params recursively.
for (prefix in a) {
buildParams(prefix, a[prefix], traditional, add);
}
} // Return the resulting serialization
return s.join("&").replace(r20, "+");
};
function buildParams(prefix, obj, traditional, add) {
var name;
if (jQuery.isArray(obj)) {
// Serialize array item.
jQuery.each(obj, function (i, v) {
if (traditional || rbracket.test(prefix)) {
// Treat each array item as a scalar.
add(prefix, v);
} else {
// If array item is non-scalar (array or object), encode its
// numeric index to resolve deserialization ambiguity issues.
// Note that rack (as of 1.0.0) can't currently deserialize
// nested arrays properly, and attempting to do so may cause
// a server error. Possible fixes are to modify rack's
// deserialization algorithm or to provide an option or flag
// to force array serialization to be shallow.
buildParams(prefix + "[" + (_typeof(v) === "object" ? i : "") + "]", v, traditional, add);
}
});
} else if (!traditional && jQuery.type(obj) === "object") {
// Serialize object item.
for (name in obj) {
buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
}
} else {
// Serialize scalar item.
add(prefix, obj);
}
}
var // Document location
ajaxLocation,
// Document location segments
ajaxLocParts,
rhash = /#.*$/,
rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,
// IE leaves an \r character at EOL
// #7653, #8125, #8152: local protocol detection
rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
rnoContent = /^(?:GET|HEAD)$/,
rprotocol = /^\/\//,
rquery = /\?/,
rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
rts = /([?&])_=[^&]*/,
rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
// Keep a copy of the old load method
_load = jQuery.fn.load,
/* Prefilters
* 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
* 2) These are called:
* - BEFORE asking for a transport
* - AFTER param serialization (s.data is a string if s.processData is true)
* 3) key is the dataType
* 4) the catchall symbol "*" can be used
* 5) execution will start with transport dataType and THEN continue down to "*" if needed
*/
prefilters = {},
/* Transports bindings
* 1) key is the dataType
* 2) the catchall symbol "*" can be used
* 3) selection will start with transport dataType and THEN go to "*" if needed
*/
transports = {},
// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
allTypes = ["*/"] + ["*"]; // #8138, IE may throw an exception when accessing
// a field from window.location if document.domain has been set
try {
ajaxLocation = location.href;
} catch (e) {
// Use the href attribute of an A element
// since IE will modify it given document.location
ajaxLocation = document.createElement("a");
ajaxLocation.href = "";
ajaxLocation = ajaxLocation.href;
} // Segment location into parts
ajaxLocParts = rurl.exec(ajaxLocation.toLowerCase()) || []; // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports(structure) {
// dataTypeExpression is optional and defaults to "*"
return function (dataTypeExpression, func) {
if (typeof dataTypeExpression !== "string") {
func = dataTypeExpression;
dataTypeExpression = "*";
}
var dataType,
list,
placeBefore,
dataTypes = dataTypeExpression.toLowerCase().split(core_rspace),
i = 0,
length = dataTypes.length;
if (jQuery.isFunction(func)) {
// For each dataType in the dataTypeExpression
for (; i < length; i++) {
dataType = dataTypes[i]; // We control if we're asked to add before
// any existing element
placeBefore = /^\+/.test(dataType);
if (placeBefore) {
dataType = dataType.substr(1) || "*";
}
list = structure[dataType] = structure[dataType] || []; // then we add to the structure accordingly
list[placeBefore ? "unshift" : "push"](func);
}
}
};
} // Base inspection function for prefilters and transports
function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR, dataType
/* internal */
, inspected
/* internal */
) {
dataType = dataType || options.dataTypes[0];
inspected = inspected || {};
inspected[dataType] = true;
var selection,
list = structure[dataType],
i = 0,
length = list ? list.length : 0,
executeOnly = structure === prefilters;
for (; i < length && (executeOnly || !selection); i++) {
selection = list[i](options, originalOptions, jqXHR); // If we got redirected to another dataType
// we try there if executing only and not done already
if (typeof selection === "string") {
if (!executeOnly || inspected[selection]) {
selection = undefined;
} else {
options.dataTypes.unshift(selection);
selection = inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR, selection, inspected);
}
}
} // If we're only executing or nothing was selected
// we try the catchall dataType if not done already
if ((executeOnly || !selection) && !inspected["*"]) {
selection = inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR, "*", inspected);
} // unnecessary when only executing (prefilters)
// but it'll be ignored by the caller in that case
return selection;
} // A special extend for ajax options
// that takes "flat" options (not to be deep extended)
// Fixes #9887
function ajaxExtend(target, src) {
var key,
deep,
flatOptions = jQuery.ajaxSettings.flatOptions || {};
for (key in src) {
if (src[key] !== undefined) {
(flatOptions[key] ? target : deep || (deep = {}))[key] = src[key];
}
}
if (deep) {
jQuery.extend(true, target, deep);
}
}
jQuery.fn.load = function (url, params, callback) {
if (typeof url !== "string" && _load) {
return _load.apply(this, arguments);
} // Don't do a request if no elements are being requested
if (!this.length) {
return this;
}
var selector,
type,
response,
self = this,
off = url.indexOf(" ");
if (off >= 0) {
selector = url.slice(off, url.length);
url = url.slice(0, off);
} // If it's a function
if (jQuery.isFunction(params)) {
// We assume that it's the callback
callback = params;
params = undefined; // Otherwise, build a param string
} else if (params && _typeof(params) === "object") {
type = "POST";
} // Request the remote document
jQuery.ajax({
url: url,
// if "type" variable is undefined, then "GET" method will be used
type: type,
dataType: "html",
data: params,
complete: function complete(jqXHR, status) {
if (callback) {
self.each(callback, response || [jqXHR.responseText, status, jqXHR]);
}
}
}).done(function (responseText) {
// Save response for use in complete callback
response = arguments; // See if a selector was specified
self.html(selector ? // Create a dummy div to hold the results
jQuery("<div>") // inject the contents of the document in, removing the scripts
// to avoid any 'Permission Denied' errors in IE
.append(responseText.replace(rscript, "")) // Locate the specified elements
.find(selector) : // If not, just inject the full result
responseText);
});
return this;
}; // Attach a bunch of functions for handling common AJAX events
jQuery.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function (i, o) {
jQuery.fn[o] = function (f) {
return this.on(o, f);
};
});
jQuery.each(["get", "post"], function (i, method) {
jQuery[method] = function (url, data, callback, type) {
// shift arguments if data argument was omitted
if (jQuery.isFunction(data)) {
type = type || callback;
callback = data;
data = undefined;
}
return jQuery.ajax({
type: method,
url: url,
data: data,
success: callback,
dataType: type
});
};
});
jQuery.extend({
getScript: function getScript(url, callback) {
return jQuery.get(url, undefined, callback, "script");
},
getJSON: function getJSON(url, data, callback) {
return jQuery.get(url, data, callback, "json");
},
// Creates a full fledged settings object into target
// with both ajaxSettings and settings fields.
// If target is omitted, writes into ajaxSettings.
ajaxSetup: function ajaxSetup(target, settings) {
if (settings) {
// Building a settings object
ajaxExtend(target, jQuery.ajaxSettings);
} else {
// Extending ajaxSettings
settings = target;
target = jQuery.ajaxSettings;
}
ajaxExtend(target, settings);
return target;
},
ajaxSettings: {
url: ajaxLocation,
isLocal: rlocalProtocol.test(ajaxLocParts[1]),
global: true,
type: "GET",
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
processData: true,
async: true,
/*
timeout: 0,
data: null,
dataType: null,
username: null,
password: null,
cache: null,
throws: false,
traditional: false,
headers: {},
*/
accepts: {
xml: "application/xml, text/xml",
html: "text/html",
text: "text/plain",
json: "application/json, text/javascript",
"*": allTypes
},
contents: {
xml: /xml/,
html: /html/,
json: /json/
},
responseFields: {
xml: "responseXML",
text: "responseText"
},
// List of data converters
// 1) key format is "source_type destination_type" (a single space in-between)
// 2) the catchall symbol "*" can be used for source_type
converters: {
// Convert anything to text
"* text": window.String,
// Text to html (true = no transformation)
"text html": true,
// Evaluate text as a json expression
"text json": jQuery.parseJSON,
// Parse text as xml
"text xml": jQuery.parseXML
},
// For options that shouldn't be deep extended:
// you can add your own custom options here if
// and when you create one that shouldn't be
// deep extended (see ajaxExtend)
flatOptions: {
context: true,
url: true
}
},
ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
ajaxTransport: addToPrefiltersOrTransports(transports),
// Main method
ajax: function ajax(url, options) {
// If url is an object, simulate pre-1.5 signature
if (_typeof(url) === "object") {
options = url;
url = undefined;
} // Force options to be an object
options = options || {};
var // ifModified key
ifModifiedKey,
// Response headers
responseHeadersString,
responseHeaders,
// transport
transport,
// timeout handle
timeoutTimer,
// Cross-domain detection vars
parts,
// To know if global events are to be dispatched
fireGlobals,
// Loop variable
i,
// Create the final options object
s = jQuery.ajaxSetup({}, options),
// Callbacks context
callbackContext = s.context || s,
// Context for global events
// It's the callbackContext if one was provided in the options
// and if it's a DOM node or a jQuery collection
globalEventContext = callbackContext !== s && (callbackContext.nodeType || callbackContext instanceof jQuery) ? jQuery(callbackContext) : jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
completeDeferred = jQuery.Callbacks("once memory"),
// Status-dependent callbacks
statusCode = s.statusCode || {},
// Headers (they are sent all at once)
requestHeaders = {},
requestHeadersNames = {},
// The jqXHR state
state = 0,
// Default abort message
strAbort = "canceled",
// Fake xhr
jqXHR = {
readyState: 0,
// Caches the header
setRequestHeader: function setRequestHeader(name, value) {
if (!state) {
var lname = name.toLowerCase();
name = requestHeadersNames[lname] = requestHeadersNames[lname] || name;
requestHeaders[name] = value;
}
return this;
},
// Raw string
getAllResponseHeaders: function getAllResponseHeaders() {
return state === 2 ? responseHeadersString : null;
},
// Builds headers hashtable if needed
getResponseHeader: function getResponseHeader(key) {
var match;
if (state === 2) {
if (!responseHeaders) {
responseHeaders = {};
while (match = rheaders.exec(responseHeadersString)) {
responseHeaders[match[1].toLowerCase()] = match[2];
}
}
match = responseHeaders[key.toLowerCase()];
}
return match === undefined ? null : match;
},
// Overrides response content-type header
overrideMimeType: function overrideMimeType(type) {
if (!state) {
s.mimeType = type;
}
return this;
},
// Cancel the request
abort: function abort(statusText) {
statusText = statusText || strAbort;
if (transport) {
transport.abort(statusText);
}
done(0, statusText);
return this;
}
}; // Callback for when everything is done
// It is defined here because jslint complains if it is declared
// at the end of the function (which would be more logical and readable)
function done(status, nativeStatusText, responses, headers) {
var isSuccess,
success,
error,
response,
modified,
statusText = nativeStatusText; // Called once
if (state === 2) {
return;
} // State is "done" now
state = 2; // Clear timeout if it exists
if (timeoutTimer) {
clearTimeout(timeoutTimer);
} // Dereference transport for early garbage collection
// (no matter how long the jqXHR object will be used)
transport = undefined; // Cache response headers
responseHeadersString = headers || ""; // Set readyState
jqXHR.readyState = status > 0 ? 4 : 0; // Get response data
if (responses) {
response = ajaxHandleResponses(s, jqXHR, responses);
} // If successful, handle type chaining
if (status >= 200 && status < 300 || status === 304) {
// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
if (s.ifModified) {
modified = jqXHR.getResponseHeader("Last-Modified");
if (modified) {
jQuery.lastModified[ifModifiedKey] = modified;
}
modified = jqXHR.getResponseHeader("Etag");
if (modified) {
jQuery.etag[ifModifiedKey] = modified;
}
} // If not modified
if (status === 304) {
statusText = "notmodified";
isSuccess = true; // If we have data
} else {
isSuccess = ajaxConvert(s, response);
statusText = isSuccess.state;
success = isSuccess.data;
error = isSuccess.error;
isSuccess = !error;
}
} else {
// We extract error from statusText
// then normalize statusText and status for non-aborts
error = statusText;
if (!statusText || status) {
statusText = "error";
if (status < 0) {
status = 0;
}
}
} // Set data for the fake xhr object
jqXHR.status = status;
jqXHR.statusText = "" + (nativeStatusText || statusText); // Success/Error
if (isSuccess) {
deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);
} else {
deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);
} // Status-dependent callbacks
jqXHR.statusCode(statusCode);
statusCode = undefined;
if (fireGlobals) {
globalEventContext.trigger("ajax" + (isSuccess ? "Success" : "Error"), [jqXHR, s, isSuccess ? success : error]);
} // Complete
completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);
if (fireGlobals) {
globalEventContext.trigger("ajaxComplete", [jqXHR, s]); // Handle the global AJAX counter
if (! --jQuery.active) {
jQuery.event.trigger("ajaxStop");
}
}
} // Attach deferreds
deferred.promise(jqXHR);
jqXHR.success = jqXHR.done;
jqXHR.error = jqXHR.fail;
jqXHR.complete = completeDeferred.add; // Status-dependent callbacks
jqXHR.statusCode = function (map) {
if (map) {
var tmp;
if (state < 2) {
for (tmp in map) {
statusCode[tmp] = [statusCode[tmp], map[tmp]];
}
} else {
tmp = map[jqXHR.status];
jqXHR.always(tmp);
}
}
return this;
}; // Remove hash character (#7531: and string promotion)
// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
// We also use the url parameter if available
s.url = ((url || s.url) + "").replace(rhash, "").replace(rprotocol, ajaxLocParts[1] + "//"); // Extract dataTypes list
s.dataTypes = jQuery.trim(s.dataType || "*").toLowerCase().split(core_rspace); // Determine if a cross-domain request is in order
if (s.crossDomain == null) {
parts = rurl.exec(s.url.toLowerCase());
s.crossDomain = !!(parts && (parts[1] != ajaxLocParts[1] || parts[2] != ajaxLocParts[2] || (parts[3] || (parts[1] === "http:" ? 80 : 443)) != (ajaxLocParts[3] || (ajaxLocParts[1] === "http:" ? 80 : 443))));
} // Convert data if not already a string
if (s.data && s.processData && typeof s.data !== "string") {
s.data = jQuery.param(s.data, s.traditional);
} // Apply prefilters
inspectPrefiltersOrTransports(prefilters, s, options, jqXHR); // If request was aborted inside a prefilter, stop there
if (state === 2) {
return jqXHR;
} // We can fire global events as of now if asked to
fireGlobals = s.global; // Uppercase the type
s.type = s.type.toUpperCase(); // Determine if request has content
s.hasContent = !rnoContent.test(s.type); // Watch for a new set of requests
if (fireGlobals && jQuery.active++ === 0) {
jQuery.event.trigger("ajaxStart");
} // More options handling for requests with no content
if (!s.hasContent) {
// If data is available, append data to url
if (s.data) {
s.url += (rquery.test(s.url) ? "&" : "?") + s.data; // #9682: remove data so that it's not used in an eventual retry
delete s.data;
} // Get ifModifiedKey before adding the anti-cache parameter
ifModifiedKey = s.url; // Add anti-cache in url if needed
if (s.cache === false) {
var ts = jQuery.now(),
// try replacing _= if it is there
ret = s.url.replace(rts, "$1_=" + ts); // if nothing was replaced, add timestamp to the end
s.url = ret + (ret === s.url ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
}
} // Set the correct header, if data is being sent
if (s.data && s.hasContent && s.contentType !== false || options.contentType) {
jqXHR.setRequestHeader("Content-Type", s.contentType);
} // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
if (s.ifModified) {
ifModifiedKey = ifModifiedKey || s.url;
if (jQuery.lastModified[ifModifiedKey]) {
jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[ifModifiedKey]);
}
if (jQuery.etag[ifModifiedKey]) {
jqXHR.setRequestHeader("If-None-Match", jQuery.etag[ifModifiedKey]);
}
} // Set the Accepts header for the server, depending on the dataType
jqXHR.setRequestHeader("Accept", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"]); // Check for headers option
for (i in s.headers) {
jqXHR.setRequestHeader(i, s.headers[i]);
} // Allow custom headers/mimetypes and early abort
if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || state === 2)) {
// Abort if not done already and return
return jqXHR.abort();
} // aborting is no longer a cancellation
strAbort = "abort"; // Install callbacks on deferreds
for (i in {
success: 1,
error: 1,
complete: 1
}) {
jqXHR[i](s[i]);
} // Get transport
transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR); // If no transport, we auto-abort
if (!transport) {
done(-1, "No Transport");
} else {
jqXHR.readyState = 1; // Send global event
if (fireGlobals) {
globalEventContext.trigger("ajaxSend", [jqXHR, s]);
} // Timeout
if (s.async && s.timeout > 0) {
timeoutTimer = setTimeout(function () {
jqXHR.abort("timeout");
}, s.timeout);
}
try {
state = 1;
transport.send(requestHeaders, done);
} catch (e) {
// Propagate exception as error if not done
if (state < 2) {
done(-1, e); // Simply rethrow otherwise
} else {
throw e;
}
}
}
return jqXHR;
},
// Counter for holding the number of active queries
active: 0,
// Last-Modified header cache for next request
lastModified: {},
etag: {}
});
/* Handles responses to an ajax request:
* - sets all responseXXX fields accordingly
* - finds the right dataType (mediates between content-type and expected dataType)
* - returns the corresponding response
*/
function ajaxHandleResponses(s, jqXHR, responses) {
var ct,
type,
finalDataType,
firstDataType,
contents = s.contents,
dataTypes = s.dataTypes,
responseFields = s.responseFields; // Fill responseXXX fields
for (type in responseFields) {
if (type in responses) {
jqXHR[responseFields[type]] = responses[type];
}
} // Remove auto dataType and get content-type in the process
while (dataTypes[0] === "*") {
dataTypes.shift();
if (ct === undefined) {
ct = s.mimeType || jqXHR.getResponseHeader("content-type");
}
} // Check if we're dealing with a known content-type
if (ct) {
for (type in contents) {
if (contents[type] && contents[type].test(ct)) {
dataTypes.unshift(type);
break;
}
}
} // Check to see if we have a response for the expected dataType
if (dataTypes[0] in responses) {
finalDataType = dataTypes[0];
} else {
// Try convertible dataTypes
for (type in responses) {
if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
finalDataType = type;
break;
}
if (!firstDataType) {
firstDataType = type;
}
} // Or just use first one
finalDataType = finalDataType || firstDataType;
} // If we found a dataType
// We add the dataType to the list if needed
// and return the corresponding response
if (finalDataType) {
if (finalDataType !== dataTypes[0]) {
dataTypes.unshift(finalDataType);
}
return responses[finalDataType];
}
} // Chain conversions given the request and the original response
function ajaxConvert(s, response) {
var conv,
conv2,
current,
tmp,
// Work with a copy of dataTypes in case we need to modify it for conversion
dataTypes = s.dataTypes.slice(),
prev = dataTypes[0],
converters = {},
i = 0; // Apply the dataFilter if provided
if (s.dataFilter) {
response = s.dataFilter(response, s.dataType);
} // Create converters map with lowercased keys
if (dataTypes[1]) {
for (conv in s.converters) {
converters[conv.toLowerCase()] = s.converters[conv];
}
} // Convert to each sequential dataType, tolerating list modification
for (; current = dataTypes[++i];) {
// There's only work to do if current dataType is non-auto
if (current !== "*") {
// Convert response if prev dataType is non-auto and differs from current
if (prev !== "*" && prev !== current) {
// Seek a direct converter
conv = converters[prev + " " + current] || converters["* " + current]; // If none found, seek a pair
if (!conv) {
for (conv2 in converters) {
// If conv2 outputs current
tmp = conv2.split(" ");
if (tmp[1] === current) {
// If prev can be converted to accepted input
conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]];
if (conv) {
// Condense equivalence converters
if (conv === true) {
conv = converters[conv2]; // Otherwise, insert the intermediate dataType
} else if (converters[conv2] !== true) {
current = tmp[0];
dataTypes.splice(i--, 0, current);
}
break;
}
}
}
} // Apply converter (if not an equivalence)
if (conv !== true) {
// Unless errors are allowed to bubble, catch and return them
if (conv && s["throws"]) {
response = conv(response);
} else {
try {
response = conv(response);
} catch (e) {
return {
state: "parsererror",
error: conv ? e : "No conversion from " + prev + " to " + current
};
}
}
}
} // Update prev for next iteration
prev = current;
}
}
return {
state: "success",
data: response
};
}
var oldCallbacks = [],
rquestion = /\?/,
rjsonp = /(=)\?(?=&|$)|\?\?/,
nonce = jQuery.now(); // Default jsonp settings
jQuery.ajaxSetup({
jsonp: "callback",
jsonpCallback: function jsonpCallback() {
var callback = oldCallbacks.pop() || jQuery.expando + "_" + nonce++;
this[callback] = true;
return callback;
}
}); // Detect, normalize options and install callbacks for jsonp requests
jQuery.ajaxPrefilter("json jsonp", function (s, originalSettings, jqXHR) {
var callbackName,
overwritten,
responseContainer,
data = s.data,
url = s.url,
hasCallback = s.jsonp !== false,
replaceInUrl = hasCallback && rjsonp.test(url),
replaceInData = hasCallback && !replaceInUrl && typeof data === "string" && !(s.contentType || "").indexOf("application/x-www-form-urlencoded") && rjsonp.test(data); // Handle iff the expected data type is "jsonp" or we have a parameter to set
if (s.dataTypes[0] === "jsonp" || replaceInUrl || replaceInData) {
// Get callback name, remembering preexisting value associated with it
callbackName = s.jsonpCallback = jQuery.isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback;
overwritten = window[callbackName]; // Insert callback into url or form data
if (replaceInUrl) {
s.url = url.replace(rjsonp, "$1" + callbackName);
} else if (replaceInData) {
s.data = data.replace(rjsonp, "$1" + callbackName);
} else if (hasCallback) {
s.url += (rquestion.test(url) ? "&" : "?") + s.jsonp + "=" + callbackName;
} // Use data converter to retrieve json after script execution
s.converters["script json"] = function () {
if (!responseContainer) {
jQuery.error(callbackName + " was not called");
}
return responseContainer[0];
}; // force json dataType
s.dataTypes[0] = "json"; // Install callback
window[callbackName] = function () {
responseContainer = arguments;
}; // Clean-up function (fires after converters)
jqXHR.always(function () {
// Restore preexisting value
window[callbackName] = overwritten; // Save back as free
if (s[callbackName]) {
// make sure that re-using the options doesn't screw things around
s.jsonpCallback = originalSettings.jsonpCallback; // save the callback name for future use
oldCallbacks.push(callbackName);
} // Call if it was a function and we have a response
if (responseContainer && jQuery.isFunction(overwritten)) {
overwritten(responseContainer[0]);
}
responseContainer = overwritten = undefined;
}); // Delegate to script
return "script";
}
}); // Install script dataType
jQuery.ajaxSetup({
accepts: {
script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
},
contents: {
script: /javascript|ecmascript/
},
converters: {
"text script": function textScript(text) {
jQuery.globalEval(text);
return text;
}
}
}); // Handle cache's special case and global
jQuery.ajaxPrefilter("script", function (s) {
if (s.cache === undefined) {
s.cache = false;
}
if (s.crossDomain) {
s.type = "GET";
s.global = false;
}
}); // Bind script tag hack transport
jQuery.ajaxTransport("script", function (s) {
// This transport only deals with cross domain requests
if (s.crossDomain) {
var script,
head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
return {
send: function send(_, callback) {
script = document.createElement("script");
script.async = "async";
if (s.scriptCharset) {
script.charset = s.scriptCharset;
}
script.src = s.url; // Attach handlers for all browsers
script.onload = script.onreadystatechange = function (_, isAbort) {
if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) {
// Handle memory leak in IE
script.onload = script.onreadystatechange = null; // Remove the script
if (head && script.parentNode) {
head.removeChild(script);
} // Dereference the script
script = undefined; // Callback if not abort
if (!isAbort) {
callback(200, "success");
}
}
}; // Use insertBefore instead of appendChild to circumvent an IE6 bug.
// This arises when a base node is used (#2709 and #4378).
head.insertBefore(script, head.firstChild);
},
abort: function abort() {
if (script) {
script.onload(0, 1);
}
}
};
}
});
var xhrCallbacks,
// #5280: Internet Explorer will keep connections alive if we don't abort on unload
xhrOnUnloadAbort = window.ActiveXObject ? function () {
// Abort all pending requests
for (var key in xhrCallbacks) {
xhrCallbacks[key](0, 1);
}
} : false,
xhrId = 0; // Functions to create xhrs
function createStandardXHR() {
try {
return new window.XMLHttpRequest();
} catch (e) {}
}
function createActiveXHR() {
try {
return new window.ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
} // Create the request object
// (This is still attached to ajaxSettings for backward compatibility)
jQuery.ajaxSettings.xhr = window.ActiveXObject ?
/* Microsoft failed to properly
* implement the XMLHttpRequest in IE7 (can't request local files),
* so we use the ActiveXObject when it is available
* Additionally XMLHttpRequest can be disabled in IE7/IE8 so
* we need a fallback.
*/
function () {
return !this.isLocal && createStandardXHR() || createActiveXHR();
} : // For all other browsers, use the standard XMLHttpRequest object
createStandardXHR; // Determine support properties
(function (xhr) {
jQuery.extend(jQuery.support, {
ajax: !!xhr,
cors: !!xhr && "withCredentials" in xhr
});
})(jQuery.ajaxSettings.xhr()); // Create transport if the browser can provide an xhr
if (jQuery.support.ajax) {
jQuery.ajaxTransport(function (s) {
// Cross domain only allowed if supported through XMLHttpRequest
if (!s.crossDomain || jQuery.support.cors) {
var _callback;
return {
send: function send(headers, complete) {
// Get a new xhr
var handle,
i,
xhr = s.xhr(); // Open the socket
// Passing null username, generates a login popup on Opera (#2865)
if (s.username) {
xhr.open(s.type, s.url, s.async, s.username, s.password);
} else {
xhr.open(s.type, s.url, s.async);
} // Apply custom fields if provided
if (s.xhrFields) {
for (i in s.xhrFields) {
xhr[i] = s.xhrFields[i];
}
} // Override mime type if needed
if (s.mimeType && xhr.overrideMimeType) {
xhr.overrideMimeType(s.mimeType);
} // X-Requested-With header
// For cross-domain requests, seeing as conditions for a preflight are
// akin to a jigsaw puzzle, we simply never set it to be sure.
// (it can always be set on a per-request basis or even using ajaxSetup)
// For same-domain requests, won't change header if already provided.
if (!s.crossDomain && !headers["X-Requested-With"]) {
headers["X-Requested-With"] = "XMLHttpRequest";
} // Need an extra try/catch for cross domain requests in Firefox 3
try {
for (i in headers) {
xhr.setRequestHeader(i, headers[i]);
}
} catch (_) {} // Do send the request
// This may raise an exception which is actually
// handled in jQuery.ajax (so no try/catch here)
xhr.send(s.hasContent && s.data || null); // Listener
_callback = function callback(_, isAbort) {
var status, statusText, responseHeaders, responses, xml; // Firefox throws exceptions when accessing properties
// of an xhr when a network error occurred
// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
try {
// Was never called and is aborted or complete
if (_callback && (isAbort || xhr.readyState === 4)) {
// Only called once
_callback = undefined; // Do not keep as active anymore
if (handle) {
xhr.onreadystatechange = jQuery.noop;
if (xhrOnUnloadAbort) {
delete xhrCallbacks[handle];
}
} // If it's an abort
if (isAbort) {
// Abort it manually if needed
if (xhr.readyState !== 4) {
xhr.abort();
}
} else {
status = xhr.status;
responseHeaders = xhr.getAllResponseHeaders();
responses = {};
xml = xhr.responseXML; // Construct response list
if (xml && xml.documentElement
/* #4958 */
) {
responses.xml = xml;
} // When requesting binary data, IE6-9 will throw an exception
// on any attempt to access responseText (#11426)
try {
responses.text = xhr.responseText;
} catch (_) {} // Firefox throws an exception when accessing
// statusText for faulty cross-domain requests
try {
statusText = xhr.statusText;
} catch (e) {
// We normalize with Webkit giving an empty statusText
statusText = "";
} // Filter status for non standard behaviors
// If the request is local and we have data: assume a success
// (success with no data won't get notified, that's the best we
// can do given current implementations)
if (!status && s.isLocal && !s.crossDomain) {
status = responses.text ? 200 : 404; // IE - #1450: sometimes returns 1223 when it should be 204
} else if (status === 1223) {
status = 204;
}
}
}
} catch (firefoxAccessException) {
if (!isAbort) {
complete(-1, firefoxAccessException);
}
} // Call complete if needed
if (responses) {
complete(status, statusText, responses, responseHeaders);
}
};
if (!s.async) {
// if we're in sync mode we fire the callback
_callback();
} else if (xhr.readyState === 4) {
// (IE6 & IE7) if it's in cache and has been
// retrieved directly we need to fire the callback
setTimeout(_callback, 0);
} else {
handle = ++xhrId;
if (xhrOnUnloadAbort) {
// Create the active xhrs callbacks list if needed
// and attach the unload handler
if (!xhrCallbacks) {
xhrCallbacks = {};
jQuery(window).unload(xhrOnUnloadAbort);
} // Add to list of active xhrs callbacks
xhrCallbacks[handle] = _callback;
}
xhr.onreadystatechange = _callback;
}
},
abort: function abort() {
if (_callback) {
_callback(0, 1);
}
}
};
}
});
}
var fxNow,
timerId,
rfxtypes = /^(?:toggle|show|hide)$/,
rfxnum = new RegExp("^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i"),
rrun = /queueHooks$/,
animationPrefilters = [defaultPrefilter],
tweeners = {
"*": [function (prop, value) {
var end,
unit,
prevScale,
tween = this.createTween(prop, value),
parts = rfxnum.exec(value),
target = tween.cur(),
start = +target || 0,
scale = 1;
if (parts) {
end = +parts[2];
unit = parts[3] || (jQuery.cssNumber[prop] ? "" : "px"); // We need to compute starting value
if (unit !== "px" && start) {
// Iteratively approximate from a nonzero starting point
// Prefer the current property, because this process will be trivial if it uses the same units
// Fallback to end or a simple constant
start = jQuery.css(tween.elem, prop, true) || end || 1;
do {
// If previous iteration zeroed out, double until we get *something*
// Use a string for doubling factor so we don't accidentally see scale as unchanged below
prevScale = scale = scale || ".5"; // Adjust and apply
start = start / scale;
jQuery.style(tween.elem, prop, start + unit); // Update scale, tolerating zeroes from tween.cur()
scale = tween.cur() / target; // Stop looping if we've hit the mark or scale is unchanged
} while (scale !== 1 && scale !== prevScale);
}
tween.unit = unit;
tween.start = start; // If a +=/-= token was provided, we're doing a relative animation
tween.end = parts[1] ? start + (parts[1] + 1) * end : end;
}
return tween;
}]
}; // Animations created synchronously will run synchronously
function createFxNow() {
setTimeout(function () {
fxNow = undefined;
}, 0);
return fxNow = jQuery.now();
}
function createTweens(animation, props) {
jQuery.each(props, function (prop, value) {
var collection = (tweeners[prop] || []).concat(tweeners["*"]),
index = 0,
length = collection.length;
for (; index < length; index++) {
if (collection[index].call(animation, prop, value)) {
// we're done with this property
return;
}
}
});
}
function Animation(elem, properties, options) {
var result,
index = 0,
tweenerIndex = 0,
length = animationPrefilters.length,
deferred = jQuery.Deferred().always(function () {
// don't match elem in the :animated selector
delete tick.elem;
}),
tick = function tick() {
var currentTime = fxNow || createFxNow(),
remaining = Math.max(0, animation.startTime + animation.duration - currentTime),
percent = 1 - (remaining / animation.duration || 0),
index = 0,
length = animation.tweens.length;
for (; index < length; index++) {
animation.tweens[index].run(percent);
}
deferred.notifyWith(elem, [animation, percent, remaining]);
if (percent < 1 && length) {
return remaining;
} else {
deferred.resolveWith(elem, [animation]);
return false;
}
},
animation = deferred.promise({
elem: elem,
props: jQuery.extend({}, properties),
opts: jQuery.extend(true, {
specialEasing: {}
}, options),
originalProperties: properties,
originalOptions: options,
startTime: fxNow || createFxNow(),
duration: options.duration,
tweens: [],
createTween: function createTween(prop, end, easing) {
var tween = jQuery.Tween(elem, animation.opts, prop, end, animation.opts.specialEasing[prop] || animation.opts.easing);
animation.tweens.push(tween);
return tween;
},
stop: function stop(gotoEnd) {
var index = 0,
// if we are going to the end, we want to run all the tweens
// otherwise we skip this part
length = gotoEnd ? animation.tweens.length : 0;
for (; index < length; index++) {
animation.tweens[index].run(1);
} // resolve when we played the last frame
// otherwise, reject
if (gotoEnd) {
deferred.resolveWith(elem, [animation, gotoEnd]);
} else {
deferred.rejectWith(elem, [animation, gotoEnd]);
}
return this;
}
}),
props = animation.props;
propFilter(props, animation.opts.specialEasing);
for (; index < length; index++) {
result = animationPrefilters[index].call(animation, elem, props, animation.opts);
if (result) {
return result;
}
}
createTweens(animation, props);
if (jQuery.isFunction(animation.opts.start)) {
animation.opts.start.call(elem, animation);
}
jQuery.fx.timer(jQuery.extend(tick, {
anim: animation,
queue: animation.opts.queue,
elem: elem
})); // attach callbacks from options
return animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always);
}
function propFilter(props, specialEasing) {
var index, name, easing, value, hooks; // camelCase, specialEasing and expand cssHook pass
for (index in props) {
name = jQuery.camelCase(index);
easing = specialEasing[name];
value = props[index];
if (jQuery.isArray(value)) {
easing = value[1];
value = props[index] = value[0];
}
if (index !== name) {
props[name] = value;
delete props[index];
}
hooks = jQuery.cssHooks[name];
if (hooks && "expand" in hooks) {
value = hooks.expand(value);
delete props[name]; // not quite $.extend, this wont overwrite keys already present.
// also - reusing 'index' from above because we have the correct "name"
for (index in value) {
if (!(index in props)) {
props[index] = value[index];
specialEasing[index] = easing;
}
}
} else {
specialEasing[name] = easing;
}
}
}
jQuery.Animation = jQuery.extend(Animation, {
tweener: function tweener(props, callback) {
if (jQuery.isFunction(props)) {
callback = props;
props = ["*"];
} else {
props = props.split(" ");
}
var prop,
index = 0,
length = props.length;
for (; index < length; index++) {
prop = props[index];
tweeners[prop] = tweeners[prop] || [];
tweeners[prop].unshift(callback);
}
},
prefilter: function prefilter(callback, prepend) {
if (prepend) {
animationPrefilters.unshift(callback);
} else {
animationPrefilters.push(callback);
}
}
});
function defaultPrefilter(elem, props, opts) {
var index,
prop,
value,
length,
dataShow,
tween,
hooks,
oldfire,
anim = this,
style = elem.style,
orig = {},
handled = [],
hidden = elem.nodeType && isHidden(elem); // handle queue: false promises
if (!opts.queue) {
hooks = jQuery._queueHooks(elem, "fx");
if (hooks.unqueued == null) {
hooks.unqueued = 0;
oldfire = hooks.empty.fire;
hooks.empty.fire = function () {
if (!hooks.unqueued) {
oldfire();
}
};
}
hooks.unqueued++;
anim.always(function () {
// doing this makes sure that the complete handler will be called
// before this completes
anim.always(function () {
hooks.unqueued--;
if (!jQuery.queue(elem, "fx").length) {
hooks.empty.fire();
}
});
});
} // height/width overflow pass
if (elem.nodeType === 1 && ("height" in props || "width" in props)) {
// Make sure that nothing sneaks out
// Record all 3 overflow attributes because IE does not
// change the overflow attribute when overflowX and
// overflowY are set to the same value
opts.overflow = [style.overflow, style.overflowX, style.overflowY]; // Set display property to inline-block for height/width
// animations on inline elements that are having width/height animated
if (jQuery.css(elem, "display") === "inline" && jQuery.css(elem, "float") === "none") {
// inline-level elements accept inline-block;
// block-level elements need to be inline with layout
if (!jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay(elem.nodeName) === "inline") {
style.display = "inline-block";
} else {
style.zoom = 1;
}
}
}
if (opts.overflow) {
style.overflow = "hidden";
if (!jQuery.support.shrinkWrapBlocks) {
anim.done(function () {
style.overflow = opts.overflow[0];
style.overflowX = opts.overflow[1];
style.overflowY = opts.overflow[2];
});
}
} // show/hide pass
for (index in props) {
value = props[index];
if (rfxtypes.exec(value)) {
delete props[index];
if (value === (hidden ? "hide" : "show")) {
continue;
}
handled.push(index);
}
}
length = handled.length;
if (length) {
dataShow = jQuery._data(elem, "fxshow") || jQuery._data(elem, "fxshow", {});
if (hidden) {
jQuery(elem).show();
} else {
anim.done(function () {
jQuery(elem).hide();
});
}
anim.done(function () {
var prop;
jQuery.removeData(elem, "fxshow", true);
for (prop in orig) {
jQuery.style(elem, prop, orig[prop]);
}
});
for (index = 0; index < length; index++) {
prop = handled[index];
tween = anim.createTween(prop, hidden ? dataShow[prop] : 0);
orig[prop] = dataShow[prop] || jQuery.style(elem, prop);
if (!(prop in dataShow)) {
dataShow[prop] = tween.start;
if (hidden) {
tween.end = tween.start;
tween.start = prop === "width" || prop === "height" ? 1 : 0;
}
}
}
}
}
function Tween(elem, options, prop, end, easing) {
return new Tween.prototype.init(elem, options, prop, end, easing);
}
jQuery.Tween = Tween;
Tween.prototype = {
constructor: Tween,
init: function init(elem, options, prop, end, easing, unit) {
this.elem = elem;
this.prop = prop;
this.easing = easing || "swing";
this.options = options;
this.start = this.now = this.cur();
this.end = end;
this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px");
},
cur: function cur() {
var hooks = Tween.propHooks[this.prop];
return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this);
},
run: function run(percent) {
var eased,
hooks = Tween.propHooks[this.prop];
if (this.options.duration) {
this.pos = eased = jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration);
} else {
this.pos = eased = percent;
}
this.now = (this.end - this.start) * eased + this.start;
if (this.options.step) {
this.options.step.call(this.elem, this.now, this);
}
if (hooks && hooks.set) {
hooks.set(this);
} else {
Tween.propHooks._default.set(this);
}
return this;
}
};
Tween.prototype.init.prototype = Tween.prototype;
Tween.propHooks = {
_default: {
get: function get(tween) {
var result;
if (tween.elem[tween.prop] != null && (!tween.elem.style || tween.elem.style[tween.prop] == null)) {
return tween.elem[tween.prop];
} // passing any value as a 4th parameter to .css will automatically
// attempt a parseFloat and fallback to a string if the parse fails
// so, simple values such as "10px" are parsed to Float.
// complex values such as "rotate(1rad)" are returned as is.
result = jQuery.css(tween.elem, tween.prop, false, ""); // Empty strings, null, undefined and "auto" are converted to 0.
return !result || result === "auto" ? 0 : result;
},
set: function set(tween) {
// use step hook for back compat - use cssHook if its there - use .style if its
// available and use plain properties where available
if (jQuery.fx.step[tween.prop]) {
jQuery.fx.step[tween.prop](tween);
} else if (tween.elem.style && (tween.elem.style[jQuery.cssProps[tween.prop]] != null || jQuery.cssHooks[tween.prop])) {
jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
} else {
tween.elem[tween.prop] = tween.now;
}
}
}
}; // Remove in 2.0 - this supports IE8's panic based approach
// to setting things on disconnected nodes
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
set: function set(tween) {
if (tween.elem.nodeType && tween.elem.parentNode) {
tween.elem[tween.prop] = tween.now;
}
}
};
jQuery.each(["toggle", "show", "hide"], function (i, name) {
var cssFn = jQuery.fn[name];
jQuery.fn[name] = function (speed, easing, callback) {
return speed == null || typeof speed === "boolean" || // special check for .toggle( handler, handler, ... )
!i && jQuery.isFunction(speed) && jQuery.isFunction(easing) ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback);
};
});
jQuery.fn.extend({
fadeTo: function fadeTo(speed, to, easing, callback) {
// show any hidden elements after setting opacity to 0
return this.filter(isHidden).css("opacity", 0).show() // animate to the value specified
.end().animate({
opacity: to
}, speed, easing, callback);
},
animate: function animate(prop, speed, easing, callback) {
var empty = jQuery.isEmptyObject(prop),
optall = jQuery.speed(speed, easing, callback),
doAnimation = function doAnimation() {
// Operate on a copy of prop so per-property easing won't be lost
var anim = Animation(this, jQuery.extend({}, prop), optall); // Empty animations resolve immediately
if (empty) {
anim.stop(true);
}
};
return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation);
},
stop: function stop(type, clearQueue, gotoEnd) {
var stopQueue = function stopQueue(hooks) {
var stop = hooks.stop;
delete hooks.stop;
stop(gotoEnd);
};
if (typeof type !== "string") {
gotoEnd = clearQueue;
clearQueue = type;
type = undefined;
}
if (clearQueue && type !== false) {
this.queue(type || "fx", []);
}
return this.each(function () {
var dequeue = true,
index = type != null && type + "queueHooks",
timers = jQuery.timers,
data = jQuery._data(this);
if (index) {
if (data[index] && data[index].stop) {
stopQueue(data[index]);
}
} else {
for (index in data) {
if (data[index] && data[index].stop && rrun.test(index)) {
stopQueue(data[index]);
}
}
}
for (index = timers.length; index--;) {
if (timers[index].elem === this && (type == null || timers[index].queue === type)) {
timers[index].anim.stop(gotoEnd);
dequeue = false;
timers.splice(index, 1);
}
} // start the next in the queue if the last step wasn't forced
// timers currently will call their complete callbacks, which will dequeue
// but only if they were gotoEnd
if (dequeue || !gotoEnd) {
jQuery.dequeue(this, type);
}
});
}
}); // Generate parameters to create a standard animation
function genFx(type, includeWidth) {
var which,
attrs = {
height: type
},
i = 0; // if we include width, step value is 1 to do all cssExpand values,
// if we don't include width, step value is 2 to skip over Left and Right
includeWidth = includeWidth ? 1 : 0;
for (; i < 4; i += 2 - includeWidth) {
which = cssExpand[i];
attrs["margin" + which] = attrs["padding" + which] = type;
}
if (includeWidth) {
attrs.opacity = attrs.width = type;
}
return attrs;
} // Generate shortcuts for custom animations
jQuery.each({
slideDown: genFx("show"),
slideUp: genFx("hide"),
slideToggle: genFx("toggle"),
fadeIn: {
opacity: "show"
},
fadeOut: {
opacity: "hide"
},
fadeToggle: {
opacity: "toggle"
}
}, function (name, props) {
jQuery.fn[name] = function (speed, easing, callback) {
return this.animate(props, speed, easing, callback);
};
});
jQuery.speed = function (speed, easing, fn) {
var opt = speed && _typeof(speed) === "object" ? jQuery.extend({}, speed) : {
complete: fn || !fn && easing || jQuery.isFunction(speed) && speed,
duration: speed,
easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
};
opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default; // normalize opt.queue - true/undefined/null -> "fx"
if (opt.queue == null || opt.queue === true) {
opt.queue = "fx";
} // Queueing
opt.old = opt.complete;
opt.complete = function () {
if (jQuery.isFunction(opt.old)) {
opt.old.call(this);
}
if (opt.queue) {
jQuery.dequeue(this, opt.queue);
}
};
return opt;
};
jQuery.easing = {
linear: function linear(p) {
return p;
},
swing: function swing(p) {
return 0.5 - Math.cos(p * Math.PI) / 2;
}
};
jQuery.timers = [];
jQuery.fx = Tween.prototype.init;
jQuery.fx.tick = function () {
var timer,
timers = jQuery.timers,
i = 0;
for (; i < timers.length; i++) {
timer = timers[i]; // Checks the timer has not already been removed
if (!timer() && timers[i] === timer) {
timers.splice(i--, 1);
}
}
if (!timers.length) {
jQuery.fx.stop();
}
};
jQuery.fx.timer = function (timer) {
if (timer() && jQuery.timers.push(timer) && !timerId) {
timerId = setInterval(jQuery.fx.tick, jQuery.fx.interval);
}
};
jQuery.fx.interval = 13;
jQuery.fx.stop = function () {
clearInterval(timerId);
timerId = null;
};
jQuery.fx.speeds = {
slow: 600,
fast: 200,
// Default speed
_default: 400
}; // Back Compat <1.8 extension point
jQuery.fx.step = {};
if (jQuery.expr && jQuery.expr.filters) {
jQuery.expr.filters.animated = function (elem) {
return jQuery.grep(jQuery.timers, function (fn) {
return elem === fn.elem;
}).length;
};
}
var rroot = /^(?:body|html)$/i;
jQuery.fn.offset = function (options) {
if (arguments.length) {
return options === undefined ? this : this.each(function (i) {
jQuery.offset.setOffset(this, options, i);
});
}
var box,
docElem,
body,
win,
clientTop,
clientLeft,
scrollTop,
scrollLeft,
top,
left,
elem = this[0],
doc = elem && elem.ownerDocument;
if (!doc) {
return;
}
if ((body = doc.body) === elem) {
return jQuery.offset.bodyOffset(elem);
}
docElem = doc.documentElement; // Make sure we're not dealing with a disconnected DOM node
if (!jQuery.contains(docElem, elem)) {
return {
top: 0,
left: 0
};
}
box = elem.getBoundingClientRect();
win = getWindow(doc);
clientTop = docElem.clientTop || body.clientTop || 0;
clientLeft = docElem.clientLeft || body.clientLeft || 0;
scrollTop = win.pageYOffset || docElem.scrollTop;
scrollLeft = win.pageXOffset || docElem.scrollLeft;
top = box.top + scrollTop - clientTop;
left = box.left + scrollLeft - clientLeft;
return {
top: top,
left: left
};
};
jQuery.offset = {
bodyOffset: function bodyOffset(body) {
var top = body.offsetTop,
left = body.offsetLeft;
if (jQuery.support.doesNotIncludeMarginInBodyOffset) {
top += parseFloat(jQuery.css(body, "marginTop")) || 0;
left += parseFloat(jQuery.css(body, "marginLeft")) || 0;
}
return {
top: top,
left: left
};
},
setOffset: function setOffset(elem, options, i) {
var position = jQuery.css(elem, "position"); // set position first, in-case top/left are set even on static elem
if (position === "static") {
elem.style.position = "relative";
}
var curElem = jQuery(elem),
curOffset = curElem.offset(),
curCSSTop = jQuery.css(elem, "top"),
curCSSLeft = jQuery.css(elem, "left"),
calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
props = {},
curPosition = {},
curTop,
curLeft; // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
if (calculatePosition) {
curPosition = curElem.position();
curTop = curPosition.top;
curLeft = curPosition.left;
} else {
curTop = parseFloat(curCSSTop) || 0;
curLeft = parseFloat(curCSSLeft) || 0;
}
if (jQuery.isFunction(options)) {
options = options.call(elem, i, curOffset);
}
if (options.top != null) {
props.top = options.top - curOffset.top + curTop;
}
if (options.left != null) {
props.left = options.left - curOffset.left + curLeft;
}
if ("using" in options) {
options.using.call(elem, props);
} else {
curElem.css(props);
}
}
};
jQuery.fn.extend({
position: function position() {
if (!this[0]) {
return;
}
var elem = this[0],
// Get *real* offsetParent
offsetParent = this.offsetParent(),
// Get correct offsets
offset = this.offset(),
parentOffset = rroot.test(offsetParent[0].nodeName) ? {
top: 0,
left: 0
} : offsetParent.offset(); // Subtract element margins
// note: when an element has margin: auto the offsetLeft and marginLeft
// are the same in Safari causing offset.left to incorrectly be 0
offset.top -= parseFloat(jQuery.css(elem, "marginTop")) || 0;
offset.left -= parseFloat(jQuery.css(elem, "marginLeft")) || 0; // Add offsetParent borders
parentOffset.top += parseFloat(jQuery.css(offsetParent[0], "borderTopWidth")) || 0;
parentOffset.left += parseFloat(jQuery.css(offsetParent[0], "borderLeftWidth")) || 0; // Subtract the two offsets
return {
top: offset.top - parentOffset.top,
left: offset.left - parentOffset.left
};
},
offsetParent: function offsetParent() {
return this.map(function () {
var offsetParent = this.offsetParent || document.body;
while (offsetParent && !rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") {
offsetParent = offsetParent.offsetParent;
}
return offsetParent || document.body;
});
}
}); // Create scrollLeft and scrollTop methods
jQuery.each({
scrollLeft: "pageXOffset",
scrollTop: "pageYOffset"
}, function (method, prop) {
var top = /Y/.test(prop);
jQuery.fn[method] = function (val) {
return jQuery.access(this, function (elem, method, val) {
var win = getWindow(elem);
if (val === undefined) {
return win ? prop in win ? win[prop] : win.document.documentElement[method] : elem[method];
}
if (win) {
win.scrollTo(!top ? val : jQuery(win).scrollLeft(), top ? val : jQuery(win).scrollTop());
} else {
elem[method] = val;
}
}, method, val, arguments.length, null);
};
});
function getWindow(elem) {
return jQuery.isWindow(elem) ? elem : elem.nodeType === 9 ? elem.defaultView || elem.parentWindow : false;
} // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each({
Height: "height",
Width: "width"
}, function (name, type) {
jQuery.each({
padding: "inner" + name,
content: type,
"": "outer" + name
}, function (defaultExtra, funcName) {
// margin is only for outerHeight, outerWidth
jQuery.fn[funcName] = function (margin, value) {
var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"),
extra = defaultExtra || (margin === true || value === true ? "margin" : "border");
return jQuery.access(this, function (elem, type, value) {
var doc;
if (jQuery.isWindow(elem)) {
// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
// isn't a whole lot we can do. See pull request at this URL for discussion:
// https://github.com/jquery/jquery/pull/764
return elem.document.documentElement["client" + name];
} // Get document width or height
if (elem.nodeType === 9) {
doc = elem.documentElement; // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
return Math.max(elem.body["scroll" + name], doc["scroll" + name], elem.body["offset" + name], doc["offset" + name], doc["client" + name]);
}
return value === undefined ? // Get width or height on the element, requesting but not forcing parseFloat
jQuery.css(elem, type, value, extra) : // Set width or height on the element
jQuery.style(elem, type, value, extra);
}, type, chainable ? margin : undefined, chainable, null);
};
});
}); // Expose jQuery to the global object
window.jQuery = window.$ = jQuery; // Expose jQuery as an AMD module, but only for AMD loaders that
// understand the issues with loading multiple versions of jQuery
// in a page that all might call define(). The loader will indicate
// they have special allowances for multiple jQuery versions by
// specifying define.amd.jQuery = true. Register as a named module,
// since jQuery can be concatenated with other files that may use define,
// but not use a proper concatenation script that understands anonymous
// AMD modules. A named AMD is safest and most robust way to register.
// Lowercase jquery is used because AMD module names are derived from
// file names, and jQuery is normally delivered in a lowercase file name.
// Do this after creating the global so that if an AMD module wants to call
// noConflict to hide this version of jQuery, it will work.
if (typeof define === "function" && define.amd && define.amd.jQuery) {
define("jquery", [], function () {
return jQuery;
});
}
})(window);
},{}]},{},[3,2,1])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJ3ZWIvYXBpLWNvbW1vbi9sb2dpbi5qcyIsIndlYi9ib290c3RyYXAvanMvYm9vdHN0cmFwLmpzIiwid2ViL2pzL2pxdWVyeS0xLjguMS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0FDQUEsQ0FBQyxDQUFDLFFBQUQsQ0FBRCxDQUFZLEtBQVosQ0FBa0IsWUFBTTtBQUN0QixFQUFBLENBQUMsQ0FBQyxNQUFELENBQUQsQ0FBVSxPQUFWLENBQWtCLFVBQUMsS0FBRCxFQUFXO0FBQzNCLFFBQUksS0FBSyxDQUFDLE9BQU4sSUFBaUIsRUFBckIsRUFBeUI7QUFDdkIsTUFBQSxLQUFLLENBQUMsY0FBTjtBQUNBLGFBQU8sS0FBUDtBQUNEO0FBQ0YsR0FMRDtBQU9BLEVBQUEsQ0FBQyxDQUFDLFdBQUQsQ0FBRCxDQUFlLE9BQWYsQ0FBdUIsVUFBQyxLQUFELEVBQVc7QUFDaEMsUUFBSSxLQUFLLENBQUMsT0FBTixJQUFpQixFQUFyQixFQUF5QjtBQUN2QixNQUFBLFdBQVc7QUFDWCxhQUFPLEtBQVA7QUFDRDtBQUNGLEdBTEQ7QUFNRCxDQWREOztBQWdCQSxNQUFNLENBQUMsa0JBQVAsR0FBNEIsWUFBTTtBQUNoQyxFQUFBLENBQUMsQ0FBQyxZQUFELENBQUQsQ0FBZ0IsSUFBaEI7QUFDQSxFQUFBLENBQUMsQ0FBQyw0QkFBRCxDQUFELENBQWdDLElBQWhDO0FBQ0QsQ0FIRDs7QUFLQSxNQUFNLENBQUMscUJBQVAsR0FBK0IsWUFBTTtBQUNuQyxFQUFBLENBQUMsQ0FBQyxpQ0FBRCxDQUFELENBQXFDLElBQXJDO0FBQ0EsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLGlCQUFELENBQUQsQ0FBcUIsR0FBckIsRUFBWDs7QUFDQSxNQUFJLEVBQUUsS0FBSyxFQUFYLEVBQWU7QUFDYixXQUFPLEtBQVA7QUFDRDs7QUFDRCxFQUFBLENBQUMsQ0FBQyxJQUFGLENBQU8sYUFBUCxFQUFzQjtBQUFFLElBQUEsQ0FBQyxFQUFFLEtBQUw7QUFBWSxJQUFBLEVBQUUsRUFBRjtBQUFaLEdBQXRCLEVBQXdDLFVBQUMsSUFBRCxFQUFVO0FBQ2hELFFBQUksSUFBSSxDQUFDLE1BQUwsSUFBZSxTQUFuQixFQUE4QjtBQUM1QixNQUFBLENBQUMsQ0FBQyxpQ0FBRCxDQUFELENBQXFDLElBQXJDO0FBQ0EsTUFBQSxDQUFDLENBQUMsaUNBQUQsQ0FBRCxDQUFxQyxJQUFyQyxDQUEwQyxJQUFJLENBQUMsT0FBL0M7QUFDRCxLQUhELE1BR087QUFDTCxNQUFBLENBQUMsQ0FBQyxpQ0FBRCxDQUFELENBQXFDLElBQXJDO0FBQ0EsTUFBQSxDQUFDLENBQUMsaUNBQUQsQ0FBRCxDQUFxQyxJQUFyQyxDQUEwQyxJQUFJLENBQUMsT0FBL0M7QUFDRDtBQUNGLEdBUkQsRUFRRyxNQVJIO0FBU0QsQ0FmRDs7QUFpQkEsTUFBTSxDQUFDLGNBQVAsR0FBd0IsVUFBQyxHQUFELEVBQVM7QUFDL0IsRUFBQSxDQUFDLENBQUMsdUJBQUQsQ0FBRCxDQUEyQixJQUEzQjtBQUNBLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxXQUFELENBQUQsQ0FBZSxHQUFmLEVBQWpCOztBQUVBLE1BQU0sa0JBQWtCLEdBQUcsU0FBckIsa0JBQXFCLENBQVUsR0FBVixFQUFlO0FBQ3hDLFdBQU8sR0FBRyxDQUFDLE1BQUosR0FBYSxDQUFwQjtBQUNELEdBRkQ7O0FBS0EsTUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQUQsQ0FBdkIsRUFBbUM7QUFDakMsSUFBQSxDQUFDLENBQUMsdUJBQUQsQ0FBRCxDQUEyQixJQUEzQjtBQUNBLElBQUEsQ0FBQyxDQUFDLHVCQUFELENBQUQsQ0FBMkIsSUFBM0IsQ0FBZ0MsNkNBQWhDO0FBQ0E7QUFDRDs7QUFHRCxFQUFBLENBQUMsQ0FBQyxJQUFGLENBQU8sYUFBUCxFQUFzQjtBQUNwQixJQUFBLENBQUMsRUFBRSxLQURpQjtBQUNWLElBQUEsR0FBRyxFQUFILEdBRFU7QUFDTCxJQUFBLEdBQUcsRUFBRSxRQURBO0FBQ1UsSUFBQSxHQUFHLEVBQUU7QUFEZixHQUF0QixFQUVHLFVBQUMsSUFBRCxFQUFVO0FBQ1gsUUFBSSxJQUFJLENBQUMsTUFBTCxJQUFlLFNBQW5CLEVBQThCO0FBQzVCLE1BQUEsR0FBRyxDQUFDLFFBQUosQ0FBYSxJQUFiLEdBQW9CLGVBQXBCO0FBQ0QsS0FGRCxNQUVPO0FBQ0wsTUFBQSxDQUFDLENBQUMsdUJBQUQsQ0FBRCxDQUEyQixJQUEzQjtBQUNBLE1BQUEsQ0FBQyxDQUFDLHVCQUFELENBQUQsQ0FBMkIsSUFBM0IsQ0FBZ0MsSUFBSSxDQUFDLE9BQXJDO0FBQ0Q7QUFDRixHQVRELEVBU0csTUFUSDtBQVVELENBMUJEOztBQTRCQSxNQUFNLENBQUMsV0FBUCxHQUFxQixZQUFNO0FBQ3pCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxXQUFELENBQUQsQ0FBZSxHQUFmLEVBQWpCO0FBQ0EsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLFdBQUQsQ0FBRCxDQUFlLEdBQWYsRUFBakI7O0FBQ0EsTUFBSSxRQUFRLEtBQUssRUFBYixJQUFtQixRQUFRLEtBQUssRUFBcEMsRUFBd0M7QUFDdEMsV0FBTyxLQUFQO0FBQ0Q7O0FBQ0QsTUFBSTtBQUNGLElBQUEsWUFBWSxDQUFDLEtBQWI7QUFDRCxHQUZELENBRUUsT0FBTyxDQUFQLEVBQVUsQ0FBRTs7QUFDZCxFQUFBLENBQUMsQ0FBQyxZQUFELENBQUQsQ0FBZ0IsTUFBaEI7QUFDRCxDQVZEOztBQVlBLE1BQU0sQ0FBQyxVQUFQLEdBQW9CLFlBQU07QUFDeEIsRUFBQSxNQUFNLENBQUMsUUFBUCxDQUFnQixJQUFoQixhQUEwQixNQUFNLENBQUMsUUFBUCxDQUFnQixJQUFoQixDQUFxQixLQUFyQixDQUEyQixXQUEzQixFQUF3QyxDQUF4QyxDQUExQjtBQUNELENBRkQ7Ozs7Ozs7QUM5RUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQSxDQUFDLFVBQVUsQ0FBVixFQUFhO0FBRVosRUFBQSxDQUFDLENBQUMsWUFBWTtBQUVaLGlCQUZZLENBRUU7O0FBR2Q7OztBQUdBLElBQUEsQ0FBQyxDQUFDLE9BQUYsQ0FBVSxVQUFWLEdBQXdCLFlBQVk7QUFFbEMsVUFBSSxhQUFhLEdBQUksWUFBWTtBQUUvQixZQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBVCxDQUF1QixXQUF2QixDQUFUO0FBQUEsWUFDSSxrQkFBa0IsR0FBRztBQUNsQiw4QkFBcUIscUJBREg7QUFFbEIsMkJBQXFCLGVBRkg7QUFHbEIseUJBQXFCLCtCQUhIO0FBSWxCLHdCQUFxQjtBQUpILFNBRHpCO0FBQUEsWUFPSSxJQVBKOztBQVNBLGFBQUssSUFBTCxJQUFhLGtCQUFiLEVBQWdDO0FBQzlCLGNBQUksRUFBRSxDQUFDLEtBQUgsQ0FBUyxJQUFULE1BQW1CLFNBQXZCLEVBQWtDO0FBQ2hDLG1CQUFPLGtCQUFrQixDQUFDLElBQUQsQ0FBekI7QUFDRDtBQUNGO0FBRUYsT0FqQm9CLEVBQXJCOztBQW1CQSxhQUFPLGFBQWEsSUFBSTtBQUN0QixRQUFBLEdBQUcsRUFBRTtBQURpQixPQUF4QjtBQUlELEtBekJzQixFQUF2QjtBQTJCRCxHQW5DQSxDQUFEO0FBcUNELENBdkNBLENBdUNDLE1BQU0sQ0FBQyxNQXZDUixDQUFEO0FBdUNpQjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CakIsQ0FBQyxVQUFVLENBQVYsRUFBYTtBQUVaLGVBRlksQ0FFRTs7QUFHZjs7O0FBR0MsTUFBSSxPQUFPLEdBQUcsd0JBQWQ7QUFBQSxNQUNJLEtBQUssR0FBRyxTQUFSLEtBQVEsQ0FBVSxFQUFWLEVBQWM7QUFDcEIsSUFBQSxDQUFDLENBQUMsRUFBRCxDQUFELENBQU0sRUFBTixDQUFTLE9BQVQsRUFBa0IsT0FBbEIsRUFBMkIsS0FBSyxLQUFoQztBQUNELEdBSEw7O0FBS0EsRUFBQSxLQUFLLENBQUMsU0FBTixDQUFnQixLQUFoQixHQUF3QixVQUFVLENBQVYsRUFBYTtBQUNuQyxRQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBRCxDQUFiO0FBQUEsUUFDSSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQU4sQ0FBVyxhQUFYLENBRGY7QUFBQSxRQUVJLE9BRko7O0FBSUEsUUFBSSxDQUFDLFFBQUwsRUFBZTtBQUNiLE1BQUEsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFOLENBQVcsTUFBWCxDQUFYO0FBQ0EsTUFBQSxRQUFRLEdBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxPQUFULENBQWlCLGdCQUFqQixFQUFtQyxFQUFuQyxDQUF2QixDQUZhLENBRWlEO0FBQy9EOztBQUVELElBQUEsT0FBTyxHQUFHLENBQUMsQ0FBQyxRQUFELENBQVg7QUFFQSxJQUFBLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBRixFQUFMO0FBRUEsSUFBQSxPQUFPLENBQUMsTUFBUixLQUFtQixPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQU4sQ0FBZSxPQUFmLElBQTBCLEtBQTFCLEdBQWtDLEtBQUssQ0FBQyxNQUFOLEVBQS9EO0FBRUEsSUFBQSxPQUFPLENBQUMsT0FBUixDQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUYsQ0FBUSxPQUFSLENBQXBCO0FBRUEsUUFBSSxDQUFDLENBQUMsa0JBQUYsRUFBSixFQUE0QjtBQUU1QixJQUFBLE9BQU8sQ0FBQyxXQUFSLENBQW9CLElBQXBCOztBQUVBLGFBQVMsYUFBVCxHQUF5QjtBQUN2QixNQUFBLE9BQU8sQ0FDSixPQURILENBQ1csUUFEWCxFQUVHLE1BRkg7QUFHRDs7QUFFRCxJQUFBLENBQUMsQ0FBQyxPQUFGLENBQVUsVUFBVixJQUF3QixPQUFPLENBQUMsUUFBUixDQUFpQixNQUFqQixDQUF4QixHQUNFLE9BQU8sQ0FBQyxFQUFSLENBQVcsQ0FBQyxDQUFDLE9BQUYsQ0FBVSxVQUFWLENBQXFCLEdBQWhDLEVBQXFDLGFBQXJDLENBREYsR0FFRSxhQUFhLEVBRmY7QUFHRCxHQS9CRDtBQWtDRDs7OztBQUdDLEVBQUEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxLQUFMLEdBQWEsVUFBVSxNQUFWLEVBQWtCO0FBQzdCLFdBQU8sS0FBSyxJQUFMLENBQVUsWUFBWTtBQUMzQixVQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBRCxDQUFiO0FBQUEsVUFDSSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQU4sQ0FBVyxPQUFYLENBRFg7QUFFQSxVQUFJLENBQUMsSUFBTCxFQUFXLEtBQUssQ0FBQyxJQUFOLENBQVcsT0FBWCxFQUFxQixJQUFJLEdBQUcsSUFBSSxLQUFKLENBQVUsSUFBVixDQUE1QjtBQUNYLFVBQUksT0FBTyxNQUFQLElBQWlCLFFBQXJCLEVBQStCLElBQUksQ0FBQyxNQUFELENBQUosQ0FBYSxJQUFiLENBQWtCLEtBQWxCO0FBQ2hDLEtBTE0sQ0FBUDtBQU1ELEdBUEQ7O0FBU0EsRUFBQSxDQUFDLENBQUMsRUFBRixDQUFLLEtBQUwsQ0FBVyxXQUFYLEdBQXlCLEtBQXpCO0FBR0Q7OztBQUdDLEVBQUEsQ0FBQyxDQUFDLFlBQVk7QUFDWixJQUFBLENBQUMsQ0FBQyxNQUFELENBQUQsQ0FBVSxFQUFWLENBQWEsc0JBQWIsRUFBcUMsT0FBckMsRUFBOEMsS0FBSyxDQUFDLFNBQU4sQ0FBZ0IsS0FBOUQ7QUFDRCxHQUZBLENBQUQ7QUFJRCxDQXJFQSxDQXFFQyxNQUFNLENBQUMsTUFyRVIsQ0FBRDtBQXFFaUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQmpCLENBQUMsVUFBVSxDQUFWLEVBQWE7QUFFWixlQUZZLENBRUU7O0FBR2Y7OztBQUdDLE1BQUksTUFBTSxHQUFHLFNBQVQsTUFBUyxDQUFVLE9BQVYsRUFBbUIsT0FBbkIsRUFBNEI7QUFDdkMsU0FBSyxRQUFMLEdBQWdCLENBQUMsQ0FBQyxPQUFELENBQWpCO0FBQ0EsU0FBSyxPQUFMLEdBQWUsQ0FBQyxDQUFDLE1BQUYsQ0FBUyxFQUFULEVBQWEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxNQUFMLENBQVksUUFBekIsRUFBbUMsT0FBbkMsQ0FBZjtBQUNELEdBSEQ7O0FBS0EsRUFBQSxNQUFNLENBQUMsU0FBUCxDQUFpQixRQUFqQixHQUE0QixVQUFVLEtBQVYsRUFBaUI7QUFDM0MsUUFBSSxDQUFDLEdBQUcsVUFBUjtBQUFBLFFBQ0ksR0FBRyxHQUFHLEtBQUssUUFEZjtBQUFBLFFBRUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFKLEVBRlg7QUFBQSxRQUdJLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBSixDQUFPLE9BQVAsSUFBa0IsS0FBbEIsR0FBMEIsTUFIcEM7QUFLQSxJQUFBLEtBQUssR0FBRyxLQUFLLEdBQUcsTUFBaEI7QUFDQSxJQUFBLElBQUksQ0FBQyxTQUFMLElBQWtCLEdBQUcsQ0FBQyxJQUFKLENBQVMsV0FBVCxFQUFzQixHQUFHLENBQUMsR0FBRCxDQUFILEVBQXRCLENBQWxCO0FBRUEsSUFBQSxHQUFHLENBQUMsR0FBRCxDQUFILENBQVMsSUFBSSxDQUFDLEtBQUQsQ0FBSixJQUFlLEtBQUssT0FBTCxDQUFhLEtBQWIsQ0FBeEIsRUFUMkMsQ0FXM0M7O0FBQ0EsSUFBQSxVQUFVLENBQUMsWUFBWTtBQUNyQixNQUFBLEtBQUssSUFBSSxhQUFULEdBQ0UsR0FBRyxDQUFDLFFBQUosQ0FBYSxDQUFiLEVBQWdCLElBQWhCLENBQXFCLENBQXJCLEVBQXdCLENBQXhCLENBREYsR0FFRSxHQUFHLENBQUMsV0FBSixDQUFnQixDQUFoQixFQUFtQixVQUFuQixDQUE4QixDQUE5QixDQUZGO0FBR0QsS0FKUyxFQUlQLENBSk8sQ0FBVjtBQUtELEdBakJEOztBQW1CQSxFQUFBLE1BQU0sQ0FBQyxTQUFQLENBQWlCLE1BQWpCLEdBQTBCLFlBQVk7QUFDcEMsUUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFMLENBQWMsT0FBZCxDQUFzQiwrQkFBdEIsQ0FBZDtBQUVBLElBQUEsT0FBTyxJQUFJLE9BQU8sQ0FDZixJQURRLENBQ0gsU0FERyxFQUVSLFdBRlEsQ0FFSSxRQUZKLENBQVg7QUFJQSxTQUFLLFFBQUwsQ0FBYyxXQUFkLENBQTBCLFFBQTFCO0FBQ0QsR0FSRDtBQVdEOzs7O0FBR0MsRUFBQSxDQUFDLENBQUMsRUFBRixDQUFLLE1BQUwsR0FBYyxVQUFVLE1BQVYsRUFBa0I7QUFDOUIsV0FBTyxLQUFLLElBQUwsQ0FBVSxZQUFZO0FBQzNCLFVBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFELENBQWI7QUFBQSxVQUNJLElBQUksR0FBRyxLQUFLLENBQUMsSUFBTixDQUFXLFFBQVgsQ0FEWDtBQUFBLFVBRUksT0FBTyxHQUFHLFFBQU8sTUFBUCxLQUFpQixRQUFqQixJQUE2QixNQUYzQztBQUdBLFVBQUksQ0FBQyxJQUFMLEVBQVcsS0FBSyxDQUFDLElBQU4sQ0FBVyxRQUFYLEVBQXNCLElBQUksR0FBRyxJQUFJLE1BQUosQ0FBVyxJQUFYLEVBQWlCLE9BQWpCLENBQTdCO0FBQ1gsVUFBSSxNQUFNLElBQUksUUFBZCxFQUF3QixJQUFJLENBQUMsTUFBTCxHQUF4QixLQUNLLElBQUksTUFBSixFQUFZLElBQUksQ0FBQyxRQUFMLENBQWMsTUFBZDtBQUNsQixLQVBNLENBQVA7QUFRRCxHQVREOztBQVdBLEVBQUEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxNQUFMLENBQVksUUFBWixHQUF1QjtBQUNyQixJQUFBLFdBQVcsRUFBRTtBQURRLEdBQXZCO0FBSUEsRUFBQSxDQUFDLENBQUMsRUFBRixDQUFLLE1BQUwsQ0FBWSxXQUFaLEdBQTBCLE1BQTFCO0FBR0Q7OztBQUdDLEVBQUEsQ0FBQyxDQUFDLFlBQVk7QUFDWixJQUFBLENBQUMsQ0FBQyxNQUFELENBQUQsQ0FBVSxFQUFWLENBQWEsdUJBQWIsRUFBc0MsdUJBQXRDLEVBQStELFVBQVcsQ0FBWCxFQUFlO0FBQzVFLFVBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBSCxDQUFaO0FBQ0EsVUFBSSxDQUFDLElBQUksQ0FBQyxRQUFMLENBQWMsS0FBZCxDQUFMLEVBQTJCLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTCxDQUFhLE1BQWIsQ0FBUDtBQUMzQixNQUFBLElBQUksQ0FBQyxNQUFMLENBQVksUUFBWjtBQUNELEtBSkQ7QUFLRCxHQU5BLENBQUQ7QUFRRCxDQTNFQSxDQTJFQyxNQUFNLENBQUMsTUEzRVIsQ0FBRDtBQTJFaUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQmpCLENBQUMsVUFBVSxDQUFWLEVBQWE7QUFFWixlQUZZLENBRUU7O0FBR2Y7OztBQUdDLE1BQUksUUFBUSxHQUFHLFNBQVgsUUFBVyxDQUFVLE9BQVYsRUFBbUIsT0FBbkIsRUFBNEI7QUFDekMsU0FBSyxRQUFMLEdBQWdCLENBQUMsQ0FBQyxPQUFELENBQWpCO0FBQ0EsU0FBSyxPQUFMLEdBQWUsT0FBZjtBQUNBLFNBQUssT0FBTCxDQUFhLEtBQWIsSUFBc0IsS0FBSyxLQUFMLENBQVcsS0FBSyxPQUFMLENBQWEsS0FBeEIsQ0FBdEI7QUFDQSxTQUFLLE9BQUwsQ0FBYSxLQUFiLElBQXNCLE9BQXRCLElBQWlDLEtBQUssUUFBTCxDQUM5QixFQUQ4QixDQUMzQixZQUQyQixFQUNiLENBQUMsQ0FBQyxLQUFGLENBQVEsS0FBSyxLQUFiLEVBQW9CLElBQXBCLENBRGEsRUFFOUIsRUFGOEIsQ0FFM0IsWUFGMkIsRUFFYixDQUFDLENBQUMsS0FBRixDQUFRLEtBQUssS0FBYixFQUFvQixJQUFwQixDQUZhLENBQWpDO0FBR0QsR0FQRDs7QUFTQSxFQUFBLFFBQVEsQ0FBQyxTQUFULEdBQXFCO0FBRW5CLElBQUEsS0FBSyxFQUFFLGVBQVUsQ0FBVixFQUFhO0FBQ2xCLFVBQUksQ0FBQyxDQUFMLEVBQVEsS0FBSyxNQUFMLEdBQWMsS0FBZDtBQUNSLFdBQUssT0FBTCxDQUFhLFFBQWIsSUFDSyxDQUFDLEtBQUssTUFEWCxLQUVNLEtBQUssUUFBTCxHQUFnQixXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUYsQ0FBUSxLQUFLLElBQWIsRUFBbUIsSUFBbkIsQ0FBRCxFQUEyQixLQUFLLE9BQUwsQ0FBYSxRQUF4QyxDQUZqQztBQUdBLGFBQU8sSUFBUDtBQUNELEtBUmtCO0FBVW5CLElBQUEsRUFBRSxFQUFFLFlBQVUsR0FBVixFQUFlO0FBQ2pCLFVBQUksT0FBTyxHQUFHLEtBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsY0FBbkIsQ0FBZDtBQUFBLFVBQ0ksUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFSLEdBQWlCLFFBQWpCLEVBRGY7QUFBQSxVQUVJLFNBQVMsR0FBRyxRQUFRLENBQUMsS0FBVCxDQUFlLE9BQWYsQ0FGaEI7QUFBQSxVQUdJLElBQUksR0FBRyxJQUhYO0FBS0EsVUFBSSxHQUFHLEdBQUksUUFBUSxDQUFDLE1BQVQsR0FBa0IsQ0FBekIsSUFBK0IsR0FBRyxHQUFHLENBQXpDLEVBQTRDOztBQUU1QyxVQUFJLEtBQUssT0FBVCxFQUFrQjtBQUNoQixlQUFPLEtBQUssUUFBTCxDQUFjLEdBQWQsQ0FBa0IsTUFBbEIsRUFBMEIsWUFBWTtBQUMzQyxVQUFBLElBQUksQ0FBQyxFQUFMLENBQVEsR0FBUjtBQUNELFNBRk0sQ0FBUDtBQUdEOztBQUVELFVBQUksU0FBUyxJQUFJLEdBQWpCLEVBQXNCO0FBQ3BCLGVBQU8sS0FBSyxLQUFMLEdBQWEsS0FBYixFQUFQO0FBQ0Q7O0FBRUQsYUFBTyxLQUFLLEtBQUwsQ0FBVyxHQUFHLEdBQUcsU0FBTixHQUFrQixNQUFsQixHQUEyQixNQUF0QyxFQUE4QyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUQsQ0FBVCxDQUEvQyxDQUFQO0FBQ0QsS0E3QmtCO0FBK0JuQixJQUFBLEtBQUssRUFBRSxlQUFVLENBQVYsRUFBYTtBQUNsQixVQUFJLENBQUMsQ0FBTCxFQUFRLEtBQUssTUFBTCxHQUFjLElBQWQ7O0FBQ1IsVUFBSSxLQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLGNBQW5CLEVBQW1DLE1BQW5DLElBQTZDLENBQUMsQ0FBQyxPQUFGLENBQVUsVUFBVixDQUFxQixHQUF0RSxFQUEyRTtBQUN6RSxhQUFLLFFBQUwsQ0FBYyxPQUFkLENBQXNCLENBQUMsQ0FBQyxPQUFGLENBQVUsVUFBVixDQUFxQixHQUEzQztBQUNBLGFBQUssS0FBTDtBQUNEOztBQUNELE1BQUEsYUFBYSxDQUFDLEtBQUssUUFBTixDQUFiO0FBQ0EsV0FBSyxRQUFMLEdBQWdCLElBQWhCO0FBQ0EsYUFBTyxJQUFQO0FBQ0QsS0F4Q2tCO0FBMENuQixJQUFBLElBQUksRUFBRSxnQkFBWTtBQUNoQixVQUFJLEtBQUssT0FBVCxFQUFrQjtBQUNsQixhQUFPLEtBQUssS0FBTCxDQUFXLE1BQVgsQ0FBUDtBQUNELEtBN0NrQjtBQStDbkIsSUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDaEIsVUFBSSxLQUFLLE9BQVQsRUFBa0I7QUFDbEIsYUFBTyxLQUFLLEtBQUwsQ0FBVyxNQUFYLENBQVA7QUFDRCxLQWxEa0I7QUFvRG5CLElBQUEsS0FBSyxFQUFFLGVBQVUsSUFBVixFQUFnQixJQUFoQixFQUFzQjtBQUMzQixVQUFJLE9BQU8sR0FBRyxLQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLGNBQW5CLENBQWQ7QUFBQSxVQUNJLEtBQUssR0FBRyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUQsQ0FBUCxFQURwQjtBQUFBLFVBRUksU0FBUyxHQUFHLEtBQUssUUFGckI7QUFBQSxVQUdJLFNBQVMsR0FBRyxJQUFJLElBQUksTUFBUixHQUFpQixNQUFqQixHQUEwQixPQUgxQztBQUFBLFVBSUksUUFBUSxHQUFJLElBQUksSUFBSSxNQUFSLEdBQWlCLE9BQWpCLEdBQTJCLE1BSjNDO0FBQUEsVUFLSSxJQUFJLEdBQUcsSUFMWDtBQUFBLFVBTUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFGLENBQVEsT0FBUixFQUFpQjtBQUNuQixRQUFBLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBRDtBQURELE9BQWpCLENBTlI7QUFVQSxXQUFLLE9BQUwsR0FBZSxJQUFmO0FBRUEsTUFBQSxTQUFTLElBQUksS0FBSyxLQUFMLEVBQWI7QUFFQSxNQUFBLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTixHQUFlLEtBQWYsR0FBdUIsS0FBSyxRQUFMLENBQWMsSUFBZCxDQUFtQixPQUFuQixFQUE0QixRQUE1QixHQUEvQjtBQUVBLFVBQUksS0FBSyxDQUFDLFFBQU4sQ0FBZSxRQUFmLENBQUosRUFBOEI7O0FBRTlCLFVBQUksQ0FBQyxDQUFDLE9BQUYsQ0FBVSxVQUFWLElBQXdCLEtBQUssUUFBTCxDQUFjLFFBQWQsQ0FBdUIsT0FBdkIsQ0FBNUIsRUFBNkQ7QUFDM0QsYUFBSyxRQUFMLENBQWMsT0FBZCxDQUFzQixDQUF0QjtBQUNBLFlBQUksQ0FBQyxDQUFDLGtCQUFGLEVBQUosRUFBNEI7QUFDNUIsUUFBQSxLQUFLLENBQUMsUUFBTixDQUFlLElBQWY7QUFDQSxRQUFBLEtBQUssQ0FBQyxDQUFELENBQUwsQ0FBUyxXQUFULENBSjJELENBSXRDOztBQUNyQixRQUFBLE9BQU8sQ0FBQyxRQUFSLENBQWlCLFNBQWpCO0FBQ0EsUUFBQSxLQUFLLENBQUMsUUFBTixDQUFlLFNBQWY7QUFDQSxhQUFLLFFBQUwsQ0FBYyxHQUFkLENBQWtCLENBQUMsQ0FBQyxPQUFGLENBQVUsVUFBVixDQUFxQixHQUF2QyxFQUE0QyxZQUFZO0FBQ3RELFVBQUEsS0FBSyxDQUFDLFdBQU4sQ0FBa0IsQ0FBQyxJQUFELEVBQU8sU0FBUCxFQUFrQixJQUFsQixDQUF1QixHQUF2QixDQUFsQixFQUErQyxRQUEvQyxDQUF3RCxRQUF4RDtBQUNBLFVBQUEsT0FBTyxDQUFDLFdBQVIsQ0FBb0IsQ0FBQyxRQUFELEVBQVcsU0FBWCxFQUFzQixJQUF0QixDQUEyQixHQUEzQixDQUFwQjtBQUNBLFVBQUEsSUFBSSxDQUFDLE9BQUwsR0FBZSxLQUFmO0FBQ0EsVUFBQSxVQUFVLENBQUMsWUFBWTtBQUFFLFlBQUEsSUFBSSxDQUFDLFFBQUwsQ0FBYyxPQUFkLENBQXNCLE1BQXRCO0FBQStCLFdBQTlDLEVBQWdELENBQWhELENBQVY7QUFDRCxTQUxEO0FBTUQsT0FiRCxNQWFPO0FBQ0wsYUFBSyxRQUFMLENBQWMsT0FBZCxDQUFzQixDQUF0QjtBQUNBLFlBQUksQ0FBQyxDQUFDLGtCQUFGLEVBQUosRUFBNEI7QUFDNUIsUUFBQSxPQUFPLENBQUMsV0FBUixDQUFvQixRQUFwQjtBQUNBLFFBQUEsS0FBSyxDQUFDLFFBQU4sQ0FBZSxRQUFmO0FBQ0EsYUFBSyxPQUFMLEdBQWUsS0FBZjtBQUNBLGFBQUssUUFBTCxDQUFjLE9BQWQsQ0FBc0IsTUFBdEI7QUFDRDs7QUFFRCxNQUFBLFNBQVMsSUFBSSxLQUFLLEtBQUwsRUFBYjtBQUVBLGFBQU8sSUFBUDtBQUNEO0FBaEdrQixHQUFyQjtBQXFHRDs7O0FBR0MsRUFBQSxDQUFDLENBQUMsRUFBRixDQUFLLFFBQUwsR0FBZ0IsVUFBVSxNQUFWLEVBQWtCO0FBQ2hDLFdBQU8sS0FBSyxJQUFMLENBQVUsWUFBWTtBQUMzQixVQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBRCxDQUFiO0FBQUEsVUFDSSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQU4sQ0FBVyxVQUFYLENBRFg7QUFBQSxVQUVJLE9BQU8sR0FBRyxDQUFDLENBQUMsTUFBRixDQUFTLEVBQVQsRUFBYSxDQUFDLENBQUMsRUFBRixDQUFLLFFBQUwsQ0FBYyxRQUEzQixFQUFxQyxRQUFPLE1BQVAsS0FBaUIsUUFBakIsSUFBNkIsTUFBbEUsQ0FGZDtBQUFBLFVBR0ksTUFBTSxHQUFHLE9BQU8sTUFBUCxJQUFpQixRQUFqQixHQUE0QixNQUE1QixHQUFxQyxPQUFPLENBQUMsS0FIMUQ7QUFJQSxVQUFJLENBQUMsSUFBTCxFQUFXLEtBQUssQ0FBQyxJQUFOLENBQVcsVUFBWCxFQUF3QixJQUFJLEdBQUcsSUFBSSxRQUFKLENBQWEsSUFBYixFQUFtQixPQUFuQixDQUEvQjtBQUNYLFVBQUksT0FBTyxNQUFQLElBQWlCLFFBQXJCLEVBQStCLElBQUksQ0FBQyxFQUFMLENBQVEsTUFBUixFQUEvQixLQUNLLElBQUksTUFBSixFQUFZLElBQUksQ0FBQyxNQUFELENBQUosR0FBWixLQUNBLElBQUksT0FBTyxDQUFDLFFBQVosRUFBc0IsSUFBSSxDQUFDLEtBQUw7QUFDNUIsS0FUTSxDQUFQO0FBVUQsR0FYRDs7QUFhQSxFQUFBLENBQUMsQ0FBQyxFQUFGLENBQUssUUFBTCxDQUFjLFFBQWQsR0FBeUI7QUFDdkIsSUFBQSxRQUFRLEVBQUUsSUFEYTtBQUV2QixJQUFBLEtBQUssRUFBRTtBQUZnQixHQUF6QjtBQUtBLEVBQUEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxRQUFMLENBQWMsV0FBZCxHQUE0QixRQUE1QjtBQUdEOzs7QUFHQyxFQUFBLENBQUMsQ0FBQyxZQUFZO0FBQ1osSUFBQSxDQUFDLENBQUMsTUFBRCxDQUFELENBQVUsRUFBVixDQUFhLHlCQUFiLEVBQXdDLGNBQXhDLEVBQXdELFVBQVcsQ0FBWCxFQUFlO0FBQ3JFLFVBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFELENBQWI7QUFBQSxVQUFxQixJQUFyQjtBQUFBLFVBQ0ksT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBTixDQUFXLGFBQVgsS0FBNkIsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQU4sQ0FBVyxNQUFYLENBQVIsS0FBK0IsSUFBSSxDQUFDLE9BQUwsQ0FBYSxnQkFBYixFQUErQixFQUEvQixDQUE3RCxDQURmLENBQ2dIO0FBRGhIO0FBQUEsVUFFSSxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBUixDQUFhLE9BQWIsQ0FBRCxJQUEwQixDQUFDLENBQUMsTUFBRixDQUFTLEVBQVQsRUFBYSxPQUFPLENBQUMsSUFBUixFQUFiLEVBQTZCLEtBQUssQ0FBQyxJQUFOLEVBQTdCLENBRnhDO0FBR0EsTUFBQSxPQUFPLENBQUMsUUFBUixDQUFpQixPQUFqQjtBQUNBLE1BQUEsQ0FBQyxDQUFDLGNBQUY7QUFDRCxLQU5EO0FBT0QsR0FSQSxDQUFEO0FBVUQsQ0EzSkEsQ0EySkMsTUFBTSxDQUFDLE1BM0pSLENBQUQ7QUEySmlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JqQixDQUFDLFVBQVUsQ0FBVixFQUFhO0FBRVosZUFGWSxDQUVFOztBQUdmOzs7QUFHQyxNQUFJLFFBQVEsR0FBRyxTQUFYLFFBQVcsQ0FBVSxPQUFWLEVBQW1CLE9BQW5CLEVBQTRCO0FBQ3pDLFNBQUssUUFBTCxHQUFnQixDQUFDLENBQUMsT0FBRCxDQUFqQjtBQUNBLFNBQUssT0FBTCxHQUFlLENBQUMsQ0FBQyxNQUFGLENBQVMsRUFBVCxFQUFhLENBQUMsQ0FBQyxFQUFGLENBQUssUUFBTCxDQUFjLFFBQTNCLEVBQXFDLE9BQXJDLENBQWY7O0FBRUEsUUFBSSxLQUFLLE9BQUwsQ0FBYSxNQUFqQixFQUF5QjtBQUN2QixXQUFLLE9BQUwsR0FBZSxDQUFDLENBQUMsS0FBSyxPQUFMLENBQWEsTUFBZCxDQUFoQjtBQUNEOztBQUVELFNBQUssT0FBTCxDQUFhLE1BQWIsSUFBdUIsS0FBSyxNQUFMLEVBQXZCO0FBQ0QsR0FURDs7QUFXQSxFQUFBLFFBQVEsQ0FBQyxTQUFULEdBQXFCO0FBRW5CLElBQUEsV0FBVyxFQUFFLFFBRk07QUFJbkIsSUFBQSxTQUFTLEVBQUUscUJBQVk7QUFDckIsVUFBSSxRQUFRLEdBQUcsS0FBSyxRQUFMLENBQWMsUUFBZCxDQUF1QixPQUF2QixDQUFmO0FBQ0EsYUFBTyxRQUFRLEdBQUcsT0FBSCxHQUFhLFFBQTVCO0FBQ0QsS0FQa0I7QUFTbkIsSUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDaEIsVUFBSSxTQUFKLEVBQ0ksTUFESixFQUVJLE9BRkosRUFHSSxPQUhKO0FBS0EsVUFBSSxLQUFLLGFBQVQsRUFBd0I7QUFFeEIsTUFBQSxTQUFTLEdBQUcsS0FBSyxTQUFMLEVBQVo7QUFDQSxNQUFBLE1BQU0sR0FBRyxDQUFDLENBQUMsU0FBRixDQUFZLENBQUMsUUFBRCxFQUFXLFNBQVgsRUFBc0IsSUFBdEIsQ0FBMkIsR0FBM0IsQ0FBWixDQUFUO0FBQ0EsTUFBQSxPQUFPLEdBQUcsS0FBSyxPQUFMLElBQWdCLEtBQUssT0FBTCxDQUFhLElBQWIsQ0FBa0IsMEJBQWxCLENBQTFCOztBQUVBLFVBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUF2QixFQUErQjtBQUM3QixRQUFBLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBUixDQUFhLFVBQWIsQ0FBVjtBQUNBLFlBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxhQUF2QixFQUFzQztBQUN0QyxRQUFBLE9BQU8sQ0FBQyxRQUFSLENBQWlCLE1BQWpCO0FBQ0EsUUFBQSxPQUFPLElBQUksT0FBTyxDQUFDLElBQVIsQ0FBYSxVQUFiLEVBQXlCLElBQXpCLENBQVg7QUFDRDs7QUFFRCxXQUFLLFFBQUwsQ0FBYyxTQUFkLEVBQXlCLENBQXpCO0FBQ0EsV0FBSyxVQUFMLENBQWdCLFVBQWhCLEVBQTRCLENBQUMsQ0FBQyxLQUFGLENBQVEsTUFBUixDQUE1QixFQUE2QyxPQUE3QztBQUNBLE1BQUEsQ0FBQyxDQUFDLE9BQUYsQ0FBVSxVQUFWLElBQXdCLEtBQUssUUFBTCxDQUFjLFNBQWQsRUFBeUIsS0FBSyxRQUFMLENBQWMsQ0FBZCxFQUFpQixNQUFqQixDQUF6QixDQUF4QjtBQUNELEtBL0JrQjtBQWlDbkIsSUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDaEIsVUFBSSxTQUFKO0FBQ0EsVUFBSSxLQUFLLGFBQVQsRUFBd0I7QUFDeEIsTUFBQSxTQUFTLEdBQUcsS0FBSyxTQUFMLEVBQVo7QUFDQSxXQUFLLEtBQUwsQ0FBVyxLQUFLLFFBQUwsQ0FBYyxTQUFkLEdBQVg7QUFDQSxXQUFLLFVBQUwsQ0FBZ0IsYUFBaEIsRUFBK0IsQ0FBQyxDQUFDLEtBQUYsQ0FBUSxNQUFSLENBQS9CLEVBQWdELFFBQWhEO0FBQ0EsV0FBSyxRQUFMLENBQWMsU0FBZCxFQUF5QixDQUF6QjtBQUNELEtBeENrQjtBQTBDbkIsSUFBQSxLQUFLLEVBQUUsZUFBVSxJQUFWLEVBQWdCO0FBQ3JCLFVBQUksU0FBUyxHQUFHLEtBQUssU0FBTCxFQUFoQjtBQUVBLFdBQUssUUFBTCxDQUNHLFdBREgsQ0FDZSxVQURmLEVBRUcsU0FGSCxFQUVjLElBQUksSUFBSSxNQUZ0QixFQUdHLENBSEgsRUFHTSxXQUhOO0FBS0EsV0FBSyxRQUFMLENBQWMsSUFBSSxLQUFLLElBQVQsR0FBZ0IsVUFBaEIsR0FBNkIsYUFBM0MsRUFBMEQsVUFBMUQ7QUFFQSxhQUFPLElBQVA7QUFDRCxLQXJEa0I7QUF1RG5CLElBQUEsVUFBVSxFQUFFLG9CQUFVLE1BQVYsRUFBa0IsVUFBbEIsRUFBOEIsYUFBOUIsRUFBNkM7QUFDdkQsVUFBSSxJQUFJLEdBQUcsSUFBWDtBQUFBLFVBQ0ksUUFBUSxHQUFHLFNBQVgsUUFBVyxHQUFZO0FBQ3JCLFlBQUksVUFBVSxDQUFDLElBQVgsSUFBbUIsTUFBdkIsRUFBK0IsSUFBSSxDQUFDLEtBQUw7QUFDL0IsUUFBQSxJQUFJLENBQUMsYUFBTCxHQUFxQixDQUFyQjtBQUNBLFFBQUEsSUFBSSxDQUFDLFFBQUwsQ0FBYyxPQUFkLENBQXNCLGFBQXRCO0FBQ0QsT0FMTDs7QUFPQSxXQUFLLFFBQUwsQ0FBYyxPQUFkLENBQXNCLFVBQXRCO0FBRUEsVUFBSSxVQUFVLENBQUMsa0JBQVgsRUFBSixFQUFxQztBQUVyQyxXQUFLLGFBQUwsR0FBcUIsQ0FBckI7QUFFQSxXQUFLLFFBQUwsQ0FBYyxNQUFkLEVBQXNCLElBQXRCO0FBRUEsTUFBQSxDQUFDLENBQUMsT0FBRixDQUFVLFVBQVYsSUFBd0IsS0FBSyxRQUFMLENBQWMsUUFBZCxDQUF1QixVQUF2QixDQUF4QixHQUNFLEtBQUssUUFBTCxDQUFjLEdBQWQsQ0FBa0IsQ0FBQyxDQUFDLE9BQUYsQ0FBVSxVQUFWLENBQXFCLEdBQXZDLEVBQTRDLFFBQTVDLENBREYsR0FFRSxRQUFRLEVBRlY7QUFHRCxLQTFFa0I7QUE0RW5CLElBQUEsTUFBTSxFQUFFLGtCQUFZO0FBQ2xCLFdBQUssS0FBSyxRQUFMLENBQWMsUUFBZCxDQUF1QixJQUF2QixJQUErQixNQUEvQixHQUF3QyxNQUE3QztBQUNEO0FBOUVrQixHQUFyQjtBQW1GRDs7O0FBR0MsRUFBQSxDQUFDLENBQUMsRUFBRixDQUFLLFFBQUwsR0FBZ0IsVUFBVSxNQUFWLEVBQWtCO0FBQ2hDLFdBQU8sS0FBSyxJQUFMLENBQVUsWUFBWTtBQUMzQixVQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBRCxDQUFiO0FBQUEsVUFDSSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQU4sQ0FBVyxVQUFYLENBRFg7QUFBQSxVQUVJLE9BQU8sR0FBRyxRQUFPLE1BQVAsS0FBaUIsUUFBakIsSUFBNkIsTUFGM0M7QUFHQSxVQUFJLENBQUMsSUFBTCxFQUFXLEtBQUssQ0FBQyxJQUFOLENBQVcsVUFBWCxFQUF3QixJQUFJLEdBQUcsSUFBSSxRQUFKLENBQWEsSUFBYixFQUFtQixPQUFuQixDQUEvQjtBQUNYLFVBQUksT0FBTyxNQUFQLElBQWlCLFFBQXJCLEVBQStCLElBQUksQ0FBQyxNQUFELENBQUo7QUFDaEMsS0FOTSxDQUFQO0FBT0QsR0FSRDs7QUFVQSxFQUFBLENBQUMsQ0FBQyxFQUFGLENBQUssUUFBTCxDQUFjLFFBQWQsR0FBeUI7QUFDdkIsSUFBQSxNQUFNLEVBQUU7QUFEZSxHQUF6QjtBQUlBLEVBQUEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxRQUFMLENBQWMsV0FBZCxHQUE0QixRQUE1QjtBQUdEOzs7QUFHQyxFQUFBLENBQUMsQ0FBQyxZQUFZO0FBQ1osSUFBQSxDQUFDLENBQUMsTUFBRCxDQUFELENBQVUsRUFBVixDQUFhLHlCQUFiLEVBQXdDLHdCQUF4QyxFQUFrRSxVQUFVLENBQVYsRUFBYTtBQUM3RSxVQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBRCxDQUFiO0FBQUEsVUFBcUIsSUFBckI7QUFBQSxVQUNJLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBTixDQUFXLGFBQVgsS0FDTixDQUFDLENBQUMsY0FBRixFQURNLElBRU4sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQU4sQ0FBVyxNQUFYLENBQVIsS0FBK0IsSUFBSSxDQUFDLE9BQUwsQ0FBYSxnQkFBYixFQUErQixFQUEvQixDQUh0QyxDQUd5RTtBQUh6RTtBQUFBLFVBSUksTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFELENBQUQsQ0FBVSxJQUFWLENBQWUsVUFBZixJQUE2QixRQUE3QixHQUF3QyxLQUFLLENBQUMsSUFBTixFQUpyRDtBQUtBLE1BQUEsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFELENBQUQsQ0FBVSxRQUFWLENBQW1CLElBQW5CLElBQTJCLFVBQTNCLEdBQXdDLGFBQXpDLENBQUwsQ0FBNkQsV0FBN0Q7QUFDQSxNQUFBLENBQUMsQ0FBQyxNQUFELENBQUQsQ0FBVSxRQUFWLENBQW1CLE1BQW5CO0FBQ0QsS0FSRDtBQVNELEdBVkEsQ0FBRDtBQVlELENBeklBLENBeUlDLE1BQU0sQ0FBQyxNQXpJUixDQUFEO0FBeUlpQjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CakIsQ0FBQyxVQUFVLENBQVYsRUFBYTtBQUVaLGVBRlksQ0FFRTs7QUFHZjs7O0FBR0MsTUFBSSxNQUFNLEdBQUcsd0JBQWI7QUFBQSxNQUNJLFFBQVEsR0FBRyxTQUFYLFFBQVcsQ0FBVSxPQUFWLEVBQW1CO0FBQzVCLFFBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxPQUFELENBQUQsQ0FBVyxFQUFYLENBQWMseUJBQWQsRUFBeUMsS0FBSyxNQUE5QyxDQUFWO0FBQ0EsSUFBQSxDQUFDLENBQUMsTUFBRCxDQUFELENBQVUsRUFBVixDQUFhLHlCQUFiLEVBQXdDLFlBQVk7QUFDbEQsTUFBQSxHQUFHLENBQUMsTUFBSixHQUFhLFdBQWIsQ0FBeUIsTUFBekI7QUFDRCxLQUZEO0FBR0QsR0FOTDs7QUFRQSxFQUFBLFFBQVEsQ0FBQyxTQUFULEdBQXFCO0FBRW5CLElBQUEsV0FBVyxFQUFFLFFBRk07QUFJbkIsSUFBQSxNQUFNLEVBQUUsZ0JBQVUsQ0FBVixFQUFhO0FBQ25CLFVBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFELENBQWI7QUFBQSxVQUNJLE9BREo7QUFBQSxVQUVJLFFBRko7QUFJQSxVQUFJLEtBQUssQ0FBQyxFQUFOLENBQVMsc0JBQVQsQ0FBSixFQUFzQztBQUV0QyxNQUFBLE9BQU8sR0FBRyxTQUFTLENBQUMsS0FBRCxDQUFuQjtBQUVBLE1BQUEsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFSLENBQWlCLE1BQWpCLENBQVg7QUFFQSxNQUFBLFVBQVU7O0FBRVYsVUFBSSxDQUFDLFFBQUwsRUFBZTtBQUNiLFFBQUEsT0FBTyxDQUFDLFdBQVIsQ0FBb0IsTUFBcEI7QUFDQSxRQUFBLEtBQUssQ0FBQyxLQUFOO0FBQ0Q7O0FBRUQsYUFBTyxLQUFQO0FBQ0QsS0F2QmtCO0FBeUJuQixJQUFBLE9BQU8sRUFBRSxpQkFBVSxDQUFWLEVBQWE7QUFDcEIsVUFBSSxLQUFKLEVBQ0ksTUFESixFQUVJLE9BRkosRUFHSSxPQUhKLEVBSUksUUFKSixFQUtJLEtBTEo7QUFPQSxVQUFJLENBQUMsYUFBYSxJQUFiLENBQWtCLENBQUMsQ0FBQyxPQUFwQixDQUFMLEVBQW1DO0FBRW5DLE1BQUEsS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFELENBQVQ7QUFFQSxNQUFBLENBQUMsQ0FBQyxjQUFGO0FBQ0EsTUFBQSxDQUFDLENBQUMsZUFBRjtBQUVBLFVBQUksS0FBSyxDQUFDLEVBQU4sQ0FBUyxzQkFBVCxDQUFKLEVBQXNDO0FBRXRDLE1BQUEsT0FBTyxHQUFHLFNBQVMsQ0FBQyxLQUFELENBQW5CO0FBRUEsTUFBQSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVIsQ0FBaUIsTUFBakIsQ0FBWDtBQUVBLFVBQUksQ0FBQyxRQUFELElBQWMsUUFBUSxJQUFJLENBQUMsQ0FBQyxPQUFGLElBQWEsRUFBM0MsRUFBZ0QsT0FBTyxLQUFLLENBQUMsS0FBTixFQUFQO0FBRWhELE1BQUEsTUFBTSxHQUFHLENBQUMsQ0FBQyxnQ0FBRCxFQUFtQyxPQUFuQyxDQUFWO0FBRUEsVUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFaLEVBQW9CO0FBRXBCLE1BQUEsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFQLENBQWEsTUFBTSxDQUFDLE1BQVAsQ0FBYyxRQUFkLENBQWIsQ0FBUjtBQUVBLFVBQUksQ0FBQyxDQUFDLE9BQUYsSUFBYSxFQUFiLElBQW1CLEtBQUssR0FBRyxDQUEvQixFQUFrQyxLQUFLLEdBN0JuQixDQTZCNkQ7O0FBQ2pGLFVBQUksQ0FBQyxDQUFDLE9BQUYsSUFBYSxFQUFiLElBQW1CLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBUCxHQUFnQixDQUEvQyxFQUFrRCxLQUFLLEdBOUJuQyxDQThCNkQ7O0FBQ2pGLFVBQUksQ0FBQyxDQUFDLEtBQU4sRUFBYSxLQUFLLEdBQUcsQ0FBUjtBQUViLE1BQUEsTUFBTSxDQUNILEVBREgsQ0FDTSxLQUROLEVBRUcsS0FGSDtBQUdEO0FBN0RrQixHQUFyQjs7QUFpRUEsV0FBUyxVQUFULEdBQXNCO0FBQ3BCLElBQUEsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFELENBQUYsQ0FBVCxDQUNHLFdBREgsQ0FDZSxNQURmO0FBRUQ7O0FBRUQsV0FBUyxTQUFULENBQW1CLEtBQW5CLEVBQTBCO0FBQ3hCLFFBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFOLENBQVcsYUFBWCxDQUFmO0FBQUEsUUFDSSxPQURKOztBQUdBLFFBQUksQ0FBQyxRQUFMLEVBQWU7QUFDYixNQUFBLFFBQVEsR0FBRyxLQUFLLENBQUMsSUFBTixDQUFXLE1BQVgsQ0FBWDtBQUNBLE1BQUEsUUFBUSxHQUFHLFFBQVEsSUFBSSxJQUFJLElBQUosQ0FBUyxRQUFULENBQVosSUFBa0MsUUFBUSxDQUFDLE9BQVQsQ0FBaUIsZ0JBQWpCLEVBQW1DLEVBQW5DLENBQTdDLENBRmEsQ0FFdUU7QUFDckY7O0FBRUQsSUFBQSxPQUFPLEdBQUcsQ0FBQyxDQUFDLFFBQUQsQ0FBWDtBQUNBLElBQUEsT0FBTyxDQUFDLE1BQVIsS0FBbUIsT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFOLEVBQTdCO0FBRUEsV0FBTyxPQUFQO0FBQ0Q7QUFHRDs7OztBQUdBLEVBQUEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxRQUFMLEdBQWdCLFVBQVUsTUFBVixFQUFrQjtBQUNoQyxXQUFPLEtBQUssSUFBTCxDQUFVLFlBQVk7QUFDM0IsVUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUQsQ0FBYjtBQUFBLFVBQ0ksSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFOLENBQVcsVUFBWCxDQURYO0FBRUEsVUFBSSxDQUFDLElBQUwsRUFBVyxLQUFLLENBQUMsSUFBTixDQUFXLFVBQVgsRUFBd0IsSUFBSSxHQUFHLElBQUksUUFBSixDQUFhLElBQWIsQ0FBL0I7QUFDWCxVQUFJLE9BQU8sTUFBUCxJQUFpQixRQUFyQixFQUErQixJQUFJLENBQUMsTUFBRCxDQUFKLENBQWEsSUFBYixDQUFrQixLQUFsQjtBQUNoQyxLQUxNLENBQVA7QUFNRCxHQVBEOztBQVNBLEVBQUEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxRQUFMLENBQWMsV0FBZCxHQUE0QixRQUE1QjtBQUdBOzs7QUFHQSxFQUFBLENBQUMsQ0FBQyxZQUFZO0FBQ1osSUFBQSxDQUFDLENBQUMsTUFBRCxDQUFELENBQ0csRUFESCxDQUNNLHNEQUROLEVBQzhELFVBRDlEO0FBRUEsSUFBQSxDQUFDLENBQUMsTUFBRCxDQUFELENBQ0csRUFESCxDQUNNLDZDQUROLEVBQ3FELGdCQURyRCxFQUN1RSxVQUFVLENBQVYsRUFBYTtBQUFFLE1BQUEsQ0FBQyxDQUFDLGVBQUY7QUFBcUIsS0FEM0csRUFFRyxFQUZILENBRU0sc0RBRk4sRUFFZ0UsTUFGaEUsRUFFd0UsUUFBUSxDQUFDLFNBQVQsQ0FBbUIsTUFGM0YsRUFHRyxFQUhILENBR00sd0RBSE4sRUFHZ0UsTUFBTSxHQUFHLGVBSHpFLEVBRzJGLFFBQVEsQ0FBQyxTQUFULENBQW1CLE9BSDlHO0FBSUQsR0FQQSxDQUFEO0FBU0QsQ0FqSUEsQ0FpSUMsTUFBTSxDQUFDLE1BaklSLENBQUQ7QUFpSWlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JqQixDQUFDLFVBQVUsQ0FBVixFQUFhO0FBRVosZUFGWSxDQUVFOztBQUdmOzs7QUFHQyxNQUFJLEtBQUssR0FBRyxTQUFSLEtBQVEsQ0FBVSxPQUFWLEVBQW1CLE9BQW5CLEVBQTRCO0FBQ3RDLFNBQUssT0FBTCxHQUFlLE9BQWY7QUFDQSxTQUFLLFFBQUwsR0FBZ0IsQ0FBQyxDQUFDLE9BQUQsQ0FBRCxDQUNiLFFBRGEsQ0FDSix3QkFESSxFQUNzQixxQkFEdEIsRUFDNkMsQ0FBQyxDQUFDLEtBQUYsQ0FBUSxLQUFLLElBQWIsRUFBbUIsSUFBbkIsQ0FEN0MsQ0FBaEI7QUFFQSxTQUFLLE9BQUwsQ0FBYSxNQUFiLElBQXVCLEtBQUssUUFBTCxDQUFjLElBQWQsQ0FBbUIsYUFBbkIsRUFBa0MsSUFBbEMsQ0FBdUMsS0FBSyxPQUFMLENBQWEsTUFBcEQsQ0FBdkI7QUFDRCxHQUxEOztBQU9BLEVBQUEsS0FBSyxDQUFDLFNBQU4sR0FBa0I7QUFFZCxJQUFBLFdBQVcsRUFBRSxLQUZDO0FBSWQsSUFBQSxNQUFNLEVBQUUsa0JBQVk7QUFDbEIsYUFBTyxLQUFLLENBQUMsS0FBSyxPQUFOLEdBQWdCLE1BQWhCLEdBQXlCLE1BQTlCLEdBQVA7QUFDRCxLQU5hO0FBUWQsSUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDaEIsVUFBSSxJQUFJLEdBQUcsSUFBWDtBQUFBLFVBQ0ksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFGLENBQVEsTUFBUixDQURSO0FBR0EsV0FBSyxRQUFMLENBQWMsT0FBZCxDQUFzQixDQUF0QjtBQUVBLFVBQUksS0FBSyxPQUFMLElBQWdCLENBQUMsQ0FBQyxrQkFBRixFQUFwQixFQUE0QztBQUU1QyxNQUFBLENBQUMsQ0FBQyxNQUFELENBQUQsQ0FBVSxRQUFWLENBQW1CLFlBQW5CO0FBRUEsV0FBSyxPQUFMLEdBQWUsSUFBZjtBQUVBLFdBQUssTUFBTDtBQUVBLFdBQUssUUFBTCxDQUFjLFlBQVk7QUFDeEIsWUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDLE9BQUYsQ0FBVSxVQUFWLElBQXdCLElBQUksQ0FBQyxRQUFMLENBQWMsUUFBZCxDQUF1QixNQUF2QixDQUF6Qzs7QUFFQSxZQUFJLENBQUMsSUFBSSxDQUFDLFFBQUwsQ0FBYyxNQUFkLEdBQXVCLE1BQTVCLEVBQW9DO0FBQ2xDLFVBQUEsSUFBSSxDQUFDLFFBQUwsQ0FBYyxRQUFkLENBQXVCLFFBQVEsQ0FBQyxJQUFoQyxFQURrQyxDQUNJO0FBQ3ZDOztBQUVELFFBQUEsSUFBSSxDQUFDLFFBQUwsQ0FDRyxJQURIOztBQUdBLFlBQUksVUFBSixFQUFnQjtBQUNkLFVBQUEsSUFBSSxDQUFDLFFBQUwsQ0FBYyxDQUFkLEVBQWlCLFdBQWpCLENBRGMsQ0FDZTtBQUM5Qjs7QUFFRCxRQUFBLElBQUksQ0FBQyxRQUFMLENBQ0csUUFESCxDQUNZLElBRFosRUFFRyxJQUZILENBRVEsYUFGUixFQUV1QixLQUZ2QixFQUdHLEtBSEg7QUFLQSxRQUFBLElBQUksQ0FBQyxZQUFMO0FBRUEsUUFBQSxVQUFVLEdBQ1IsSUFBSSxDQUFDLFFBQUwsQ0FBYyxHQUFkLENBQWtCLENBQUMsQ0FBQyxPQUFGLENBQVUsVUFBVixDQUFxQixHQUF2QyxFQUE0QyxZQUFZO0FBQUUsVUFBQSxJQUFJLENBQUMsUUFBTCxDQUFjLE9BQWQsQ0FBc0IsT0FBdEI7QUFBZ0MsU0FBMUYsQ0FEUSxHQUVSLElBQUksQ0FBQyxRQUFMLENBQWMsT0FBZCxDQUFzQixPQUF0QixDQUZGO0FBSUQsT0F6QkQ7QUEwQkQsS0FoRGE7QUFrRGQsSUFBQSxJQUFJLEVBQUUsY0FBVSxDQUFWLEVBQWE7QUFDakIsTUFBQSxDQUFDLElBQUksQ0FBQyxDQUFDLGNBQUYsRUFBTDtBQUVBLFVBQUksSUFBSSxHQUFHLElBQVg7QUFFQSxNQUFBLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBRixDQUFRLE1BQVIsQ0FBSjtBQUVBLFdBQUssUUFBTCxDQUFjLE9BQWQsQ0FBc0IsQ0FBdEI7QUFFQSxVQUFJLENBQUMsS0FBSyxPQUFOLElBQWlCLENBQUMsQ0FBQyxrQkFBRixFQUFyQixFQUE2QztBQUU3QyxXQUFLLE9BQUwsR0FBZSxLQUFmO0FBRUEsTUFBQSxDQUFDLENBQUMsTUFBRCxDQUFELENBQVUsV0FBVixDQUFzQixZQUF0QjtBQUVBLFdBQUssTUFBTDtBQUVBLE1BQUEsQ0FBQyxDQUFDLFFBQUQsQ0FBRCxDQUFZLEdBQVosQ0FBZ0IsZUFBaEI7QUFFQSxXQUFLLFFBQUwsQ0FDRyxXQURILENBQ2UsSUFEZixFQUVHLElBRkgsQ0FFUSxhQUZSLEVBRXVCLElBRnZCO0FBSUEsTUFBQSxDQUFDLENBQUMsT0FBRixDQUFVLFVBQVYsSUFBd0IsS0FBSyxRQUFMLENBQWMsUUFBZCxDQUF1QixNQUF2QixDQUF4QixHQUNFLEtBQUssa0JBQUwsRUFERixHQUVFLEtBQUssU0FBTCxFQUZGO0FBR0QsS0E1RWE7QUE4RWQsSUFBQSxZQUFZLEVBQUUsd0JBQVk7QUFDeEIsVUFBSSxJQUFJLEdBQUcsSUFBWDtBQUNBLE1BQUEsQ0FBQyxDQUFDLFFBQUQsQ0FBRCxDQUFZLEVBQVosQ0FBZSxlQUFmLEVBQWdDLFVBQVUsQ0FBVixFQUFhO0FBQzNDLFlBQUksSUFBSSxDQUFDLFFBQUwsQ0FBYyxDQUFkLE1BQXFCLENBQUMsQ0FBQyxNQUF2QixJQUFpQyxDQUFDLElBQUksQ0FBQyxRQUFMLENBQWMsR0FBZCxDQUFrQixDQUFDLENBQUMsTUFBcEIsRUFBNEIsTUFBbEUsRUFBMEU7QUFDeEUsVUFBQSxJQUFJLENBQUMsUUFBTCxDQUFjLEtBQWQ7QUFDRDtBQUNGLE9BSkQ7QUFLRCxLQXJGYTtBQXVGZCxJQUFBLE1BQU0sRUFBRSxrQkFBWTtBQUNsQixVQUFJLElBQUksR0FBRyxJQUFYOztBQUNBLFVBQUksS0FBSyxPQUFMLElBQWdCLEtBQUssT0FBTCxDQUFhLFFBQWpDLEVBQTJDO0FBQ3pDLGFBQUssUUFBTCxDQUFjLEVBQWQsQ0FBaUIscUJBQWpCLEVBQXdDLFVBQVcsQ0FBWCxFQUFlO0FBQ3JELFVBQUEsQ0FBQyxDQUFDLEtBQUYsSUFBVyxFQUFYLElBQWlCLElBQUksQ0FBQyxJQUFMLEVBQWpCO0FBQ0QsU0FGRDtBQUdELE9BSkQsTUFJTyxJQUFJLENBQUMsS0FBSyxPQUFWLEVBQW1CO0FBQ3hCLGFBQUssUUFBTCxDQUFjLEdBQWQsQ0FBa0IscUJBQWxCO0FBQ0Q7QUFDRixLQWhHYTtBQWtHZCxJQUFBLGtCQUFrQixFQUFFLDhCQUFZO0FBQzlCLFVBQUksSUFBSSxHQUFHLElBQVg7QUFBQSxVQUNJLE9BQU8sR0FBRyxVQUFVLENBQUMsWUFBWTtBQUMvQixRQUFBLElBQUksQ0FBQyxRQUFMLENBQWMsR0FBZCxDQUFrQixDQUFDLENBQUMsT0FBRixDQUFVLFVBQVYsQ0FBcUIsR0FBdkM7QUFDQSxRQUFBLElBQUksQ0FBQyxTQUFMO0FBQ0QsT0FIbUIsRUFHakIsR0FIaUIsQ0FEeEI7QUFNQSxXQUFLLFFBQUwsQ0FBYyxHQUFkLENBQWtCLENBQUMsQ0FBQyxPQUFGLENBQVUsVUFBVixDQUFxQixHQUF2QyxFQUE0QyxZQUFZO0FBQ3RELFFBQUEsWUFBWSxDQUFDLE9BQUQsQ0FBWjtBQUNBLFFBQUEsSUFBSSxDQUFDLFNBQUw7QUFDRCxPQUhEO0FBSUQsS0E3R2E7QUErR2QsSUFBQSxTQUFTLEVBQUUsbUJBQVUsSUFBVixFQUFnQjtBQUN6QixXQUFLLFFBQUwsQ0FDRyxJQURILEdBRUcsT0FGSCxDQUVXLFFBRlg7QUFJQSxXQUFLLFFBQUw7QUFDRCxLQXJIYTtBQXVIZCxJQUFBLGNBQWMsRUFBRSwwQkFBWTtBQUMxQixXQUFLLFNBQUwsQ0FBZSxNQUFmO0FBQ0EsV0FBSyxTQUFMLEdBQWlCLElBQWpCO0FBQ0QsS0ExSGE7QUE0SGQsSUFBQSxRQUFRLEVBQUUsa0JBQVUsUUFBVixFQUFvQjtBQUM1QixVQUFJLElBQUksR0FBRyxJQUFYO0FBQUEsVUFDSSxPQUFPLEdBQUcsS0FBSyxRQUFMLENBQWMsUUFBZCxDQUF1QixNQUF2QixJQUFpQyxNQUFqQyxHQUEwQyxFQUR4RDs7QUFHQSxVQUFJLEtBQUssT0FBTCxJQUFnQixLQUFLLE9BQUwsQ0FBYSxRQUFqQyxFQUEyQztBQUN6QyxZQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsT0FBRixDQUFVLFVBQVYsSUFBd0IsT0FBeEM7QUFFQSxhQUFLLFNBQUwsR0FBaUIsQ0FBQyxDQUFDLGdDQUFnQyxPQUFoQyxHQUEwQyxNQUEzQyxDQUFELENBQ2QsUUFEYyxDQUNMLFFBQVEsQ0FBQyxJQURKLENBQWpCOztBQUdBLFlBQUksS0FBSyxPQUFMLENBQWEsUUFBYixJQUF5QixRQUE3QixFQUF1QztBQUNyQyxlQUFLLFNBQUwsQ0FBZSxLQUFmLENBQXFCLENBQUMsQ0FBQyxLQUFGLENBQVEsS0FBSyxJQUFiLEVBQW1CLElBQW5CLENBQXJCO0FBQ0Q7O0FBRUQsWUFBSSxTQUFKLEVBQWUsS0FBSyxTQUFMLENBQWUsQ0FBZixFQUFrQixXQUFsQixDQVYwQixDQVVJOztBQUU3QyxhQUFLLFNBQUwsQ0FBZSxRQUFmLENBQXdCLElBQXhCO0FBRUEsUUFBQSxTQUFTLEdBQ1AsS0FBSyxTQUFMLENBQWUsR0FBZixDQUFtQixDQUFDLENBQUMsT0FBRixDQUFVLFVBQVYsQ0FBcUIsR0FBeEMsRUFBNkMsUUFBN0MsQ0FETyxHQUVQLFFBQVEsRUFGVjtBQUlELE9BbEJELE1Ba0JPLElBQUksQ0FBQyxLQUFLLE9BQU4sSUFBaUIsS0FBSyxTQUExQixFQUFxQztBQUMxQyxhQUFLLFNBQUwsQ0FBZSxXQUFmLENBQTJCLElBQTNCO0FBRUEsUUFBQSxDQUFDLENBQUMsT0FBRixDQUFVLFVBQVYsSUFBd0IsS0FBSyxRQUFMLENBQWMsUUFBZCxDQUF1QixNQUF2QixDQUF4QixHQUNFLEtBQUssU0FBTCxDQUFlLEdBQWYsQ0FBbUIsQ0FBQyxDQUFDLE9BQUYsQ0FBVSxVQUFWLENBQXFCLEdBQXhDLEVBQTZDLENBQUMsQ0FBQyxLQUFGLENBQVEsS0FBSyxjQUFiLEVBQTZCLElBQTdCLENBQTdDLENBREYsR0FFRSxLQUFLLGNBQUwsRUFGRjtBQUlELE9BUE0sTUFPQSxJQUFJLFFBQUosRUFBYztBQUNuQixRQUFBLFFBQVE7QUFDVDtBQUNGO0FBNUphLEdBQWxCO0FBZ0tEOzs7QUFHQyxFQUFBLENBQUMsQ0FBQyxFQUFGLENBQUssS0FBTCxHQUFhLFVBQVUsTUFBVixFQUFrQjtBQUM3QixXQUFPLEtBQUssSUFBTCxDQUFVLFlBQVk7QUFDM0IsVUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUQsQ0FBYjtBQUFBLFVBQ0ksSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFOLENBQVcsT0FBWCxDQURYO0FBQUEsVUFFSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQUYsQ0FBUyxFQUFULEVBQWEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxLQUFMLENBQVcsUUFBeEIsRUFBa0MsS0FBSyxDQUFDLElBQU4sRUFBbEMsRUFBZ0QsUUFBTyxNQUFQLEtBQWlCLFFBQWpCLElBQTZCLE1BQTdFLENBRmQ7QUFHQSxVQUFJLENBQUMsSUFBTCxFQUFXLEtBQUssQ0FBQyxJQUFOLENBQVcsT0FBWCxFQUFxQixJQUFJLEdBQUcsSUFBSSxLQUFKLENBQVUsSUFBVixFQUFnQixPQUFoQixDQUE1QjtBQUNYLFVBQUksT0FBTyxNQUFQLElBQWlCLFFBQXJCLEVBQStCLElBQUksQ0FBQyxNQUFELENBQUosR0FBL0IsS0FDSyxJQUFJLE9BQU8sQ0FBQyxJQUFaLEVBQWtCLElBQUksQ0FBQyxJQUFMO0FBQ3hCLEtBUE0sQ0FBUDtBQVFELEdBVEQ7O0FBV0EsRUFBQSxDQUFDLENBQUMsRUFBRixDQUFLLEtBQUwsQ0FBVyxRQUFYLEdBQXNCO0FBQ2xCLElBQUEsUUFBUSxFQUFFLElBRFE7QUFFbEIsSUFBQSxRQUFRLEVBQUUsSUFGUTtBQUdsQixJQUFBLElBQUksRUFBRTtBQUhZLEdBQXRCO0FBTUEsRUFBQSxDQUFDLENBQUMsRUFBRixDQUFLLEtBQUwsQ0FBVyxXQUFYLEdBQXlCLEtBQXpCO0FBR0Q7OztBQUdDLEVBQUEsQ0FBQyxDQUFDLFlBQVk7QUFDWixJQUFBLENBQUMsQ0FBQyxNQUFELENBQUQsQ0FBVSxFQUFWLENBQWEsc0JBQWIsRUFBcUMsdUJBQXJDLEVBQThELFVBQVcsQ0FBWCxFQUFlO0FBQzNFLFVBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFELENBQWI7QUFBQSxVQUNJLElBQUksR0FBRyxLQUFLLENBQUMsSUFBTixDQUFXLE1BQVgsQ0FEWDtBQUFBLFVBRUksT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBTixDQUFXLGFBQVgsS0FBOEIsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFMLENBQWEsZ0JBQWIsRUFBK0IsRUFBL0IsQ0FBdkMsQ0FGZixDQUUyRjtBQUYzRjtBQUFBLFVBR0ksTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFSLENBQWEsT0FBYixJQUF3QixRQUF4QixHQUFtQyxDQUFDLENBQUMsTUFBRixDQUFTO0FBQUUsUUFBQSxNQUFNLEVBQUUsQ0FBQyxJQUFJLElBQUosQ0FBUyxJQUFULENBQUQsSUFBbUI7QUFBN0IsT0FBVCxFQUE4QyxPQUFPLENBQUMsSUFBUixFQUE5QyxFQUE4RCxLQUFLLENBQUMsSUFBTixFQUE5RCxDQUhoRDtBQUtBLE1BQUEsQ0FBQyxDQUFDLGNBQUY7QUFFQSxNQUFBLE9BQU8sQ0FDSixLQURILENBQ1MsTUFEVCxFQUVHLEdBRkgsQ0FFTyxNQUZQLEVBRWUsWUFBWTtBQUN2QixRQUFBLEtBQUssQ0FBQyxLQUFOO0FBQ0QsT0FKSDtBQUtELEtBYkQ7QUFjRCxHQWZBLENBQUQ7QUFpQkQsQ0ExTkEsQ0EwTkMsTUFBTSxDQUFDLE1BMU5SLENBQUQ7QUEwTmlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCakIsQ0FBQyxVQUFVLENBQVYsRUFBYTtBQUVaLGVBRlksQ0FFRTs7QUFHZjs7O0FBR0MsTUFBSSxPQUFPLEdBQUcsU0FBVixPQUFVLENBQVUsT0FBVixFQUFtQixPQUFuQixFQUE0QjtBQUN4QyxTQUFLLElBQUwsQ0FBVSxTQUFWLEVBQXFCLE9BQXJCLEVBQThCLE9BQTlCO0FBQ0QsR0FGRDs7QUFJQSxFQUFBLE9BQU8sQ0FBQyxTQUFSLEdBQW9CO0FBRWxCLElBQUEsV0FBVyxFQUFFLE9BRks7QUFJbEIsSUFBQSxJQUFJLEVBQUUsY0FBVSxJQUFWLEVBQWdCLE9BQWhCLEVBQXlCLE9BQXpCLEVBQWtDO0FBQ3RDLFVBQUksT0FBSixFQUNJLFFBREo7QUFHQSxXQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0EsV0FBSyxRQUFMLEdBQWdCLENBQUMsQ0FBQyxPQUFELENBQWpCO0FBQ0EsV0FBSyxPQUFMLEdBQWUsS0FBSyxVQUFMLENBQWdCLE9BQWhCLENBQWY7QUFDQSxXQUFLLE9BQUwsR0FBZSxJQUFmOztBQUVBLFVBQUksS0FBSyxPQUFMLENBQWEsT0FBYixJQUF3QixPQUE1QixFQUFxQztBQUNuQyxhQUFLLFFBQUwsQ0FBYyxFQUFkLENBQWlCLFdBQVcsS0FBSyxJQUFqQyxFQUF1QyxLQUFLLE9BQUwsQ0FBYSxRQUFwRCxFQUE4RCxDQUFDLENBQUMsS0FBRixDQUFRLEtBQUssTUFBYixFQUFxQixJQUFyQixDQUE5RDtBQUNELE9BRkQsTUFFTyxJQUFJLEtBQUssT0FBTCxDQUFhLE9BQWIsSUFBd0IsUUFBNUIsRUFBc0M7QUFDM0MsUUFBQSxPQUFPLEdBQUcsS0FBSyxPQUFMLENBQWEsT0FBYixJQUF3QixPQUF4QixHQUFrQyxZQUFsQyxHQUFpRCxPQUEzRDtBQUNBLFFBQUEsUUFBUSxHQUFHLEtBQUssT0FBTCxDQUFhLE9BQWIsSUFBd0IsT0FBeEIsR0FBa0MsWUFBbEMsR0FBaUQsTUFBNUQ7QUFDQSxhQUFLLFFBQUwsQ0FBYyxFQUFkLENBQWlCLE9BQU8sR0FBRyxHQUFWLEdBQWdCLEtBQUssSUFBdEMsRUFBNEMsS0FBSyxPQUFMLENBQWEsUUFBekQsRUFBbUUsQ0FBQyxDQUFDLEtBQUYsQ0FBUSxLQUFLLEtBQWIsRUFBb0IsSUFBcEIsQ0FBbkU7QUFDQSxhQUFLLFFBQUwsQ0FBYyxFQUFkLENBQWlCLFFBQVEsR0FBRyxHQUFYLEdBQWlCLEtBQUssSUFBdkMsRUFBNkMsS0FBSyxPQUFMLENBQWEsUUFBMUQsRUFBb0UsQ0FBQyxDQUFDLEtBQUYsQ0FBUSxLQUFLLEtBQWIsRUFBb0IsSUFBcEIsQ0FBcEU7QUFDRDs7QUFFRCxXQUFLLE9BQUwsQ0FBYSxRQUFiLEdBQ0csS0FBSyxRQUFMLEdBQWdCLENBQUMsQ0FBQyxNQUFGLENBQVMsRUFBVCxFQUFhLEtBQUssT0FBbEIsRUFBMkI7QUFBRSxRQUFBLE9BQU8sRUFBRSxRQUFYO0FBQXFCLFFBQUEsUUFBUSxFQUFFO0FBQS9CLE9BQTNCLENBRG5CLEdBRUUsS0FBSyxRQUFMLEVBRkY7QUFHRCxLQXpCaUI7QUEyQmxCLElBQUEsVUFBVSxFQUFFLG9CQUFVLE9BQVYsRUFBbUI7QUFDN0IsTUFBQSxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQUYsQ0FBUyxFQUFULEVBQWEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxLQUFLLElBQVYsRUFBZ0IsUUFBN0IsRUFBdUMsT0FBdkMsRUFBZ0QsS0FBSyxRQUFMLENBQWMsSUFBZCxFQUFoRCxDQUFWOztBQUVBLFVBQUksT0FBTyxDQUFDLEtBQVIsSUFBaUIsT0FBTyxPQUFPLENBQUMsS0FBZixJQUF3QixRQUE3QyxFQUF1RDtBQUNyRCxRQUFBLE9BQU8sQ0FBQyxLQUFSLEdBQWdCO0FBQ2QsVUFBQSxJQUFJLEVBQUUsT0FBTyxDQUFDLEtBREE7QUFFZCxVQUFBLElBQUksRUFBRSxPQUFPLENBQUM7QUFGQSxTQUFoQjtBQUlEOztBQUVELGFBQU8sT0FBUDtBQUNELEtBdENpQjtBQXdDbEIsSUFBQSxLQUFLLEVBQUUsZUFBVSxDQUFWLEVBQWE7QUFDbEIsVUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFILENBQUQsQ0FBbUIsS0FBSyxJQUF4QixFQUE4QixLQUFLLFFBQW5DLEVBQTZDLElBQTdDLENBQWtELEtBQUssSUFBdkQsQ0FBWDtBQUVBLFVBQUksQ0FBQyxJQUFJLENBQUMsT0FBTCxDQUFhLEtBQWQsSUFBdUIsQ0FBQyxJQUFJLENBQUMsT0FBTCxDQUFhLEtBQWIsQ0FBbUIsSUFBL0MsRUFBcUQsT0FBTyxJQUFJLENBQUMsSUFBTCxFQUFQO0FBRXJELE1BQUEsWUFBWSxDQUFDLEtBQUssT0FBTixDQUFaO0FBQ0EsTUFBQSxJQUFJLENBQUMsVUFBTCxHQUFrQixJQUFsQjtBQUNBLFdBQUssT0FBTCxHQUFlLFVBQVUsQ0FBQyxZQUFXO0FBQ25DLFlBQUksSUFBSSxDQUFDLFVBQUwsSUFBbUIsSUFBdkIsRUFBNkIsSUFBSSxDQUFDLElBQUw7QUFDOUIsT0FGd0IsRUFFdEIsSUFBSSxDQUFDLE9BQUwsQ0FBYSxLQUFiLENBQW1CLElBRkcsQ0FBekI7QUFHRCxLQWxEaUI7QUFvRGxCLElBQUEsS0FBSyxFQUFFLGVBQVUsQ0FBVixFQUFhO0FBQ2xCLFVBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBSCxDQUFELENBQW1CLEtBQUssSUFBeEIsRUFBOEIsS0FBSyxRQUFuQyxFQUE2QyxJQUE3QyxDQUFrRCxLQUFLLElBQXZELENBQVg7QUFFQSxVQUFJLEtBQUssT0FBVCxFQUFrQixZQUFZLENBQUMsS0FBSyxPQUFOLENBQVo7QUFDbEIsVUFBSSxDQUFDLElBQUksQ0FBQyxPQUFMLENBQWEsS0FBZCxJQUF1QixDQUFDLElBQUksQ0FBQyxPQUFMLENBQWEsS0FBYixDQUFtQixJQUEvQyxFQUFxRCxPQUFPLElBQUksQ0FBQyxJQUFMLEVBQVA7QUFFckQsTUFBQSxJQUFJLENBQUMsVUFBTCxHQUFrQixLQUFsQjtBQUNBLFdBQUssT0FBTCxHQUFlLFVBQVUsQ0FBQyxZQUFXO0FBQ25DLFlBQUksSUFBSSxDQUFDLFVBQUwsSUFBbUIsS0FBdkIsRUFBOEIsSUFBSSxDQUFDLElBQUw7QUFDL0IsT0FGd0IsRUFFdEIsSUFBSSxDQUFDLE9BQUwsQ0FBYSxLQUFiLENBQW1CLElBRkcsQ0FBekI7QUFHRCxLQTlEaUI7QUFnRWxCLElBQUEsSUFBSSxFQUFFLGdCQUFZO0FBQ2hCLFVBQUksSUFBSixFQUNJLE1BREosRUFFSSxHQUZKLEVBR0ksV0FISixFQUlJLFlBSkosRUFLSSxTQUxKLEVBTUksRUFOSjs7QUFRQSxVQUFJLEtBQUssVUFBTCxNQUFxQixLQUFLLE9BQTlCLEVBQXVDO0FBQ3JDLFFBQUEsSUFBSSxHQUFHLEtBQUssR0FBTCxFQUFQO0FBQ0EsYUFBSyxVQUFMOztBQUVBLFlBQUksS0FBSyxPQUFMLENBQWEsU0FBakIsRUFBNEI7QUFDMUIsVUFBQSxJQUFJLENBQUMsUUFBTCxDQUFjLE1BQWQ7QUFDRDs7QUFFRCxRQUFBLFNBQVMsR0FBRyxPQUFPLEtBQUssT0FBTCxDQUFhLFNBQXBCLElBQWlDLFVBQWpDLEdBQ1YsS0FBSyxPQUFMLENBQWEsU0FBYixDQUF1QixJQUF2QixDQUE0QixJQUE1QixFQUFrQyxJQUFJLENBQUMsQ0FBRCxDQUF0QyxFQUEyQyxLQUFLLFFBQUwsQ0FBYyxDQUFkLENBQTNDLENBRFUsR0FFVixLQUFLLE9BQUwsQ0FBYSxTQUZmO0FBSUEsUUFBQSxNQUFNLEdBQUcsS0FBSyxJQUFMLENBQVUsU0FBVixDQUFUO0FBRUEsUUFBQSxJQUFJLENBQ0QsTUFESCxHQUVHLEdBRkgsQ0FFTztBQUFFLFVBQUEsR0FBRyxFQUFFLENBQVA7QUFBVSxVQUFBLElBQUksRUFBRSxDQUFoQjtBQUFtQixVQUFBLE9BQU8sRUFBRTtBQUE1QixTQUZQLEVBR0csUUFISCxDQUdZLE1BQU0sR0FBRyxLQUFLLFFBQVIsR0FBbUIsUUFBUSxDQUFDLElBSDlDO0FBS0EsUUFBQSxHQUFHLEdBQUcsS0FBSyxXQUFMLENBQWlCLE1BQWpCLENBQU47QUFFQSxRQUFBLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBRCxDQUFKLENBQVEsV0FBdEI7QUFDQSxRQUFBLFlBQVksR0FBRyxJQUFJLENBQUMsQ0FBRCxDQUFKLENBQVEsWUFBdkI7O0FBRUEsZ0JBQVEsTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFWLENBQWdCLEdBQWhCLEVBQXFCLENBQXJCLENBQUgsR0FBNkIsU0FBM0M7QUFDRSxlQUFLLFFBQUw7QUFDRSxZQUFBLEVBQUUsR0FBRztBQUFDLGNBQUEsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFKLEdBQVUsR0FBRyxDQUFDLE1BQXBCO0FBQTRCLGNBQUEsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFKLEdBQVcsR0FBRyxDQUFDLEtBQUosR0FBWSxDQUF2QixHQUEyQixXQUFXLEdBQUc7QUFBM0UsYUFBTDtBQUNBOztBQUNGLGVBQUssS0FBTDtBQUNFLFlBQUEsRUFBRSxHQUFHO0FBQUMsY0FBQSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUosR0FBVSxZQUFoQjtBQUE4QixjQUFBLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSixHQUFXLEdBQUcsQ0FBQyxLQUFKLEdBQVksQ0FBdkIsR0FBMkIsV0FBVyxHQUFHO0FBQTdFLGFBQUw7QUFDQTs7QUFDRixlQUFLLE1BQUw7QUFDRSxZQUFBLEVBQUUsR0FBRztBQUFDLGNBQUEsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFKLEdBQVUsR0FBRyxDQUFDLE1BQUosR0FBYSxDQUF2QixHQUEyQixZQUFZLEdBQUcsQ0FBaEQ7QUFBbUQsY0FBQSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUosR0FBVztBQUFwRSxhQUFMO0FBQ0E7O0FBQ0YsZUFBSyxPQUFMO0FBQ0UsWUFBQSxFQUFFLEdBQUc7QUFBQyxjQUFBLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBSixHQUFVLEdBQUcsQ0FBQyxNQUFKLEdBQWEsQ0FBdkIsR0FBMkIsWUFBWSxHQUFHLENBQWhEO0FBQW1ELGNBQUEsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFKLEdBQVcsR0FBRyxDQUFDO0FBQXhFLGFBQUw7QUFDQTtBQVpKOztBQWVBLFFBQUEsSUFBSSxDQUNELEdBREgsQ0FDTyxFQURQLEVBRUcsUUFGSCxDQUVZLFNBRlosRUFHRyxRQUhILENBR1ksSUFIWjtBQUlEO0FBQ0YsS0FySGlCO0FBdUhsQixJQUFBLFVBQVUsRUFBRSxzQkFBWTtBQUN0QixVQUFJLElBQUksR0FBRyxLQUFLLEdBQUwsRUFBWDtBQUFBLFVBQ0ksS0FBSyxHQUFHLEtBQUssUUFBTCxFQURaO0FBR0EsTUFBQSxJQUFJLENBQUMsSUFBTCxDQUFVLGdCQUFWLEVBQTRCLEtBQUssT0FBTCxDQUFhLElBQWIsR0FBb0IsTUFBcEIsR0FBNkIsTUFBekQsRUFBaUUsS0FBakU7QUFDQSxNQUFBLElBQUksQ0FBQyxXQUFMLENBQWlCLCtCQUFqQjtBQUNELEtBN0hpQjtBQStIbEIsSUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDaEIsVUFBSSxJQUFJLEdBQUcsSUFBWDtBQUFBLFVBQ0ksSUFBSSxHQUFHLEtBQUssR0FBTCxFQURYO0FBR0EsTUFBQSxJQUFJLENBQUMsV0FBTCxDQUFpQixJQUFqQjs7QUFFQSxlQUFTLG1CQUFULEdBQStCO0FBQzdCLFlBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQyxZQUFZO0FBQ25DLFVBQUEsSUFBSSxDQUFDLEdBQUwsQ0FBUyxDQUFDLENBQUMsT0FBRixDQUFVLFVBQVYsQ0FBcUIsR0FBOUIsRUFBbUMsTUFBbkM7QUFDRCxTQUZ1QixFQUVyQixHQUZxQixDQUF4QjtBQUlBLFFBQUEsSUFBSSxDQUFDLEdBQUwsQ0FBUyxDQUFDLENBQUMsT0FBRixDQUFVLFVBQVYsQ0FBcUIsR0FBOUIsRUFBbUMsWUFBWTtBQUM3QyxVQUFBLFlBQVksQ0FBQyxPQUFELENBQVo7QUFDQSxVQUFBLElBQUksQ0FBQyxNQUFMO0FBQ0QsU0FIRDtBQUlEOztBQUVELE1BQUEsQ0FBQyxDQUFDLE9BQUYsQ0FBVSxVQUFWLElBQXdCLEtBQUssSUFBTCxDQUFVLFFBQVYsQ0FBbUIsTUFBbkIsQ0FBeEIsR0FDRSxtQkFBbUIsRUFEckIsR0FFRSxJQUFJLENBQUMsTUFBTCxFQUZGO0FBSUEsYUFBTyxJQUFQO0FBQ0QsS0FySmlCO0FBdUpsQixJQUFBLFFBQVEsRUFBRSxvQkFBWTtBQUNwQixVQUFJLEVBQUUsR0FBRyxLQUFLLFFBQWQ7O0FBQ0EsVUFBSSxFQUFFLENBQUMsSUFBSCxDQUFRLE9BQVIsS0FBb0IsT0FBTyxFQUFFLENBQUMsSUFBSCxDQUFRLHFCQUFSLENBQVAsSUFBMEMsUUFBbEUsRUFBNEU7QUFDMUUsUUFBQSxFQUFFLENBQUMsSUFBSCxDQUFRLHFCQUFSLEVBQStCLEVBQUUsQ0FBQyxJQUFILENBQVEsT0FBUixLQUFvQixFQUFuRCxFQUF1RCxVQUF2RCxDQUFrRSxPQUFsRTtBQUNEO0FBQ0YsS0E1SmlCO0FBOEpsQixJQUFBLFVBQVUsRUFBRSxzQkFBWTtBQUN0QixhQUFPLEtBQUssUUFBTCxFQUFQO0FBQ0QsS0FoS2lCO0FBa0tsQixJQUFBLFdBQVcsRUFBRSxxQkFBVSxNQUFWLEVBQWtCO0FBQzdCLGFBQU8sQ0FBQyxDQUFDLE1BQUYsQ0FBUyxFQUFULEVBQWMsTUFBTSxHQUFHO0FBQUMsUUFBQSxHQUFHLEVBQUUsQ0FBTjtBQUFTLFFBQUEsSUFBSSxFQUFFO0FBQWYsT0FBSCxHQUF1QixLQUFLLFFBQUwsQ0FBYyxNQUFkLEVBQTNDLEVBQW9FO0FBQ3pFLFFBQUEsS0FBSyxFQUFFLEtBQUssUUFBTCxDQUFjLENBQWQsRUFBaUIsV0FEaUQ7QUFFekUsUUFBQSxNQUFNLEVBQUUsS0FBSyxRQUFMLENBQWMsQ0FBZCxFQUFpQjtBQUZnRCxPQUFwRSxDQUFQO0FBSUQsS0F2S2lCO0FBeUtsQixJQUFBLFFBQVEsRUFBRSxvQkFBWTtBQUNwQixVQUFJLEtBQUo7QUFBQSxVQUNJLEVBQUUsR0FBRyxLQUFLLFFBRGQ7QUFBQSxVQUVJLENBQUMsR0FBRyxLQUFLLE9BRmI7QUFJQSxNQUFBLEtBQUssR0FBRyxFQUFFLENBQUMsSUFBSCxDQUFRLHFCQUFSLE1BQ0YsT0FBTyxDQUFDLENBQUMsS0FBVCxJQUFrQixVQUFsQixHQUErQixDQUFDLENBQUMsS0FBRixDQUFRLElBQVIsQ0FBYSxFQUFFLENBQUMsQ0FBRCxDQUFmLENBQS9CLEdBQXNELENBQUMsQ0FBQyxLQUR0RCxDQUFSO0FBR0EsYUFBTyxLQUFQO0FBQ0QsS0FsTGlCO0FBb0xsQixJQUFBLEdBQUcsRUFBRSxlQUFZO0FBQ2YsYUFBTyxLQUFLLElBQUwsR0FBWSxLQUFLLElBQUwsSUFBYSxDQUFDLENBQUMsS0FBSyxPQUFMLENBQWEsUUFBZCxDQUFqQztBQUNELEtBdExpQjtBQXdMbEIsSUFBQSxRQUFRLEVBQUUsb0JBQVk7QUFDcEIsVUFBSSxDQUFDLEtBQUssUUFBTCxDQUFjLENBQWQsRUFBaUIsVUFBdEIsRUFBa0M7QUFDaEMsYUFBSyxJQUFMO0FBQ0EsYUFBSyxRQUFMLEdBQWdCLElBQWhCO0FBQ0EsYUFBSyxPQUFMLEdBQWUsSUFBZjtBQUNEO0FBQ0YsS0E5TGlCO0FBZ01sQixJQUFBLE1BQU0sRUFBRSxrQkFBWTtBQUNsQixXQUFLLE9BQUwsR0FBZSxJQUFmO0FBQ0QsS0FsTWlCO0FBb01sQixJQUFBLE9BQU8sRUFBRSxtQkFBWTtBQUNuQixXQUFLLE9BQUwsR0FBZSxLQUFmO0FBQ0QsS0F0TWlCO0FBd01sQixJQUFBLGFBQWEsRUFBRSx5QkFBWTtBQUN6QixXQUFLLE9BQUwsR0FBZSxDQUFDLEtBQUssT0FBckI7QUFDRCxLQTFNaUI7QUE0TWxCLElBQUEsTUFBTSxFQUFFLGtCQUFZO0FBQ2xCLFdBQUssS0FBSyxHQUFMLEdBQVcsUUFBWCxDQUFvQixJQUFwQixJQUE0QixNQUE1QixHQUFxQyxNQUExQztBQUNELEtBOU1pQjtBQWdObEIsSUFBQSxPQUFPLEVBQUUsbUJBQVk7QUFDbkIsV0FBSyxJQUFMLEdBQVksUUFBWixDQUFxQixHQUFyQixDQUF5QixNQUFNLEtBQUssSUFBcEMsRUFBMEMsVUFBMUMsQ0FBcUQsS0FBSyxJQUExRDtBQUNEO0FBbE5pQixHQUFwQjtBQXVORDs7O0FBR0MsRUFBQSxDQUFDLENBQUMsRUFBRixDQUFLLE9BQUwsR0FBZSxVQUFXLE1BQVgsRUFBb0I7QUFDakMsV0FBTyxLQUFLLElBQUwsQ0FBVSxZQUFZO0FBQzNCLFVBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFELENBQWI7QUFBQSxVQUNJLElBQUksR0FBRyxLQUFLLENBQUMsSUFBTixDQUFXLFNBQVgsQ0FEWDtBQUFBLFVBRUksT0FBTyxHQUFHLFFBQU8sTUFBUCxLQUFpQixRQUFqQixJQUE2QixNQUYzQztBQUdBLFVBQUksQ0FBQyxJQUFMLEVBQVcsS0FBSyxDQUFDLElBQU4sQ0FBVyxTQUFYLEVBQXVCLElBQUksR0FBRyxJQUFJLE9BQUosQ0FBWSxJQUFaLEVBQWtCLE9BQWxCLENBQTlCO0FBQ1gsVUFBSSxPQUFPLE1BQVAsSUFBaUIsUUFBckIsRUFBK0IsSUFBSSxDQUFDLE1BQUQsQ0FBSjtBQUNoQyxLQU5NLENBQVA7QUFPRCxHQVJEOztBQVVBLEVBQUEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxPQUFMLENBQWEsV0FBYixHQUEyQixPQUEzQjtBQUVBLEVBQUEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxPQUFMLENBQWEsUUFBYixHQUF3QjtBQUN0QixJQUFBLFNBQVMsRUFBRSxJQURXO0FBRXRCLElBQUEsU0FBUyxFQUFFLEtBRlc7QUFHdEIsSUFBQSxRQUFRLEVBQUUsS0FIWTtBQUl0QixJQUFBLFFBQVEsRUFBRSwrRkFKWTtBQUt0QixJQUFBLE9BQU8sRUFBRSxPQUxhO0FBTXRCLElBQUEsS0FBSyxFQUFFLEVBTmU7QUFPdEIsSUFBQSxLQUFLLEVBQUUsQ0FQZTtBQVF0QixJQUFBLElBQUksRUFBRTtBQVJnQixHQUF4QjtBQVdELENBN1BBLENBNlBDLE1BQU0sQ0FBQyxNQTdQUixDQUFEO0FBOFBBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBLENBQUMsVUFBVSxDQUFWLEVBQWE7QUFFWixlQUZZLENBRUU7O0FBR2Y7OztBQUdDLE1BQUksT0FBTyxHQUFHLFNBQVYsT0FBVSxDQUFVLE9BQVYsRUFBbUIsT0FBbkIsRUFBNEI7QUFDeEMsU0FBSyxJQUFMLENBQVUsU0FBVixFQUFxQixPQUFyQixFQUE4QixPQUE5QjtBQUNELEdBRkQ7QUFLQTs7OztBQUdBLEVBQUEsT0FBTyxDQUFDLFNBQVIsR0FBb0IsQ0FBQyxDQUFDLE1BQUYsQ0FBUyxFQUFULEVBQWEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxPQUFMLENBQWEsV0FBYixDQUF5QixTQUF0QyxFQUFpRDtBQUVuRSxJQUFBLFdBQVcsRUFBRSxPQUZzRDtBQUluRSxJQUFBLFVBQVUsRUFBRSxzQkFBWTtBQUN0QixVQUFJLElBQUksR0FBRyxLQUFLLEdBQUwsRUFBWDtBQUFBLFVBQ0ksS0FBSyxHQUFHLEtBQUssUUFBTCxFQURaO0FBQUEsVUFFSSxPQUFPLEdBQUcsS0FBSyxVQUFMLEVBRmQ7QUFJQSxNQUFBLElBQUksQ0FBQyxJQUFMLENBQVUsZ0JBQVYsRUFBNEIsS0FBSyxPQUFMLENBQWEsSUFBYixHQUFvQixNQUFwQixHQUE2QixNQUF6RCxFQUFpRSxLQUFqRTtBQUNBLE1BQUEsSUFBSSxDQUFDLElBQUwsQ0FBVSxzQkFBVixFQUFrQyxLQUFLLE9BQUwsQ0FBYSxJQUFiLEdBQW9CLE1BQXBCLEdBQTZCLE1BQS9ELEVBQXVFLE9BQXZFO0FBRUEsTUFBQSxJQUFJLENBQUMsV0FBTCxDQUFpQiwrQkFBakI7QUFDRCxLQWJrRTtBQWVuRSxJQUFBLFVBQVUsRUFBRSxzQkFBWTtBQUN0QixhQUFPLEtBQUssUUFBTCxNQUFtQixLQUFLLFVBQUwsRUFBMUI7QUFDRCxLQWpCa0U7QUFtQm5FLElBQUEsVUFBVSxFQUFFLHNCQUFZO0FBQ3RCLFVBQUksT0FBSjtBQUFBLFVBQ0ksRUFBRSxHQUFHLEtBQUssUUFEZDtBQUFBLFVBRUksQ0FBQyxHQUFHLEtBQUssT0FGYjtBQUlBLE1BQUEsT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFILENBQVEsY0FBUixNQUNKLE9BQU8sQ0FBQyxDQUFDLE9BQVQsSUFBb0IsVUFBcEIsR0FBaUMsQ0FBQyxDQUFDLE9BQUYsQ0FBVSxJQUFWLENBQWUsRUFBRSxDQUFDLENBQUQsQ0FBakIsQ0FBakMsR0FBMEQsQ0FBQyxDQUFDLE9BRHhELENBQVY7QUFHQSxhQUFPLE9BQVA7QUFDRCxLQTVCa0U7QUE4Qm5FLElBQUEsR0FBRyxFQUFFLGVBQVk7QUFDZixVQUFJLENBQUMsS0FBSyxJQUFWLEVBQWdCO0FBQ2QsYUFBSyxJQUFMLEdBQVksQ0FBQyxDQUFDLEtBQUssT0FBTCxDQUFhLFFBQWQsQ0FBYjtBQUNEOztBQUNELGFBQU8sS0FBSyxJQUFaO0FBQ0QsS0FuQ2tFO0FBcUNuRSxJQUFBLE9BQU8sRUFBRSxtQkFBWTtBQUNuQixXQUFLLElBQUwsR0FBWSxRQUFaLENBQXFCLEdBQXJCLENBQXlCLE1BQU0sS0FBSyxJQUFwQyxFQUEwQyxVQUExQyxDQUFxRCxLQUFLLElBQTFEO0FBQ0Q7QUF2Q2tFLEdBQWpELENBQXBCO0FBNENEOzs7QUFHQyxFQUFBLENBQUMsQ0FBQyxFQUFGLENBQUssT0FBTCxHQUFlLFVBQVUsTUFBVixFQUFrQjtBQUMvQixXQUFPLEtBQUssSUFBTCxDQUFVLFlBQVk7QUFDM0IsVUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUQsQ0FBYjtBQUFBLFVBQ0ksSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFOLENBQVcsU0FBWCxDQURYO0FBQUEsVUFFSSxPQUFPLEdBQUcsUUFBTyxNQUFQLEtBQWlCLFFBQWpCLElBQTZCLE1BRjNDO0FBR0EsVUFBSSxDQUFDLElBQUwsRUFBVyxLQUFLLENBQUMsSUFBTixDQUFXLFNBQVgsRUFBdUIsSUFBSSxHQUFHLElBQUksT0FBSixDQUFZLElBQVosRUFBa0IsT0FBbEIsQ0FBOUI7QUFDWCxVQUFJLE9BQU8sTUFBUCxJQUFpQixRQUFyQixFQUErQixJQUFJLENBQUMsTUFBRCxDQUFKO0FBQ2hDLEtBTk0sQ0FBUDtBQU9ELEdBUkQ7O0FBVUEsRUFBQSxDQUFDLENBQUMsRUFBRixDQUFLLE9BQUwsQ0FBYSxXQUFiLEdBQTJCLE9BQTNCO0FBRUEsRUFBQSxDQUFDLENBQUMsRUFBRixDQUFLLE9BQUwsQ0FBYSxRQUFiLEdBQXdCLENBQUMsQ0FBQyxNQUFGLENBQVMsRUFBVCxFQUFjLENBQUMsQ0FBQyxFQUFGLENBQUssT0FBTCxDQUFhLFFBQTNCLEVBQXFDO0FBQzNELElBQUEsU0FBUyxFQUFFLE9BRGdEO0FBRTNELElBQUEsT0FBTyxFQUFFLE9BRmtEO0FBRzNELElBQUEsT0FBTyxFQUFFLEVBSGtEO0FBSTNELElBQUEsUUFBUSxFQUFFO0FBSmlELEdBQXJDLENBQXhCO0FBT0QsQ0FsRkEsQ0FrRkMsTUFBTSxDQUFDLE1BbEZSLENBQUQ7QUFrRmlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JqQixDQUFDLFVBQVUsQ0FBVixFQUFhO0FBRVosZUFGWSxDQUVFOztBQUdmOzs7QUFHQyxXQUFTLFNBQVQsQ0FBbUIsT0FBbkIsRUFBNEIsT0FBNUIsRUFBcUM7QUFDbkMsUUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUYsQ0FBUSxLQUFLLE9BQWIsRUFBc0IsSUFBdEIsQ0FBZDtBQUFBLFFBQ0ksUUFBUSxHQUFHLENBQUMsQ0FBQyxPQUFELENBQUQsQ0FBVyxFQUFYLENBQWMsTUFBZCxJQUF3QixDQUFDLENBQUMsTUFBRCxDQUF6QixHQUFvQyxDQUFDLENBQUMsT0FBRCxDQURwRDtBQUFBLFFBRUksSUFGSjtBQUdBLFNBQUssT0FBTCxHQUFlLENBQUMsQ0FBQyxNQUFGLENBQVMsRUFBVCxFQUFhLENBQUMsQ0FBQyxFQUFGLENBQUssU0FBTCxDQUFlLFFBQTVCLEVBQXNDLE9BQXRDLENBQWY7QUFDQSxTQUFLLGNBQUwsR0FBc0IsUUFBUSxDQUFDLEVBQVQsQ0FBWSw0QkFBWixFQUEwQyxPQUExQyxDQUF0QjtBQUNBLFNBQUssUUFBTCxHQUFnQixDQUFDLEtBQUssT0FBTCxDQUFhLE1BQWIsSUFDWCxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsT0FBRCxDQUFELENBQVcsSUFBWCxDQUFnQixNQUFoQixDQUFSLEtBQW9DLElBQUksQ0FBQyxPQUFMLENBQWEsZ0JBQWIsRUFBK0IsRUFBL0IsQ0FEekIsQ0FDNkQ7QUFEN0QsT0FFWixFQUZXLElBRUwsY0FGWDtBQUdBLFNBQUssS0FBTCxHQUFhLENBQUMsQ0FBQyxNQUFELENBQWQ7QUFDQSxTQUFLLE9BQUw7QUFDQSxTQUFLLE9BQUw7QUFDRDs7QUFFRCxFQUFBLFNBQVMsQ0FBQyxTQUFWLEdBQXNCO0FBRWxCLElBQUEsV0FBVyxFQUFFLFNBRks7QUFJbEIsSUFBQSxPQUFPLEVBQUUsbUJBQVk7QUFDbkIsVUFBSSxJQUFJLEdBQUcsSUFBWDtBQUFBLFVBQ0ksUUFESjtBQUdBLFdBQUssT0FBTCxHQUFlLENBQUMsQ0FBQyxFQUFELENBQWhCO0FBQ0EsV0FBSyxPQUFMLEdBQWUsQ0FBQyxDQUFDLEVBQUQsQ0FBaEI7QUFFQSxNQUFBLFFBQVEsR0FBRyxLQUFLLEtBQUwsQ0FDUixJQURRLENBQ0gsS0FBSyxRQURGLEVBRVIsR0FGUSxDQUVKLFlBQVk7QUFDZixZQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBRCxDQUFYO0FBQUEsWUFDSSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUosQ0FBUyxRQUFULEtBQXNCLEdBQUcsQ0FBQyxJQUFKLENBQVMsTUFBVCxDQURqQztBQUFBLFlBRUksS0FBSyxHQUFHLE9BQU8sSUFBUCxDQUFZLElBQVosS0FBcUIsQ0FBQyxDQUFDLElBQUQsQ0FGbEM7QUFHQSxlQUFTLEtBQUssSUFDVCxLQUFLLENBQUMsTUFERixJQUVKLENBQUMsQ0FBRSxLQUFLLENBQUMsUUFBTixHQUFpQixHQUFuQixFQUF3QixJQUF4QixDQUFELENBRkUsSUFFb0MsSUFGM0M7QUFHRCxPQVRRLEVBVVIsSUFWUSxDQVVILFVBQVUsQ0FBVixFQUFhLENBQWIsRUFBZ0I7QUFBRSxlQUFPLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxDQUFDLENBQUMsQ0FBRCxDQUFmO0FBQW9CLE9BVm5DLEVBV1IsSUFYUSxDQVdILFlBQVk7QUFDaEIsUUFBQSxJQUFJLENBQUMsT0FBTCxDQUFhLElBQWIsQ0FBa0IsS0FBSyxDQUFMLENBQWxCO0FBQ0EsUUFBQSxJQUFJLENBQUMsT0FBTCxDQUFhLElBQWIsQ0FBa0IsS0FBSyxDQUFMLENBQWxCO0FBQ0QsT0FkUSxDQUFYO0FBZUQsS0ExQmlCO0FBNEJsQixJQUFBLE9BQU8sRUFBRSxtQkFBWTtBQUNuQixVQUFJLFNBQVMsR0FBRyxLQUFLLGNBQUwsQ0FBb0IsU0FBcEIsS0FBa0MsS0FBSyxPQUFMLENBQWEsTUFBL0Q7QUFBQSxVQUNJLFlBQVksR0FBRyxLQUFLLGNBQUwsQ0FBb0IsQ0FBcEIsRUFBdUIsWUFBdkIsSUFBdUMsS0FBSyxLQUFMLENBQVcsQ0FBWCxFQUFjLFlBRHhFO0FBQUEsVUFFSSxTQUFTLEdBQUcsWUFBWSxHQUFHLEtBQUssY0FBTCxDQUFvQixNQUFwQixFQUYvQjtBQUFBLFVBR0ksT0FBTyxHQUFHLEtBQUssT0FIbkI7QUFBQSxVQUlJLE9BQU8sR0FBRyxLQUFLLE9BSm5CO0FBQUEsVUFLSSxZQUFZLEdBQUcsS0FBSyxZQUx4QjtBQUFBLFVBTUksQ0FOSjs7QUFRQSxVQUFJLFNBQVMsSUFBSSxTQUFqQixFQUE0QjtBQUMxQixlQUFPLFlBQVksS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQVIsR0FBZSxDQUFmLENBQVQsQ0FBWixJQUNGLEtBQUssUUFBTCxDQUFnQixDQUFoQixDQURMO0FBRUQ7O0FBRUQsV0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQWpCLEVBQXlCLENBQUMsRUFBMUIsR0FBK0I7QUFDN0IsUUFBQSxZQUFZLElBQUksT0FBTyxDQUFDLENBQUQsQ0FBdkIsSUFDSyxTQUFTLElBQUksT0FBTyxDQUFDLENBQUQsQ0FEekIsS0FFTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBTCxDQUFSLElBQW1CLFNBQVMsSUFBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUwsQ0FGN0MsS0FHSyxLQUFLLFFBQUwsQ0FBZSxPQUFPLENBQUMsQ0FBRCxDQUF0QixDQUhMO0FBSUQ7QUFDRixLQWhEaUI7QUFrRGxCLElBQUEsUUFBUSxFQUFFLGtCQUFVLE1BQVYsRUFBa0I7QUFDMUIsVUFBSSxNQUFKLEVBQ0ksUUFESjtBQUdBLFdBQUssWUFBTCxHQUFvQixNQUFwQjtBQUVBLE1BQUEsQ0FBQyxDQUFDLEtBQUssUUFBTixDQUFELENBQ0csTUFESCxDQUNVLFNBRFYsRUFFRyxXQUZILENBRWUsUUFGZjtBQUlBLE1BQUEsUUFBUSxHQUFHLEtBQUssUUFBTCxHQUNQLGdCQURPLEdBQ1ksTUFEWixHQUNxQixLQURyQixHQUVQLEtBQUssUUFGRSxHQUVTLFNBRlQsR0FFcUIsTUFGckIsR0FFOEIsSUFGekM7QUFJQSxNQUFBLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBRCxDQUFELENBQ04sTUFETSxDQUNDLElBREQsRUFFTixRQUZNLENBRUcsUUFGSCxDQUFUOztBQUlBLFVBQUksTUFBTSxDQUFDLE1BQVAsQ0FBYyxnQkFBZCxFQUFnQyxNQUFwQyxFQUE2QztBQUMzQyxRQUFBLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBUCxDQUFlLGFBQWYsRUFBOEIsUUFBOUIsQ0FBdUMsUUFBdkMsQ0FBVDtBQUNEOztBQUVELE1BQUEsTUFBTSxDQUFDLE9BQVAsQ0FBZSxVQUFmO0FBQ0Q7QUF6RWlCLEdBQXRCO0FBOEVEOzs7QUFHQyxFQUFBLENBQUMsQ0FBQyxFQUFGLENBQUssU0FBTCxHQUFpQixVQUFVLE1BQVYsRUFBa0I7QUFDakMsV0FBTyxLQUFLLElBQUwsQ0FBVSxZQUFZO0FBQzNCLFVBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFELENBQWI7QUFBQSxVQUNJLElBQUksR0FBRyxLQUFLLENBQUMsSUFBTixDQUFXLFdBQVgsQ0FEWDtBQUFBLFVBRUksT0FBTyxHQUFHLFFBQU8sTUFBUCxLQUFpQixRQUFqQixJQUE2QixNQUYzQztBQUdBLFVBQUksQ0FBQyxJQUFMLEVBQVcsS0FBSyxDQUFDLElBQU4sQ0FBVyxXQUFYLEVBQXlCLElBQUksR0FBRyxJQUFJLFNBQUosQ0FBYyxJQUFkLEVBQW9CLE9BQXBCLENBQWhDO0FBQ1gsVUFBSSxPQUFPLE1BQVAsSUFBaUIsUUFBckIsRUFBK0IsSUFBSSxDQUFDLE1BQUQsQ0FBSjtBQUNoQyxLQU5NLENBQVA7QUFPRCxHQVJEOztBQVVBLEVBQUEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxTQUFMLENBQWUsV0FBZixHQUE2QixTQUE3QjtBQUVBLEVBQUEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxTQUFMLENBQWUsUUFBZixHQUEwQjtBQUN4QixJQUFBLE1BQU0sRUFBRTtBQURnQixHQUExQjtBQUtEOzs7QUFHQyxFQUFBLENBQUMsQ0FBQyxNQUFELENBQUQsQ0FBVSxFQUFWLENBQWEsTUFBYixFQUFxQixZQUFZO0FBQy9CLElBQUEsQ0FBQyxDQUFDLHFCQUFELENBQUQsQ0FBeUIsSUFBekIsQ0FBOEIsWUFBWTtBQUN4QyxVQUFJLElBQUksR0FBRyxDQUFDLENBQUMsSUFBRCxDQUFaO0FBQ0EsTUFBQSxJQUFJLENBQUMsU0FBTCxDQUFlLElBQUksQ0FBQyxJQUFMLEVBQWY7QUFDRCxLQUhEO0FBSUQsR0FMRDtBQU9ELENBbElBLENBa0lDLE1BQU0sQ0FBQyxNQWxJUixDQUFEO0FBa0lpQjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CakIsQ0FBQyxVQUFVLENBQVYsRUFBYTtBQUVaLGVBRlksQ0FFRTs7QUFHZjs7O0FBR0MsTUFBSSxHQUFHLEdBQUcsU0FBTixHQUFNLENBQVUsT0FBVixFQUFtQjtBQUMzQixTQUFLLE9BQUwsR0FBZSxDQUFDLENBQUMsT0FBRCxDQUFoQjtBQUNELEdBRkQ7O0FBSUEsRUFBQSxHQUFHLENBQUMsU0FBSixHQUFnQjtBQUVkLElBQUEsV0FBVyxFQUFFLEdBRkM7QUFJZCxJQUFBLElBQUksRUFBRSxnQkFBWTtBQUNoQixVQUFJLEtBQUssR0FBRyxLQUFLLE9BQWpCO0FBQUEsVUFDSSxHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU4sQ0FBYyx3QkFBZCxDQURWO0FBQUEsVUFFSSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQU4sQ0FBVyxhQUFYLENBRmY7QUFBQSxVQUdJLFFBSEo7QUFBQSxVQUlJLE9BSko7QUFBQSxVQUtJLENBTEo7O0FBT0EsVUFBSSxDQUFDLFFBQUwsRUFBZTtBQUNiLFFBQUEsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFOLENBQVcsTUFBWCxDQUFYO0FBQ0EsUUFBQSxRQUFRLEdBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxPQUFULENBQWlCLGdCQUFqQixFQUFtQyxFQUFuQyxDQUF2QixDQUZhLENBRWlEO0FBQy9EOztBQUVELFVBQUssS0FBSyxDQUFDLE1BQU4sQ0FBYSxJQUFiLEVBQW1CLFFBQW5CLENBQTRCLFFBQTVCLENBQUwsRUFBNkM7QUFFN0MsTUFBQSxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUosQ0FBUyxXQUFULEVBQXNCLElBQXRCLEdBQTZCLENBQTdCLENBQVg7QUFFQSxNQUFBLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBRixDQUFRLE1BQVIsRUFBZ0I7QUFDbEIsUUFBQSxhQUFhLEVBQUU7QUFERyxPQUFoQixDQUFKO0FBSUEsTUFBQSxLQUFLLENBQUMsT0FBTixDQUFjLENBQWQ7QUFFQSxVQUFJLENBQUMsQ0FBQyxrQkFBRixFQUFKLEVBQTRCO0FBRTVCLE1BQUEsT0FBTyxHQUFHLENBQUMsQ0FBQyxRQUFELENBQVg7QUFFQSxXQUFLLFFBQUwsQ0FBYyxLQUFLLENBQUMsTUFBTixDQUFhLElBQWIsQ0FBZCxFQUFrQyxHQUFsQztBQUNBLFdBQUssUUFBTCxDQUFjLE9BQWQsRUFBdUIsT0FBTyxDQUFDLE1BQVIsRUFBdkIsRUFBeUMsWUFBWTtBQUNuRCxRQUFBLEtBQUssQ0FBQyxPQUFOLENBQWM7QUFDWixVQUFBLElBQUksRUFBRSxPQURNO0FBRVosVUFBQSxhQUFhLEVBQUU7QUFGSCxTQUFkO0FBSUQsT0FMRDtBQU1ELEtBdENhO0FBd0NkLElBQUEsUUFBUSxFQUFFLGtCQUFXLE9BQVgsRUFBb0IsU0FBcEIsRUFBK0IsUUFBL0IsRUFBeUM7QUFDakQsVUFBSSxPQUFPLEdBQUcsU0FBUyxDQUFDLElBQVYsQ0FBZSxXQUFmLENBQWQ7QUFBQSxVQUNJLFVBQVUsR0FBRyxRQUFRLElBQ2hCLENBQUMsQ0FBQyxPQUFGLENBQVUsVUFERixJQUVSLE9BQU8sQ0FBQyxRQUFSLENBQWlCLE1BQWpCLENBSFQ7O0FBS0EsZUFBUyxJQUFULEdBQWdCO0FBQ2QsUUFBQSxPQUFPLENBQ0osV0FESCxDQUNlLFFBRGYsRUFFRyxJQUZILENBRVEsNEJBRlIsRUFHRyxXQUhILENBR2UsUUFIZjtBQUtBLFFBQUEsT0FBTyxDQUFDLFFBQVIsQ0FBaUIsUUFBakI7O0FBRUEsWUFBSSxVQUFKLEVBQWdCO0FBQ2QsVUFBQSxPQUFPLENBQUMsQ0FBRCxDQUFQLENBQVcsV0FBWCxDQURjLENBQ1M7O0FBQ3ZCLFVBQUEsT0FBTyxDQUFDLFFBQVIsQ0FBaUIsSUFBakI7QUFDRCxTQUhELE1BR087QUFDTCxVQUFBLE9BQU8sQ0FBQyxXQUFSLENBQW9CLE1BQXBCO0FBQ0Q7O0FBRUQsWUFBSyxPQUFPLENBQUMsTUFBUixDQUFlLGdCQUFmLENBQUwsRUFBd0M7QUFDdEMsVUFBQSxPQUFPLENBQUMsT0FBUixDQUFnQixhQUFoQixFQUErQixRQUEvQixDQUF3QyxRQUF4QztBQUNEOztBQUVELFFBQUEsUUFBUSxJQUFJLFFBQVEsRUFBcEI7QUFDRDs7QUFFRCxNQUFBLFVBQVUsR0FDUixPQUFPLENBQUMsR0FBUixDQUFZLENBQUMsQ0FBQyxPQUFGLENBQVUsVUFBVixDQUFxQixHQUFqQyxFQUFzQyxJQUF0QyxDQURRLEdBRVIsSUFBSSxFQUZOO0FBSUEsTUFBQSxPQUFPLENBQUMsV0FBUixDQUFvQixJQUFwQjtBQUNEO0FBekVhLEdBQWhCO0FBNkVEOzs7QUFHQyxFQUFBLENBQUMsQ0FBQyxFQUFGLENBQUssR0FBTCxHQUFXLFVBQVcsTUFBWCxFQUFvQjtBQUM3QixXQUFPLEtBQUssSUFBTCxDQUFVLFlBQVk7QUFDM0IsVUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUQsQ0FBYjtBQUFBLFVBQ0ksSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFOLENBQVcsS0FBWCxDQURYO0FBRUEsVUFBSSxDQUFDLElBQUwsRUFBVyxLQUFLLENBQUMsSUFBTixDQUFXLEtBQVgsRUFBbUIsSUFBSSxHQUFHLElBQUksR0FBSixDQUFRLElBQVIsQ0FBMUI7QUFDWCxVQUFJLE9BQU8sTUFBUCxJQUFpQixRQUFyQixFQUErQixJQUFJLENBQUMsTUFBRCxDQUFKO0FBQ2hDLEtBTE0sQ0FBUDtBQU1ELEdBUEQ7O0FBU0EsRUFBQSxDQUFDLENBQUMsRUFBRixDQUFLLEdBQUwsQ0FBUyxXQUFULEdBQXVCLEdBQXZCO0FBR0Q7OztBQUdDLEVBQUEsQ0FBQyxDQUFDLFlBQVk7QUFDWixJQUFBLENBQUMsQ0FBQyxNQUFELENBQUQsQ0FBVSxFQUFWLENBQWEsb0JBQWIsRUFBbUMsMkNBQW5DLEVBQWdGLFVBQVUsQ0FBVixFQUFhO0FBQzNGLE1BQUEsQ0FBQyxDQUFDLGNBQUY7QUFDQSxNQUFBLENBQUMsQ0FBQyxJQUFELENBQUQsQ0FBUSxHQUFSLENBQVksTUFBWjtBQUNELEtBSEQ7QUFJRCxHQUxBLENBQUQ7QUFPRCxDQWxIQSxDQWtIQyxNQUFNLENBQUMsTUFsSFIsQ0FBRDtBQWtIaUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQmpCLENBQUMsVUFBUyxDQUFULEVBQVc7QUFFVixlQUZVLENBRUk7O0FBR2Y7OztBQUdDLE1BQUksU0FBUyxHQUFHLFNBQVosU0FBWSxDQUFVLE9BQVYsRUFBbUIsT0FBbkIsRUFBNEI7QUFDMUMsU0FBSyxRQUFMLEdBQWdCLENBQUMsQ0FBQyxPQUFELENBQWpCO0FBQ0EsU0FBSyxPQUFMLEdBQWUsQ0FBQyxDQUFDLE1BQUYsQ0FBUyxFQUFULEVBQWEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxTQUFMLENBQWUsUUFBNUIsRUFBc0MsT0FBdEMsQ0FBZjtBQUNBLFNBQUssT0FBTCxHQUFlLEtBQUssT0FBTCxDQUFhLE9BQWIsSUFBd0IsS0FBSyxPQUE1QztBQUNBLFNBQUssTUFBTCxHQUFjLEtBQUssT0FBTCxDQUFhLE1BQWIsSUFBdUIsS0FBSyxNQUExQztBQUNBLFNBQUssV0FBTCxHQUFtQixLQUFLLE9BQUwsQ0FBYSxXQUFiLElBQTRCLEtBQUssV0FBcEQ7QUFDQSxTQUFLLE9BQUwsR0FBZSxLQUFLLE9BQUwsQ0FBYSxPQUFiLElBQXdCLEtBQUssT0FBNUM7QUFDQSxTQUFLLEtBQUwsR0FBYSxDQUFDLENBQUMsS0FBSyxPQUFMLENBQWEsSUFBZCxDQUFELENBQXFCLFFBQXJCLENBQThCLE1BQTlCLENBQWI7QUFDQSxTQUFLLE1BQUwsR0FBYyxLQUFLLE9BQUwsQ0FBYSxNQUEzQjtBQUNBLFNBQUssS0FBTCxHQUFhLEtBQWI7QUFDQSxTQUFLLE1BQUw7QUFDRCxHQVhEOztBQWFBLEVBQUEsU0FBUyxDQUFDLFNBQVYsR0FBc0I7QUFFcEIsSUFBQSxXQUFXLEVBQUUsU0FGTztBQUlwQixJQUFBLE1BQU0sRUFBRSxrQkFBWTtBQUNsQixVQUFJLEdBQUcsR0FBRyxLQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLFNBQWhCLEVBQTJCLElBQTNCLENBQWdDLFlBQWhDLENBQVY7QUFDQSxXQUFLLFFBQUwsQ0FDRyxHQURILENBQ08sS0FBSyxPQUFMLENBQWEsR0FBYixDQURQLEVBRUcsTUFGSDtBQUdBLGFBQU8sS0FBSyxJQUFMLEVBQVA7QUFDRCxLQVZtQjtBQVlwQixJQUFBLE9BQU8sRUFBRSxpQkFBVSxJQUFWLEVBQWdCO0FBQ3ZCLGFBQU8sSUFBUDtBQUNELEtBZG1CO0FBZ0JwQixJQUFBLElBQUksRUFBRSxnQkFBWTtBQUNoQixVQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBRixDQUFTLEVBQVQsRUFBYSxLQUFLLFFBQUwsQ0FBYyxNQUFkLEVBQWIsRUFBcUM7QUFDN0MsUUFBQSxNQUFNLEVBQUUsS0FBSyxRQUFMLENBQWMsQ0FBZCxFQUFpQjtBQURvQixPQUFyQyxDQUFWO0FBSUEsV0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlO0FBQ2IsUUFBQSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUosR0FBVSxHQUFHLENBQUMsTUFETjtBQUViLFFBQUEsSUFBSSxFQUFFLEdBQUcsQ0FBQztBQUZHLE9BQWY7QUFLQSxXQUFLLEtBQUwsQ0FBVyxJQUFYO0FBQ0EsV0FBSyxLQUFMLEdBQWEsSUFBYjtBQUNBLGFBQU8sSUFBUDtBQUNELEtBN0JtQjtBQStCcEIsSUFBQSxJQUFJLEVBQUUsZ0JBQVk7QUFDaEIsV0FBSyxLQUFMLENBQVcsSUFBWDtBQUNBLFdBQUssS0FBTCxHQUFhLEtBQWI7QUFDQSxhQUFPLElBQVA7QUFDRCxLQW5DbUI7QUFxQ3BCLElBQUEsTUFBTSxFQUFFLGdCQUFVLEtBQVYsRUFBaUI7QUFDdkIsVUFBSSxLQUFKO0FBRUEsV0FBSyxLQUFMLEdBQWEsS0FBSyxRQUFMLENBQWMsR0FBZCxFQUFiOztBQUVBLFVBQUksQ0FBQyxLQUFLLEtBQU4sSUFBZSxLQUFLLEtBQUwsQ0FBVyxNQUFYLEdBQW9CLEtBQUssT0FBTCxDQUFhLFNBQXBELEVBQStEO0FBQzdELGVBQU8sS0FBSyxLQUFMLEdBQWEsS0FBSyxJQUFMLEVBQWIsR0FBMkIsSUFBbEM7QUFDRDs7QUFFRCxNQUFBLEtBQUssR0FBRyxDQUFDLENBQUMsVUFBRixDQUFhLEtBQUssTUFBbEIsSUFBNEIsS0FBSyxNQUFMLENBQVksS0FBSyxLQUFqQixFQUF3QixDQUFDLENBQUMsS0FBRixDQUFRLEtBQUssT0FBYixFQUFzQixJQUF0QixDQUF4QixDQUE1QixHQUFtRixLQUFLLE1BQWhHO0FBRUEsYUFBTyxLQUFLLEdBQUcsS0FBSyxPQUFMLENBQWEsS0FBYixDQUFILEdBQXlCLElBQXJDO0FBQ0QsS0FqRG1CO0FBbURwQixJQUFBLE9BQU8sRUFBRSxpQkFBVSxLQUFWLEVBQWlCO0FBQ3hCLFVBQUksSUFBSSxHQUFHLElBQVg7QUFFQSxNQUFBLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBRixDQUFPLEtBQVAsRUFBYyxVQUFVLElBQVYsRUFBZ0I7QUFDcEMsZUFBTyxJQUFJLENBQUMsT0FBTCxDQUFhLElBQWIsQ0FBUDtBQUNELE9BRk8sQ0FBUjtBQUlBLE1BQUEsS0FBSyxHQUFHLEtBQUssTUFBTCxDQUFZLEtBQVosQ0FBUjs7QUFFQSxVQUFJLENBQUMsS0FBSyxDQUFDLE1BQVgsRUFBbUI7QUFDakIsZUFBTyxLQUFLLEtBQUwsR0FBYSxLQUFLLElBQUwsRUFBYixHQUEyQixJQUFsQztBQUNEOztBQUVELGFBQU8sS0FBSyxNQUFMLENBQVksS0FBSyxDQUFDLEtBQU4sQ0FBWSxDQUFaLEVBQWUsS0FBSyxPQUFMLENBQWEsS0FBNUIsQ0FBWixFQUFnRCxJQUFoRCxFQUFQO0FBQ0QsS0FqRW1CO0FBbUVwQixJQUFBLE9BQU8sRUFBRSxpQkFBVSxJQUFWLEVBQWdCO0FBQ3ZCLGFBQU8sQ0FBQyxJQUFJLENBQUMsV0FBTCxHQUFtQixPQUFuQixDQUEyQixLQUFLLEtBQUwsQ0FBVyxXQUFYLEVBQTNCLENBQVI7QUFDRCxLQXJFbUI7QUF1RXBCLElBQUEsTUFBTSxFQUFFLGdCQUFVLEtBQVYsRUFBaUI7QUFDdkIsVUFBSSxVQUFVLEdBQUcsRUFBakI7QUFBQSxVQUNJLGFBQWEsR0FBRyxFQURwQjtBQUFBLFVBRUksZUFBZSxHQUFHLEVBRnRCO0FBQUEsVUFHSSxJQUhKOztBQUtBLGFBQU8sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFOLEVBQWQsRUFBNkI7QUFDM0IsWUFBSSxDQUFDLElBQUksQ0FBQyxXQUFMLEdBQW1CLE9BQW5CLENBQTJCLEtBQUssS0FBTCxDQUFXLFdBQVgsRUFBM0IsQ0FBTCxFQUEyRCxVQUFVLENBQUMsSUFBWCxDQUFnQixJQUFoQixFQUEzRCxLQUNLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTCxDQUFhLEtBQUssS0FBbEIsQ0FBTCxFQUErQixhQUFhLENBQUMsSUFBZCxDQUFtQixJQUFuQixFQUEvQixLQUNBLGVBQWUsQ0FBQyxJQUFoQixDQUFxQixJQUFyQjtBQUNOOztBQUVELGFBQU8sVUFBVSxDQUFDLE1BQVgsQ0FBa0IsYUFBbEIsRUFBaUMsZUFBakMsQ0FBUDtBQUNELEtBcEZtQjtBQXNGcEIsSUFBQSxXQUFXLEVBQUUscUJBQVUsSUFBVixFQUFnQjtBQUMzQixVQUFJLEtBQUssR0FBRyxLQUFLLEtBQUwsQ0FBVyxPQUFYLENBQW1CLDZCQUFuQixFQUFrRCxNQUFsRCxDQUFaO0FBQ0EsYUFBTyxJQUFJLENBQUMsT0FBTCxDQUFhLElBQUksTUFBSixDQUFXLE1BQU0sS0FBTixHQUFjLEdBQXpCLEVBQThCLElBQTlCLENBQWIsRUFBa0QsVUFBVSxFQUFWLEVBQWMsS0FBZCxFQUFxQjtBQUM1RSxlQUFPLGFBQWEsS0FBYixHQUFxQixXQUE1QjtBQUNELE9BRk0sQ0FBUDtBQUdELEtBM0ZtQjtBQTZGcEIsSUFBQSxNQUFNLEVBQUUsZ0JBQVUsS0FBVixFQUFpQjtBQUN2QixVQUFJLElBQUksR0FBRyxJQUFYO0FBRUEsTUFBQSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUQsQ0FBRCxDQUFTLEdBQVQsQ0FBYSxVQUFVLENBQVYsRUFBYSxJQUFiLEVBQW1CO0FBQ3RDLFFBQUEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTCxDQUFhLElBQWQsQ0FBRCxDQUFxQixJQUFyQixDQUEwQixZQUExQixFQUF3QyxJQUF4QyxDQUFKO0FBQ0EsUUFBQSxDQUFDLENBQUMsSUFBRixDQUFPLEdBQVAsRUFBWSxJQUFaLENBQWlCLElBQUksQ0FBQyxXQUFMLENBQWlCLElBQWpCLENBQWpCO0FBQ0EsZUFBTyxDQUFDLENBQUMsQ0FBRCxDQUFSO0FBQ0QsT0FKTyxDQUFSO0FBTUEsTUFBQSxLQUFLLENBQUMsS0FBTixHQUFjLFFBQWQsQ0FBdUIsUUFBdkI7QUFDQSxXQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLEtBQWhCO0FBQ0EsYUFBTyxJQUFQO0FBQ0QsS0F6R21CO0FBMkdwQixJQUFBLElBQUksRUFBRSxjQUFVLEtBQVYsRUFBaUI7QUFDckIsVUFBSSxNQUFNLEdBQUcsS0FBSyxLQUFMLENBQVcsSUFBWCxDQUFnQixTQUFoQixFQUEyQixXQUEzQixDQUF1QyxRQUF2QyxDQUFiO0FBQUEsVUFDSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQVAsRUFEWDs7QUFHQSxVQUFJLENBQUMsSUFBSSxDQUFDLE1BQVYsRUFBa0I7QUFDaEIsUUFBQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0IsSUFBaEIsRUFBc0IsQ0FBdEIsQ0FBRCxDQUFSO0FBQ0Q7O0FBRUQsTUFBQSxJQUFJLENBQUMsUUFBTCxDQUFjLFFBQWQ7QUFDRCxLQXBIbUI7QUFzSHBCLElBQUEsSUFBSSxFQUFFLGNBQVUsS0FBVixFQUFpQjtBQUNyQixVQUFJLE1BQU0sR0FBRyxLQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLFNBQWhCLEVBQTJCLFdBQTNCLENBQXVDLFFBQXZDLENBQWI7QUFBQSxVQUNJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBUCxFQURYOztBQUdBLFVBQUksQ0FBQyxJQUFJLENBQUMsTUFBVixFQUFrQjtBQUNoQixRQUFBLElBQUksR0FBRyxLQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLElBQWhCLEVBQXNCLElBQXRCLEVBQVA7QUFDRDs7QUFFRCxNQUFBLElBQUksQ0FBQyxRQUFMLENBQWMsUUFBZDtBQUNELEtBL0htQjtBQWlJcEIsSUFBQSxNQUFNLEVBQUUsa0JBQVk7QUFDbEIsV0FBSyxRQUFMLENBQ0csRUFESCxDQUNNLE1BRE4sRUFDa0IsQ0FBQyxDQUFDLEtBQUYsQ0FBUSxLQUFLLElBQWIsRUFBbUIsSUFBbkIsQ0FEbEIsRUFFRyxFQUZILENBRU0sVUFGTixFQUVrQixDQUFDLENBQUMsS0FBRixDQUFRLEtBQUssUUFBYixFQUF1QixJQUF2QixDQUZsQixFQUdHLEVBSEgsQ0FHTSxPQUhOLEVBR2tCLENBQUMsQ0FBQyxLQUFGLENBQVEsS0FBSyxLQUFiLEVBQW9CLElBQXBCLENBSGxCOztBQUtBLFVBQUksQ0FBQyxDQUFDLE9BQUYsQ0FBVSxNQUFWLElBQW9CLENBQUMsQ0FBQyxPQUFGLENBQVUsTUFBOUIsSUFBd0MsQ0FBQyxDQUFDLE9BQUYsQ0FBVSxJQUF0RCxFQUE0RDtBQUMxRCxhQUFLLFFBQUwsQ0FBYyxFQUFkLENBQWlCLFNBQWpCLEVBQTRCLENBQUMsQ0FBQyxLQUFGLENBQVEsS0FBSyxPQUFiLEVBQXNCLElBQXRCLENBQTVCO0FBQ0Q7O0FBRUQsV0FBSyxLQUFMLENBQ0csRUFESCxDQUNNLE9BRE4sRUFDZSxDQUFDLENBQUMsS0FBRixDQUFRLEtBQUssS0FBYixFQUFvQixJQUFwQixDQURmLEVBRUcsRUFGSCxDQUVNLFlBRk4sRUFFb0IsSUFGcEIsRUFFMEIsQ0FBQyxDQUFDLEtBQUYsQ0FBUSxLQUFLLFVBQWIsRUFBeUIsSUFBekIsQ0FGMUI7QUFHRCxLQTlJbUI7QUFnSnBCLElBQUEsSUFBSSxFQUFFLGNBQVUsQ0FBVixFQUFhO0FBQ2pCLFVBQUksQ0FBQyxLQUFLLEtBQVYsRUFBaUI7O0FBRWpCLGNBQU8sQ0FBQyxDQUFDLE9BQVQ7QUFDRSxhQUFLLENBQUwsQ0FERixDQUNVOztBQUNSLGFBQUssRUFBTCxDQUZGLENBRVc7O0FBQ1QsYUFBSyxFQUFMO0FBQVM7QUFDUCxVQUFBLENBQUMsQ0FBQyxjQUFGO0FBQ0E7O0FBRUYsYUFBSyxFQUFMO0FBQVM7QUFDUCxVQUFBLENBQUMsQ0FBQyxjQUFGO0FBQ0EsZUFBSyxJQUFMO0FBQ0E7O0FBRUYsYUFBSyxFQUFMO0FBQVM7QUFDUCxVQUFBLENBQUMsQ0FBQyxjQUFGO0FBQ0EsZUFBSyxJQUFMO0FBQ0E7QUFmSjs7QUFrQkEsTUFBQSxDQUFDLENBQUMsZUFBRjtBQUNELEtBdEttQjtBQXdLcEIsSUFBQSxPQUFPLEVBQUUsaUJBQVUsQ0FBVixFQUFhO0FBQ3BCLFdBQUssc0JBQUwsR0FBOEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFGLENBQVUsQ0FBQyxDQUFDLE9BQVosRUFBcUIsQ0FBQyxFQUFELEVBQUksRUFBSixFQUFPLENBQVAsRUFBUyxFQUFULEVBQVksRUFBWixDQUFyQixDQUFoQztBQUNBLFdBQUssSUFBTCxDQUFVLENBQVY7QUFDRCxLQTNLbUI7QUE2S3BCLElBQUEsUUFBUSxFQUFFLGtCQUFVLENBQVYsRUFBYTtBQUNyQixVQUFJLEtBQUssc0JBQVQsRUFBaUM7QUFDakMsV0FBSyxJQUFMLENBQVUsQ0FBVjtBQUNELEtBaExtQjtBQWtMcEIsSUFBQSxLQUFLLEVBQUUsZUFBVSxDQUFWLEVBQWE7QUFDbEIsY0FBTyxDQUFDLENBQUMsT0FBVDtBQUNFLGFBQUssRUFBTCxDQURGLENBQ1c7O0FBQ1QsYUFBSyxFQUFMO0FBQVM7QUFDUDs7QUFFRixhQUFLLENBQUwsQ0FMRixDQUtVOztBQUNSLGFBQUssRUFBTDtBQUFTO0FBQ1AsY0FBSSxDQUFDLEtBQUssS0FBVixFQUFpQjtBQUNqQixlQUFLLE1BQUw7QUFDQTs7QUFFRixhQUFLLEVBQUw7QUFBUztBQUNQLGNBQUksQ0FBQyxLQUFLLEtBQVYsRUFBaUI7QUFDakIsZUFBSyxJQUFMO0FBQ0E7O0FBRUY7QUFDRSxlQUFLLE1BQUw7QUFqQko7O0FBb0JBLE1BQUEsQ0FBQyxDQUFDLGVBQUY7QUFDQSxNQUFBLENBQUMsQ0FBQyxjQUFGO0FBQ0gsS0F6TXFCO0FBMk1wQixJQUFBLElBQUksRUFBRSxjQUFVLENBQVYsRUFBYTtBQUNqQixVQUFJLElBQUksR0FBRyxJQUFYO0FBQ0EsTUFBQSxVQUFVLENBQUMsWUFBWTtBQUFFLFFBQUEsSUFBSSxDQUFDLElBQUw7QUFBYSxPQUE1QixFQUE4QixHQUE5QixDQUFWO0FBQ0QsS0E5TW1CO0FBZ05wQixJQUFBLEtBQUssRUFBRSxlQUFVLENBQVYsRUFBYTtBQUNsQixNQUFBLENBQUMsQ0FBQyxlQUFGO0FBQ0EsTUFBQSxDQUFDLENBQUMsY0FBRjtBQUNBLFdBQUssTUFBTDtBQUNELEtBcE5tQjtBQXNOcEIsSUFBQSxVQUFVLEVBQUUsb0JBQVUsQ0FBVixFQUFhO0FBQ3ZCLFdBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0IsU0FBaEIsRUFBMkIsV0FBM0IsQ0FBdUMsUUFBdkM7QUFDQSxNQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBSCxDQUFELENBQW1CLFFBQW5CLENBQTRCLFFBQTVCO0FBQ0Q7QUF6Tm1CLEdBQXRCO0FBOE5BOzs7QUFHQSxFQUFBLENBQUMsQ0FBQyxFQUFGLENBQUssU0FBTCxHQUFpQixVQUFVLE1BQVYsRUFBa0I7QUFDakMsV0FBTyxLQUFLLElBQUwsQ0FBVSxZQUFZO0FBQzNCLFVBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFELENBQWI7QUFBQSxVQUNJLElBQUksR0FBRyxLQUFLLENBQUMsSUFBTixDQUFXLFdBQVgsQ0FEWDtBQUFBLFVBRUksT0FBTyxHQUFHLFFBQU8sTUFBUCxLQUFpQixRQUFqQixJQUE2QixNQUYzQztBQUdBLFVBQUksQ0FBQyxJQUFMLEVBQVcsS0FBSyxDQUFDLElBQU4sQ0FBVyxXQUFYLEVBQXlCLElBQUksR0FBRyxJQUFJLFNBQUosQ0FBYyxJQUFkLEVBQW9CLE9BQXBCLENBQWhDO0FBQ1gsVUFBSSxPQUFPLE1BQVAsSUFBaUIsUUFBckIsRUFBK0IsSUFBSSxDQUFDLE1BQUQsQ0FBSjtBQUNoQyxLQU5NLENBQVA7QUFPRCxHQVJEOztBQVVBLEVBQUEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxTQUFMLENBQWUsUUFBZixHQUEwQjtBQUN4QixJQUFBLE1BQU0sRUFBRSxFQURnQjtBQUV4QixJQUFBLEtBQUssRUFBRSxDQUZpQjtBQUd4QixJQUFBLElBQUksRUFBRSwyQ0FIa0I7QUFJeEIsSUFBQSxJQUFJLEVBQUUsMkJBSmtCO0FBS3hCLElBQUEsU0FBUyxFQUFFO0FBTGEsR0FBMUI7QUFRQSxFQUFBLENBQUMsQ0FBQyxFQUFGLENBQUssU0FBTCxDQUFlLFdBQWYsR0FBNkIsU0FBN0I7QUFHRDs7O0FBR0MsRUFBQSxDQUFDLENBQUMsWUFBWTtBQUNaLElBQUEsQ0FBQyxDQUFDLE1BQUQsQ0FBRCxDQUFVLEVBQVYsQ0FBYSwwQkFBYixFQUF5Qyw0QkFBekMsRUFBdUUsVUFBVSxDQUFWLEVBQWE7QUFDbEYsVUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUQsQ0FBYjtBQUNBLFVBQUksS0FBSyxDQUFDLElBQU4sQ0FBVyxXQUFYLENBQUosRUFBNkI7QUFDN0IsTUFBQSxDQUFDLENBQUMsY0FBRjtBQUNBLE1BQUEsS0FBSyxDQUFDLFNBQU4sQ0FBZ0IsS0FBSyxDQUFDLElBQU4sRUFBaEI7QUFDRCxLQUxEO0FBTUQsR0FQQSxDQUFEO0FBU0QsQ0F2UkEsQ0F1UkMsTUFBTSxDQUFDLE1BdlJSLENBQUQ7QUF3UkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkEsQ0FBQyxVQUFVLENBQVYsRUFBYTtBQUVaLGVBRlksQ0FFRTs7QUFHZjs7O0FBR0MsTUFBSSxLQUFLLEdBQUcsU0FBUixLQUFRLENBQVUsT0FBVixFQUFtQixPQUFuQixFQUE0QjtBQUN0QyxTQUFLLE9BQUwsR0FBZSxDQUFDLENBQUMsTUFBRixDQUFTLEVBQVQsRUFBYSxDQUFDLENBQUMsRUFBRixDQUFLLEtBQUwsQ0FBVyxRQUF4QixFQUFrQyxPQUFsQyxDQUFmO0FBQ0EsU0FBSyxPQUFMLEdBQWUsQ0FBQyxDQUFDLE1BQUQsQ0FBRCxDQUFVLEVBQVYsQ0FBYSx1QkFBYixFQUFzQyxDQUFDLENBQUMsS0FBRixDQUFRLEtBQUssYUFBYixFQUE0QixJQUE1QixDQUF0QyxDQUFmO0FBQ0EsU0FBSyxRQUFMLEdBQWdCLENBQUMsQ0FBQyxPQUFELENBQWpCO0FBQ0EsU0FBSyxhQUFMO0FBQ0QsR0FMRDs7QUFPQSxFQUFBLEtBQUssQ0FBQyxTQUFOLENBQWdCLGFBQWhCLEdBQWdDLFlBQVk7QUFDMUMsUUFBSSxDQUFDLEtBQUssUUFBTCxDQUFjLEVBQWQsQ0FBaUIsVUFBakIsQ0FBTCxFQUFtQztBQUVuQyxRQUFJLFlBQVksR0FBRyxDQUFDLENBQUMsUUFBRCxDQUFELENBQVksTUFBWixFQUFuQjtBQUFBLFFBQ0ksU0FBUyxHQUFHLEtBQUssT0FBTCxDQUFhLFNBQWIsRUFEaEI7QUFBQSxRQUVJLFFBQVEsR0FBRyxLQUFLLFFBQUwsQ0FBYyxNQUFkLEVBRmY7QUFBQSxRQUdJLE1BQU0sR0FBRyxLQUFLLE9BQUwsQ0FBYSxNQUgxQjtBQUFBLFFBSUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUoxQjtBQUFBLFFBS0ksU0FBUyxHQUFHLE1BQU0sQ0FBQyxHQUx2QjtBQUFBLFFBTUksS0FBSyxHQUFHLDhCQU5aO0FBQUEsUUFPSSxLQVBKO0FBU0EsUUFBSSxRQUFPLE1BQVAsS0FBaUIsUUFBckIsRUFBK0IsWUFBWSxHQUFHLFNBQVMsR0FBRyxNQUEzQjtBQUMvQixRQUFJLE9BQU8sU0FBUCxJQUFvQixVQUF4QixFQUFvQyxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQVAsRUFBWjtBQUNwQyxRQUFJLE9BQU8sWUFBUCxJQUF1QixVQUEzQixFQUF1QyxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQVAsRUFBZjtBQUV2QyxJQUFBLEtBQUssR0FBRyxLQUFLLEtBQUwsSUFBYyxJQUFkLElBQXVCLFNBQVMsR0FBRyxLQUFLLEtBQWpCLElBQTBCLFFBQVEsQ0FBQyxHQUExRCxHQUNOLEtBRE0sR0FDSyxZQUFZLElBQUksSUFBaEIsSUFBeUIsUUFBUSxDQUFDLEdBQVQsR0FBZSxLQUFLLFFBQUwsQ0FBYyxNQUFkLEVBQWYsSUFBeUMsWUFBWSxHQUFHLFlBQWpGLEdBQ1gsUUFEVyxHQUNBLFNBQVMsSUFBSSxJQUFiLElBQXFCLFNBQVMsSUFBSSxTQUFsQyxHQUNYLEtBRFcsR0FDQSxLQUhiO0FBS0EsUUFBSSxLQUFLLE9BQUwsS0FBaUIsS0FBckIsRUFBNEI7QUFFNUIsU0FBSyxPQUFMLEdBQWUsS0FBZjtBQUNBLFNBQUssS0FBTCxHQUFhLEtBQUssSUFBSSxRQUFULEdBQW9CLFFBQVEsQ0FBQyxHQUFULEdBQWUsU0FBbkMsR0FBK0MsSUFBNUQ7QUFFQSxTQUFLLFFBQUwsQ0FBYyxXQUFkLENBQTBCLEtBQTFCLEVBQWlDLFFBQWpDLENBQTBDLFdBQVcsS0FBSyxHQUFHLE1BQU0sS0FBVCxHQUFpQixFQUFqQyxDQUExQztBQUNELEdBM0JEO0FBOEJEOzs7O0FBR0MsRUFBQSxDQUFDLENBQUMsRUFBRixDQUFLLEtBQUwsR0FBYSxVQUFVLE1BQVYsRUFBa0I7QUFDN0IsV0FBTyxLQUFLLElBQUwsQ0FBVSxZQUFZO0FBQzNCLFVBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFELENBQWI7QUFBQSxVQUNJLElBQUksR0FBRyxLQUFLLENBQUMsSUFBTixDQUFXLE9BQVgsQ0FEWDtBQUFBLFVBRUksT0FBTyxHQUFHLFFBQU8sTUFBUCxLQUFpQixRQUFqQixJQUE2QixNQUYzQztBQUdBLFVBQUksQ0FBQyxJQUFMLEVBQVcsS0FBSyxDQUFDLElBQU4sQ0FBVyxPQUFYLEVBQXFCLElBQUksR0FBRyxJQUFJLEtBQUosQ0FBVSxJQUFWLEVBQWdCLE9BQWhCLENBQTVCO0FBQ1gsVUFBSSxPQUFPLE1BQVAsSUFBaUIsUUFBckIsRUFBK0IsSUFBSSxDQUFDLE1BQUQsQ0FBSjtBQUNoQyxLQU5NLENBQVA7QUFPRCxHQVJEOztBQVVBLEVBQUEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxLQUFMLENBQVcsV0FBWCxHQUF5QixLQUF6QjtBQUVBLEVBQUEsQ0FBQyxDQUFDLEVBQUYsQ0FBSyxLQUFMLENBQVcsUUFBWCxHQUFzQjtBQUNwQixJQUFBLE1BQU0sRUFBRTtBQURZLEdBQXRCO0FBS0Q7OztBQUdDLEVBQUEsQ0FBQyxDQUFDLE1BQUQsQ0FBRCxDQUFVLEVBQVYsQ0FBYSxNQUFiLEVBQXFCLFlBQVk7QUFDL0IsSUFBQSxDQUFDLENBQUMsb0JBQUQsQ0FBRCxDQUF3QixJQUF4QixDQUE2QixZQUFZO0FBQ3ZDLFVBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFELENBQVo7QUFBQSxVQUNJLElBQUksR0FBRyxJQUFJLENBQUMsSUFBTCxFQURYO0FBR0EsTUFBQSxJQUFJLENBQUMsTUFBTCxHQUFjLElBQUksQ0FBQyxNQUFMLElBQWUsRUFBN0I7QUFFQSxNQUFBLElBQUksQ0FBQyxZQUFMLEtBQXNCLElBQUksQ0FBQyxNQUFMLENBQVksTUFBWixHQUFxQixJQUFJLENBQUMsWUFBaEQ7QUFDQSxNQUFBLElBQUksQ0FBQyxTQUFMLEtBQW1CLElBQUksQ0FBQyxNQUFMLENBQVksR0FBWixHQUFrQixJQUFJLENBQUMsU0FBMUM7QUFFQSxNQUFBLElBQUksQ0FBQyxLQUFMLENBQVcsSUFBWDtBQUNELEtBVkQ7QUFXRCxHQVpEO0FBZUQsQ0FuRkEsQ0FtRkMsTUFBTSxDQUFDLE1BbkZSLENBQUQ7Ozs7Ozs7QUN2NURBOzs7Ozs7Ozs7Ozs7O0FBYUEsQ0FBQyxVQUFVLE1BQVYsRUFBa0IsU0FBbEIsRUFBOEI7QUFDL0IsTUFDQztBQUNBLEVBQUEsVUFGRDtBQUFBLE1BSUM7QUFDQSxFQUFBLFNBTEQ7QUFBQSxNQU9DO0FBQ0EsRUFBQSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBUm5CO0FBQUEsTUFTQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBVG5CO0FBQUEsTUFVQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBVnBCO0FBQUEsTUFZQztBQUNBLEVBQUEsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQWJsQjtBQUFBLE1BZUM7QUFDQSxFQUFBLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FoQmI7QUFBQSxNQWtCQztBQUNBLEVBQUEsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFOLENBQWdCLElBbkI3QjtBQUFBLE1Bb0JDLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBTixDQUFnQixLQXBCOUI7QUFBQSxNQXFCQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFNBQU4sQ0FBZ0IsT0FyQmhDO0FBQUEsTUFzQkMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxTQUFQLENBQWlCLFFBdEJsQztBQUFBLE1BdUJDLFdBQVcsR0FBRyxNQUFNLENBQUMsU0FBUCxDQUFpQixjQXZCaEM7QUFBQSxNQXdCQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVAsQ0FBaUIsSUF4QjlCO0FBQUEsTUEwQkM7QUFDQSxFQUFBLE1BQU0sR0FBRyxTQUFULE1BQVMsQ0FBVSxRQUFWLEVBQW9CLE9BQXBCLEVBQThCO0FBQ3RDO0FBQ0EsV0FBTyxJQUFJLE1BQU0sQ0FBQyxFQUFQLENBQVUsSUFBZCxDQUFvQixRQUFwQixFQUE4QixPQUE5QixFQUF1QyxVQUF2QyxDQUFQO0FBQ0EsR0E5QkY7QUFBQSxNQWdDQztBQUNBLEVBQUEsU0FBUyxHQUFHLHdDQUF3QyxNQWpDckQ7QUFBQSxNQW1DQztBQUNBLEVBQUEsY0FBYyxHQUFHLElBcENsQjtBQUFBLE1BcUNDLFdBQVcsR0FBRyxLQXJDZjtBQUFBLE1BdUNDO0FBQ0EsRUFBQSxLQUFLLEdBQUcsb0NBeENUO0FBQUEsTUEwQ0M7QUFDQTtBQUNBLEVBQUEsVUFBVSxHQUFHLDBDQTVDZDtBQUFBLE1BOENDO0FBQ0EsRUFBQSxVQUFVLEdBQUcsNEJBL0NkO0FBQUEsTUFpREM7QUFDQSxFQUFBLFdBQVcsR0FBRyxlQWxEZjtBQUFBLE1BbURDLFlBQVksR0FBRyxzQkFuRGhCO0FBQUEsTUFvREMsWUFBWSxHQUFHLG9DQXBEaEI7QUFBQSxNQXFEQyxZQUFZLEdBQUcsb0VBckRoQjtBQUFBLE1BdURDO0FBQ0EsRUFBQSxTQUFTLEdBQUcsT0F4RGI7QUFBQSxNQXlEQyxVQUFVLEdBQUcsY0F6RGQ7QUFBQSxNQTJEQztBQUNBLEVBQUEsVUFBVSxHQUFHLFNBQWIsVUFBYSxDQUFVLEdBQVYsRUFBZSxNQUFmLEVBQXdCO0FBQ3BDLFdBQU8sQ0FBRSxNQUFNLEdBQUcsRUFBWCxFQUFnQixXQUFoQixFQUFQO0FBQ0EsR0E5REY7QUFBQSxNQWdFQztBQUNBLEVBQUEsZ0JBQWdCLEdBQUcsU0FBbkIsZ0JBQW1CLEdBQVc7QUFDN0IsUUFBSyxRQUFRLENBQUMsZ0JBQWQsRUFBaUM7QUFDaEMsTUFBQSxRQUFRLENBQUMsbUJBQVQsQ0FBOEIsa0JBQTlCLEVBQWtELGdCQUFsRCxFQUFvRSxLQUFwRTtBQUNBLE1BQUEsTUFBTSxDQUFDLEtBQVA7QUFDQSxLQUhELE1BR08sSUFBSyxRQUFRLENBQUMsVUFBVCxLQUF3QixVQUE3QixFQUEwQztBQUNoRDtBQUNBO0FBQ0EsTUFBQSxRQUFRLENBQUMsV0FBVCxDQUFzQixvQkFBdEIsRUFBNEMsZ0JBQTVDO0FBQ0EsTUFBQSxNQUFNLENBQUMsS0FBUDtBQUNBO0FBQ0QsR0EzRUY7QUFBQSxNQTZFQztBQUNBLEVBQUEsVUFBVSxHQUFHLEVBOUVkOztBQWdGQSxFQUFBLE1BQU0sQ0FBQyxFQUFQLEdBQVksTUFBTSxDQUFDLFNBQVAsR0FBbUI7QUFDOUIsSUFBQSxXQUFXLEVBQUUsTUFEaUI7QUFFOUIsSUFBQSxJQUFJLEVBQUUsY0FBVSxRQUFWLEVBQW9CLE9BQXBCLEVBQTZCLFVBQTdCLEVBQTBDO0FBQy9DLFVBQUksS0FBSixFQUFXLElBQVgsRUFBaUIsR0FBakIsRUFBc0IsR0FBdEIsQ0FEK0MsQ0FHL0M7O0FBQ0EsVUFBSyxDQUFDLFFBQU4sRUFBaUI7QUFDaEIsZUFBTyxJQUFQO0FBQ0EsT0FOOEMsQ0FRL0M7OztBQUNBLFVBQUssUUFBUSxDQUFDLFFBQWQsRUFBeUI7QUFDeEIsYUFBSyxPQUFMLEdBQWUsS0FBSyxDQUFMLElBQVUsUUFBekI7QUFDQSxhQUFLLE1BQUwsR0FBYyxDQUFkO0FBQ0EsZUFBTyxJQUFQO0FBQ0EsT0FiOEMsQ0FlL0M7OztBQUNBLFVBQUssT0FBTyxRQUFQLEtBQW9CLFFBQXpCLEVBQW9DO0FBQ25DLFlBQUssUUFBUSxDQUFDLE1BQVQsQ0FBZ0IsQ0FBaEIsTUFBdUIsR0FBdkIsSUFBOEIsUUFBUSxDQUFDLE1BQVQsQ0FBaUIsUUFBUSxDQUFDLE1BQVQsR0FBa0IsQ0FBbkMsTUFBMkMsR0FBekUsSUFBZ0YsUUFBUSxDQUFDLE1BQVQsSUFBbUIsQ0FBeEcsRUFBNEc7QUFDM0c7QUFDQSxVQUFBLEtBQUssR0FBRyxDQUFFLElBQUYsRUFBUSxRQUFSLEVBQWtCLElBQWxCLENBQVI7QUFFQSxTQUpELE1BSU87QUFDTixVQUFBLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBWCxDQUFpQixRQUFqQixDQUFSO0FBQ0EsU0FQa0MsQ0FTbkM7OztBQUNBLFlBQUssS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFELENBQUwsSUFBWSxDQUFDLE9BQWxCLENBQVYsRUFBdUM7QUFFdEM7QUFDQSxjQUFLLEtBQUssQ0FBQyxDQUFELENBQVYsRUFBZ0I7QUFDZixZQUFBLE9BQU8sR0FBRyxPQUFPLFlBQVksTUFBbkIsR0FBNEIsT0FBTyxDQUFDLENBQUQsQ0FBbkMsR0FBeUMsT0FBbkQ7QUFDQSxZQUFBLEdBQUcsR0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLFFBQW5CLEdBQThCLE9BQU8sQ0FBQyxhQUFSLElBQXlCLE9BQXZELEdBQWlFLFFBQXpFLENBRmUsQ0FJZjs7QUFDQSxZQUFBLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUCxDQUFrQixLQUFLLENBQUMsQ0FBRCxDQUF2QixFQUE0QixHQUE1QixFQUFpQyxJQUFqQyxDQUFYOztBQUNBLGdCQUFLLFVBQVUsQ0FBQyxJQUFYLENBQWlCLEtBQUssQ0FBQyxDQUFELENBQXRCLEtBQStCLE1BQU0sQ0FBQyxhQUFQLENBQXNCLE9BQXRCLENBQXBDLEVBQXNFO0FBQ3JFLG1CQUFLLElBQUwsQ0FBVSxJQUFWLENBQWdCLFFBQWhCLEVBQTBCLE9BQTFCLEVBQW1DLElBQW5DO0FBQ0E7O0FBRUQsbUJBQU8sTUFBTSxDQUFDLEtBQVAsQ0FBYyxJQUFkLEVBQW9CLFFBQXBCLENBQVAsQ0FWZSxDQVloQjtBQUNDLFdBYkQsTUFhTztBQUNOLFlBQUEsSUFBSSxHQUFHLFFBQVEsQ0FBQyxjQUFULENBQXlCLEtBQUssQ0FBQyxDQUFELENBQTlCLENBQVAsQ0FETSxDQUdOO0FBQ0E7O0FBQ0EsZ0JBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFsQixFQUErQjtBQUM5QjtBQUNBO0FBQ0Esa0JBQUssSUFBSSxDQUFDLEVBQUwsS0FBWSxLQUFLLENBQUMsQ0FBRCxDQUF0QixFQUE0QjtBQUMzQix1QkFBTyxVQUFVLENBQUMsSUFBWCxDQUFpQixRQUFqQixDQUFQO0FBQ0EsZUFMNkIsQ0FPOUI7OztBQUNBLG1CQUFLLE1BQUwsR0FBYyxDQUFkO0FBQ0EsbUJBQUssQ0FBTCxJQUFVLElBQVY7QUFDQTs7QUFFRCxpQkFBSyxPQUFMLEdBQWUsUUFBZjtBQUNBLGlCQUFLLFFBQUwsR0FBZ0IsUUFBaEI7QUFDQSxtQkFBTyxJQUFQO0FBQ0EsV0FwQ3FDLENBc0N2Qzs7QUFDQyxTQXZDRCxNQXVDTyxJQUFLLENBQUMsT0FBRCxJQUFZLE9BQU8sQ0FBQyxNQUF6QixFQUFrQztBQUN4QyxpQkFBTyxDQUFFLE9BQU8sSUFBSSxVQUFiLEVBQTBCLElBQTFCLENBQWdDLFFBQWhDLENBQVAsQ0FEd0MsQ0FHekM7QUFDQTtBQUNDLFNBTE0sTUFLQTtBQUNOLGlCQUFPLEtBQUssV0FBTCxDQUFrQixPQUFsQixFQUE0QixJQUE1QixDQUFrQyxRQUFsQyxDQUFQO0FBQ0EsU0F4RGtDLENBMERwQztBQUNBOztBQUNDLE9BNURELE1BNERPLElBQUssTUFBTSxDQUFDLFVBQVAsQ0FBbUIsUUFBbkIsQ0FBTCxFQUFxQztBQUMzQyxlQUFPLFVBQVUsQ0FBQyxLQUFYLENBQWtCLFFBQWxCLENBQVA7QUFDQTs7QUFFRCxVQUFLLFFBQVEsQ0FBQyxRQUFULEtBQXNCLFNBQTNCLEVBQXVDO0FBQ3RDLGFBQUssUUFBTCxHQUFnQixRQUFRLENBQUMsUUFBekI7QUFDQSxhQUFLLE9BQUwsR0FBZSxRQUFRLENBQUMsT0FBeEI7QUFDQTs7QUFFRCxhQUFPLE1BQU0sQ0FBQyxTQUFQLENBQWtCLFFBQWxCLEVBQTRCLElBQTVCLENBQVA7QUFDQSxLQXhGNkI7QUEwRjlCO0FBQ0EsSUFBQSxRQUFRLEVBQUUsRUEzRm9CO0FBNkY5QjtBQUNBLElBQUEsTUFBTSxFQUFFLE9BOUZzQjtBQWdHOUI7QUFDQSxJQUFBLE1BQU0sRUFBRSxDQWpHc0I7QUFtRzlCO0FBQ0EsSUFBQSxJQUFJLEVBQUUsZ0JBQVc7QUFDaEIsYUFBTyxLQUFLLE1BQVo7QUFDQSxLQXRHNkI7QUF3RzlCLElBQUEsT0FBTyxFQUFFLG1CQUFXO0FBQ25CLGFBQU8sVUFBVSxDQUFDLElBQVgsQ0FBaUIsSUFBakIsQ0FBUDtBQUNBLEtBMUc2QjtBQTRHOUI7QUFDQTtBQUNBLElBQUEsR0FBRyxFQUFFLGFBQVUsR0FBVixFQUFnQjtBQUNwQixhQUFPLEdBQUcsSUFBSSxJQUFQLEdBRU47QUFDQSxXQUFLLE9BQUwsRUFITSxHQUtOO0FBQ0UsTUFBQSxHQUFHLEdBQUcsQ0FBTixHQUFVLEtBQU0sS0FBSyxNQUFMLEdBQWMsR0FBcEIsQ0FBVixHQUFzQyxLQUFNLEdBQU4sQ0FOekM7QUFPQSxLQXRINkI7QUF3SDlCO0FBQ0E7QUFDQSxJQUFBLFNBQVMsRUFBRSxtQkFBVSxLQUFWLEVBQWlCLElBQWpCLEVBQXVCLFFBQXZCLEVBQWtDO0FBRTVDO0FBQ0EsVUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQVAsQ0FBYyxLQUFLLFdBQUwsRUFBZCxFQUFrQyxLQUFsQyxDQUFWLENBSDRDLENBSzVDOztBQUNBLE1BQUEsR0FBRyxDQUFDLFVBQUosR0FBaUIsSUFBakI7QUFFQSxNQUFBLEdBQUcsQ0FBQyxPQUFKLEdBQWMsS0FBSyxPQUFuQjs7QUFFQSxVQUFLLElBQUksS0FBSyxNQUFkLEVBQXVCO0FBQ3RCLFFBQUEsR0FBRyxDQUFDLFFBQUosR0FBZSxLQUFLLFFBQUwsSUFBa0IsS0FBSyxRQUFMLEdBQWdCLEdBQWhCLEdBQXNCLEVBQXhDLElBQStDLFFBQTlEO0FBQ0EsT0FGRCxNQUVPLElBQUssSUFBTCxFQUFZO0FBQ2xCLFFBQUEsR0FBRyxDQUFDLFFBQUosR0FBZSxLQUFLLFFBQUwsR0FBZ0IsR0FBaEIsR0FBc0IsSUFBdEIsR0FBNkIsR0FBN0IsR0FBbUMsUUFBbkMsR0FBOEMsR0FBN0Q7QUFDQSxPQWQyQyxDQWdCNUM7OztBQUNBLGFBQU8sR0FBUDtBQUNBLEtBNUk2QjtBQThJOUI7QUFDQTtBQUNBO0FBQ0EsSUFBQSxJQUFJLEVBQUUsY0FBVSxRQUFWLEVBQW9CLElBQXBCLEVBQTJCO0FBQ2hDLGFBQU8sTUFBTSxDQUFDLElBQVAsQ0FBYSxJQUFiLEVBQW1CLFFBQW5CLEVBQTZCLElBQTdCLENBQVA7QUFDQSxLQW5KNkI7QUFxSjlCLElBQUEsS0FBSyxFQUFFLGVBQVUsRUFBVixFQUFlO0FBQ3JCO0FBQ0EsTUFBQSxNQUFNLENBQUMsS0FBUCxDQUFhLE9BQWIsR0FBdUIsSUFBdkIsQ0FBNkIsRUFBN0I7QUFFQSxhQUFPLElBQVA7QUFDQSxLQTFKNkI7QUE0SjlCLElBQUEsRUFBRSxFQUFFLFlBQVUsQ0FBVixFQUFjO0FBQ2pCLE1BQUEsQ0FBQyxHQUFHLENBQUMsQ0FBTDtBQUNBLGFBQU8sQ0FBQyxLQUFLLENBQUMsQ0FBUCxHQUNOLEtBQUssS0FBTCxDQUFZLENBQVosQ0FETSxHQUVOLEtBQUssS0FBTCxDQUFZLENBQVosRUFBZSxDQUFDLEdBQUcsQ0FBbkIsQ0FGRDtBQUdBLEtBaks2QjtBQW1LOUIsSUFBQSxLQUFLLEVBQUUsaUJBQVc7QUFDakIsYUFBTyxLQUFLLEVBQUwsQ0FBUyxDQUFULENBQVA7QUFDQSxLQXJLNkI7QUF1SzlCLElBQUEsSUFBSSxFQUFFLGdCQUFXO0FBQ2hCLGFBQU8sS0FBSyxFQUFMLENBQVMsQ0FBQyxDQUFWLENBQVA7QUFDQSxLQXpLNkI7QUEySzlCLElBQUEsS0FBSyxFQUFFLGlCQUFXO0FBQ2pCLGFBQU8sS0FBSyxTQUFMLENBQWdCLFVBQVUsQ0FBQyxLQUFYLENBQWtCLElBQWxCLEVBQXdCLFNBQXhCLENBQWhCLEVBQ04sT0FETSxFQUNHLFVBQVUsQ0FBQyxJQUFYLENBQWdCLFNBQWhCLEVBQTJCLElBQTNCLENBQWdDLEdBQWhDLENBREgsQ0FBUDtBQUVBLEtBOUs2QjtBQWdMOUIsSUFBQSxHQUFHLEVBQUUsYUFBVSxRQUFWLEVBQXFCO0FBQ3pCLGFBQU8sS0FBSyxTQUFMLENBQWdCLE1BQU0sQ0FBQyxHQUFQLENBQVcsSUFBWCxFQUFpQixVQUFVLElBQVYsRUFBZ0IsQ0FBaEIsRUFBb0I7QUFDM0QsZUFBTyxRQUFRLENBQUMsSUFBVCxDQUFlLElBQWYsRUFBcUIsQ0FBckIsRUFBd0IsSUFBeEIsQ0FBUDtBQUNBLE9BRnNCLENBQWhCLENBQVA7QUFHQSxLQXBMNkI7QUFzTDlCLElBQUEsR0FBRyxFQUFFLGVBQVc7QUFDZixhQUFPLEtBQUssVUFBTCxJQUFtQixLQUFLLFdBQUwsQ0FBaUIsSUFBakIsQ0FBMUI7QUFDQSxLQXhMNkI7QUEwTDlCO0FBQ0E7QUFDQSxJQUFBLElBQUksRUFBRSxTQTVMd0I7QUE2TDlCLElBQUEsSUFBSSxFQUFFLEdBQUcsSUE3THFCO0FBOEw5QixJQUFBLE1BQU0sRUFBRSxHQUFHO0FBOUxtQixHQUEvQixDQWpGK0IsQ0FrUi9COztBQUNBLEVBQUEsTUFBTSxDQUFDLEVBQVAsQ0FBVSxJQUFWLENBQWUsU0FBZixHQUEyQixNQUFNLENBQUMsRUFBbEM7O0FBRUEsRUFBQSxNQUFNLENBQUMsTUFBUCxHQUFnQixNQUFNLENBQUMsRUFBUCxDQUFVLE1BQVYsR0FBbUIsWUFBVztBQUM3QyxRQUFJLE9BQUo7QUFBQSxRQUFhLElBQWI7QUFBQSxRQUFtQixHQUFuQjtBQUFBLFFBQXdCLElBQXhCO0FBQUEsUUFBOEIsV0FBOUI7QUFBQSxRQUEyQyxLQUEzQztBQUFBLFFBQ0MsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFELENBQVQsSUFBZ0IsRUFEMUI7QUFBQSxRQUVDLENBQUMsR0FBRyxDQUZMO0FBQUEsUUFHQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BSHBCO0FBQUEsUUFJQyxJQUFJLEdBQUcsS0FKUixDQUQ2QyxDQU83Qzs7QUFDQSxRQUFLLE9BQU8sTUFBUCxLQUFrQixTQUF2QixFQUFtQztBQUNsQyxNQUFBLElBQUksR0FBRyxNQUFQO0FBQ0EsTUFBQSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUQsQ0FBVCxJQUFnQixFQUF6QixDQUZrQyxDQUdsQzs7QUFDQSxNQUFBLENBQUMsR0FBRyxDQUFKO0FBQ0EsS0FiNEMsQ0FlN0M7OztBQUNBLFFBQUssUUFBTyxNQUFQLE1BQWtCLFFBQWxCLElBQThCLENBQUMsTUFBTSxDQUFDLFVBQVAsQ0FBa0IsTUFBbEIsQ0FBcEMsRUFBZ0U7QUFDL0QsTUFBQSxNQUFNLEdBQUcsRUFBVDtBQUNBLEtBbEI0QyxDQW9CN0M7OztBQUNBLFFBQUssTUFBTSxLQUFLLENBQWhCLEVBQW9CO0FBQ25CLE1BQUEsTUFBTSxHQUFHLElBQVQ7QUFDQSxRQUFFLENBQUY7QUFDQTs7QUFFRCxXQUFRLENBQUMsR0FBRyxNQUFaLEVBQW9CLENBQUMsRUFBckIsRUFBMEI7QUFDekI7QUFDQSxVQUFLLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBRSxDQUFGLENBQXBCLEtBQThCLElBQW5DLEVBQTBDO0FBQ3pDO0FBQ0EsYUFBTSxJQUFOLElBQWMsT0FBZCxFQUF3QjtBQUN2QixVQUFBLEdBQUcsR0FBRyxNQUFNLENBQUUsSUFBRixDQUFaO0FBQ0EsVUFBQSxJQUFJLEdBQUcsT0FBTyxDQUFFLElBQUYsQ0FBZCxDQUZ1QixDQUl2Qjs7QUFDQSxjQUFLLE1BQU0sS0FBSyxJQUFoQixFQUF1QjtBQUN0QjtBQUNBLFdBUHNCLENBU3ZCOzs7QUFDQSxjQUFLLElBQUksSUFBSSxJQUFSLEtBQWtCLE1BQU0sQ0FBQyxhQUFQLENBQXFCLElBQXJCLE1BQStCLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBUCxDQUFlLElBQWYsQ0FBN0MsQ0FBbEIsQ0FBTCxFQUE4RjtBQUM3RixnQkFBSyxXQUFMLEVBQW1CO0FBQ2xCLGNBQUEsV0FBVyxHQUFHLEtBQWQ7QUFDQSxjQUFBLEtBQUssR0FBRyxHQUFHLElBQUksTUFBTSxDQUFDLE9BQVAsQ0FBZSxHQUFmLENBQVAsR0FBNkIsR0FBN0IsR0FBbUMsRUFBM0M7QUFFQSxhQUpELE1BSU87QUFDTixjQUFBLEtBQUssR0FBRyxHQUFHLElBQUksTUFBTSxDQUFDLGFBQVAsQ0FBcUIsR0FBckIsQ0FBUCxHQUFtQyxHQUFuQyxHQUF5QyxFQUFqRDtBQUNBLGFBUDRGLENBUzdGOzs7QUFDQSxZQUFBLE1BQU0sQ0FBRSxJQUFGLENBQU4sR0FBaUIsTUFBTSxDQUFDLE1BQVAsQ0FBZSxJQUFmLEVBQXFCLEtBQXJCLEVBQTRCLElBQTVCLENBQWpCLENBVjZGLENBWTlGO0FBQ0MsV0FiRCxNQWFPLElBQUssSUFBSSxLQUFLLFNBQWQsRUFBMEI7QUFDaEMsWUFBQSxNQUFNLENBQUUsSUFBRixDQUFOLEdBQWlCLElBQWpCO0FBQ0E7QUFDRDtBQUNEO0FBQ0QsS0ExRDRDLENBNEQ3Qzs7O0FBQ0EsV0FBTyxNQUFQO0FBQ0EsR0E5REQ7O0FBZ0VBLEVBQUEsTUFBTSxDQUFDLE1BQVAsQ0FBYztBQUNiLElBQUEsVUFBVSxFQUFFLG9CQUFVLElBQVYsRUFBaUI7QUFDNUIsVUFBSyxNQUFNLENBQUMsQ0FBUCxLQUFhLE1BQWxCLEVBQTJCO0FBQzFCLFFBQUEsTUFBTSxDQUFDLENBQVAsR0FBVyxFQUFYO0FBQ0E7O0FBRUQsVUFBSyxJQUFJLElBQUksTUFBTSxDQUFDLE1BQVAsS0FBa0IsTUFBL0IsRUFBd0M7QUFDdkMsUUFBQSxNQUFNLENBQUMsTUFBUCxHQUFnQixPQUFoQjtBQUNBOztBQUVELGFBQU8sTUFBUDtBQUNBLEtBWFk7QUFhYjtBQUNBLElBQUEsT0FBTyxFQUFFLEtBZEk7QUFnQmI7QUFDQTtBQUNBLElBQUEsU0FBUyxFQUFFLENBbEJFO0FBb0JiO0FBQ0EsSUFBQSxTQUFTLEVBQUUsbUJBQVUsSUFBVixFQUFpQjtBQUMzQixVQUFLLElBQUwsRUFBWTtBQUNYLFFBQUEsTUFBTSxDQUFDLFNBQVA7QUFDQSxPQUZELE1BRU87QUFDTixRQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZDtBQUNBO0FBQ0QsS0EzQlk7QUE2QmI7QUFDQSxJQUFBLEtBQUssRUFBRSxlQUFVLElBQVYsRUFBaUI7QUFFdkI7QUFDQSxVQUFLLElBQUksS0FBSyxJQUFULEdBQWdCLEVBQUUsTUFBTSxDQUFDLFNBQXpCLEdBQXFDLE1BQU0sQ0FBQyxPQUFqRCxFQUEyRDtBQUMxRDtBQUNBLE9BTHNCLENBT3ZCOzs7QUFDQSxVQUFLLENBQUMsUUFBUSxDQUFDLElBQWYsRUFBc0I7QUFDckIsZUFBTyxVQUFVLENBQUUsTUFBTSxDQUFDLEtBQVQsRUFBZ0IsQ0FBaEIsQ0FBakI7QUFDQSxPQVZzQixDQVl2Qjs7O0FBQ0EsTUFBQSxNQUFNLENBQUMsT0FBUCxHQUFpQixJQUFqQixDQWJ1QixDQWV2Qjs7QUFDQSxVQUFLLElBQUksS0FBSyxJQUFULElBQWlCLEVBQUUsTUFBTSxDQUFDLFNBQVQsR0FBcUIsQ0FBM0MsRUFBK0M7QUFDOUM7QUFDQSxPQWxCc0IsQ0FvQnZCOzs7QUFDQSxNQUFBLFNBQVMsQ0FBQyxXQUFWLENBQXVCLFFBQXZCLEVBQWlDLENBQUUsTUFBRixDQUFqQyxFQXJCdUIsQ0F1QnZCOztBQUNBLFVBQUssTUFBTSxDQUFDLEVBQVAsQ0FBVSxPQUFmLEVBQXlCO0FBQ3hCLFFBQUEsTUFBTSxDQUFFLFFBQUYsQ0FBTixDQUFtQixPQUFuQixDQUEyQixPQUEzQixFQUFvQyxHQUFwQyxDQUF3QyxPQUF4QztBQUNBO0FBQ0QsS0F6RFk7QUEyRGI7QUFDQTtBQUNBO0FBQ0EsSUFBQSxVQUFVLEVBQUUsb0JBQVUsR0FBVixFQUFnQjtBQUMzQixhQUFPLE1BQU0sQ0FBQyxJQUFQLENBQVksR0FBWixNQUFxQixVQUE1QjtBQUNBLEtBaEVZO0FBa0ViLElBQUEsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFOLElBQWlCLFVBQVUsR0FBVixFQUFnQjtBQUN6QyxhQUFPLE1BQU0sQ0FBQyxJQUFQLENBQVksR0FBWixNQUFxQixPQUE1QjtBQUNBLEtBcEVZO0FBc0ViLElBQUEsUUFBUSxFQUFFLGtCQUFVLEdBQVYsRUFBZ0I7QUFDekIsYUFBTyxHQUFHLElBQUksSUFBUCxJQUFlLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBakM7QUFDQSxLQXhFWTtBQTBFYixJQUFBLFNBQVMsRUFBRSxtQkFBVSxHQUFWLEVBQWdCO0FBQzFCLGFBQU8sQ0FBQyxLQUFLLENBQUUsVUFBVSxDQUFDLEdBQUQsQ0FBWixDQUFOLElBQTZCLFFBQVEsQ0FBRSxHQUFGLENBQTVDO0FBQ0EsS0E1RVk7QUE4RWIsSUFBQSxJQUFJLEVBQUUsY0FBVSxHQUFWLEVBQWdCO0FBQ3JCLGFBQU8sR0FBRyxJQUFJLElBQVAsR0FDTixNQUFNLENBQUUsR0FBRixDQURBLEdBRU4sVUFBVSxDQUFFLGFBQWEsQ0FBQyxJQUFkLENBQW1CLEdBQW5CLENBQUYsQ0FBVixJQUF5QyxRQUYxQztBQUdBLEtBbEZZO0FBb0ZiLElBQUEsYUFBYSxFQUFFLHVCQUFVLEdBQVYsRUFBZ0I7QUFDOUI7QUFDQTtBQUNBO0FBQ0EsVUFBSyxDQUFDLEdBQUQsSUFBUSxNQUFNLENBQUMsSUFBUCxDQUFZLEdBQVosTUFBcUIsUUFBN0IsSUFBeUMsR0FBRyxDQUFDLFFBQTdDLElBQXlELE1BQU0sQ0FBQyxRQUFQLENBQWlCLEdBQWpCLENBQTlELEVBQXVGO0FBQ3RGLGVBQU8sS0FBUDtBQUNBOztBQUVELFVBQUk7QUFDSDtBQUNBLFlBQUssR0FBRyxDQUFDLFdBQUosSUFDSixDQUFDLFdBQVcsQ0FBQyxJQUFaLENBQWlCLEdBQWpCLEVBQXNCLGFBQXRCLENBREcsSUFFSixDQUFDLFdBQVcsQ0FBQyxJQUFaLENBQWlCLEdBQUcsQ0FBQyxXQUFKLENBQWdCLFNBQWpDLEVBQTRDLGVBQTVDLENBRkYsRUFFaUU7QUFDaEUsaUJBQU8sS0FBUDtBQUNBO0FBQ0QsT0FQRCxDQU9FLE9BQVEsQ0FBUixFQUFZO0FBQ2I7QUFDQSxlQUFPLEtBQVA7QUFDQSxPQWxCNkIsQ0FvQjlCO0FBQ0E7OztBQUVBLFVBQUksR0FBSjs7QUFDQSxXQUFNLEdBQU4sSUFBYSxHQUFiLEVBQW1CLENBQUU7O0FBRXJCLGFBQU8sR0FBRyxLQUFLLFNBQVIsSUFBcUIsV0FBVyxDQUFDLElBQVosQ0FBa0IsR0FBbEIsRUFBdUIsR0FBdkIsQ0FBNUI7QUFDQSxLQS9HWTtBQWlIYixJQUFBLGFBQWEsRUFBRSx1QkFBVSxHQUFWLEVBQWdCO0FBQzlCLFVBQUksSUFBSjs7QUFDQSxXQUFNLElBQU4sSUFBYyxHQUFkLEVBQW9CO0FBQ25CLGVBQU8sS0FBUDtBQUNBOztBQUNELGFBQU8sSUFBUDtBQUNBLEtBdkhZO0FBeUhiLElBQUEsS0FBSyxFQUFFLGVBQVUsR0FBVixFQUFnQjtBQUN0QixZQUFNLElBQUksS0FBSixDQUFXLEdBQVgsQ0FBTjtBQUNBLEtBM0hZO0FBNkhiO0FBQ0E7QUFDQTtBQUNBLElBQUEsU0FBUyxFQUFFLG1CQUFVLElBQVYsRUFBZ0IsT0FBaEIsRUFBeUIsT0FBekIsRUFBbUM7QUFDN0MsVUFBSSxNQUFKOztBQUNBLFVBQUssQ0FBQyxJQUFELElBQVMsT0FBTyxJQUFQLEtBQWdCLFFBQTlCLEVBQXlDO0FBQ3hDLGVBQU8sSUFBUDtBQUNBOztBQUNELFVBQUssT0FBTyxPQUFQLEtBQW1CLFNBQXhCLEVBQW9DO0FBQ25DLFFBQUEsT0FBTyxHQUFHLE9BQVY7QUFDQSxRQUFBLE9BQU8sR0FBRyxDQUFWO0FBQ0E7O0FBQ0QsTUFBQSxPQUFPLEdBQUcsT0FBTyxJQUFJLFFBQXJCLENBVDZDLENBVzdDOztBQUNBLFVBQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFYLENBQWlCLElBQWpCLENBQWYsRUFBMEM7QUFDekMsZUFBTyxDQUFFLE9BQU8sQ0FBQyxhQUFSLENBQXVCLE1BQU0sQ0FBQyxDQUFELENBQTdCLENBQUYsQ0FBUDtBQUNBOztBQUVELE1BQUEsTUFBTSxHQUFHLE1BQU0sQ0FBQyxhQUFQLENBQXNCLENBQUUsSUFBRixDQUF0QixFQUFnQyxPQUFoQyxFQUF5QyxPQUFPLEdBQUcsSUFBSCxHQUFVLEVBQTFELENBQVQ7QUFDQSxhQUFPLE1BQU0sQ0FBQyxLQUFQLENBQWMsRUFBZCxFQUNOLENBQUMsTUFBTSxDQUFDLFNBQVAsR0FBbUIsTUFBTSxDQUFDLEtBQVAsQ0FBYyxNQUFNLENBQUMsUUFBckIsQ0FBbkIsR0FBcUQsTUFBTSxDQUFDLFFBQTdELEVBQXVFLFVBRGpFLENBQVA7QUFFQSxLQW5KWTtBQXFKYixJQUFBLFNBQVMsRUFBRSxtQkFBVSxJQUFWLEVBQWlCO0FBQzNCLFVBQUssQ0FBQyxJQUFELElBQVMsT0FBTyxJQUFQLEtBQWdCLFFBQTlCLEVBQXdDO0FBQ3ZDLGVBQU8sSUFBUDtBQUNBLE9BSDBCLENBSzNCOzs7QUFDQSxNQUFBLElBQUksR0FBRyxNQUFNLENBQUMsSUFBUCxDQUFhLElBQWIsQ0FBUCxDQU4yQixDQVEzQjs7QUFDQSxVQUFLLE1BQU0sQ0FBQyxJQUFQLElBQWUsTUFBTSxDQUFDLElBQVAsQ0FBWSxLQUFoQyxFQUF3QztBQUN2QyxlQUFPLE1BQU0sQ0FBQyxJQUFQLENBQVksS0FBWixDQUFtQixJQUFuQixDQUFQO0FBQ0EsT0FYMEIsQ0FhM0I7QUFDQTs7O0FBQ0EsVUFBSyxXQUFXLENBQUMsSUFBWixDQUFrQixJQUFJLENBQUMsT0FBTCxDQUFjLFlBQWQsRUFBNEIsR0FBNUIsRUFDckIsT0FEcUIsQ0FDWixZQURZLEVBQ0UsR0FERixFQUVyQixPQUZxQixDQUVaLFlBRlksRUFFRSxFQUZGLENBQWxCLENBQUwsRUFFZ0M7QUFFL0IsZUFBUyxJQUFJLFFBQUosQ0FBYyxZQUFZLElBQTFCLENBQUYsRUFBUDtBQUVBOztBQUNELE1BQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYyxtQkFBbUIsSUFBakM7QUFDQSxLQTVLWTtBQThLYjtBQUNBLElBQUEsUUFBUSxFQUFFLGtCQUFVLElBQVYsRUFBaUI7QUFDMUIsVUFBSSxHQUFKLEVBQVMsR0FBVDs7QUFDQSxVQUFLLENBQUMsSUFBRCxJQUFTLE9BQU8sSUFBUCxLQUFnQixRQUE5QixFQUF5QztBQUN4QyxlQUFPLElBQVA7QUFDQTs7QUFDRCxVQUFJO0FBQ0gsWUFBSyxNQUFNLENBQUMsU0FBWixFQUF3QjtBQUFFO0FBQ3pCLFVBQUEsR0FBRyxHQUFHLElBQUksU0FBSixFQUFOO0FBQ0EsVUFBQSxHQUFHLEdBQUcsR0FBRyxDQUFDLGVBQUosQ0FBcUIsSUFBckIsRUFBNEIsVUFBNUIsQ0FBTjtBQUNBLFNBSEQsTUFHTztBQUFFO0FBQ1IsVUFBQSxHQUFHLEdBQUcsSUFBSSxhQUFKLENBQW1CLGtCQUFuQixDQUFOO0FBQ0EsVUFBQSxHQUFHLENBQUMsS0FBSixHQUFZLE9BQVo7QUFDQSxVQUFBLEdBQUcsQ0FBQyxPQUFKLENBQWEsSUFBYjtBQUNBO0FBQ0QsT0FURCxDQVNFLE9BQU8sQ0FBUCxFQUFXO0FBQ1osUUFBQSxHQUFHLEdBQUcsU0FBTjtBQUNBOztBQUNELFVBQUssQ0FBQyxHQUFELElBQVEsQ0FBQyxHQUFHLENBQUMsZUFBYixJQUFnQyxHQUFHLENBQUMsb0JBQUosQ0FBMEIsYUFBMUIsRUFBMEMsTUFBL0UsRUFBd0Y7QUFDdkYsUUFBQSxNQUFNLENBQUMsS0FBUCxDQUFjLGtCQUFrQixJQUFoQztBQUNBOztBQUNELGFBQU8sR0FBUDtBQUNBLEtBcE1ZO0FBc01iLElBQUEsSUFBSSxFQUFFLGdCQUFXLENBQUUsQ0F0TU47QUF3TWI7QUFDQTtBQUNBO0FBQ0EsSUFBQSxVQUFVLEVBQUUsb0JBQVUsSUFBVixFQUFpQjtBQUM1QixVQUFLLElBQUksSUFBSSxjQUFjLENBQUMsSUFBZixDQUFxQixJQUFyQixDQUFiLEVBQTJDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLFNBQUUsTUFBTSxDQUFDLFVBQVAsSUFBcUIsVUFBVSxJQUFWLEVBQWlCO0FBQ3ZDLFVBQUEsTUFBTSxDQUFFLE1BQUYsQ0FBTixDQUFpQixJQUFqQixDQUF1QixNQUF2QixFQUErQixJQUEvQjtBQUNBLFNBRkQsRUFFSyxJQUZMO0FBR0E7QUFDRCxLQXBOWTtBQXNOYjtBQUNBO0FBQ0EsSUFBQSxTQUFTLEVBQUUsbUJBQVUsTUFBVixFQUFtQjtBQUM3QixhQUFPLE1BQU0sQ0FBQyxPQUFQLENBQWdCLFNBQWhCLEVBQTJCLEtBQTNCLEVBQW1DLE9BQW5DLENBQTRDLFVBQTVDLEVBQXdELFVBQXhELENBQVA7QUFDQSxLQTFOWTtBQTROYixJQUFBLFFBQVEsRUFBRSxrQkFBVSxJQUFWLEVBQWdCLElBQWhCLEVBQXVCO0FBQ2hDLGFBQU8sSUFBSSxDQUFDLFFBQUwsSUFBaUIsSUFBSSxDQUFDLFFBQUwsQ0FBYyxXQUFkLE9BQWdDLElBQUksQ0FBQyxXQUFMLEVBQXhEO0FBQ0EsS0E5Tlk7QUFnT2I7QUFDQSxJQUFBLElBQUksRUFBRSxjQUFVLEdBQVYsRUFBZSxRQUFmLEVBQXlCLElBQXpCLEVBQWdDO0FBQ3JDLFVBQUksSUFBSjtBQUFBLFVBQ0MsQ0FBQyxHQUFHLENBREw7QUFBQSxVQUVDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFGZDtBQUFBLFVBR0MsS0FBSyxHQUFHLE1BQU0sS0FBSyxTQUFYLElBQXdCLE1BQU0sQ0FBQyxVQUFQLENBQW1CLEdBQW5CLENBSGpDOztBQUtBLFVBQUssSUFBTCxFQUFZO0FBQ1gsWUFBSyxLQUFMLEVBQWE7QUFDWixlQUFNLElBQU4sSUFBYyxHQUFkLEVBQW9CO0FBQ25CLGdCQUFLLFFBQVEsQ0FBQyxLQUFULENBQWdCLEdBQUcsQ0FBRSxJQUFGLENBQW5CLEVBQTZCLElBQTdCLE1BQXdDLEtBQTdDLEVBQXFEO0FBQ3BEO0FBQ0E7QUFDRDtBQUNELFNBTkQsTUFNTztBQUNOLGlCQUFRLENBQUMsR0FBRyxNQUFaLEdBQXNCO0FBQ3JCLGdCQUFLLFFBQVEsQ0FBQyxLQUFULENBQWdCLEdBQUcsQ0FBRSxDQUFDLEVBQUgsQ0FBbkIsRUFBNEIsSUFBNUIsTUFBdUMsS0FBNUMsRUFBb0Q7QUFDbkQ7QUFDQTtBQUNEO0FBQ0QsU0FiVSxDQWVaOztBQUNDLE9BaEJELE1BZ0JPO0FBQ04sWUFBSyxLQUFMLEVBQWE7QUFDWixlQUFNLElBQU4sSUFBYyxHQUFkLEVBQW9CO0FBQ25CLGdCQUFLLFFBQVEsQ0FBQyxJQUFULENBQWUsR0FBRyxDQUFFLElBQUYsQ0FBbEIsRUFBNEIsSUFBNUIsRUFBa0MsR0FBRyxDQUFFLElBQUYsQ0FBckMsTUFBb0QsS0FBekQsRUFBaUU7QUFDaEU7QUFDQTtBQUNEO0FBQ0QsU0FORCxNQU1PO0FBQ04saUJBQVEsQ0FBQyxHQUFHLE1BQVosR0FBc0I7QUFDckIsZ0JBQUssUUFBUSxDQUFDLElBQVQsQ0FBZSxHQUFHLENBQUUsQ0FBRixDQUFsQixFQUF5QixDQUF6QixFQUE0QixHQUFHLENBQUUsQ0FBQyxFQUFILENBQS9CLE1BQTZDLEtBQWxELEVBQTBEO0FBQ3pEO0FBQ0E7QUFDRDtBQUNEO0FBQ0Q7O0FBRUQsYUFBTyxHQUFQO0FBQ0EsS0F4UVk7QUEwUWI7QUFDQSxJQUFBLElBQUksRUFBRSxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBVixDQUFlLFlBQWYsQ0FBZCxHQUNMLFVBQVUsSUFBVixFQUFpQjtBQUNoQixhQUFPLElBQUksSUFBSSxJQUFSLEdBQ04sRUFETSxHQUVOLFNBQVMsQ0FBQyxJQUFWLENBQWdCLElBQWhCLENBRkQ7QUFHQSxLQUxJLEdBT0w7QUFDQSxjQUFVLElBQVYsRUFBaUI7QUFDaEIsYUFBTyxJQUFJLElBQUksSUFBUixHQUNOLEVBRE0sR0FFTixJQUFJLENBQUMsUUFBTCxHQUFnQixPQUFoQixDQUF5QixLQUF6QixFQUFnQyxFQUFoQyxDQUZEO0FBR0EsS0F2Ulc7QUF5UmI7QUFDQSxJQUFBLFNBQVMsRUFBRSxtQkFBVSxHQUFWLEVBQWUsT0FBZixFQUF5QjtBQUNuQyxVQUFJLElBQUo7QUFBQSxVQUNDLEdBQUcsR0FBRyxPQUFPLElBQUksRUFEbEI7O0FBR0EsVUFBSyxHQUFHLElBQUksSUFBWixFQUFtQjtBQUNsQjtBQUNBO0FBQ0EsUUFBQSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQVAsQ0FBYSxHQUFiLENBQVA7O0FBRUEsWUFBSyxHQUFHLENBQUMsTUFBSixJQUFjLElBQWQsSUFBc0IsSUFBSSxLQUFLLFFBQS9CLElBQTJDLElBQUksS0FBSyxVQUFwRCxJQUFrRSxJQUFJLEtBQUssUUFBM0UsSUFBdUYsTUFBTSxDQUFDLFFBQVAsQ0FBaUIsR0FBakIsQ0FBNUYsRUFBcUg7QUFDcEgsVUFBQSxTQUFTLENBQUMsSUFBVixDQUFnQixHQUFoQixFQUFxQixHQUFyQjtBQUNBLFNBRkQsTUFFTztBQUNOLFVBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYyxHQUFkLEVBQW1CLEdBQW5CO0FBQ0E7QUFDRDs7QUFFRCxhQUFPLEdBQVA7QUFDQSxLQTNTWTtBQTZTYixJQUFBLE9BQU8sRUFBRSxpQkFBVSxJQUFWLEVBQWdCLEdBQWhCLEVBQXFCLENBQXJCLEVBQXlCO0FBQ2pDLFVBQUksR0FBSjs7QUFFQSxVQUFLLEdBQUwsRUFBVztBQUNWLFlBQUssWUFBTCxFQUFvQjtBQUNuQixpQkFBTyxZQUFZLENBQUMsSUFBYixDQUFtQixHQUFuQixFQUF3QixJQUF4QixFQUE4QixDQUE5QixDQUFQO0FBQ0E7O0FBRUQsUUFBQSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQVY7QUFDQSxRQUFBLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUosR0FBUSxJQUFJLENBQUMsR0FBTCxDQUFVLENBQVYsRUFBYSxHQUFHLEdBQUcsQ0FBbkIsQ0FBUixHQUFpQyxDQUFwQyxHQUF3QyxDQUE3Qzs7QUFFQSxlQUFRLENBQUMsR0FBRyxHQUFaLEVBQWlCLENBQUMsRUFBbEIsRUFBdUI7QUFDdEI7QUFDQSxjQUFLLENBQUMsSUFBSSxHQUFMLElBQVksR0FBRyxDQUFFLENBQUYsQ0FBSCxLQUFhLElBQTlCLEVBQXFDO0FBQ3BDLG1CQUFPLENBQVA7QUFDQTtBQUNEO0FBQ0Q7O0FBRUQsYUFBTyxDQUFDLENBQVI7QUFDQSxLQWpVWTtBQW1VYixJQUFBLEtBQUssRUFBRSxlQUFVLEtBQVYsRUFBaUIsTUFBakIsRUFBMEI7QUFDaEMsVUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQWY7QUFBQSxVQUNDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFEWDtBQUFBLFVBRUMsQ0FBQyxHQUFHLENBRkw7O0FBSUEsVUFBSyxPQUFPLENBQVAsS0FBYSxRQUFsQixFQUE2QjtBQUM1QixlQUFRLENBQUMsR0FBRyxDQUFaLEVBQWUsQ0FBQyxFQUFoQixFQUFxQjtBQUNwQixVQUFBLEtBQUssQ0FBRSxDQUFDLEVBQUgsQ0FBTCxHQUFlLE1BQU0sQ0FBRSxDQUFGLENBQXJCO0FBQ0E7QUFFRCxPQUxELE1BS087QUFDTixlQUFRLE1BQU0sQ0FBQyxDQUFELENBQU4sS0FBYyxTQUF0QixFQUFrQztBQUNqQyxVQUFBLEtBQUssQ0FBRSxDQUFDLEVBQUgsQ0FBTCxHQUFlLE1BQU0sQ0FBRSxDQUFDLEVBQUgsQ0FBckI7QUFDQTtBQUNEOztBQUVELE1BQUEsS0FBSyxDQUFDLE1BQU4sR0FBZSxDQUFmO0FBRUEsYUFBTyxLQUFQO0FBQ0EsS0F0Vlk7QUF3VmIsSUFBQSxJQUFJLEVBQUUsY0FBVSxLQUFWLEVBQWlCLFFBQWpCLEVBQTJCLEdBQTNCLEVBQWlDO0FBQ3RDLFVBQUksTUFBSjtBQUFBLFVBQ0MsR0FBRyxHQUFHLEVBRFA7QUFBQSxVQUVDLENBQUMsR0FBRyxDQUZMO0FBQUEsVUFHQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BSGhCO0FBSUEsTUFBQSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQVIsQ0FMc0MsQ0FPdEM7QUFDQTs7QUFDQSxhQUFRLENBQUMsR0FBRyxNQUFaLEVBQW9CLENBQUMsRUFBckIsRUFBMEI7QUFDekIsUUFBQSxNQUFNLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBRSxLQUFLLENBQUUsQ0FBRixDQUFQLEVBQWMsQ0FBZCxDQUFuQjs7QUFDQSxZQUFLLEdBQUcsS0FBSyxNQUFiLEVBQXNCO0FBQ3JCLFVBQUEsR0FBRyxDQUFDLElBQUosQ0FBVSxLQUFLLENBQUUsQ0FBRixDQUFmO0FBQ0E7QUFDRDs7QUFFRCxhQUFPLEdBQVA7QUFDQSxLQXpXWTtBQTJXYjtBQUNBLElBQUEsR0FBRyxFQUFFLGFBQVUsS0FBVixFQUFpQixRQUFqQixFQUEyQixHQUEzQixFQUFpQztBQUNyQyxVQUFJLEtBQUo7QUFBQSxVQUFXLEdBQVg7QUFBQSxVQUNDLEdBQUcsR0FBRyxFQURQO0FBQUEsVUFFQyxDQUFDLEdBQUcsQ0FGTDtBQUFBLFVBR0MsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUhoQjtBQUFBLFVBSUM7QUFDQSxNQUFBLE9BQU8sR0FBRyxLQUFLLFlBQVksTUFBakIsSUFBMkIsTUFBTSxLQUFLLFNBQVgsSUFBd0IsT0FBTyxNQUFQLEtBQWtCLFFBQTFDLEtBQTBELE1BQU0sR0FBRyxDQUFULElBQWMsS0FBSyxDQUFFLENBQUYsQ0FBbkIsSUFBNEIsS0FBSyxDQUFFLE1BQU0sR0FBRSxDQUFWLENBQW5DLElBQXNELE1BQU0sS0FBSyxDQUFqRSxJQUFzRSxNQUFNLENBQUMsT0FBUCxDQUFnQixLQUFoQixDQUE5SCxDQUx0QyxDQURxQyxDQVFyQzs7QUFDQSxVQUFLLE9BQUwsRUFBZTtBQUNkLGVBQVEsQ0FBQyxHQUFHLE1BQVosRUFBb0IsQ0FBQyxFQUFyQixFQUEwQjtBQUN6QixVQUFBLEtBQUssR0FBRyxRQUFRLENBQUUsS0FBSyxDQUFFLENBQUYsQ0FBUCxFQUFjLENBQWQsRUFBaUIsR0FBakIsQ0FBaEI7O0FBRUEsY0FBSyxLQUFLLElBQUksSUFBZCxFQUFxQjtBQUNwQixZQUFBLEdBQUcsQ0FBRSxHQUFHLENBQUMsTUFBTixDQUFILEdBQW9CLEtBQXBCO0FBQ0E7QUFDRCxTQVBhLENBU2Y7O0FBQ0MsT0FWRCxNQVVPO0FBQ04sYUFBTSxHQUFOLElBQWEsS0FBYixFQUFxQjtBQUNwQixVQUFBLEtBQUssR0FBRyxRQUFRLENBQUUsS0FBSyxDQUFFLEdBQUYsQ0FBUCxFQUFnQixHQUFoQixFQUFxQixHQUFyQixDQUFoQjs7QUFFQSxjQUFLLEtBQUssSUFBSSxJQUFkLEVBQXFCO0FBQ3BCLFlBQUEsR0FBRyxDQUFFLEdBQUcsQ0FBQyxNQUFOLENBQUgsR0FBb0IsS0FBcEI7QUFDQTtBQUNEO0FBQ0QsT0EzQm9DLENBNkJyQzs7O0FBQ0EsYUFBTyxHQUFHLENBQUMsTUFBSixDQUFXLEtBQVgsQ0FBa0IsRUFBbEIsRUFBc0IsR0FBdEIsQ0FBUDtBQUNBLEtBM1lZO0FBNlliO0FBQ0EsSUFBQSxJQUFJLEVBQUUsQ0E5WU87QUFnWmI7QUFDQTtBQUNBLElBQUEsS0FBSyxFQUFFLGVBQVUsRUFBVixFQUFjLE9BQWQsRUFBd0I7QUFDOUIsVUFBSSxHQUFKLEVBQVMsSUFBVCxFQUFlLEtBQWY7O0FBRUEsVUFBSyxPQUFPLE9BQVAsS0FBbUIsUUFBeEIsRUFBbUM7QUFDbEMsUUFBQSxHQUFHLEdBQUcsRUFBRSxDQUFFLE9BQUYsQ0FBUjtBQUNBLFFBQUEsT0FBTyxHQUFHLEVBQVY7QUFDQSxRQUFBLEVBQUUsR0FBRyxHQUFMO0FBQ0EsT0FQNkIsQ0FTOUI7QUFDQTs7O0FBQ0EsVUFBSyxDQUFDLE1BQU0sQ0FBQyxVQUFQLENBQW1CLEVBQW5CLENBQU4sRUFBZ0M7QUFDL0IsZUFBTyxTQUFQO0FBQ0EsT0FiNkIsQ0FlOUI7OztBQUNBLE1BQUEsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFYLENBQWlCLFNBQWpCLEVBQTRCLENBQTVCLENBQVA7O0FBQ0EsTUFBQSxLQUFLLEdBQUcsaUJBQVc7QUFDbEIsZUFBTyxFQUFFLENBQUMsS0FBSCxDQUFVLE9BQVYsRUFBbUIsSUFBSSxDQUFDLE1BQUwsQ0FBYSxVQUFVLENBQUMsSUFBWCxDQUFpQixTQUFqQixDQUFiLENBQW5CLENBQVA7QUFDQSxPQUZELENBakI4QixDQXFCOUI7OztBQUNBLE1BQUEsS0FBSyxDQUFDLElBQU4sR0FBYSxFQUFFLENBQUMsSUFBSCxHQUFVLEVBQUUsQ0FBQyxJQUFILElBQVcsS0FBSyxDQUFDLElBQWpCLElBQXlCLE1BQU0sQ0FBQyxJQUFQLEVBQWhEO0FBRUEsYUFBTyxLQUFQO0FBQ0EsS0EzYVk7QUE2YWI7QUFDQTtBQUNBLElBQUEsTUFBTSxFQUFFLGdCQUFVLEtBQVYsRUFBaUIsRUFBakIsRUFBcUIsR0FBckIsRUFBMEIsS0FBMUIsRUFBaUMsU0FBakMsRUFBNEMsUUFBNUMsRUFBc0QsSUFBdEQsRUFBNkQ7QUFDcEUsVUFBSSxJQUFKO0FBQUEsVUFDQyxJQUFJLEdBQUcsR0FBRyxJQUFJLElBRGY7QUFBQSxVQUVDLENBQUMsR0FBRyxDQUZMO0FBQUEsVUFHQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BSGhCLENBRG9FLENBTXBFOztBQUNBLFVBQUssR0FBRyxJQUFJLFFBQU8sR0FBUCxNQUFlLFFBQTNCLEVBQXNDO0FBQ3JDLGFBQU0sQ0FBTixJQUFXLEdBQVgsRUFBaUI7QUFDaEIsVUFBQSxNQUFNLENBQUMsTUFBUCxDQUFlLEtBQWYsRUFBc0IsRUFBdEIsRUFBMEIsQ0FBMUIsRUFBNkIsR0FBRyxDQUFDLENBQUQsQ0FBaEMsRUFBcUMsQ0FBckMsRUFBd0MsUUFBeEMsRUFBa0QsS0FBbEQ7QUFDQTs7QUFDRCxRQUFBLFNBQVMsR0FBRyxDQUFaLENBSnFDLENBTXRDO0FBQ0MsT0FQRCxNQU9PLElBQUssS0FBSyxLQUFLLFNBQWYsRUFBMkI7QUFDakM7QUFDQSxRQUFBLElBQUksR0FBRyxJQUFJLEtBQUssU0FBVCxJQUFzQixNQUFNLENBQUMsVUFBUCxDQUFtQixLQUFuQixDQUE3Qjs7QUFFQSxZQUFLLElBQUwsRUFBWTtBQUNYO0FBQ0EsY0FBSyxJQUFMLEVBQVk7QUFDWCxZQUFBLElBQUksR0FBRyxFQUFQOztBQUNBLFlBQUEsRUFBRSxHQUFHLFlBQVUsSUFBVixFQUFnQixHQUFoQixFQUFxQixLQUFyQixFQUE2QjtBQUNqQyxxQkFBTyxJQUFJLENBQUMsSUFBTCxDQUFXLE1BQU0sQ0FBRSxJQUFGLENBQWpCLEVBQTJCLEtBQTNCLENBQVA7QUFDQSxhQUZELENBRlcsQ0FNWjs7QUFDQyxXQVBELE1BT087QUFDTixZQUFBLEVBQUUsQ0FBQyxJQUFILENBQVMsS0FBVCxFQUFnQixLQUFoQjtBQUNBLFlBQUEsRUFBRSxHQUFHLElBQUw7QUFDQTtBQUNEOztBQUVELFlBQUssRUFBTCxFQUFVO0FBQ1QsaUJBQU8sQ0FBQyxHQUFHLE1BQVgsRUFBbUIsQ0FBQyxFQUFwQixFQUF5QjtBQUN4QixZQUFBLEVBQUUsQ0FBRSxLQUFLLENBQUMsQ0FBRCxDQUFQLEVBQVksR0FBWixFQUFpQixJQUFJLEdBQUcsS0FBSyxDQUFDLElBQU4sQ0FBWSxLQUFLLENBQUMsQ0FBRCxDQUFqQixFQUFzQixDQUF0QixFQUF5QixFQUFFLENBQUUsS0FBSyxDQUFDLENBQUQsQ0FBUCxFQUFZLEdBQVosQ0FBM0IsQ0FBSCxHQUFvRCxLQUF6RSxFQUFnRixJQUFoRixDQUFGO0FBQ0E7QUFDRDs7QUFFRCxRQUFBLFNBQVMsR0FBRyxDQUFaO0FBQ0E7O0FBRUQsYUFBTyxTQUFTLEdBQ2YsS0FEZSxHQUdmO0FBQ0EsTUFBQSxJQUFJLEdBQ0gsRUFBRSxDQUFDLElBQUgsQ0FBUyxLQUFULENBREcsR0FFSCxNQUFNLEdBQUcsRUFBRSxDQUFFLEtBQUssQ0FBQyxDQUFELENBQVAsRUFBWSxHQUFaLENBQUwsR0FBeUIsUUFOakM7QUFPQSxLQWhlWTtBQWtlYixJQUFBLEdBQUcsRUFBRSxlQUFXO0FBQ2YsYUFBUyxJQUFJLElBQUosRUFBRixDQUFlLE9BQWYsRUFBUDtBQUNBO0FBcGVZLEdBQWQ7O0FBdWVBLEVBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYSxPQUFiLEdBQXVCLFVBQVUsR0FBVixFQUFnQjtBQUN0QyxRQUFLLENBQUMsU0FBTixFQUFrQjtBQUVqQixNQUFBLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUCxFQUFaLENBRmlCLENBSWpCO0FBQ0E7QUFDQTs7QUFDQSxVQUFLLFFBQVEsQ0FBQyxVQUFULEtBQXdCLFVBQTdCLEVBQTBDO0FBQ3pDO0FBQ0EsUUFBQSxVQUFVLENBQUUsTUFBTSxDQUFDLEtBQVQsRUFBZ0IsQ0FBaEIsQ0FBVixDQUZ5QyxDQUkxQztBQUNDLE9BTEQsTUFLTyxJQUFLLFFBQVEsQ0FBQyxnQkFBZCxFQUFpQztBQUN2QztBQUNBLFFBQUEsUUFBUSxDQUFDLGdCQUFULENBQTJCLGtCQUEzQixFQUErQyxnQkFBL0MsRUFBaUUsS0FBakUsRUFGdUMsQ0FJdkM7O0FBQ0EsUUFBQSxNQUFNLENBQUMsZ0JBQVAsQ0FBeUIsTUFBekIsRUFBaUMsTUFBTSxDQUFDLEtBQXhDLEVBQStDLEtBQS9DLEVBTHVDLENBT3hDO0FBQ0MsT0FSTSxNQVFBO0FBQ047QUFDQSxRQUFBLFFBQVEsQ0FBQyxXQUFULENBQXNCLG9CQUF0QixFQUE0QyxnQkFBNUMsRUFGTSxDQUlOOztBQUNBLFFBQUEsTUFBTSxDQUFDLFdBQVAsQ0FBb0IsUUFBcEIsRUFBOEIsTUFBTSxDQUFDLEtBQXJDLEVBTE0sQ0FPTjtBQUNBOztBQUNBLFlBQUksR0FBRyxHQUFHLEtBQVY7O0FBRUEsWUFBSTtBQUNILFVBQUEsR0FBRyxHQUFHLE1BQU0sQ0FBQyxZQUFQLElBQXVCLElBQXZCLElBQStCLFFBQVEsQ0FBQyxlQUE5QztBQUNBLFNBRkQsQ0FFRSxPQUFNLENBQU4sRUFBUyxDQUFFOztBQUViLFlBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFoQixFQUEyQjtBQUMxQixXQUFDLFNBQVMsYUFBVCxHQUF5QjtBQUN6QixnQkFBSyxDQUFDLE1BQU0sQ0FBQyxPQUFiLEVBQXVCO0FBRXRCLGtCQUFJO0FBQ0g7QUFDQTtBQUNBLGdCQUFBLEdBQUcsQ0FBQyxRQUFKLENBQWEsTUFBYjtBQUNBLGVBSkQsQ0FJRSxPQUFNLENBQU4sRUFBUztBQUNWLHVCQUFPLFVBQVUsQ0FBRSxhQUFGLEVBQWlCLEVBQWpCLENBQWpCO0FBQ0EsZUFScUIsQ0FVdEI7OztBQUNBLGNBQUEsTUFBTSxDQUFDLEtBQVA7QUFDQTtBQUNELFdBZEQ7QUFlQTtBQUNEO0FBQ0Q7O0FBQ0QsV0FBTyxTQUFTLENBQUMsT0FBVixDQUFtQixHQUFuQixDQUFQO0FBQ0EsR0F4REQsQ0E1ekIrQixDQXMzQi9COzs7QUFDQSxFQUFBLE1BQU0sQ0FBQyxJQUFQLENBQVksMERBQTBELEtBQTFELENBQWdFLEdBQWhFLENBQVosRUFBa0YsVUFBUyxDQUFULEVBQVksSUFBWixFQUFrQjtBQUNuRyxJQUFBLFVBQVUsQ0FBRSxhQUFhLElBQWIsR0FBb0IsR0FBdEIsQ0FBVixHQUF3QyxJQUFJLENBQUMsV0FBTCxFQUF4QztBQUNBLEdBRkQsRUF2M0IrQixDQTIzQi9COztBQUNBLEVBQUEsVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFELENBQW5CLENBNTNCK0IsQ0E2M0IvQjs7QUFDQSxNQUFJLFlBQVksR0FBRyxFQUFuQixDQTkzQitCLENBZzRCL0I7O0FBQ0EsV0FBUyxhQUFULENBQXdCLE9BQXhCLEVBQWtDO0FBQ2pDLFFBQUksTUFBTSxHQUFHLFlBQVksQ0FBRSxPQUFGLENBQVosR0FBMEIsRUFBdkM7QUFDQSxJQUFBLE1BQU0sQ0FBQyxJQUFQLENBQWEsT0FBTyxDQUFDLEtBQVIsQ0FBZSxXQUFmLENBQWIsRUFBMkMsVUFBVSxDQUFWLEVBQWEsSUFBYixFQUFvQjtBQUM5RCxNQUFBLE1BQU0sQ0FBRSxJQUFGLENBQU4sR0FBaUIsSUFBakI7QUFDQSxLQUZEO0FBR0EsV0FBTyxNQUFQO0FBQ0E7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBLEVBQUEsTUFBTSxDQUFDLFNBQVAsR0FBbUIsVUFBVSxPQUFWLEVBQW9CO0FBRXRDO0FBQ0E7QUFDQSxJQUFBLE9BQU8sR0FBRyxPQUFPLE9BQVAsS0FBbUIsUUFBbkIsR0FDUCxZQUFZLENBQUUsT0FBRixDQUFaLElBQTJCLGFBQWEsQ0FBRSxPQUFGLENBRGpDLEdBRVQsTUFBTSxDQUFDLE1BQVAsQ0FBZSxFQUFmLEVBQW1CLE9BQW5CLENBRkQ7O0FBSUEsUUFBSTtBQUNILElBQUEsTUFERDtBQUFBLFFBRUM7QUFDQSxJQUFBLE1BSEQ7QUFBQSxRQUlDO0FBQ0EsSUFBQSxNQUxEO0FBQUEsUUFNQztBQUNBLElBQUEsV0FQRDtBQUFBLFFBUUM7QUFDQSxJQUFBLFlBVEQ7QUFBQSxRQVVDO0FBQ0EsSUFBQSxXQVhEO0FBQUEsUUFZQztBQUNBLElBQUEsSUFBSSxHQUFHLEVBYlI7QUFBQSxRQWNDO0FBQ0EsSUFBQSxLQUFLLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBVCxJQUFpQixFQWYxQjtBQUFBLFFBZ0JDO0FBQ0EsSUFBQSxJQUFJLEdBQUcsU0FBUCxJQUFPLENBQVUsSUFBVixFQUFpQjtBQUN2QixNQUFBLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBUixJQUFrQixJQUEzQjtBQUNBLE1BQUEsTUFBSyxHQUFHLElBQVI7QUFDQSxNQUFBLFdBQVcsR0FBRyxXQUFXLElBQUksQ0FBN0I7QUFDQSxNQUFBLFdBQVcsR0FBRyxDQUFkO0FBQ0EsTUFBQSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQXBCO0FBQ0EsTUFBQSxNQUFNLEdBQUcsSUFBVDs7QUFDQSxhQUFRLElBQUksSUFBSSxXQUFXLEdBQUcsWUFBOUIsRUFBNEMsV0FBVyxFQUF2RCxFQUE0RDtBQUMzRCxZQUFLLElBQUksQ0FBRSxXQUFGLENBQUosQ0FBb0IsS0FBcEIsQ0FBMkIsSUFBSSxDQUFFLENBQUYsQ0FBL0IsRUFBc0MsSUFBSSxDQUFFLENBQUYsQ0FBMUMsTUFBc0QsS0FBdEQsSUFBK0QsT0FBTyxDQUFDLFdBQTVFLEVBQTBGO0FBQ3pGLFVBQUEsTUFBTSxHQUFHLEtBQVQsQ0FEeUYsQ0FDekU7O0FBQ2hCO0FBQ0E7QUFDRDs7QUFDRCxNQUFBLE1BQU0sR0FBRyxLQUFUOztBQUNBLFVBQUssSUFBTCxFQUFZO0FBQ1gsWUFBSyxLQUFMLEVBQWE7QUFDWixjQUFLLEtBQUssQ0FBQyxNQUFYLEVBQW9CO0FBQ25CLFlBQUEsSUFBSSxDQUFFLEtBQUssQ0FBQyxLQUFOLEVBQUYsQ0FBSjtBQUNBO0FBQ0QsU0FKRCxNQUlPLElBQUssTUFBTCxFQUFjO0FBQ3BCLFVBQUEsSUFBSSxHQUFHLEVBQVA7QUFDQSxTQUZNLE1BRUE7QUFDTixVQUFBLElBQUksQ0FBQyxPQUFMO0FBQ0E7QUFDRDtBQUNELEtBMUNGO0FBQUEsUUEyQ0M7QUFDQSxJQUFBLElBQUksR0FBRztBQUNOO0FBQ0EsTUFBQSxHQUFHLEVBQUUsZUFBVztBQUNmLFlBQUssSUFBTCxFQUFZO0FBQ1g7QUFDQSxjQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBakI7O0FBQ0EsV0FBQyxTQUFTLEdBQVQsQ0FBYyxJQUFkLEVBQXFCO0FBQ3JCLFlBQUEsTUFBTSxDQUFDLElBQVAsQ0FBYSxJQUFiLEVBQW1CLFVBQVUsQ0FBVixFQUFhLEdBQWIsRUFBbUI7QUFDckMsa0JBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFQLENBQWEsR0FBYixDQUFYOztBQUNBLGtCQUFLLElBQUksS0FBSyxVQUFULEtBQXlCLENBQUMsT0FBTyxDQUFDLE1BQVQsSUFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBTCxDQUFVLEdBQVYsQ0FBN0MsQ0FBTCxFQUFzRTtBQUNyRSxnQkFBQSxJQUFJLENBQUMsSUFBTCxDQUFXLEdBQVg7QUFDQSxlQUZELE1BRU8sSUFBSyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQVgsSUFBcUIsSUFBSSxLQUFLLFFBQW5DLEVBQThDO0FBQ3BEO0FBQ0EsZ0JBQUEsR0FBRyxDQUFFLEdBQUYsQ0FBSDtBQUNBO0FBQ0QsYUFSRDtBQVNBLFdBVkQsRUFVSSxTQVZKLEVBSFcsQ0FjWDtBQUNBOzs7QUFDQSxjQUFLLE1BQUwsRUFBYztBQUNiLFlBQUEsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFwQixDQURhLENBRWQ7QUFDQTtBQUNDLFdBSkQsTUFJTyxJQUFLLE1BQUwsRUFBYztBQUNwQixZQUFBLFdBQVcsR0FBRyxLQUFkO0FBQ0EsWUFBQSxJQUFJLENBQUUsTUFBRixDQUFKO0FBQ0E7QUFDRDs7QUFDRCxlQUFPLElBQVA7QUFDQSxPQTdCSztBQThCTjtBQUNBLE1BQUEsTUFBTSxFQUFFLGtCQUFXO0FBQ2xCLFlBQUssSUFBTCxFQUFZO0FBQ1gsVUFBQSxNQUFNLENBQUMsSUFBUCxDQUFhLFNBQWIsRUFBd0IsVUFBVSxDQUFWLEVBQWEsR0FBYixFQUFtQjtBQUMxQyxnQkFBSSxLQUFKOztBQUNBLG1CQUFPLENBQUUsS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFQLENBQWdCLEdBQWhCLEVBQXFCLElBQXJCLEVBQTJCLEtBQTNCLENBQVYsSUFBaUQsQ0FBQyxDQUF6RCxFQUE2RDtBQUM1RCxjQUFBLElBQUksQ0FBQyxNQUFMLENBQWEsS0FBYixFQUFvQixDQUFwQixFQUQ0RCxDQUU1RDs7QUFDQSxrQkFBSyxNQUFMLEVBQWM7QUFDYixvQkFBSyxLQUFLLElBQUksWUFBZCxFQUE2QjtBQUM1QixrQkFBQSxZQUFZO0FBQ1o7O0FBQ0Qsb0JBQUssS0FBSyxJQUFJLFdBQWQsRUFBNEI7QUFDM0Isa0JBQUEsV0FBVztBQUNYO0FBQ0Q7QUFDRDtBQUNELFdBZEQ7QUFlQTs7QUFDRCxlQUFPLElBQVA7QUFDQSxPQWxESztBQW1ETjtBQUNBLE1BQUEsR0FBRyxFQUFFLGFBQVUsRUFBVixFQUFlO0FBQ25CLGVBQU8sTUFBTSxDQUFDLE9BQVAsQ0FBZ0IsRUFBaEIsRUFBb0IsSUFBcEIsSUFBNkIsQ0FBQyxDQUFyQztBQUNBLE9BdERLO0FBdUROO0FBQ0EsTUFBQSxLQUFLLEVBQUUsaUJBQVc7QUFDakIsUUFBQSxJQUFJLEdBQUcsRUFBUDtBQUNBLGVBQU8sSUFBUDtBQUNBLE9BM0RLO0FBNEROO0FBQ0EsTUFBQSxPQUFPLEVBQUUsbUJBQVc7QUFDbkIsUUFBQSxJQUFJLEdBQUcsS0FBSyxHQUFHLE1BQU0sR0FBRyxTQUF4QjtBQUNBLGVBQU8sSUFBUDtBQUNBLE9BaEVLO0FBaUVOO0FBQ0EsTUFBQSxRQUFRLEVBQUUsb0JBQVc7QUFDcEIsZUFBTyxDQUFDLElBQVI7QUFDQSxPQXBFSztBQXFFTjtBQUNBLE1BQUEsSUFBSSxFQUFFLGdCQUFXO0FBQ2hCLFFBQUEsS0FBSyxHQUFHLFNBQVI7O0FBQ0EsWUFBSyxDQUFDLE1BQU4sRUFBZTtBQUNkLFVBQUEsSUFBSSxDQUFDLE9BQUw7QUFDQTs7QUFDRCxlQUFPLElBQVA7QUFDQSxPQTVFSztBQTZFTjtBQUNBLE1BQUEsTUFBTSxFQUFFLGtCQUFXO0FBQ2xCLGVBQU8sQ0FBQyxLQUFSO0FBQ0EsT0FoRks7QUFpRk47QUFDQSxNQUFBLFFBQVEsRUFBRSxrQkFBVSxPQUFWLEVBQW1CLElBQW5CLEVBQTBCO0FBQ25DLFFBQUEsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFmO0FBQ0EsUUFBQSxJQUFJLEdBQUcsQ0FBRSxPQUFGLEVBQVcsSUFBSSxDQUFDLEtBQUwsR0FBYSxJQUFJLENBQUMsS0FBTCxFQUFiLEdBQTRCLElBQXZDLENBQVA7O0FBQ0EsWUFBSyxJQUFJLEtBQU0sQ0FBQyxNQUFELElBQVUsS0FBaEIsQ0FBVCxFQUFtQztBQUNsQyxjQUFLLE1BQUwsRUFBYztBQUNiLFlBQUEsS0FBSyxDQUFDLElBQU4sQ0FBWSxJQUFaO0FBQ0EsV0FGRCxNQUVPO0FBQ04sWUFBQSxJQUFJLENBQUUsSUFBRixDQUFKO0FBQ0E7QUFDRDs7QUFDRCxlQUFPLElBQVA7QUFDQSxPQTdGSztBQThGTjtBQUNBLE1BQUEsSUFBSSxFQUFFLGdCQUFXO0FBQ2hCLFFBQUEsSUFBSSxDQUFDLFFBQUwsQ0FBZSxJQUFmLEVBQXFCLFNBQXJCO0FBQ0EsZUFBTyxJQUFQO0FBQ0EsT0FsR0s7QUFtR047QUFDQSxNQUFBLEtBQUssRUFBRSxpQkFBVztBQUNqQixlQUFPLENBQUMsQ0FBQyxNQUFUO0FBQ0E7QUF0R0ssS0E1Q1I7O0FBcUpBLFdBQU8sSUFBUDtBQUNBLEdBOUpEOztBQStKQSxFQUFBLE1BQU0sQ0FBQyxNQUFQLENBQWM7QUFFYixJQUFBLFFBQVEsRUFBRSxrQkFBVSxJQUFWLEVBQWlCO0FBQzFCLFVBQUksTUFBTSxHQUFHLENBQ1g7QUFDQSxPQUFFLFNBQUYsRUFBYSxNQUFiLEVBQXFCLE1BQU0sQ0FBQyxTQUFQLENBQWlCLGFBQWpCLENBQXJCLEVBQXNELFVBQXRELENBRlcsRUFHWCxDQUFFLFFBQUYsRUFBWSxNQUFaLEVBQW9CLE1BQU0sQ0FBQyxTQUFQLENBQWlCLGFBQWpCLENBQXBCLEVBQXFELFVBQXJELENBSFcsRUFJWCxDQUFFLFFBQUYsRUFBWSxVQUFaLEVBQXdCLE1BQU0sQ0FBQyxTQUFQLENBQWlCLFFBQWpCLENBQXhCLENBSlcsQ0FBYjtBQUFBLFVBTUMsTUFBSyxHQUFHLFNBTlQ7QUFBQSxVQU9DLFFBQU8sR0FBRztBQUNULFFBQUEsS0FBSyxFQUFFLGlCQUFXO0FBQ2pCLGlCQUFPLE1BQVA7QUFDQSxTQUhRO0FBSVQsUUFBQSxNQUFNLEVBQUUsa0JBQVc7QUFDbEIsVUFBQSxRQUFRLENBQUMsSUFBVCxDQUFlLFNBQWYsRUFBMkIsSUFBM0IsQ0FBaUMsU0FBakM7QUFDQSxpQkFBTyxJQUFQO0FBQ0EsU0FQUTtBQVFULFFBQUEsSUFBSSxFQUFFO0FBQVU7QUFBbUM7QUFDbEQsY0FBSSxHQUFHLEdBQUcsU0FBVjtBQUNBLGlCQUFPLE1BQU0sQ0FBQyxRQUFQLENBQWdCLFVBQVUsUUFBVixFQUFxQjtBQUMzQyxZQUFBLE1BQU0sQ0FBQyxJQUFQLENBQWEsTUFBYixFQUFxQixVQUFVLENBQVYsRUFBYSxLQUFiLEVBQXFCO0FBQ3pDLGtCQUFJLE1BQU0sR0FBRyxLQUFLLENBQUUsQ0FBRixDQUFsQjtBQUFBLGtCQUNDLEVBQUUsR0FBRyxHQUFHLENBQUUsQ0FBRixDQURULENBRHlDLENBR3pDOztBQUNBLGNBQUEsUUFBUSxDQUFFLEtBQUssQ0FBQyxDQUFELENBQVAsQ0FBUixDQUFzQixNQUFNLENBQUMsVUFBUCxDQUFtQixFQUFuQixJQUNyQixZQUFXO0FBQ1Ysb0JBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQyxLQUFILENBQVUsSUFBVixFQUFnQixTQUFoQixDQUFmOztBQUNBLG9CQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsVUFBUCxDQUFtQixRQUFRLENBQUMsT0FBNUIsQ0FBakIsRUFBeUQ7QUFDeEQsa0JBQUEsUUFBUSxDQUFDLE9BQVQsR0FDRSxJQURGLENBQ1EsUUFBUSxDQUFDLE9BRGpCLEVBRUUsSUFGRixDQUVRLFFBQVEsQ0FBQyxNQUZqQixFQUdFLFFBSEYsQ0FHWSxRQUFRLENBQUMsTUFIckI7QUFJQSxpQkFMRCxNQUtPO0FBQ04sa0JBQUEsUUFBUSxDQUFFLE1BQU0sR0FBRyxNQUFYLENBQVIsQ0FBNkIsU0FBUyxRQUFULEdBQW9CLFFBQXBCLEdBQStCLElBQTVELEVBQWtFLENBQUUsUUFBRixDQUFsRTtBQUNBO0FBQ0QsZUFYb0IsR0FZckIsUUFBUSxDQUFFLE1BQUYsQ0FaVDtBQWNBLGFBbEJEO0FBbUJBLFlBQUEsR0FBRyxHQUFHLElBQU47QUFDQSxXQXJCTSxFQXFCSixPQXJCSSxFQUFQO0FBc0JBLFNBaENRO0FBaUNUO0FBQ0E7QUFDQSxRQUFBLE9BQU8sRUFBRSxpQkFBVSxHQUFWLEVBQWdCO0FBQ3hCLGlCQUFPLFFBQU8sR0FBUCxNQUFlLFFBQWYsR0FBMEIsTUFBTSxDQUFDLE1BQVAsQ0FBZSxHQUFmLEVBQW9CLFFBQXBCLENBQTFCLEdBQTBELFFBQWpFO0FBQ0E7QUFyQ1EsT0FQWDtBQUFBLFVBOENDLFFBQVEsR0FBRyxFQTlDWixDQUQwQixDQWlEMUI7O0FBQ0EsTUFBQSxRQUFPLENBQUMsSUFBUixHQUFlLFFBQU8sQ0FBQyxJQUF2QixDQWxEMEIsQ0FvRDFCOztBQUNBLE1BQUEsTUFBTSxDQUFDLElBQVAsQ0FBYSxNQUFiLEVBQXFCLFVBQVUsQ0FBVixFQUFhLEtBQWIsRUFBcUI7QUFDekMsWUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFFLENBQUYsQ0FBaEI7QUFBQSxZQUNDLFdBQVcsR0FBRyxLQUFLLENBQUUsQ0FBRixDQURwQixDQUR5QyxDQUl6Qzs7QUFDQSxRQUFBLFFBQU8sQ0FBRSxLQUFLLENBQUMsQ0FBRCxDQUFQLENBQVAsR0FBc0IsSUFBSSxDQUFDLEdBQTNCLENBTHlDLENBT3pDOztBQUNBLFlBQUssV0FBTCxFQUFtQjtBQUNsQixVQUFBLElBQUksQ0FBQyxHQUFMLENBQVMsWUFBVztBQUNuQjtBQUNBLFlBQUEsTUFBSyxHQUFHLFdBQVIsQ0FGbUIsQ0FJcEI7QUFDQyxXQUxELEVBS0csTUFBTSxDQUFFLENBQUMsR0FBRyxDQUFOLENBQU4sQ0FBaUIsQ0FBakIsRUFBcUIsT0FMeEIsRUFLaUMsTUFBTSxDQUFFLENBQUYsQ0FBTixDQUFhLENBQWIsRUFBaUIsSUFMbEQ7QUFNQSxTQWZ3QyxDQWlCekM7OztBQUNBLFFBQUEsUUFBUSxDQUFFLEtBQUssQ0FBQyxDQUFELENBQVAsQ0FBUixHQUF1QixJQUFJLENBQUMsSUFBNUI7QUFDQSxRQUFBLFFBQVEsQ0FBRSxLQUFLLENBQUMsQ0FBRCxDQUFMLEdBQVcsTUFBYixDQUFSLEdBQWdDLElBQUksQ0FBQyxRQUFyQztBQUNBLE9BcEJELEVBckQwQixDQTJFMUI7O0FBQ0EsTUFBQSxRQUFPLENBQUMsT0FBUixDQUFpQixRQUFqQixFQTVFMEIsQ0E4RTFCOzs7QUFDQSxVQUFLLElBQUwsRUFBWTtBQUNYLFFBQUEsSUFBSSxDQUFDLElBQUwsQ0FBVyxRQUFYLEVBQXFCLFFBQXJCO0FBQ0EsT0FqRnlCLENBbUYxQjs7O0FBQ0EsYUFBTyxRQUFQO0FBQ0EsS0F2Rlk7QUF5RmI7QUFDQSxJQUFBLElBQUksRUFBRSxjQUFVO0FBQVk7QUFBdEIsTUFBa0Q7QUFDdkQsVUFBSSxDQUFDLEdBQUcsQ0FBUjtBQUFBLFVBQ0MsYUFBYSxHQUFHLFVBQVUsQ0FBQyxJQUFYLENBQWlCLFNBQWpCLENBRGpCO0FBQUEsVUFFQyxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BRnhCO0FBQUEsVUFJQztBQUNBLE1BQUEsU0FBUyxHQUFHLE1BQU0sS0FBSyxDQUFYLElBQWtCLFdBQVcsSUFBSSxNQUFNLENBQUMsVUFBUCxDQUFtQixXQUFXLENBQUMsT0FBL0IsQ0FBakMsR0FBOEUsTUFBOUUsR0FBdUYsQ0FMcEc7QUFBQSxVQU9DO0FBQ0EsTUFBQSxRQUFRLEdBQUcsU0FBUyxLQUFLLENBQWQsR0FBa0IsV0FBbEIsR0FBZ0MsTUFBTSxDQUFDLFFBQVAsRUFSNUM7QUFBQSxVQVVDO0FBQ0EsTUFBQSxVQUFVLEdBQUcsU0FBYixVQUFhLENBQVUsQ0FBVixFQUFhLFFBQWIsRUFBdUIsTUFBdkIsRUFBZ0M7QUFDNUMsZUFBTyxVQUFVLEtBQVYsRUFBa0I7QUFDeEIsVUFBQSxRQUFRLENBQUUsQ0FBRixDQUFSLEdBQWdCLElBQWhCO0FBQ0EsVUFBQSxNQUFNLENBQUUsQ0FBRixDQUFOLEdBQWMsU0FBUyxDQUFDLE1BQVYsR0FBbUIsQ0FBbkIsR0FBdUIsVUFBVSxDQUFDLElBQVgsQ0FBaUIsU0FBakIsQ0FBdkIsR0FBc0QsS0FBcEU7O0FBQ0EsY0FBSSxNQUFNLEtBQUssY0FBZixFQUFnQztBQUMvQixZQUFBLFFBQVEsQ0FBQyxVQUFULENBQXFCLFFBQXJCLEVBQStCLE1BQS9CO0FBQ0EsV0FGRCxNQUVPLElBQUssQ0FBRyxHQUFFLFNBQVYsRUFBd0I7QUFDOUIsWUFBQSxRQUFRLENBQUMsV0FBVCxDQUFzQixRQUF0QixFQUFnQyxNQUFoQztBQUNBO0FBQ0QsU0FSRDtBQVNBLE9BckJGO0FBQUEsVUF1QkMsY0F2QkQ7QUFBQSxVQXVCaUIsZ0JBdkJqQjtBQUFBLFVBdUJtQyxlQXZCbkMsQ0FEdUQsQ0EwQnZEOzs7QUFDQSxVQUFLLE1BQU0sR0FBRyxDQUFkLEVBQWtCO0FBQ2pCLFFBQUEsY0FBYyxHQUFHLElBQUksS0FBSixDQUFXLE1BQVgsQ0FBakI7QUFDQSxRQUFBLGdCQUFnQixHQUFHLElBQUksS0FBSixDQUFXLE1BQVgsQ0FBbkI7QUFDQSxRQUFBLGVBQWUsR0FBRyxJQUFJLEtBQUosQ0FBVyxNQUFYLENBQWxCOztBQUNBLGVBQVEsQ0FBQyxHQUFHLE1BQVosRUFBb0IsQ0FBQyxFQUFyQixFQUEwQjtBQUN6QixjQUFLLGFBQWEsQ0FBRSxDQUFGLENBQWIsSUFBc0IsTUFBTSxDQUFDLFVBQVAsQ0FBbUIsYUFBYSxDQUFFLENBQUYsQ0FBYixDQUFtQixPQUF0QyxDQUEzQixFQUE2RTtBQUM1RSxZQUFBLGFBQWEsQ0FBRSxDQUFGLENBQWIsQ0FBbUIsT0FBbkIsR0FDRSxJQURGLENBQ1EsVUFBVSxDQUFFLENBQUYsRUFBSyxlQUFMLEVBQXNCLGFBQXRCLENBRGxCLEVBRUUsSUFGRixDQUVRLFFBQVEsQ0FBQyxNQUZqQixFQUdFLFFBSEYsQ0FHWSxVQUFVLENBQUUsQ0FBRixFQUFLLGdCQUFMLEVBQXVCLGNBQXZCLENBSHRCO0FBSUEsV0FMRCxNQUtPO0FBQ04sY0FBRSxTQUFGO0FBQ0E7QUFDRDtBQUNELE9BekNzRCxDQTJDdkQ7OztBQUNBLFVBQUssQ0FBQyxTQUFOLEVBQWtCO0FBQ2pCLFFBQUEsUUFBUSxDQUFDLFdBQVQsQ0FBc0IsZUFBdEIsRUFBdUMsYUFBdkM7QUFDQTs7QUFFRCxhQUFPLFFBQVEsQ0FBQyxPQUFULEVBQVA7QUFDQTtBQTNJWSxHQUFkOztBQTZJQSxFQUFBLE1BQU0sQ0FBQyxPQUFQLEdBQWtCLFlBQVc7QUFFNUIsUUFBSSxPQUFKO0FBQUEsUUFDQyxHQUREO0FBQUEsUUFFQyxDQUZEO0FBQUEsUUFHQyxNQUhEO0FBQUEsUUFJQyxHQUpEO0FBQUEsUUFLQyxLQUxEO0FBQUEsUUFNQyxRQU5EO0FBQUEsUUFPQyxTQVBEO0FBQUEsUUFRQyxDQVJEO0FBQUEsUUFTQyxXQVREO0FBQUEsUUFVQyxPQVZEO0FBQUEsUUFXQyxHQUFHLEdBQUcsUUFBUSxDQUFDLGFBQVQsQ0FBdUIsS0FBdkIsQ0FYUCxDQUY0QixDQWU1Qjs7QUFDQSxJQUFBLEdBQUcsQ0FBQyxZQUFKLENBQWtCLFdBQWxCLEVBQStCLEdBQS9CO0FBQ0EsSUFBQSxHQUFHLENBQUMsU0FBSixHQUFnQixvRUFBaEI7QUFFQSxJQUFBLEdBQUcsR0FBRyxHQUFHLENBQUMsb0JBQUosQ0FBeUIsR0FBekIsQ0FBTjtBQUNBLElBQUEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxvQkFBSixDQUF5QixHQUF6QixFQUErQixDQUEvQixDQUFKO0FBQ0EsSUFBQSxDQUFDLENBQUMsS0FBRixDQUFRLE9BQVIsR0FBa0IsK0JBQWxCLENBckI0QixDQXVCNUI7O0FBQ0EsUUFBSyxDQUFDLEdBQUQsSUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFiLElBQXVCLENBQUMsQ0FBN0IsRUFBaUM7QUFDaEMsYUFBTyxFQUFQO0FBQ0EsS0ExQjJCLENBNEI1Qjs7O0FBQ0EsSUFBQSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQVQsQ0FBdUIsUUFBdkIsQ0FBVDtBQUNBLElBQUEsR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFQLENBQW9CLFFBQVEsQ0FBQyxhQUFULENBQXVCLFFBQXZCLENBQXBCLENBQU47QUFDQSxJQUFBLEtBQUssR0FBRyxHQUFHLENBQUMsb0JBQUosQ0FBeUIsT0FBekIsRUFBbUMsQ0FBbkMsQ0FBUjtBQUVBLElBQUEsT0FBTyxHQUFHO0FBQ1Q7QUFDQSxNQUFBLGlCQUFpQixFQUFJLEdBQUcsQ0FBQyxVQUFKLENBQWUsUUFBZixLQUE0QixDQUZ4QztBQUlUO0FBQ0E7QUFDQSxNQUFBLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxvQkFBSixDQUF5QixPQUF6QixFQUFrQyxNQU5qQztBQVFUO0FBQ0E7QUFDQSxNQUFBLGFBQWEsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLG9CQUFKLENBQXlCLE1BQXpCLEVBQWlDLE1BVnpDO0FBWVQ7QUFDQTtBQUNBLE1BQUEsS0FBSyxFQUFFLE1BQU0sSUFBTixDQUFZLENBQUMsQ0FBQyxZQUFGLENBQWUsT0FBZixDQUFaLENBZEU7QUFnQlQ7QUFDQTtBQUNBLE1BQUEsY0FBYyxFQUFJLENBQUMsQ0FBQyxZQUFGLENBQWUsTUFBZixNQUEyQixJQWxCcEM7QUFvQlQ7QUFDQTtBQUNBO0FBQ0EsTUFBQSxPQUFPLEVBQUUsT0FBTyxJQUFQLENBQWEsQ0FBQyxDQUFDLEtBQUYsQ0FBUSxPQUFyQixDQXZCQTtBQXlCVDtBQUNBO0FBQ0EsTUFBQSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFGLENBQVEsUUEzQlg7QUE2QlQ7QUFDQTtBQUNBO0FBQ0EsTUFBQSxPQUFPLEVBQUksS0FBSyxDQUFDLEtBQU4sS0FBZ0IsSUFoQ2xCO0FBa0NUO0FBQ0E7QUFDQSxNQUFBLFdBQVcsRUFBRSxHQUFHLENBQUMsUUFwQ1I7QUFzQ1Q7QUFDQSxNQUFBLGVBQWUsRUFBRSxHQUFHLENBQUMsU0FBSixLQUFrQixHQXZDMUI7QUF5Q1Q7QUFDQSxNQUFBLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQVQsQ0FBdUIsTUFBdkIsRUFBK0IsT0ExQ2pDO0FBNENUO0FBQ0E7QUFDQSxNQUFBLFVBQVUsRUFBRSxRQUFRLENBQUMsYUFBVCxDQUF1QixLQUF2QixFQUE4QixTQUE5QixDQUF5QyxJQUF6QyxFQUFnRCxTQUFoRCxLQUE4RCxlQTlDakU7QUFnRFQ7QUFDQSxNQUFBLFFBQVEsRUFBSSxRQUFRLENBQUMsVUFBVCxLQUF3QixZQWpEM0I7QUFtRFQ7QUFDQSxNQUFBLGFBQWEsRUFBRSxJQXBETjtBQXFEVCxNQUFBLGFBQWEsRUFBRSxJQXJETjtBQXNEVCxNQUFBLGNBQWMsRUFBRSxLQXREUDtBQXVEVCxNQUFBLGFBQWEsRUFBRSxJQXZETjtBQXdEVCxNQUFBLFlBQVksRUFBRSxJQXhETDtBQXlEVCxNQUFBLHNCQUFzQixFQUFFLEtBekRmO0FBMERULE1BQUEsZ0JBQWdCLEVBQUUsS0ExRFQ7QUEyRFQsTUFBQSxtQkFBbUIsRUFBRSxJQTNEWjtBQTREVCxNQUFBLGlCQUFpQixFQUFFLElBNURWO0FBNkRULE1BQUEsYUFBYSxFQUFFO0FBN0ROLEtBQVYsQ0FqQzRCLENBaUc1Qjs7QUFDQSxJQUFBLEtBQUssQ0FBQyxPQUFOLEdBQWdCLElBQWhCO0FBQ0EsSUFBQSxPQUFPLENBQUMsY0FBUixHQUF5QixLQUFLLENBQUMsU0FBTixDQUFpQixJQUFqQixFQUF3QixPQUFqRCxDQW5HNEIsQ0FxRzVCO0FBQ0E7O0FBQ0EsSUFBQSxNQUFNLENBQUMsUUFBUCxHQUFrQixJQUFsQjtBQUNBLElBQUEsT0FBTyxDQUFDLFdBQVIsR0FBc0IsQ0FBQyxHQUFHLENBQUMsUUFBM0IsQ0F4RzRCLENBMEc1QjtBQUNBOztBQUNBLFFBQUk7QUFDSCxhQUFPLEdBQUcsQ0FBQyxJQUFYO0FBQ0EsS0FGRCxDQUVFLE9BQU8sQ0FBUCxFQUFXO0FBQ1osTUFBQSxPQUFPLENBQUMsYUFBUixHQUF3QixLQUF4QjtBQUNBOztBQUVELFFBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQUwsSUFBeUIsR0FBRyxDQUFDLFdBQTdCLElBQTRDLEdBQUcsQ0FBQyxTQUFyRCxFQUFpRTtBQUNoRSxNQUFBLEdBQUcsQ0FBQyxXQUFKLENBQWlCLFNBQWpCLEVBQTRCLE9BQU8sR0FBRyxtQkFBVztBQUNoRDtBQUNBO0FBQ0EsUUFBQSxPQUFPLENBQUMsWUFBUixHQUF1QixLQUF2QjtBQUNBLE9BSkQ7QUFLQSxNQUFBLEdBQUcsQ0FBQyxTQUFKLENBQWUsSUFBZixFQUFzQixTQUF0QixDQUFnQyxTQUFoQztBQUNBLE1BQUEsR0FBRyxDQUFDLFdBQUosQ0FBaUIsU0FBakIsRUFBNEIsT0FBNUI7QUFDQSxLQTFIMkIsQ0E0SDVCO0FBQ0E7OztBQUNBLElBQUEsS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFULENBQXVCLE9BQXZCLENBQVI7QUFDQSxJQUFBLEtBQUssQ0FBQyxLQUFOLEdBQWMsR0FBZDtBQUNBLElBQUEsS0FBSyxDQUFDLFlBQU4sQ0FBb0IsTUFBcEIsRUFBNEIsT0FBNUI7QUFDQSxJQUFBLE9BQU8sQ0FBQyxVQUFSLEdBQXFCLEtBQUssQ0FBQyxLQUFOLEtBQWdCLEdBQXJDO0FBRUEsSUFBQSxLQUFLLENBQUMsWUFBTixDQUFvQixTQUFwQixFQUErQixTQUEvQixFQW5JNEIsQ0FxSTVCOztBQUNBLElBQUEsS0FBSyxDQUFDLFlBQU4sQ0FBb0IsTUFBcEIsRUFBNEIsR0FBNUI7QUFFQSxJQUFBLEdBQUcsQ0FBQyxXQUFKLENBQWlCLEtBQWpCO0FBQ0EsSUFBQSxRQUFRLEdBQUcsUUFBUSxDQUFDLHNCQUFULEVBQVg7QUFDQSxJQUFBLFFBQVEsQ0FBQyxXQUFULENBQXNCLEdBQUcsQ0FBQyxTQUExQixFQTFJNEIsQ0E0STVCOztBQUNBLElBQUEsT0FBTyxDQUFDLFVBQVIsR0FBcUIsUUFBUSxDQUFDLFNBQVQsQ0FBb0IsSUFBcEIsRUFBMkIsU0FBM0IsQ0FBc0MsSUFBdEMsRUFBNkMsU0FBN0MsQ0FBdUQsT0FBNUUsQ0E3STRCLENBK0k1QjtBQUNBOztBQUNBLElBQUEsT0FBTyxDQUFDLGFBQVIsR0FBd0IsS0FBSyxDQUFDLE9BQTlCO0FBRUEsSUFBQSxRQUFRLENBQUMsV0FBVCxDQUFzQixLQUF0QjtBQUNBLElBQUEsUUFBUSxDQUFDLFdBQVQsQ0FBc0IsR0FBdEIsRUFwSjRCLENBc0o1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsUUFBSyxHQUFHLENBQUMsV0FBVCxFQUF1QjtBQUN0QixXQUFNLENBQU4sSUFBVztBQUNWLFFBQUEsTUFBTSxFQUFFLElBREU7QUFFVixRQUFBLE1BQU0sRUFBRSxJQUZFO0FBR1YsUUFBQSxPQUFPLEVBQUU7QUFIQyxPQUFYLEVBSUc7QUFDRixRQUFBLFNBQVMsR0FBRyxPQUFPLENBQW5CO0FBQ0EsUUFBQSxXQUFXLEdBQUssU0FBUyxJQUFJLEdBQTdCOztBQUNBLFlBQUssQ0FBQyxXQUFOLEVBQW9CO0FBQ25CLFVBQUEsR0FBRyxDQUFDLFlBQUosQ0FBa0IsU0FBbEIsRUFBNkIsU0FBN0I7QUFDQSxVQUFBLFdBQVcsR0FBSyxPQUFPLEdBQUcsQ0FBRSxTQUFGLENBQVYsS0FBNEIsVUFBNUM7QUFDQTs7QUFDRCxRQUFBLE9BQU8sQ0FBRSxDQUFDLEdBQUcsU0FBTixDQUFQLEdBQTJCLFdBQTNCO0FBQ0E7QUFDRCxLQTFLMkIsQ0E0SzVCOzs7QUFDQSxJQUFBLE1BQU0sQ0FBQyxZQUFXO0FBQ2pCLFVBQUksU0FBSjtBQUFBLFVBQWUsR0FBZjtBQUFBLFVBQW9CLEdBQXBCO0FBQUEsVUFBeUIsU0FBekI7QUFBQSxVQUNDLFFBQVEsR0FBRyw0REFEWjtBQUFBLFVBRUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxvQkFBVCxDQUE4QixNQUE5QixFQUFzQyxDQUF0QyxDQUZSOztBQUlBLFVBQUssQ0FBQyxJQUFOLEVBQWE7QUFDWjtBQUNBO0FBQ0E7O0FBRUQsTUFBQSxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQVQsQ0FBdUIsS0FBdkIsQ0FBWjtBQUNBLE1BQUEsU0FBUyxDQUFDLEtBQVYsQ0FBZ0IsT0FBaEIsR0FBMEIsa0ZBQTFCO0FBQ0EsTUFBQSxJQUFJLENBQUMsWUFBTCxDQUFtQixTQUFuQixFQUE4QixJQUFJLENBQUMsVUFBbkMsRUFaaUIsQ0FjakI7O0FBQ0EsTUFBQSxHQUFHLEdBQUcsUUFBUSxDQUFDLGFBQVQsQ0FBdUIsS0FBdkIsQ0FBTjtBQUNBLE1BQUEsU0FBUyxDQUFDLFdBQVYsQ0FBdUIsR0FBdkIsRUFoQmlCLENBa0JqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxNQUFBLEdBQUcsQ0FBQyxTQUFKLEdBQWdCLDZDQUFoQjtBQUNBLE1BQUEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxvQkFBSixDQUF5QixJQUF6QixDQUFOO0FBQ0EsTUFBQSxHQUFHLENBQUUsQ0FBRixDQUFILENBQVMsS0FBVCxDQUFlLE9BQWYsR0FBeUIsMENBQXpCO0FBQ0EsTUFBQSxXQUFXLEdBQUssR0FBRyxDQUFFLENBQUYsQ0FBSCxDQUFTLFlBQVQsS0FBMEIsQ0FBMUM7QUFFQSxNQUFBLEdBQUcsQ0FBRSxDQUFGLENBQUgsQ0FBUyxLQUFULENBQWUsT0FBZixHQUF5QixFQUF6QjtBQUNBLE1BQUEsR0FBRyxDQUFFLENBQUYsQ0FBSCxDQUFTLEtBQVQsQ0FBZSxPQUFmLEdBQXlCLE1BQXpCLENBL0JpQixDQWlDakI7QUFDQTs7QUFDQSxNQUFBLE9BQU8sQ0FBQyxxQkFBUixHQUFnQyxXQUFXLElBQU0sR0FBRyxDQUFFLENBQUYsQ0FBSCxDQUFTLFlBQVQsS0FBMEIsQ0FBM0UsQ0FuQ2lCLENBcUNqQjs7QUFDQSxNQUFBLEdBQUcsQ0FBQyxTQUFKLEdBQWdCLEVBQWhCO0FBQ0EsTUFBQSxHQUFHLENBQUMsS0FBSixDQUFVLE9BQVYsR0FBb0IsdUtBQXBCO0FBQ0EsTUFBQSxPQUFPLENBQUMsU0FBUixHQUFzQixHQUFHLENBQUMsV0FBSixLQUFvQixDQUExQztBQUNBLE1BQUEsT0FBTyxDQUFDLGdDQUFSLEdBQTZDLElBQUksQ0FBQyxTQUFMLEtBQW1CLENBQWhFLENBekNpQixDQTJDakI7QUFDQTs7QUFDQSxVQUFLLE1BQU0sQ0FBQyxnQkFBWixFQUErQjtBQUM5QixRQUFBLE9BQU8sQ0FBQyxhQUFSLEdBQXdCLENBQUUsTUFBTSxDQUFDLGdCQUFQLENBQXlCLEdBQXpCLEVBQThCLElBQTlCLEtBQXdDLEVBQTFDLEVBQStDLEdBQS9DLEtBQXVELElBQS9FO0FBQ0EsUUFBQSxPQUFPLENBQUMsaUJBQVIsR0FBNEIsQ0FBRSxNQUFNLENBQUMsZ0JBQVAsQ0FBeUIsR0FBekIsRUFBOEIsSUFBOUIsS0FBd0M7QUFBRSxVQUFBLEtBQUssRUFBRTtBQUFULFNBQTFDLEVBQTZELEtBQTdELEtBQXVFLEtBQW5HLENBRjhCLENBSTlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsUUFBQSxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQVQsQ0FBdUIsS0FBdkIsQ0FBWjtBQUNBLFFBQUEsU0FBUyxDQUFDLEtBQVYsQ0FBZ0IsT0FBaEIsR0FBMEIsR0FBRyxDQUFDLEtBQUosQ0FBVSxPQUFWLEdBQW9CLFFBQTlDO0FBQ0EsUUFBQSxTQUFTLENBQUMsS0FBVixDQUFnQixXQUFoQixHQUE4QixTQUFTLENBQUMsS0FBVixDQUFnQixLQUFoQixHQUF3QixHQUF0RDtBQUNBLFFBQUEsR0FBRyxDQUFDLEtBQUosQ0FBVSxLQUFWLEdBQWtCLEtBQWxCO0FBQ0EsUUFBQSxHQUFHLENBQUMsV0FBSixDQUFpQixTQUFqQjtBQUNBLFFBQUEsT0FBTyxDQUFDLG1CQUFSLEdBQ0MsQ0FBQyxVQUFVLENBQUUsQ0FBRSxNQUFNLENBQUMsZ0JBQVAsQ0FBeUIsU0FBekIsRUFBb0MsSUFBcEMsS0FBOEMsRUFBaEQsRUFBcUQsV0FBdkQsQ0FEWjtBQUVBOztBQUVELFVBQUssT0FBTyxHQUFHLENBQUMsS0FBSixDQUFVLElBQWpCLEtBQTBCLFdBQS9CLEVBQTZDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBQSxHQUFHLENBQUMsU0FBSixHQUFnQixFQUFoQjtBQUNBLFFBQUEsR0FBRyxDQUFDLEtBQUosQ0FBVSxPQUFWLEdBQW9CLFFBQVEsR0FBRyw2Q0FBL0I7QUFDQSxRQUFBLE9BQU8sQ0FBQyxzQkFBUixHQUFtQyxHQUFHLENBQUMsV0FBSixLQUFvQixDQUF2RCxDQVA0QyxDQVM1QztBQUNBOztBQUNBLFFBQUEsR0FBRyxDQUFDLEtBQUosQ0FBVSxPQUFWLEdBQW9CLE9BQXBCO0FBQ0EsUUFBQSxHQUFHLENBQUMsS0FBSixDQUFVLFFBQVYsR0FBcUIsU0FBckI7QUFDQSxRQUFBLEdBQUcsQ0FBQyxTQUFKLEdBQWdCLGFBQWhCO0FBQ0EsUUFBQSxHQUFHLENBQUMsVUFBSixDQUFlLEtBQWYsQ0FBcUIsS0FBckIsR0FBNkIsS0FBN0I7QUFDQSxRQUFBLE9BQU8sQ0FBQyxnQkFBUixHQUE2QixHQUFHLENBQUMsV0FBSixLQUFvQixDQUFqRDtBQUVBLFFBQUEsU0FBUyxDQUFDLEtBQVYsQ0FBZ0IsSUFBaEIsR0FBdUIsQ0FBdkI7QUFDQSxPQWpGZ0IsQ0FtRmpCOzs7QUFDQSxNQUFBLElBQUksQ0FBQyxXQUFMLENBQWtCLFNBQWxCO0FBQ0EsTUFBQSxTQUFTLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxTQUFTLEdBQUcsSUFBcEM7QUFDQSxLQXRGSyxDQUFOLENBN0s0QixDQXFRNUI7O0FBQ0EsSUFBQSxRQUFRLENBQUMsV0FBVCxDQUFzQixHQUF0QjtBQUNBLElBQUEsR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxRQUFRLEdBQUcsR0FBRyxHQUFHLElBQWxEO0FBRUEsV0FBTyxPQUFQO0FBQ0EsR0ExUWdCLEVBQWpCOztBQTJRQSxNQUFJLE1BQU0sR0FBRyw4QkFBYjtBQUFBLE1BQ0MsVUFBVSxHQUFHLFVBRGQ7QUFHQSxFQUFBLE1BQU0sQ0FBQyxNQUFQLENBQWM7QUFDYixJQUFBLEtBQUssRUFBRSxFQURNO0FBR2IsSUFBQSxVQUFVLEVBQUUsRUFIQztBQUtiO0FBQ0EsSUFBQSxJQUFJLEVBQUUsQ0FOTztBQVFiO0FBQ0E7QUFDQSxJQUFBLE9BQU8sRUFBRSxXQUFXLENBQUUsTUFBTSxDQUFDLEVBQVAsQ0FBVSxNQUFWLEdBQW1CLElBQUksQ0FBQyxNQUFMLEVBQXJCLEVBQXFDLE9BQXJDLENBQThDLEtBQTlDLEVBQXFELEVBQXJELENBVlA7QUFZYjtBQUNBO0FBQ0EsSUFBQSxNQUFNLEVBQUU7QUFDUCxlQUFTLElBREY7QUFFUDtBQUNBLGdCQUFVLDRDQUhIO0FBSVAsZ0JBQVU7QUFKSCxLQWRLO0FBcUJiLElBQUEsT0FBTyxFQUFFLGlCQUFVLElBQVYsRUFBaUI7QUFDekIsTUFBQSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQUwsR0FBZ0IsTUFBTSxDQUFDLEtBQVAsQ0FBYyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQVIsQ0FBbEIsQ0FBaEIsR0FBdUQsSUFBSSxDQUFFLE1BQU0sQ0FBQyxPQUFULENBQWxFO0FBQ0EsYUFBTyxDQUFDLENBQUMsSUFBRixJQUFVLENBQUMsaUJBQWlCLENBQUUsSUFBRixDQUFuQztBQUNBLEtBeEJZO0FBMEJiLElBQUEsSUFBSSxFQUFFLGNBQVUsSUFBVixFQUFnQixJQUFoQixFQUFzQixLQUF0QixFQUE0QjtBQUFJO0FBQWhDLE1BQTBEO0FBQy9ELFVBQUssQ0FBQyxNQUFNLENBQUMsVUFBUCxDQUFtQixJQUFuQixDQUFOLEVBQWtDO0FBQ2pDO0FBQ0E7O0FBRUQsVUFBSSxTQUFKO0FBQUEsVUFBZSxHQUFmO0FBQUEsVUFDQyxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BRHRCO0FBQUEsVUFFQyxTQUFTLEdBQUcsT0FBTyxJQUFQLEtBQWdCLFFBRjdCO0FBQUEsVUFJQztBQUNBO0FBQ0EsTUFBQSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBTmY7QUFBQSxVQVFDO0FBQ0E7QUFDQSxNQUFBLEtBQUssR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQVYsR0FBa0IsSUFWakM7QUFBQSxVQVlDO0FBQ0E7QUFDQSxNQUFBLEVBQUUsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFFLFdBQUYsQ0FBUCxHQUF5QixJQUFJLENBQUUsV0FBRixDQUFKLElBQXVCLFdBZDVELENBTCtELENBcUIvRDtBQUNBOztBQUNBLFVBQUssQ0FBQyxDQUFDLEVBQUQsSUFBTyxDQUFDLEtBQUssQ0FBQyxFQUFELENBQWIsSUFBc0IsQ0FBQyxHQUFELElBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRCxDQUFMLENBQVUsSUFBMUMsS0FBb0QsU0FBcEQsSUFBaUUsS0FBSSxLQUFLLFNBQS9FLEVBQTJGO0FBQzFGO0FBQ0E7O0FBRUQsVUFBSyxDQUFDLEVBQU4sRUFBVztBQUNWO0FBQ0E7QUFDQSxZQUFLLE1BQUwsRUFBYztBQUNiLFVBQUEsSUFBSSxDQUFFLFdBQUYsQ0FBSixHQUFzQixFQUFFLEdBQUcsTUFBTSxDQUFDLFVBQVAsQ0FBa0IsR0FBbEIsTUFBMkIsRUFBRSxNQUFNLENBQUMsSUFBL0Q7QUFDQSxTQUZELE1BRU87QUFDTixVQUFBLEVBQUUsR0FBRyxXQUFMO0FBQ0E7QUFDRDs7QUFFRCxVQUFLLENBQUMsS0FBSyxDQUFFLEVBQUYsQ0FBWCxFQUFvQjtBQUNuQixRQUFBLEtBQUssQ0FBRSxFQUFGLENBQUwsR0FBYyxFQUFkLENBRG1CLENBR25CO0FBQ0E7O0FBQ0EsWUFBSyxDQUFDLE1BQU4sRUFBZTtBQUNkLFVBQUEsS0FBSyxDQUFFLEVBQUYsQ0FBTCxDQUFZLE1BQVosR0FBcUIsTUFBTSxDQUFDLElBQTVCO0FBQ0E7QUFDRCxPQTdDOEQsQ0ErQy9EO0FBQ0E7OztBQUNBLFVBQUssUUFBTyxJQUFQLE1BQWdCLFFBQWhCLElBQTRCLE9BQU8sSUFBUCxLQUFnQixVQUFqRCxFQUE4RDtBQUM3RCxZQUFLLEdBQUwsRUFBVztBQUNWLFVBQUEsS0FBSyxDQUFFLEVBQUYsQ0FBTCxHQUFjLE1BQU0sQ0FBQyxNQUFQLENBQWUsS0FBSyxDQUFFLEVBQUYsQ0FBcEIsRUFBNEIsSUFBNUIsQ0FBZDtBQUNBLFNBRkQsTUFFTztBQUNOLFVBQUEsS0FBSyxDQUFFLEVBQUYsQ0FBTCxDQUFZLElBQVosR0FBbUIsTUFBTSxDQUFDLE1BQVAsQ0FBZSxLQUFLLENBQUUsRUFBRixDQUFMLENBQVksSUFBM0IsRUFBaUMsSUFBakMsQ0FBbkI7QUFDQTtBQUNEOztBQUVELE1BQUEsU0FBUyxHQUFHLEtBQUssQ0FBRSxFQUFGLENBQWpCLENBekQrRCxDQTJEL0Q7QUFDQTtBQUNBOztBQUNBLFVBQUssQ0FBQyxHQUFOLEVBQVk7QUFDWCxZQUFLLENBQUMsU0FBUyxDQUFDLElBQWhCLEVBQXVCO0FBQ3RCLFVBQUEsU0FBUyxDQUFDLElBQVYsR0FBaUIsRUFBakI7QUFDQTs7QUFFRCxRQUFBLFNBQVMsR0FBRyxTQUFTLENBQUMsSUFBdEI7QUFDQTs7QUFFRCxVQUFLLEtBQUksS0FBSyxTQUFkLEVBQTBCO0FBQ3pCLFFBQUEsU0FBUyxDQUFFLE1BQU0sQ0FBQyxTQUFQLENBQWtCLElBQWxCLENBQUYsQ0FBVCxHQUF3QyxLQUF4QztBQUNBLE9BeEU4RCxDQTBFL0Q7QUFDQTs7O0FBQ0EsVUFBSyxTQUFMLEVBQWlCO0FBRWhCO0FBQ0EsUUFBQSxHQUFHLEdBQUcsU0FBUyxDQUFFLElBQUYsQ0FBZixDQUhnQixDQUtoQjs7QUFDQSxZQUFLLEdBQUcsSUFBSSxJQUFaLEVBQW1CO0FBRWxCO0FBQ0EsVUFBQSxHQUFHLEdBQUcsU0FBUyxDQUFFLE1BQU0sQ0FBQyxTQUFQLENBQWtCLElBQWxCLENBQUYsQ0FBZjtBQUNBO0FBQ0QsT0FYRCxNQVdPO0FBQ04sUUFBQSxHQUFHLEdBQUcsU0FBTjtBQUNBOztBQUVELGFBQU8sR0FBUDtBQUNBLEtBdEhZO0FBd0hiLElBQUEsVUFBVSxFQUFFLG9CQUFVLElBQVYsRUFBZ0IsSUFBaEIsRUFBc0I7QUFBSTtBQUExQixNQUFvRDtBQUMvRCxVQUFLLENBQUMsTUFBTSxDQUFDLFVBQVAsQ0FBbUIsSUFBbkIsQ0FBTixFQUFrQztBQUNqQztBQUNBOztBQUVELFVBQUksU0FBSjtBQUFBLFVBQWUsQ0FBZjtBQUFBLFVBQWtCLENBQWxCO0FBQUEsVUFFQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBRmY7QUFBQSxVQUlDO0FBQ0EsTUFBQSxLQUFLLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFWLEdBQWtCLElBTGpDO0FBQUEsVUFNQyxFQUFFLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBRSxNQUFNLENBQUMsT0FBVCxDQUFQLEdBQTRCLE1BQU0sQ0FBQyxPQU4vQyxDQUwrRCxDQWEvRDtBQUNBOztBQUNBLFVBQUssQ0FBQyxLQUFLLENBQUUsRUFBRixDQUFYLEVBQW9CO0FBQ25CO0FBQ0E7O0FBRUQsVUFBSyxJQUFMLEVBQVk7QUFFWCxRQUFBLFNBQVMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFFLEVBQUYsQ0FBUixHQUFpQixLQUFLLENBQUUsRUFBRixDQUFMLENBQVksSUFBNUM7O0FBRUEsWUFBSyxTQUFMLEVBQWlCO0FBRWhCO0FBQ0EsY0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFQLENBQWdCLElBQWhCLENBQU4sRUFBK0I7QUFFOUI7QUFDQSxnQkFBSyxJQUFJLElBQUksU0FBYixFQUF5QjtBQUN4QixjQUFBLElBQUksR0FBRyxDQUFFLElBQUYsQ0FBUDtBQUNBLGFBRkQsTUFFTztBQUVOO0FBQ0EsY0FBQSxJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVAsQ0FBa0IsSUFBbEIsQ0FBUDs7QUFDQSxrQkFBSyxJQUFJLElBQUksU0FBYixFQUF5QjtBQUN4QixnQkFBQSxJQUFJLEdBQUcsQ0FBRSxJQUFGLENBQVA7QUFDQSxlQUZELE1BRU87QUFDTixnQkFBQSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUwsQ0FBVyxHQUFYLENBQVA7QUFDQTtBQUNEO0FBQ0Q7O0FBRUQsZUFBTSxDQUFDLEdBQUcsQ0FBSixFQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBdEIsRUFBOEIsQ0FBQyxHQUFHLENBQWxDLEVBQXFDLENBQUMsRUFBdEMsRUFBMkM7QUFDMUMsbUJBQU8sU0FBUyxDQUFFLElBQUksQ0FBQyxDQUFELENBQU4sQ0FBaEI7QUFDQSxXQXRCZSxDQXdCaEI7QUFDQTs7O0FBQ0EsY0FBSyxDQUFDLENBQUUsR0FBRyxHQUFHLGlCQUFILEdBQXVCLE1BQU0sQ0FBQyxhQUFuQyxFQUFvRCxTQUFwRCxDQUFOLEVBQXdFO0FBQ3ZFO0FBQ0E7QUFDRDtBQUNELE9BckQ4RCxDQXVEL0Q7OztBQUNBLFVBQUssQ0FBQyxHQUFOLEVBQVk7QUFDWCxlQUFPLEtBQUssQ0FBRSxFQUFGLENBQUwsQ0FBWSxJQUFuQixDQURXLENBR1g7QUFDQTs7QUFDQSxZQUFLLENBQUMsaUJBQWlCLENBQUUsS0FBSyxDQUFFLEVBQUYsQ0FBUCxDQUF2QixFQUF5QztBQUN4QztBQUNBO0FBQ0QsT0FoRThELENBa0UvRDs7O0FBQ0EsVUFBSyxNQUFMLEVBQWM7QUFDYixRQUFBLE1BQU0sQ0FBQyxTQUFQLENBQWtCLENBQUUsSUFBRixDQUFsQixFQUE0QixJQUE1QixFQURhLENBR2Q7QUFDQyxPQUpELE1BSU8sSUFBSyxNQUFNLENBQUMsT0FBUCxDQUFlLGFBQWYsSUFBZ0MsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFwRCxFQUE2RDtBQUNuRSxlQUFPLEtBQUssQ0FBRSxFQUFGLENBQVosQ0FEbUUsQ0FHcEU7QUFDQyxPQUpNLE1BSUE7QUFDTixRQUFBLEtBQUssQ0FBRSxFQUFGLENBQUwsR0FBYyxJQUFkO0FBQ0E7QUFDRCxLQXRNWTtBQXdNYjtBQUNBLElBQUEsS0FBSyxFQUFFLGVBQVUsSUFBVixFQUFnQixJQUFoQixFQUFzQixJQUF0QixFQUE2QjtBQUNuQyxhQUFPLE1BQU0sQ0FBQyxJQUFQLENBQWEsSUFBYixFQUFtQixJQUFuQixFQUF5QixJQUF6QixFQUErQixJQUEvQixDQUFQO0FBQ0EsS0EzTVk7QUE2TWI7QUFDQSxJQUFBLFVBQVUsRUFBRSxvQkFBVSxJQUFWLEVBQWlCO0FBQzVCLFVBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFMLElBQWlCLE1BQU0sQ0FBQyxNQUFQLENBQWUsSUFBSSxDQUFDLFFBQUwsQ0FBYyxXQUFkLEVBQWYsQ0FBOUIsQ0FENEIsQ0FHNUI7O0FBQ0EsYUFBTyxDQUFDLE1BQUQsSUFBVyxNQUFNLEtBQUssSUFBWCxJQUFtQixJQUFJLENBQUMsWUFBTCxDQUFrQixTQUFsQixNQUFpQyxNQUF0RTtBQUNBO0FBbk5ZLEdBQWQ7QUFzTkEsRUFBQSxNQUFNLENBQUMsRUFBUCxDQUFVLE1BQVYsQ0FBaUI7QUFDaEIsSUFBQSxJQUFJLEVBQUUsY0FBVSxHQUFWLEVBQWUsS0FBZixFQUF1QjtBQUM1QixVQUFJLEtBQUo7QUFBQSxVQUFXLElBQVg7QUFBQSxVQUFpQixJQUFqQjtBQUFBLFVBQXVCLElBQXZCO0FBQUEsVUFBNkIsQ0FBN0I7QUFBQSxVQUNDLElBQUksR0FBRyxLQUFLLENBQUwsQ0FEUjtBQUFBLFVBRUMsQ0FBQyxHQUFHLENBRkw7QUFBQSxVQUdDLElBQUksR0FBRyxJQUhSLENBRDRCLENBTTVCOztBQUNBLFVBQUssR0FBRyxLQUFLLFNBQWIsRUFBeUI7QUFDeEIsWUFBSyxLQUFLLE1BQVYsRUFBbUI7QUFDbEIsVUFBQSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQVAsQ0FBYSxJQUFiLENBQVA7O0FBRUEsY0FBSyxJQUFJLENBQUMsUUFBTCxLQUFrQixDQUFsQixJQUF1QixDQUFDLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZCxFQUFvQixhQUFwQixDQUE3QixFQUFtRTtBQUNsRSxZQUFBLElBQUksR0FBRyxJQUFJLENBQUMsVUFBWjs7QUFDQSxpQkFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQWYsRUFBdUIsQ0FBQyxHQUFHLENBQTNCLEVBQThCLENBQUMsRUFBL0IsRUFBb0M7QUFDbkMsY0FBQSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUQsQ0FBSixDQUFRLElBQWY7O0FBRUEsa0JBQUssSUFBSSxDQUFDLE9BQUwsQ0FBYyxPQUFkLE1BQTRCLENBQWpDLEVBQXFDO0FBQ3BDLGdCQUFBLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUCxDQUFrQixJQUFJLENBQUMsU0FBTCxDQUFlLENBQWYsQ0FBbEIsQ0FBUDtBQUVBLGdCQUFBLFFBQVEsQ0FBRSxJQUFGLEVBQVEsSUFBUixFQUFjLElBQUksQ0FBRSxJQUFGLENBQWxCLENBQVI7QUFDQTtBQUNEOztBQUNELFlBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYyxJQUFkLEVBQW9CLGFBQXBCLEVBQW1DLElBQW5DO0FBQ0E7QUFDRDs7QUFFRCxlQUFPLElBQVA7QUFDQSxPQTNCMkIsQ0E2QjVCOzs7QUFDQSxVQUFLLFFBQU8sR0FBUCxNQUFlLFFBQXBCLEVBQStCO0FBQzlCLGVBQU8sS0FBSyxJQUFMLENBQVUsWUFBVztBQUMzQixVQUFBLE1BQU0sQ0FBQyxJQUFQLENBQWEsSUFBYixFQUFtQixHQUFuQjtBQUNBLFNBRk0sQ0FBUDtBQUdBOztBQUVELE1BQUEsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFKLENBQVcsR0FBWCxFQUFnQixDQUFoQixDQUFSO0FBQ0EsTUFBQSxLQUFLLENBQUMsQ0FBRCxDQUFMLEdBQVcsS0FBSyxDQUFDLENBQUQsQ0FBTCxHQUFXLE1BQU0sS0FBSyxDQUFDLENBQUQsQ0FBdEIsR0FBNEIsRUFBdkM7QUFDQSxNQUFBLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBRCxDQUFMLEdBQVcsR0FBbEI7QUFFQSxhQUFPLE1BQU0sQ0FBQyxNQUFQLENBQWUsSUFBZixFQUFxQixVQUFVLEtBQVYsRUFBa0I7QUFFN0MsWUFBSyxLQUFLLEtBQUssU0FBZixFQUEyQjtBQUMxQixVQUFBLElBQUksR0FBRyxLQUFLLGNBQUwsQ0FBcUIsWUFBWSxJQUFqQyxFQUF1QyxDQUFFLEtBQUssQ0FBQyxDQUFELENBQVAsQ0FBdkMsQ0FBUCxDQUQwQixDQUcxQjs7QUFDQSxjQUFLLElBQUksS0FBSyxTQUFULElBQXNCLElBQTNCLEVBQWtDO0FBQ2pDLFlBQUEsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFQLENBQWEsSUFBYixFQUFtQixHQUFuQixDQUFQO0FBQ0EsWUFBQSxJQUFJLEdBQUcsUUFBUSxDQUFFLElBQUYsRUFBUSxHQUFSLEVBQWEsSUFBYixDQUFmO0FBQ0E7O0FBRUQsaUJBQU8sSUFBSSxLQUFLLFNBQVQsSUFBc0IsS0FBSyxDQUFDLENBQUQsQ0FBM0IsR0FDTixLQUFLLElBQUwsQ0FBVyxLQUFLLENBQUMsQ0FBRCxDQUFoQixDQURNLEdBRU4sSUFGRDtBQUdBOztBQUVELFFBQUEsS0FBSyxDQUFDLENBQUQsQ0FBTCxHQUFXLEtBQVg7QUFDQSxhQUFLLElBQUwsQ0FBVSxZQUFXO0FBQ3BCLGNBQUksSUFBSSxHQUFHLE1BQU0sQ0FBRSxJQUFGLENBQWpCO0FBRUEsVUFBQSxJQUFJLENBQUMsY0FBTCxDQUFxQixZQUFZLElBQWpDLEVBQXVDLEtBQXZDO0FBQ0EsVUFBQSxNQUFNLENBQUMsSUFBUCxDQUFhLElBQWIsRUFBbUIsR0FBbkIsRUFBd0IsS0FBeEI7QUFDQSxVQUFBLElBQUksQ0FBQyxjQUFMLENBQXFCLGVBQWUsSUFBcEMsRUFBMEMsS0FBMUM7QUFDQSxTQU5EO0FBT0EsT0F4Qk0sRUF3QkosSUF4QkksRUF3QkUsS0F4QkYsRUF3QlMsU0FBUyxDQUFDLE1BQVYsR0FBbUIsQ0F4QjVCLEVBd0IrQixJQXhCL0IsRUF3QnFDLEtBeEJyQyxDQUFQO0FBeUJBLEtBbEVlO0FBb0VoQixJQUFBLFVBQVUsRUFBRSxvQkFBVSxHQUFWLEVBQWdCO0FBQzNCLGFBQU8sS0FBSyxJQUFMLENBQVUsWUFBVztBQUMzQixRQUFBLE1BQU0sQ0FBQyxVQUFQLENBQW1CLElBQW5CLEVBQXlCLEdBQXpCO0FBQ0EsT0FGTSxDQUFQO0FBR0E7QUF4RWUsR0FBakI7O0FBMkVBLFdBQVMsUUFBVCxDQUFtQixJQUFuQixFQUF5QixHQUF6QixFQUE4QixJQUE5QixFQUFxQztBQUNwQztBQUNBO0FBQ0EsUUFBSyxJQUFJLEtBQUssU0FBVCxJQUFzQixJQUFJLENBQUMsUUFBTCxLQUFrQixDQUE3QyxFQUFpRDtBQUVoRCxVQUFJLElBQUksR0FBRyxVQUFVLEdBQUcsQ0FBQyxPQUFKLENBQWEsVUFBYixFQUF5QixLQUF6QixFQUFpQyxXQUFqQyxFQUFyQjtBQUVBLE1BQUEsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFMLENBQW1CLElBQW5CLENBQVA7O0FBRUEsVUFBSyxPQUFPLElBQVAsS0FBZ0IsUUFBckIsRUFBZ0M7QUFDL0IsWUFBSTtBQUNILFVBQUEsSUFBSSxHQUFHLElBQUksS0FBSyxNQUFULEdBQWtCLElBQWxCLEdBQ1AsSUFBSSxLQUFLLE9BQVQsR0FBbUIsS0FBbkIsR0FDQSxJQUFJLEtBQUssTUFBVCxHQUFrQixJQUFsQixHQUNBO0FBQ0EsV0FBQyxJQUFELEdBQVEsRUFBUixLQUFlLElBQWYsR0FBc0IsQ0FBQyxJQUF2QixHQUNBLE1BQU0sQ0FBQyxJQUFQLENBQWEsSUFBYixJQUFzQixNQUFNLENBQUMsU0FBUCxDQUFrQixJQUFsQixDQUF0QixHQUNDLElBTkQ7QUFPQSxTQVJELENBUUUsT0FBTyxDQUFQLEVBQVcsQ0FBRSxDQVRnQixDQVcvQjs7O0FBQ0EsUUFBQSxNQUFNLENBQUMsSUFBUCxDQUFhLElBQWIsRUFBbUIsR0FBbkIsRUFBd0IsSUFBeEI7QUFFQSxPQWRELE1BY087QUFDTixRQUFBLElBQUksR0FBRyxTQUFQO0FBQ0E7QUFDRDs7QUFFRCxXQUFPLElBQVA7QUFDQSxHQXZ4RDhCLENBeXhEL0I7OztBQUNBLFdBQVMsaUJBQVQsQ0FBNEIsR0FBNUIsRUFBa0M7QUFDakMsUUFBSSxJQUFKOztBQUNBLFNBQU0sSUFBTixJQUFjLEdBQWQsRUFBb0I7QUFFbkI7QUFDQSxVQUFLLElBQUksS0FBSyxNQUFULElBQW1CLE1BQU0sQ0FBQyxhQUFQLENBQXNCLEdBQUcsQ0FBQyxJQUFELENBQXpCLENBQXhCLEVBQTREO0FBQzNEO0FBQ0E7O0FBQ0QsVUFBSyxJQUFJLEtBQUssUUFBZCxFQUF5QjtBQUN4QixlQUFPLEtBQVA7QUFDQTtBQUNEOztBQUVELFdBQU8sSUFBUDtBQUNBOztBQUNELEVBQUEsTUFBTSxDQUFDLE1BQVAsQ0FBYztBQUNiLElBQUEsS0FBSyxFQUFFLGVBQVUsSUFBVixFQUFnQixJQUFoQixFQUFzQixJQUF0QixFQUE2QjtBQUNuQyxVQUFJLEtBQUo7O0FBRUEsVUFBSyxJQUFMLEVBQVk7QUFDWCxRQUFBLElBQUksR0FBRyxDQUFFLElBQUksSUFBSSxJQUFWLElBQW1CLE9BQTFCO0FBQ0EsUUFBQSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQVAsQ0FBYyxJQUFkLEVBQW9CLElBQXBCLENBQVIsQ0FGVyxDQUlYOztBQUNBLFlBQUssSUFBTCxFQUFZO0FBQ1gsY0FBSyxDQUFDLEtBQUQsSUFBVSxNQUFNLENBQUMsT0FBUCxDQUFlLElBQWYsQ0FBZixFQUFzQztBQUNyQyxZQUFBLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBUCxDQUFjLElBQWQsRUFBb0IsSUFBcEIsRUFBMEIsTUFBTSxDQUFDLFNBQVAsQ0FBaUIsSUFBakIsQ0FBMUIsQ0FBUjtBQUNBLFdBRkQsTUFFTztBQUNOLFlBQUEsS0FBSyxDQUFDLElBQU4sQ0FBWSxJQUFaO0FBQ0E7QUFDRDs7QUFDRCxlQUFPLEtBQUssSUFBSSxFQUFoQjtBQUNBO0FBQ0QsS0FsQlk7QUFvQmIsSUFBQSxPQUFPLEVBQUUsaUJBQVUsSUFBVixFQUFnQixJQUFoQixFQUF1QjtBQUMvQixNQUFBLElBQUksR0FBRyxJQUFJLElBQUksSUFBZjs7QUFFQSxVQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBUCxDQUFjLElBQWQsRUFBb0IsSUFBcEIsQ0FBWjtBQUFBLFVBQ0MsV0FBVyxHQUFHLEtBQUssQ0FBQyxNQURyQjtBQUFBLFVBRUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxLQUFOLEVBRk47QUFBQSxVQUdDLEtBQUssR0FBRyxNQUFNLENBQUMsV0FBUCxDQUFvQixJQUFwQixFQUEwQixJQUExQixDQUhUO0FBQUEsVUFJQyxJQUFJLEdBQUcsU0FBUCxJQUFPLEdBQVc7QUFDakIsUUFBQSxNQUFNLENBQUMsT0FBUCxDQUFnQixJQUFoQixFQUFzQixJQUF0QjtBQUNBLE9BTkYsQ0FIK0IsQ0FXL0I7OztBQUNBLFVBQUssRUFBRSxLQUFLLFlBQVosRUFBMkI7QUFDMUIsUUFBQSxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQU4sRUFBTDtBQUNBLFFBQUEsV0FBVztBQUNYOztBQUVELFVBQUssRUFBTCxFQUFVO0FBRVQ7QUFDQTtBQUNBLFlBQUssSUFBSSxLQUFLLElBQWQsRUFBcUI7QUFDcEIsVUFBQSxLQUFLLENBQUMsT0FBTixDQUFlLFlBQWY7QUFDQSxTQU5RLENBUVQ7OztBQUNBLGVBQU8sS0FBSyxDQUFDLElBQWI7QUFDQSxRQUFBLEVBQUUsQ0FBQyxJQUFILENBQVMsSUFBVCxFQUFlLElBQWYsRUFBcUIsS0FBckI7QUFDQTs7QUFFRCxVQUFLLENBQUMsV0FBRCxJQUFnQixLQUFyQixFQUE2QjtBQUM1QixRQUFBLEtBQUssQ0FBQyxLQUFOLENBQVksSUFBWjtBQUNBO0FBQ0QsS0FyRFk7QUF1RGI7QUFDQSxJQUFBLFdBQVcsRUFBRSxxQkFBVSxJQUFWLEVBQWdCLElBQWhCLEVBQXVCO0FBQ25DLFVBQUksR0FBRyxHQUFHLElBQUksR0FBRyxZQUFqQjtBQUNBLGFBQU8sTUFBTSxDQUFDLEtBQVAsQ0FBYyxJQUFkLEVBQW9CLEdBQXBCLEtBQTZCLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZCxFQUFvQixHQUFwQixFQUF5QjtBQUM1RCxRQUFBLEtBQUssRUFBRSxNQUFNLENBQUMsU0FBUCxDQUFpQixhQUFqQixFQUFnQyxHQUFoQyxDQUFvQyxZQUFXO0FBQ3JELFVBQUEsTUFBTSxDQUFDLFVBQVAsQ0FBbUIsSUFBbkIsRUFBeUIsSUFBSSxHQUFHLE9BQWhDLEVBQXlDLElBQXpDO0FBQ0EsVUFBQSxNQUFNLENBQUMsVUFBUCxDQUFtQixJQUFuQixFQUF5QixHQUF6QixFQUE4QixJQUE5QjtBQUNBLFNBSE07QUFEcUQsT0FBekIsQ0FBcEM7QUFNQTtBQWhFWSxHQUFkO0FBbUVBLEVBQUEsTUFBTSxDQUFDLEVBQVAsQ0FBVSxNQUFWLENBQWlCO0FBQ2hCLElBQUEsS0FBSyxFQUFFLGVBQVUsSUFBVixFQUFnQixJQUFoQixFQUF1QjtBQUM3QixVQUFJLE1BQU0sR0FBRyxDQUFiOztBQUVBLFVBQUssT0FBTyxJQUFQLEtBQWdCLFFBQXJCLEVBQWdDO0FBQy9CLFFBQUEsSUFBSSxHQUFHLElBQVA7QUFDQSxRQUFBLElBQUksR0FBRyxJQUFQO0FBQ0EsUUFBQSxNQUFNO0FBQ047O0FBRUQsVUFBSyxTQUFTLENBQUMsTUFBVixHQUFtQixNQUF4QixFQUFpQztBQUNoQyxlQUFPLE1BQU0sQ0FBQyxLQUFQLENBQWMsS0FBSyxDQUFMLENBQWQsRUFBdUIsSUFBdkIsQ0FBUDtBQUNBOztBQUVELGFBQU8sSUFBSSxLQUFLLFNBQVQsR0FDTixJQURNLEdBRU4sS0FBSyxJQUFMLENBQVUsWUFBVztBQUNwQixZQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBUCxDQUFjLElBQWQsRUFBb0IsSUFBcEIsRUFBMEIsSUFBMUIsQ0FBWixDQURvQixDQUdwQjs7QUFDQSxRQUFBLE1BQU0sQ0FBQyxXQUFQLENBQW9CLElBQXBCLEVBQTBCLElBQTFCOztBQUVBLFlBQUssSUFBSSxLQUFLLElBQVQsSUFBaUIsS0FBSyxDQUFDLENBQUQsQ0FBTCxLQUFhLFlBQW5DLEVBQWtEO0FBQ2pELFVBQUEsTUFBTSxDQUFDLE9BQVAsQ0FBZ0IsSUFBaEIsRUFBc0IsSUFBdEI7QUFDQTtBQUNELE9BVEQsQ0FGRDtBQVlBLEtBMUJlO0FBMkJoQixJQUFBLE9BQU8sRUFBRSxpQkFBVSxJQUFWLEVBQWlCO0FBQ3pCLGFBQU8sS0FBSyxJQUFMLENBQVUsWUFBVztBQUMzQixRQUFBLE1BQU0sQ0FBQyxPQUFQLENBQWdCLElBQWhCLEVBQXNCLElBQXRCO0FBQ0EsT0FGTSxDQUFQO0FBR0EsS0EvQmU7QUFnQ2hCO0FBQ0E7QUFDQSxJQUFBLEtBQUssRUFBRSxlQUFVLElBQVYsRUFBZ0IsSUFBaEIsRUFBdUI7QUFDN0IsTUFBQSxJQUFJLEdBQUcsTUFBTSxDQUFDLEVBQVAsR0FBWSxNQUFNLENBQUMsRUFBUCxDQUFVLE1BQVYsQ0FBa0IsSUFBbEIsS0FBNEIsSUFBeEMsR0FBK0MsSUFBdEQ7QUFDQSxNQUFBLElBQUksR0FBRyxJQUFJLElBQUksSUFBZjtBQUVBLGFBQU8sS0FBSyxLQUFMLENBQVksSUFBWixFQUFrQixVQUFVLElBQVYsRUFBZ0IsS0FBaEIsRUFBd0I7QUFDaEQsWUFBSSxPQUFPLEdBQUcsVUFBVSxDQUFFLElBQUYsRUFBUSxJQUFSLENBQXhCOztBQUNBLFFBQUEsS0FBSyxDQUFDLElBQU4sR0FBYSxZQUFXO0FBQ3ZCLFVBQUEsWUFBWSxDQUFFLE9BQUYsQ0FBWjtBQUNBLFNBRkQ7QUFHQSxPQUxNLENBQVA7QUFNQSxLQTVDZTtBQTZDaEIsSUFBQSxVQUFVLEVBQUUsb0JBQVUsSUFBVixFQUFpQjtBQUM1QixhQUFPLEtBQUssS0FBTCxDQUFZLElBQUksSUFBSSxJQUFwQixFQUEwQixFQUExQixDQUFQO0FBQ0EsS0EvQ2U7QUFnRGhCO0FBQ0E7QUFDQSxJQUFBLE9BQU8sRUFBRSxpQkFBVSxJQUFWLEVBQWdCLEdBQWhCLEVBQXNCO0FBQzlCLFVBQUksR0FBSjtBQUFBLFVBQ0MsS0FBSyxHQUFHLENBRFQ7QUFBQSxVQUVDLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUCxFQUZUO0FBQUEsVUFHQyxRQUFRLEdBQUcsSUFIWjtBQUFBLFVBSUMsQ0FBQyxHQUFHLEtBQUssTUFKVjtBQUFBLFVBS0MsT0FBTyxHQUFHLFNBQVYsT0FBVSxHQUFXO0FBQ3BCLFlBQUssQ0FBRyxHQUFFLEtBQVYsRUFBb0I7QUFDbkIsVUFBQSxLQUFLLENBQUMsV0FBTixDQUFtQixRQUFuQixFQUE2QixDQUFFLFFBQUYsQ0FBN0I7QUFDQTtBQUNELE9BVEY7O0FBV0EsVUFBSyxPQUFPLElBQVAsS0FBZ0IsUUFBckIsRUFBZ0M7QUFDL0IsUUFBQSxHQUFHLEdBQUcsSUFBTjtBQUNBLFFBQUEsSUFBSSxHQUFHLFNBQVA7QUFDQTs7QUFDRCxNQUFBLElBQUksR0FBRyxJQUFJLElBQUksSUFBZjs7QUFFQSxhQUFPLENBQUMsRUFBUixFQUFhO0FBQ1osUUFBQSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQVAsQ0FBYyxRQUFRLENBQUUsQ0FBRixDQUF0QixFQUE2QixJQUFJLEdBQUcsWUFBcEMsQ0FBTjs7QUFDQSxZQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBaEIsRUFBd0I7QUFDdkIsVUFBQSxLQUFLO0FBQ0wsVUFBQSxHQUFHLENBQUMsS0FBSixDQUFVLEdBQVYsQ0FBZSxPQUFmO0FBQ0E7QUFDRDs7QUFDRCxNQUFBLE9BQU87QUFDUCxhQUFPLEtBQUssQ0FBQyxPQUFOLENBQWUsR0FBZixDQUFQO0FBQ0E7QUE3RWUsR0FBakI7QUErRUEsTUFBSSxRQUFKO0FBQUEsTUFBYyxRQUFkO0FBQUEsTUFBd0IsWUFBeEI7QUFBQSxNQUNDLE1BQU0sR0FBRyxXQURWO0FBQUEsTUFFQyxPQUFPLEdBQUcsS0FGWDtBQUFBLE1BR0MsS0FBSyxHQUFHLHFCQUhUO0FBQUEsTUFJQyxVQUFVLEdBQUcsNENBSmQ7QUFBQSxNQUtDLFVBQVUsR0FBRyxjQUxkO0FBQUEsTUFNQyxRQUFRLEdBQUcsNkhBTlo7QUFBQSxNQU9DLGVBQWUsR0FBRyxNQUFNLENBQUMsT0FBUCxDQUFlLGVBUGxDO0FBU0EsRUFBQSxNQUFNLENBQUMsRUFBUCxDQUFVLE1BQVYsQ0FBaUI7QUFDaEIsSUFBQSxJQUFJLEVBQUUsY0FBVSxJQUFWLEVBQWdCLEtBQWhCLEVBQXdCO0FBQzdCLGFBQU8sTUFBTSxDQUFDLE1BQVAsQ0FBZSxJQUFmLEVBQXFCLE1BQU0sQ0FBQyxJQUE1QixFQUFrQyxJQUFsQyxFQUF3QyxLQUF4QyxFQUErQyxTQUFTLENBQUMsTUFBVixHQUFtQixDQUFsRSxDQUFQO0FBQ0EsS0FIZTtBQUtoQixJQUFBLFVBQVUsRUFBRSxvQkFBVSxJQUFWLEVBQWlCO0FBQzVCLGFBQU8sS0FBSyxJQUFMLENBQVUsWUFBVztBQUMzQixRQUFBLE1BQU0sQ0FBQyxVQUFQLENBQW1CLElBQW5CLEVBQXlCLElBQXpCO0FBQ0EsT0FGTSxDQUFQO0FBR0EsS0FUZTtBQVdoQixJQUFBLElBQUksRUFBRSxjQUFVLElBQVYsRUFBZ0IsS0FBaEIsRUFBd0I7QUFDN0IsYUFBTyxNQUFNLENBQUMsTUFBUCxDQUFlLElBQWYsRUFBcUIsTUFBTSxDQUFDLElBQTVCLEVBQWtDLElBQWxDLEVBQXdDLEtBQXhDLEVBQStDLFNBQVMsQ0FBQyxNQUFWLEdBQW1CLENBQWxFLENBQVA7QUFDQSxLQWJlO0FBZWhCLElBQUEsVUFBVSxFQUFFLG9CQUFVLElBQVYsRUFBaUI7QUFDNUIsTUFBQSxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQVAsQ0FBZ0IsSUFBaEIsS0FBMEIsSUFBakM7QUFDQSxhQUFPLEtBQUssSUFBTCxDQUFVLFlBQVc7QUFDM0I7QUFDQSxZQUFJO0FBQ0gsZUFBTSxJQUFOLElBQWUsU0FBZjtBQUNBLGlCQUFPLEtBQU0sSUFBTixDQUFQO0FBQ0EsU0FIRCxDQUdFLE9BQU8sQ0FBUCxFQUFXLENBQUU7QUFDZixPQU5NLENBQVA7QUFPQSxLQXhCZTtBQTBCaEIsSUFBQSxRQUFRLEVBQUUsa0JBQVUsS0FBVixFQUFrQjtBQUMzQixVQUFJLFVBQUosRUFBZ0IsQ0FBaEIsRUFBbUIsQ0FBbkIsRUFBc0IsSUFBdEIsRUFDQyxRQURELEVBQ1csQ0FEWCxFQUNjLEVBRGQ7O0FBR0EsVUFBSyxNQUFNLENBQUMsVUFBUCxDQUFtQixLQUFuQixDQUFMLEVBQWtDO0FBQ2pDLGVBQU8sS0FBSyxJQUFMLENBQVUsVUFBVSxDQUFWLEVBQWM7QUFDOUIsVUFBQSxNQUFNLENBQUUsSUFBRixDQUFOLENBQWUsUUFBZixDQUF5QixLQUFLLENBQUMsSUFBTixDQUFXLElBQVgsRUFBaUIsQ0FBakIsRUFBb0IsS0FBSyxTQUF6QixDQUF6QjtBQUNBLFNBRk0sQ0FBUDtBQUdBOztBQUVELFVBQUssS0FBSyxJQUFJLE9BQU8sS0FBUCxLQUFpQixRQUEvQixFQUEwQztBQUN6QyxRQUFBLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBTixDQUFhLFdBQWIsQ0FBYjs7QUFFQSxhQUFNLENBQUMsR0FBRyxDQUFKLEVBQU8sQ0FBQyxHQUFHLEtBQUssTUFBdEIsRUFBOEIsQ0FBQyxHQUFHLENBQWxDLEVBQXFDLENBQUMsRUFBdEMsRUFBMkM7QUFDMUMsVUFBQSxJQUFJLEdBQUcsS0FBTSxDQUFOLENBQVA7O0FBRUEsY0FBSyxJQUFJLENBQUMsUUFBTCxLQUFrQixDQUF2QixFQUEyQjtBQUMxQixnQkFBSyxDQUFDLElBQUksQ0FBQyxTQUFOLElBQW1CLFVBQVUsQ0FBQyxNQUFYLEtBQXNCLENBQTlDLEVBQWtEO0FBQ2pELGNBQUEsSUFBSSxDQUFDLFNBQUwsR0FBaUIsS0FBakI7QUFFQSxhQUhELE1BR087QUFDTixjQUFBLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFYLEdBQXVCLEdBQWxDOztBQUVBLG1CQUFNLENBQUMsR0FBRyxDQUFKLEVBQU8sRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUE3QixFQUFxQyxDQUFDLEdBQUcsRUFBekMsRUFBNkMsQ0FBQyxFQUE5QyxFQUFtRDtBQUNsRCxvQkFBSyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQVQsQ0FBa0IsTUFBTSxVQUFVLENBQUUsQ0FBRixDQUFoQixHQUF3QixHQUExQyxDQUFQLEVBQXlEO0FBQ3hELGtCQUFBLFFBQVEsSUFBSSxVQUFVLENBQUUsQ0FBRixDQUFWLEdBQWtCLEdBQTlCO0FBQ0E7QUFDRDs7QUFDRCxjQUFBLElBQUksQ0FBQyxTQUFMLEdBQWlCLE1BQU0sQ0FBQyxJQUFQLENBQWEsUUFBYixDQUFqQjtBQUNBO0FBQ0Q7QUFDRDtBQUNEOztBQUVELGFBQU8sSUFBUDtBQUNBLEtBN0RlO0FBK0RoQixJQUFBLFdBQVcsRUFBRSxxQkFBVSxLQUFWLEVBQWtCO0FBQzlCLFVBQUksT0FBSixFQUFhLFNBQWIsRUFBd0IsSUFBeEIsRUFBOEIsQ0FBOUIsRUFBaUMsRUFBakMsRUFBcUMsQ0FBckMsRUFBd0MsQ0FBeEM7O0FBRUEsVUFBSyxNQUFNLENBQUMsVUFBUCxDQUFtQixLQUFuQixDQUFMLEVBQWtDO0FBQ2pDLGVBQU8sS0FBSyxJQUFMLENBQVUsVUFBVSxDQUFWLEVBQWM7QUFDOUIsVUFBQSxNQUFNLENBQUUsSUFBRixDQUFOLENBQWUsV0FBZixDQUE0QixLQUFLLENBQUMsSUFBTixDQUFXLElBQVgsRUFBaUIsQ0FBakIsRUFBb0IsS0FBSyxTQUF6QixDQUE1QjtBQUNBLFNBRk0sQ0FBUDtBQUdBOztBQUNELFVBQU0sS0FBSyxJQUFJLE9BQU8sS0FBUCxLQUFpQixRQUEzQixJQUF3QyxLQUFLLEtBQUssU0FBdkQsRUFBbUU7QUFDbEUsUUFBQSxPQUFPLEdBQUcsQ0FBRSxLQUFLLElBQUksRUFBWCxFQUFnQixLQUFoQixDQUF1QixXQUF2QixDQUFWOztBQUVBLGFBQU0sQ0FBQyxHQUFHLENBQUosRUFBTyxDQUFDLEdBQUcsS0FBSyxNQUF0QixFQUE4QixDQUFDLEdBQUcsQ0FBbEMsRUFBcUMsQ0FBQyxFQUF0QyxFQUEyQztBQUMxQyxVQUFBLElBQUksR0FBRyxLQUFNLENBQU4sQ0FBUDs7QUFDQSxjQUFLLElBQUksQ0FBQyxRQUFMLEtBQWtCLENBQWxCLElBQXVCLElBQUksQ0FBQyxTQUFqQyxFQUE2QztBQUU1QyxZQUFBLFNBQVMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLFNBQVgsR0FBdUIsR0FBeEIsRUFBNkIsT0FBN0IsQ0FBc0MsTUFBdEMsRUFBOEMsR0FBOUMsQ0FBWixDQUY0QyxDQUk1Qzs7QUFDQSxpQkFBTSxDQUFDLEdBQUcsQ0FBSixFQUFPLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFBMUIsRUFBa0MsQ0FBQyxHQUFHLEVBQXRDLEVBQTBDLENBQUMsRUFBM0MsRUFBZ0Q7QUFDL0M7QUFDQSxxQkFBUSxTQUFTLENBQUMsT0FBVixDQUFrQixNQUFNLE9BQU8sQ0FBRSxDQUFGLENBQWIsR0FBcUIsR0FBdkMsSUFBOEMsQ0FBQyxDQUF2RCxFQUEyRDtBQUMxRCxnQkFBQSxTQUFTLEdBQUcsU0FBUyxDQUFDLE9BQVYsQ0FBbUIsTUFBTSxPQUFPLENBQUUsQ0FBRixDQUFiLEdBQXFCLEdBQXhDLEVBQThDLEdBQTlDLENBQVo7QUFDQTtBQUNEOztBQUNELFlBQUEsSUFBSSxDQUFDLFNBQUwsR0FBaUIsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFQLENBQWEsU0FBYixDQUFILEdBQThCLEVBQXBEO0FBQ0E7QUFDRDtBQUNEOztBQUVELGFBQU8sSUFBUDtBQUNBLEtBN0ZlO0FBK0ZoQixJQUFBLFdBQVcsRUFBRSxxQkFBVSxLQUFWLEVBQWlCLFFBQWpCLEVBQTRCO0FBQ3hDLFVBQUksSUFBSSxXQUFVLEtBQVYsQ0FBUjtBQUFBLFVBQ0MsTUFBTSxHQUFHLE9BQU8sUUFBUCxLQUFvQixTQUQ5Qjs7QUFHQSxVQUFLLE1BQU0sQ0FBQyxVQUFQLENBQW1CLEtBQW5CLENBQUwsRUFBa0M7QUFDakMsZUFBTyxLQUFLLElBQUwsQ0FBVSxVQUFVLENBQVYsRUFBYztBQUM5QixVQUFBLE1BQU0sQ0FBRSxJQUFGLENBQU4sQ0FBZSxXQUFmLENBQTRCLEtBQUssQ0FBQyxJQUFOLENBQVcsSUFBWCxFQUFpQixDQUFqQixFQUFvQixLQUFLLFNBQXpCLEVBQW9DLFFBQXBDLENBQTVCLEVBQTJFLFFBQTNFO0FBQ0EsU0FGTSxDQUFQO0FBR0E7O0FBRUQsYUFBTyxLQUFLLElBQUwsQ0FBVSxZQUFXO0FBQzNCLFlBQUssSUFBSSxLQUFLLFFBQWQsRUFBeUI7QUFDeEI7QUFDQSxjQUFJLFNBQUo7QUFBQSxjQUNDLENBQUMsR0FBRyxDQURMO0FBQUEsY0FFQyxJQUFJLEdBQUcsTUFBTSxDQUFFLElBQUYsQ0FGZDtBQUFBLGNBR0MsS0FBSyxHQUFHLFFBSFQ7QUFBQSxjQUlDLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBTixDQUFhLFdBQWIsQ0FKZDs7QUFNQSxpQkFBUyxTQUFTLEdBQUcsVUFBVSxDQUFFLENBQUMsRUFBSCxDQUEvQixFQUEwQztBQUN6QztBQUNBLFlBQUEsS0FBSyxHQUFHLE1BQU0sR0FBRyxLQUFILEdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBTCxDQUFlLFNBQWYsQ0FBMUI7QUFDQSxZQUFBLElBQUksQ0FBRSxLQUFLLEdBQUcsVUFBSCxHQUFnQixhQUF2QixDQUFKLENBQTRDLFNBQTVDO0FBQ0E7QUFFRCxTQWRELE1BY08sSUFBSyxJQUFJLEtBQUssV0FBVCxJQUF3QixJQUFJLEtBQUssU0FBdEMsRUFBa0Q7QUFDeEQsY0FBSyxLQUFLLFNBQVYsRUFBc0I7QUFDckI7QUFDQSxZQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZCxFQUFvQixlQUFwQixFQUFxQyxLQUFLLFNBQTFDO0FBQ0EsV0FKdUQsQ0FNeEQ7OztBQUNBLGVBQUssU0FBTCxHQUFpQixLQUFLLFNBQUwsSUFBa0IsS0FBSyxLQUFLLEtBQTVCLEdBQW9DLEVBQXBDLEdBQXlDLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZCxFQUFvQixlQUFwQixLQUF5QyxFQUFuRztBQUNBO0FBQ0QsT0F4Qk0sQ0FBUDtBQXlCQSxLQWxJZTtBQW9JaEIsSUFBQSxRQUFRLEVBQUUsa0JBQVUsUUFBVixFQUFxQjtBQUM5QixVQUFJLFNBQVMsR0FBRyxNQUFNLFFBQU4sR0FBaUIsR0FBakM7QUFBQSxVQUNDLENBQUMsR0FBRyxDQURMO0FBQUEsVUFFQyxDQUFDLEdBQUcsS0FBSyxNQUZWOztBQUdBLGFBQVEsQ0FBQyxHQUFHLENBQVosRUFBZSxDQUFDLEVBQWhCLEVBQXFCO0FBQ3BCLFlBQUssS0FBSyxDQUFMLEVBQVEsUUFBUixLQUFxQixDQUFyQixJQUEwQixDQUFDLE1BQU0sS0FBSyxDQUFMLEVBQVEsU0FBZCxHQUEwQixHQUEzQixFQUFnQyxPQUFoQyxDQUF3QyxNQUF4QyxFQUFnRCxHQUFoRCxFQUFxRCxPQUFyRCxDQUE4RCxTQUE5RCxJQUE0RSxDQUFDLENBQTVHLEVBQWdIO0FBQy9HLGlCQUFPLElBQVA7QUFDQTtBQUNEOztBQUVELGFBQU8sS0FBUDtBQUNBLEtBL0llO0FBaUpoQixJQUFBLEdBQUcsRUFBRSxhQUFVLEtBQVYsRUFBa0I7QUFDdEIsVUFBSSxLQUFKO0FBQUEsVUFBVyxHQUFYO0FBQUEsVUFBZ0IsVUFBaEI7QUFBQSxVQUNDLElBQUksR0FBRyxLQUFLLENBQUwsQ0FEUjs7QUFHQSxVQUFLLENBQUMsU0FBUyxDQUFDLE1BQWhCLEVBQXlCO0FBQ3hCLFlBQUssSUFBTCxFQUFZO0FBQ1gsVUFBQSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVAsQ0FBaUIsSUFBSSxDQUFDLElBQXRCLEtBQWdDLE1BQU0sQ0FBQyxRQUFQLENBQWlCLElBQUksQ0FBQyxRQUFMLENBQWMsV0FBZCxFQUFqQixDQUF4Qzs7QUFFQSxjQUFLLEtBQUssSUFBSSxTQUFTLEtBQWxCLElBQTJCLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFOLENBQVcsSUFBWCxFQUFpQixPQUFqQixDQUFQLE1BQXVDLFNBQXZFLEVBQW1GO0FBQ2xGLG1CQUFPLEdBQVA7QUFDQTs7QUFFRCxVQUFBLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBWDtBQUVBLGlCQUFPLE9BQU8sR0FBUCxLQUFlLFFBQWYsR0FDTjtBQUNBLFVBQUEsR0FBRyxDQUFDLE9BQUosQ0FBWSxPQUFaLEVBQXFCLEVBQXJCLENBRk0sR0FHTjtBQUNBLFVBQUEsR0FBRyxJQUFJLElBQVAsR0FBYyxFQUFkLEdBQW1CLEdBSnBCO0FBS0E7O0FBRUQ7QUFDQTs7QUFFRCxNQUFBLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBUCxDQUFtQixLQUFuQixDQUFiO0FBRUEsYUFBTyxLQUFLLElBQUwsQ0FBVSxVQUFVLENBQVYsRUFBYztBQUM5QixZQUFJLEdBQUo7QUFBQSxZQUNDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBRCxDQURkOztBQUdBLFlBQUssS0FBSyxRQUFMLEtBQWtCLENBQXZCLEVBQTJCO0FBQzFCO0FBQ0E7O0FBRUQsWUFBSyxVQUFMLEVBQWtCO0FBQ2pCLFVBQUEsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFOLENBQVksSUFBWixFQUFrQixDQUFsQixFQUFxQixJQUFJLENBQUMsR0FBTCxFQUFyQixDQUFOO0FBQ0EsU0FGRCxNQUVPO0FBQ04sVUFBQSxHQUFHLEdBQUcsS0FBTjtBQUNBLFNBWjZCLENBYzlCOzs7QUFDQSxZQUFLLEdBQUcsSUFBSSxJQUFaLEVBQW1CO0FBQ2xCLFVBQUEsR0FBRyxHQUFHLEVBQU47QUFDQSxTQUZELE1BRU8sSUFBSyxPQUFPLEdBQVAsS0FBZSxRQUFwQixFQUErQjtBQUNyQyxVQUFBLEdBQUcsSUFBSSxFQUFQO0FBQ0EsU0FGTSxNQUVBLElBQUssTUFBTSxDQUFDLE9BQVAsQ0FBZ0IsR0FBaEIsQ0FBTCxFQUE2QjtBQUNuQyxVQUFBLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBUCxDQUFXLEdBQVgsRUFBZ0IsVUFBVyxLQUFYLEVBQW1CO0FBQ3hDLG1CQUFPLEtBQUssSUFBSSxJQUFULEdBQWdCLEVBQWhCLEdBQXFCLEtBQUssR0FBRyxFQUFwQztBQUNBLFdBRkssQ0FBTjtBQUdBOztBQUVELFFBQUEsS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFQLENBQWlCLEtBQUssSUFBdEIsS0FBZ0MsTUFBTSxDQUFDLFFBQVAsQ0FBaUIsS0FBSyxRQUFMLENBQWMsV0FBZCxFQUFqQixDQUF4QyxDQXpCOEIsQ0EyQjlCOztBQUNBLFlBQUssQ0FBQyxLQUFELElBQVUsRUFBRSxTQUFTLEtBQVgsQ0FBVixJQUErQixLQUFLLENBQUMsR0FBTixDQUFXLElBQVgsRUFBaUIsR0FBakIsRUFBc0IsT0FBdEIsTUFBb0MsU0FBeEUsRUFBb0Y7QUFDbkYsZUFBSyxLQUFMLEdBQWEsR0FBYjtBQUNBO0FBQ0QsT0EvQk0sQ0FBUDtBQWdDQTtBQTNNZSxHQUFqQjtBQThNQSxFQUFBLE1BQU0sQ0FBQyxNQUFQLENBQWM7QUFDYixJQUFBLFFBQVEsRUFBRTtBQUNULE1BQUEsTUFBTSxFQUFFO0FBQ1AsUUFBQSxHQUFHLEVBQUUsYUFBVSxJQUFWLEVBQWlCO0FBQ3JCO0FBQ0E7QUFDQSxjQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBTCxDQUFnQixLQUExQjtBQUNBLGlCQUFPLENBQUMsR0FBRCxJQUFRLEdBQUcsQ0FBQyxTQUFaLEdBQXdCLElBQUksQ0FBQyxLQUE3QixHQUFxQyxJQUFJLENBQUMsSUFBakQ7QUFDQTtBQU5NLE9BREM7QUFTVCxNQUFBLE1BQU0sRUFBRTtBQUNQLFFBQUEsR0FBRyxFQUFFLGFBQVUsSUFBVixFQUFpQjtBQUNyQixjQUFJLEtBQUo7QUFBQSxjQUFXLENBQVg7QUFBQSxjQUFjLEdBQWQ7QUFBQSxjQUFtQixNQUFuQjtBQUFBLGNBQ0MsS0FBSyxHQUFHLElBQUksQ0FBQyxhQURkO0FBQUEsY0FFQyxNQUFNLEdBQUcsRUFGVjtBQUFBLGNBR0MsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUhoQjtBQUFBLGNBSUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFMLEtBQWMsWUFKckIsQ0FEcUIsQ0FPckI7O0FBQ0EsY0FBSyxLQUFLLEdBQUcsQ0FBYixFQUFpQjtBQUNoQixtQkFBTyxJQUFQO0FBQ0EsV0FWb0IsQ0FZckI7OztBQUNBLFVBQUEsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFILEdBQVcsQ0FBbEI7QUFDQSxVQUFBLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLENBQVgsR0FBZSxPQUFPLENBQUMsTUFBaEM7O0FBQ0EsaUJBQVEsQ0FBQyxHQUFHLEdBQVosRUFBaUIsQ0FBQyxFQUFsQixFQUF1QjtBQUN0QixZQUFBLE1BQU0sR0FBRyxPQUFPLENBQUUsQ0FBRixDQUFoQixDQURzQixDQUd0Qjs7QUFDQSxnQkFBSyxNQUFNLENBQUMsUUFBUCxLQUFvQixNQUFNLENBQUMsT0FBUCxDQUFlLFdBQWYsR0FBNkIsQ0FBQyxNQUFNLENBQUMsUUFBckMsR0FBZ0QsTUFBTSxDQUFDLFlBQVAsQ0FBb0IsVUFBcEIsTUFBb0MsSUFBeEcsTUFDRixDQUFDLE1BQU0sQ0FBQyxVQUFQLENBQWtCLFFBQW5CLElBQStCLENBQUMsTUFBTSxDQUFDLFFBQVAsQ0FBaUIsTUFBTSxDQUFDLFVBQXhCLEVBQW9DLFVBQXBDLENBRDlCLENBQUwsRUFDdUY7QUFFdEY7QUFDQSxjQUFBLEtBQUssR0FBRyxNQUFNLENBQUUsTUFBRixDQUFOLENBQWlCLEdBQWpCLEVBQVIsQ0FIc0YsQ0FLdEY7O0FBQ0Esa0JBQUssR0FBTCxFQUFXO0FBQ1YsdUJBQU8sS0FBUDtBQUNBLGVBUnFGLENBVXRGOzs7QUFDQSxjQUFBLE1BQU0sQ0FBQyxJQUFQLENBQWEsS0FBYjtBQUNBO0FBQ0QsV0FqQ29CLENBbUNyQjs7O0FBQ0EsY0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBZixJQUF5QixPQUFPLENBQUMsTUFBdEMsRUFBK0M7QUFDOUMsbUJBQU8sTUFBTSxDQUFFLE9BQU8sQ0FBRSxLQUFGLENBQVQsQ0FBTixDQUEyQixHQUEzQixFQUFQO0FBQ0E7O0FBRUQsaUJBQU8sTUFBUDtBQUNBLFNBMUNNO0FBNENQLFFBQUEsR0FBRyxFQUFFLGFBQVUsSUFBVixFQUFnQixLQUFoQixFQUF3QjtBQUM1QixjQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUCxDQUFrQixLQUFsQixDQUFiO0FBRUEsVUFBQSxNQUFNLENBQUMsSUFBRCxDQUFOLENBQWEsSUFBYixDQUFrQixRQUFsQixFQUE0QixJQUE1QixDQUFpQyxZQUFXO0FBQzNDLGlCQUFLLFFBQUwsR0FBZ0IsTUFBTSxDQUFDLE9BQVAsQ0FBZ0IsTUFBTSxDQUFDLElBQUQsQ0FBTixDQUFhLEdBQWIsRUFBaEIsRUFBb0MsTUFBcEMsS0FBZ0QsQ0FBaEU7QUFDQSxXQUZEOztBQUlBLGNBQUssQ0FBQyxNQUFNLENBQUMsTUFBYixFQUFzQjtBQUNyQixZQUFBLElBQUksQ0FBQyxhQUFMLEdBQXFCLENBQUMsQ0FBdEI7QUFDQTs7QUFDRCxpQkFBTyxNQUFQO0FBQ0E7QUF2RE07QUFUQyxLQURHO0FBcUViO0FBQ0EsSUFBQSxNQUFNLEVBQUUsRUF0RUs7QUF3RWIsSUFBQSxJQUFJLEVBQUUsY0FBVSxJQUFWLEVBQWdCLElBQWhCLEVBQXNCLEtBQXRCLEVBQTZCLElBQTdCLEVBQW9DO0FBQ3pDLFVBQUksR0FBSjtBQUFBLFVBQVMsS0FBVDtBQUFBLFVBQWdCLE1BQWhCO0FBQUEsVUFDQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBRGQsQ0FEeUMsQ0FJekM7O0FBQ0EsVUFBSyxDQUFDLElBQUQsSUFBUyxLQUFLLEtBQUssQ0FBbkIsSUFBd0IsS0FBSyxLQUFLLENBQWxDLElBQXVDLEtBQUssS0FBSyxDQUF0RCxFQUEwRDtBQUN6RDtBQUNBOztBQUVELFVBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxVQUFQLENBQW1CLE1BQU0sQ0FBQyxFQUFQLENBQVcsSUFBWCxDQUFuQixDQUFiLEVBQXNEO0FBQ3JELGVBQU8sTUFBTSxDQUFFLElBQUYsQ0FBTixDQUFnQixJQUFoQixFQUF3QixLQUF4QixDQUFQO0FBQ0EsT0FYd0MsQ0FhekM7OztBQUNBLFVBQUssT0FBTyxJQUFJLENBQUMsWUFBWixLQUE2QixXQUFsQyxFQUFnRDtBQUMvQyxlQUFPLE1BQU0sQ0FBQyxJQUFQLENBQWEsSUFBYixFQUFtQixJQUFuQixFQUF5QixLQUF6QixDQUFQO0FBQ0E7O0FBRUQsTUFBQSxNQUFNLEdBQUcsS0FBSyxLQUFLLENBQVYsSUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFQLENBQWlCLElBQWpCLENBQXpCLENBbEJ5QyxDQW9CekM7QUFDQTs7QUFDQSxVQUFLLE1BQUwsRUFBYztBQUNiLFFBQUEsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFMLEVBQVA7QUFDQSxRQUFBLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUCxDQUFrQixJQUFsQixNQUE4QixRQUFRLENBQUMsSUFBVCxDQUFlLElBQWYsSUFBd0IsUUFBeEIsR0FBbUMsUUFBakUsQ0FBUjtBQUNBOztBQUVELFVBQUssS0FBSyxLQUFLLFNBQWYsRUFBMkI7QUFFMUIsWUFBSyxLQUFLLEtBQUssSUFBZixFQUFzQjtBQUNyQixVQUFBLE1BQU0sQ0FBQyxVQUFQLENBQW1CLElBQW5CLEVBQXlCLElBQXpCO0FBQ0E7QUFFQSxTQUpELE1BSU8sSUFBSyxLQUFLLElBQUksU0FBUyxLQUFsQixJQUEyQixNQUEzQixJQUFxQyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBTixDQUFXLElBQVgsRUFBaUIsS0FBakIsRUFBd0IsSUFBeEIsQ0FBUCxNQUEyQyxTQUFyRixFQUFpRztBQUN2RyxpQkFBTyxHQUFQO0FBRUEsU0FITSxNQUdBO0FBQ04sVUFBQSxJQUFJLENBQUMsWUFBTCxDQUFtQixJQUFuQixFQUF5QixLQUFLLEtBQTlCO0FBQ0EsaUJBQU8sS0FBUDtBQUNBO0FBRUQsT0FkRCxNQWNPLElBQUssS0FBSyxJQUFJLFNBQVMsS0FBbEIsSUFBMkIsTUFBM0IsSUFBcUMsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQU4sQ0FBVyxJQUFYLEVBQWlCLElBQWpCLENBQVAsTUFBb0MsSUFBOUUsRUFBcUY7QUFDM0YsZUFBTyxHQUFQO0FBRUEsT0FITSxNQUdBO0FBRU4sUUFBQSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQUwsQ0FBbUIsSUFBbkIsQ0FBTixDQUZNLENBSU47O0FBQ0EsZUFBTyxHQUFHLEtBQUssSUFBUixHQUNOLFNBRE0sR0FFTixHQUZEO0FBR0E7QUFDRCxLQTdIWTtBQStIYixJQUFBLFVBQVUsRUFBRSxvQkFBVSxJQUFWLEVBQWdCLEtBQWhCLEVBQXdCO0FBQ25DLFVBQUksUUFBSjtBQUFBLFVBQWMsU0FBZDtBQUFBLFVBQXlCLElBQXpCO0FBQUEsVUFBK0IsTUFBL0I7QUFBQSxVQUNDLENBQUMsR0FBRyxDQURMOztBQUdBLFVBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFMLEtBQWtCLENBQWhDLEVBQW9DO0FBRW5DLFFBQUEsU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFOLENBQWEsV0FBYixDQUFaOztBQUVBLGVBQVEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUF0QixFQUE4QixDQUFDLEVBQS9CLEVBQW9DO0FBQ25DLFVBQUEsSUFBSSxHQUFHLFNBQVMsQ0FBRSxDQUFGLENBQWhCOztBQUVBLGNBQUssSUFBTCxFQUFZO0FBQ1gsWUFBQSxRQUFRLEdBQUcsTUFBTSxDQUFDLE9BQVAsQ0FBZ0IsSUFBaEIsS0FBMEIsSUFBckM7QUFDQSxZQUFBLE1BQU0sR0FBRyxRQUFRLENBQUMsSUFBVCxDQUFlLElBQWYsQ0FBVCxDQUZXLENBSVg7QUFDQTs7QUFDQSxnQkFBSyxDQUFDLE1BQU4sRUFBZTtBQUNkLGNBQUEsTUFBTSxDQUFDLElBQVAsQ0FBYSxJQUFiLEVBQW1CLElBQW5CLEVBQXlCLEVBQXpCO0FBQ0E7O0FBQ0QsWUFBQSxJQUFJLENBQUMsZUFBTCxDQUFzQixlQUFlLEdBQUcsSUFBSCxHQUFVLFFBQS9DLEVBVFcsQ0FXWDs7QUFDQSxnQkFBSyxNQUFNLElBQUksUUFBUSxJQUFJLElBQTNCLEVBQWtDO0FBQ2pDLGNBQUEsSUFBSSxDQUFFLFFBQUYsQ0FBSixHQUFtQixLQUFuQjtBQUNBO0FBQ0Q7QUFDRDtBQUNEO0FBQ0QsS0E1Slk7QUE4SmIsSUFBQSxTQUFTLEVBQUU7QUFDVixNQUFBLElBQUksRUFBRTtBQUNMLFFBQUEsR0FBRyxFQUFFLGFBQVUsSUFBVixFQUFnQixLQUFoQixFQUF3QjtBQUM1QjtBQUNBLGNBQUssS0FBSyxDQUFDLElBQU4sQ0FBWSxJQUFJLENBQUMsUUFBakIsS0FBK0IsSUFBSSxDQUFDLFVBQXpDLEVBQXNEO0FBQ3JELFlBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYyxnQ0FBZDtBQUNBLFdBRkQsTUFFTyxJQUFLLENBQUMsTUFBTSxDQUFDLE9BQVAsQ0FBZSxVQUFoQixJQUE4QixLQUFLLEtBQUssT0FBeEMsSUFBbUQsTUFBTSxDQUFDLFFBQVAsQ0FBZ0IsSUFBaEIsRUFBc0IsT0FBdEIsQ0FBeEQsRUFBeUY7QUFDL0Y7QUFDQTtBQUNBO0FBQ0EsZ0JBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFmO0FBQ0EsWUFBQSxJQUFJLENBQUMsWUFBTCxDQUFtQixNQUFuQixFQUEyQixLQUEzQjs7QUFDQSxnQkFBSyxHQUFMLEVBQVc7QUFDVixjQUFBLElBQUksQ0FBQyxLQUFMLEdBQWEsR0FBYjtBQUNBOztBQUNELG1CQUFPLEtBQVA7QUFDQTtBQUNEO0FBaEJJLE9BREk7QUFtQlY7QUFDQTtBQUNBLE1BQUEsS0FBSyxFQUFFO0FBQ04sUUFBQSxHQUFHLEVBQUUsYUFBVSxJQUFWLEVBQWdCLElBQWhCLEVBQXVCO0FBQzNCLGNBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFQLENBQWlCLElBQWpCLEVBQXVCLFFBQXZCLENBQWpCLEVBQXFEO0FBQ3BELG1CQUFPLFFBQVEsQ0FBQyxHQUFULENBQWMsSUFBZCxFQUFvQixJQUFwQixDQUFQO0FBQ0E7O0FBQ0QsaUJBQU8sSUFBSSxJQUFJLElBQVIsR0FDTixJQUFJLENBQUMsS0FEQyxHQUVOLElBRkQ7QUFHQSxTQVJLO0FBU04sUUFBQSxHQUFHLEVBQUUsYUFBVSxJQUFWLEVBQWdCLEtBQWhCLEVBQXVCLElBQXZCLEVBQThCO0FBQ2xDLGNBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFQLENBQWlCLElBQWpCLEVBQXVCLFFBQXZCLENBQWpCLEVBQXFEO0FBQ3BELG1CQUFPLFFBQVEsQ0FBQyxHQUFULENBQWMsSUFBZCxFQUFvQixLQUFwQixFQUEyQixJQUEzQixDQUFQO0FBQ0EsV0FIaUMsQ0FJbEM7OztBQUNBLFVBQUEsSUFBSSxDQUFDLEtBQUwsR0FBYSxLQUFiO0FBQ0E7QUFmSztBQXJCRyxLQTlKRTtBQXNNYixJQUFBLE9BQU8sRUFBRTtBQUNSLE1BQUEsUUFBUSxFQUFFLFVBREY7QUFFUixNQUFBLFFBQVEsRUFBRSxVQUZGO0FBR1IsYUFBTyxTQUhDO0FBSVIsZUFBUyxXQUpEO0FBS1IsTUFBQSxTQUFTLEVBQUUsV0FMSDtBQU1SLE1BQUEsV0FBVyxFQUFFLGFBTkw7QUFPUixNQUFBLFdBQVcsRUFBRSxhQVBMO0FBUVIsTUFBQSxPQUFPLEVBQUUsU0FSRDtBQVNSLE1BQUEsT0FBTyxFQUFFLFNBVEQ7QUFVUixNQUFBLE1BQU0sRUFBRSxRQVZBO0FBV1IsTUFBQSxXQUFXLEVBQUUsYUFYTDtBQVlSLE1BQUEsZUFBZSxFQUFFO0FBWlQsS0F0TUk7QUFxTmIsSUFBQSxJQUFJLEVBQUUsY0FBVSxJQUFWLEVBQWdCLElBQWhCLEVBQXNCLEtBQXRCLEVBQThCO0FBQ25DLFVBQUksR0FBSjtBQUFBLFVBQVMsS0FBVDtBQUFBLFVBQWdCLE1BQWhCO0FBQUEsVUFDQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBRGQsQ0FEbUMsQ0FJbkM7O0FBQ0EsVUFBSyxDQUFDLElBQUQsSUFBUyxLQUFLLEtBQUssQ0FBbkIsSUFBd0IsS0FBSyxLQUFLLENBQWxDLElBQXVDLEtBQUssS0FBSyxDQUF0RCxFQUEwRDtBQUN6RDtBQUNBOztBQUVELE1BQUEsTUFBTSxHQUFHLEtBQUssS0FBSyxDQUFWLElBQWUsQ0FBQyxNQUFNLENBQUMsUUFBUCxDQUFpQixJQUFqQixDQUF6Qjs7QUFFQSxVQUFLLE1BQUwsRUFBYztBQUNiO0FBQ0EsUUFBQSxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQVAsQ0FBZ0IsSUFBaEIsS0FBMEIsSUFBakM7QUFDQSxRQUFBLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUCxDQUFrQixJQUFsQixDQUFSO0FBQ0E7O0FBRUQsVUFBSyxLQUFLLEtBQUssU0FBZixFQUEyQjtBQUMxQixZQUFLLEtBQUssSUFBSSxTQUFTLEtBQWxCLElBQTJCLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFOLENBQVcsSUFBWCxFQUFpQixLQUFqQixFQUF3QixJQUF4QixDQUFQLE1BQTJDLFNBQTNFLEVBQXVGO0FBQ3RGLGlCQUFPLEdBQVA7QUFFQSxTQUhELE1BR087QUFDTixpQkFBUyxJQUFJLENBQUUsSUFBRixDQUFKLEdBQWUsS0FBeEI7QUFDQTtBQUVELE9BUkQsTUFRTztBQUNOLFlBQUssS0FBSyxJQUFJLFNBQVMsS0FBbEIsSUFBMkIsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQU4sQ0FBVyxJQUFYLEVBQWlCLElBQWpCLENBQVAsTUFBb0MsSUFBcEUsRUFBMkU7QUFDMUUsaUJBQU8sR0FBUDtBQUVBLFNBSEQsTUFHTztBQUNOLGlCQUFPLElBQUksQ0FBRSxJQUFGLENBQVg7QUFDQTtBQUNEO0FBQ0QsS0F0UFk7QUF3UGIsSUFBQSxTQUFTLEVBQUU7QUFDVixNQUFBLFFBQVEsRUFBRTtBQUNULFFBQUEsR0FBRyxFQUFFLGFBQVUsSUFBVixFQUFpQjtBQUNyQjtBQUNBO0FBQ0EsY0FBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFMLENBQXNCLFVBQXRCLENBQXBCO0FBRUEsaUJBQU8sYUFBYSxJQUFJLGFBQWEsQ0FBQyxTQUEvQixHQUNOLFFBQVEsQ0FBRSxhQUFhLENBQUMsS0FBaEIsRUFBdUIsRUFBdkIsQ0FERixHQUVOLFVBQVUsQ0FBQyxJQUFYLENBQWlCLElBQUksQ0FBQyxRQUF0QixLQUFvQyxVQUFVLENBQUMsSUFBWCxDQUFpQixJQUFJLENBQUMsUUFBdEIsS0FBb0MsSUFBSSxDQUFDLElBQTdFLEdBQ0MsQ0FERCxHQUVDLFNBSkY7QUFLQTtBQVhRO0FBREE7QUF4UEUsR0FBZCxFQWxwRStCLENBMjVFL0I7O0FBQ0EsRUFBQSxRQUFRLEdBQUc7QUFDVixJQUFBLEdBQUcsRUFBRSxhQUFVLElBQVYsRUFBZ0IsSUFBaEIsRUFBdUI7QUFDM0I7QUFDQTtBQUNBLFVBQUksUUFBSjtBQUFBLFVBQ0MsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFQLENBQWEsSUFBYixFQUFtQixJQUFuQixDQURaO0FBRUEsYUFBTyxRQUFRLEtBQUssSUFBYixJQUFxQixPQUFPLFFBQVAsS0FBb0IsU0FBcEIsS0FBbUMsUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBTCxDQUFzQixJQUF0QixDQUE5QyxLQUErRSxRQUFRLENBQUMsU0FBVCxLQUF1QixLQUEzSCxHQUNOLElBQUksQ0FBQyxXQUFMLEVBRE0sR0FFTixTQUZEO0FBR0EsS0FUUztBQVVWLElBQUEsR0FBRyxFQUFFLGFBQVUsSUFBVixFQUFnQixLQUFoQixFQUF1QixJQUF2QixFQUE4QjtBQUNsQyxVQUFJLFFBQUo7O0FBQ0EsVUFBSyxLQUFLLEtBQUssS0FBZixFQUF1QjtBQUN0QjtBQUNBLFFBQUEsTUFBTSxDQUFDLFVBQVAsQ0FBbUIsSUFBbkIsRUFBeUIsSUFBekI7QUFDQSxPQUhELE1BR087QUFDTjtBQUNBO0FBQ0EsUUFBQSxRQUFRLEdBQUcsTUFBTSxDQUFDLE9BQVAsQ0FBZ0IsSUFBaEIsS0FBMEIsSUFBckM7O0FBQ0EsWUFBSyxRQUFRLElBQUksSUFBakIsRUFBd0I7QUFDdkI7QUFDQSxVQUFBLElBQUksQ0FBRSxRQUFGLENBQUosR0FBbUIsSUFBbkI7QUFDQTs7QUFFRCxRQUFBLElBQUksQ0FBQyxZQUFMLENBQW1CLElBQW5CLEVBQXlCLElBQUksQ0FBQyxXQUFMLEVBQXpCO0FBQ0E7O0FBQ0QsYUFBTyxJQUFQO0FBQ0E7QUEzQlMsR0FBWCxDQTU1RStCLENBMDdFL0I7O0FBQ0EsTUFBSyxDQUFDLGVBQU4sRUFBd0I7QUFFdkIsSUFBQSxZQUFZLEdBQUc7QUFDZCxNQUFBLElBQUksRUFBRSxJQURRO0FBRWQsTUFBQSxFQUFFLEVBQUUsSUFGVTtBQUdkLE1BQUEsTUFBTSxFQUFFO0FBSE0sS0FBZixDQUZ1QixDQVF2QjtBQUNBOztBQUNBLElBQUEsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFQLENBQWdCLE1BQWhCLEdBQXlCO0FBQ25DLE1BQUEsR0FBRyxFQUFFLGFBQVUsSUFBVixFQUFnQixJQUFoQixFQUF1QjtBQUMzQixZQUFJLEdBQUo7QUFDQSxRQUFBLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQUwsQ0FBdUIsSUFBdkIsQ0FBTjtBQUNBLGVBQU8sR0FBRyxLQUFNLFlBQVksQ0FBRSxJQUFGLENBQVosR0FBdUIsR0FBRyxDQUFDLEtBQUosS0FBYyxFQUFyQyxHQUEwQyxHQUFHLENBQUMsU0FBcEQsQ0FBSCxHQUNOLEdBQUcsQ0FBQyxLQURFLEdBRU4sU0FGRDtBQUdBLE9BUGtDO0FBUW5DLE1BQUEsR0FBRyxFQUFFLGFBQVUsSUFBVixFQUFnQixLQUFoQixFQUF1QixJQUF2QixFQUE4QjtBQUNsQztBQUNBLFlBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBTCxDQUF1QixJQUF2QixDQUFWOztBQUNBLFlBQUssQ0FBQyxHQUFOLEVBQVk7QUFDWCxVQUFBLEdBQUcsR0FBRyxRQUFRLENBQUMsZUFBVCxDQUEwQixJQUExQixDQUFOO0FBQ0EsVUFBQSxJQUFJLENBQUMsZ0JBQUwsQ0FBdUIsR0FBdkI7QUFDQTs7QUFDRCxlQUFTLEdBQUcsQ0FBQyxLQUFKLEdBQVksS0FBSyxHQUFHLEVBQTdCO0FBQ0E7QUFoQmtDLEtBQXBDLENBVnVCLENBNkJ2QjtBQUNBOztBQUNBLElBQUEsTUFBTSxDQUFDLElBQVAsQ0FBWSxDQUFFLE9BQUYsRUFBVyxRQUFYLENBQVosRUFBbUMsVUFBVSxDQUFWLEVBQWEsSUFBYixFQUFvQjtBQUN0RCxNQUFBLE1BQU0sQ0FBQyxTQUFQLENBQWtCLElBQWxCLElBQTJCLE1BQU0sQ0FBQyxNQUFQLENBQWUsTUFBTSxDQUFDLFNBQVAsQ0FBa0IsSUFBbEIsQ0FBZixFQUF5QztBQUNuRSxRQUFBLEdBQUcsRUFBRSxhQUFVLElBQVYsRUFBZ0IsS0FBaEIsRUFBd0I7QUFDNUIsY0FBSyxLQUFLLEtBQUssRUFBZixFQUFvQjtBQUNuQixZQUFBLElBQUksQ0FBQyxZQUFMLENBQW1CLElBQW5CLEVBQXlCLE1BQXpCO0FBQ0EsbUJBQU8sS0FBUDtBQUNBO0FBQ0Q7QUFOa0UsT0FBekMsQ0FBM0I7QUFRQSxLQVRELEVBL0J1QixDQTBDdkI7QUFDQTs7QUFDQSxJQUFBLE1BQU0sQ0FBQyxTQUFQLENBQWlCLGVBQWpCLEdBQW1DO0FBQ2xDLE1BQUEsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQURvQjtBQUVsQyxNQUFBLEdBQUcsRUFBRSxhQUFVLElBQVYsRUFBZ0IsS0FBaEIsRUFBdUIsSUFBdkIsRUFBOEI7QUFDbEMsWUFBSyxLQUFLLEtBQUssRUFBZixFQUFvQjtBQUNuQixVQUFBLEtBQUssR0FBRyxPQUFSO0FBQ0E7O0FBQ0QsUUFBQSxRQUFRLENBQUMsR0FBVCxDQUFjLElBQWQsRUFBb0IsS0FBcEIsRUFBMkIsSUFBM0I7QUFDQTtBQVBpQyxLQUFuQztBQVNBLEdBaC9FOEIsQ0FtL0UvQjs7O0FBQ0EsTUFBSyxDQUFDLE1BQU0sQ0FBQyxPQUFQLENBQWUsY0FBckIsRUFBc0M7QUFDckMsSUFBQSxNQUFNLENBQUMsSUFBUCxDQUFZLENBQUUsTUFBRixFQUFVLEtBQVYsRUFBaUIsT0FBakIsRUFBMEIsUUFBMUIsQ0FBWixFQUFrRCxVQUFVLENBQVYsRUFBYSxJQUFiLEVBQW9CO0FBQ3JFLE1BQUEsTUFBTSxDQUFDLFNBQVAsQ0FBa0IsSUFBbEIsSUFBMkIsTUFBTSxDQUFDLE1BQVAsQ0FBZSxNQUFNLENBQUMsU0FBUCxDQUFrQixJQUFsQixDQUFmLEVBQXlDO0FBQ25FLFFBQUEsR0FBRyxFQUFFLGFBQVUsSUFBVixFQUFpQjtBQUNyQixjQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBTCxDQUFtQixJQUFuQixFQUF5QixDQUF6QixDQUFWO0FBQ0EsaUJBQU8sR0FBRyxLQUFLLElBQVIsR0FBZSxTQUFmLEdBQTJCLEdBQWxDO0FBQ0E7QUFKa0UsT0FBekMsQ0FBM0I7QUFNQSxLQVBEO0FBUUE7O0FBRUQsTUFBSyxDQUFDLE1BQU0sQ0FBQyxPQUFQLENBQWUsS0FBckIsRUFBNkI7QUFDNUIsSUFBQSxNQUFNLENBQUMsU0FBUCxDQUFpQixLQUFqQixHQUF5QjtBQUN4QixNQUFBLEdBQUcsRUFBRSxhQUFVLElBQVYsRUFBaUI7QUFDckI7QUFDQTtBQUNBLGVBQU8sSUFBSSxDQUFDLEtBQUwsQ0FBVyxPQUFYLENBQW1CLFdBQW5CLE1BQW9DLFNBQTNDO0FBQ0EsT0FMdUI7QUFNeEIsTUFBQSxHQUFHLEVBQUUsYUFBVSxJQUFWLEVBQWdCLEtBQWhCLEVBQXdCO0FBQzVCLGVBQVMsSUFBSSxDQUFDLEtBQUwsQ0FBVyxPQUFYLEdBQXFCLEtBQUssS0FBbkM7QUFDQTtBQVJ1QixLQUF6QjtBQVVBLEdBMWdGOEIsQ0E0Z0YvQjtBQUNBOzs7QUFDQSxNQUFLLENBQUMsTUFBTSxDQUFDLE9BQVAsQ0FBZSxXQUFyQixFQUFtQztBQUNsQyxJQUFBLE1BQU0sQ0FBQyxTQUFQLENBQWlCLFFBQWpCLEdBQTRCLE1BQU0sQ0FBQyxNQUFQLENBQWUsTUFBTSxDQUFDLFNBQVAsQ0FBaUIsUUFBaEMsRUFBMEM7QUFDckUsTUFBQSxHQUFHLEVBQUUsYUFBVSxJQUFWLEVBQWlCO0FBQ3JCLFlBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFsQjs7QUFFQSxZQUFLLE1BQUwsRUFBYztBQUNiLFVBQUEsTUFBTSxDQUFDLGFBQVAsQ0FEYSxDQUdiOztBQUNBLGNBQUssTUFBTSxDQUFDLFVBQVosRUFBeUI7QUFDeEIsWUFBQSxNQUFNLENBQUMsVUFBUCxDQUFrQixhQUFsQjtBQUNBO0FBQ0Q7O0FBQ0QsZUFBTyxJQUFQO0FBQ0E7QUFib0UsS0FBMUMsQ0FBNUI7QUFlQSxHQTloRjhCLENBZ2lGL0I7OztBQUNBLE1BQUssQ0FBQyxNQUFNLENBQUMsT0FBUCxDQUFlLE9BQXJCLEVBQStCO0FBQzlCLElBQUEsTUFBTSxDQUFDLE9BQVAsQ0FBZSxPQUFmLEdBQXlCLFVBQXpCO0FBQ0EsR0FuaUY4QixDQXFpRi9COzs7QUFDQSxNQUFLLENBQUMsTUFBTSxDQUFDLE9BQVAsQ0FBZSxPQUFyQixFQUErQjtBQUM5QixJQUFBLE1BQU0sQ0FBQyxJQUFQLENBQVksQ0FBRSxPQUFGLEVBQVcsVUFBWCxDQUFaLEVBQXFDLFlBQVc7QUFDL0MsTUFBQSxNQUFNLENBQUMsUUFBUCxDQUFpQixJQUFqQixJQUEwQjtBQUN6QixRQUFBLEdBQUcsRUFBRSxhQUFVLElBQVYsRUFBaUI7QUFDckI7QUFDQSxpQkFBTyxJQUFJLENBQUMsWUFBTCxDQUFrQixPQUFsQixNQUErQixJQUEvQixHQUFzQyxJQUF0QyxHQUE2QyxJQUFJLENBQUMsS0FBekQ7QUFDQTtBQUp3QixPQUExQjtBQU1BLEtBUEQ7QUFRQTs7QUFDRCxFQUFBLE1BQU0sQ0FBQyxJQUFQLENBQVksQ0FBRSxPQUFGLEVBQVcsVUFBWCxDQUFaLEVBQXFDLFlBQVc7QUFDL0MsSUFBQSxNQUFNLENBQUMsUUFBUCxDQUFpQixJQUFqQixJQUEwQixNQUFNLENBQUMsTUFBUCxDQUFlLE1BQU0sQ0FBQyxRQUFQLENBQWlCLElBQWpCLENBQWYsRUFBd0M7QUFDakUsTUFBQSxHQUFHLEVBQUUsYUFBVSxJQUFWLEVBQWdCLEtBQWhCLEVBQXdCO0FBQzVCLFlBQUssTUFBTSxDQUFDLE9BQVAsQ0FBZ0IsS0FBaEIsQ0FBTCxFQUErQjtBQUM5QixpQkFBUyxJQUFJLENBQUMsT0FBTCxHQUFlLE1BQU0sQ0FBQyxPQUFQLENBQWdCLE1BQU0sQ0FBQyxJQUFELENBQU4sQ0FBYSxHQUFiLEVBQWhCLEVBQW9DLEtBQXBDLEtBQStDLENBQXZFO0FBQ0E7QUFDRDtBQUxnRSxLQUF4QyxDQUExQjtBQU9BLEdBUkQ7O0FBU0EsTUFBSSxVQUFVLEdBQUcsOEJBQWpCO0FBQUEsTUFDQyxjQUFjLEdBQUcsd0JBRGxCO0FBQUEsTUFFQyxVQUFVLEdBQUcseUJBRmQ7QUFBQSxNQUdDLFNBQVMsR0FBRyxNQUhiO0FBQUEsTUFJQyxXQUFXLEdBQUcsOEJBSmY7QUFBQSxNQUtDLFdBQVcsR0FBRyxpQ0FMZjtBQUFBLE1BTUMsU0FBUyxHQUFHLFNBQVosU0FBWSxDQUFVLE1BQVYsRUFBbUI7QUFDOUIsV0FBTyxNQUFNLENBQUMsS0FBUCxDQUFhLE9BQWIsQ0FBcUIsS0FBckIsR0FBNkIsTUFBN0IsR0FBc0MsTUFBTSxDQUFDLE9BQVAsQ0FBZ0IsVUFBaEIsRUFBNEIsMkJBQTVCLENBQTdDO0FBQ0EsR0FSRjtBQVVBOzs7Ozs7QUFJQSxFQUFBLE1BQU0sQ0FBQyxLQUFQLEdBQWU7QUFFZCxJQUFBLEdBQUcsRUFBRSxhQUFVLElBQVYsRUFBZ0IsS0FBaEIsRUFBdUIsT0FBdkIsRUFBZ0MsSUFBaEMsRUFBc0MsUUFBdEMsRUFBaUQ7QUFFckQsVUFBSSxRQUFKLEVBQWMsWUFBZCxFQUEyQixNQUEzQixFQUNDLENBREQsRUFDSSxHQURKLEVBQ1MsSUFEVCxFQUNlLFVBRGYsRUFDMkIsU0FEM0IsRUFFQyxXQUZELEVBRWMsUUFGZCxFQUV3QixPQUZ4QixDQUZxRCxDQU1yRDs7O0FBQ0EsVUFBSyxJQUFJLENBQUMsUUFBTCxLQUFrQixDQUFsQixJQUF1QixJQUFJLENBQUMsUUFBTCxLQUFrQixDQUF6QyxJQUE4QyxDQUFDLEtBQS9DLElBQXdELENBQUMsT0FBekQsSUFBb0UsRUFBRSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQVAsQ0FBYyxJQUFkLENBQWIsQ0FBekUsRUFBOEc7QUFDN0c7QUFDQSxPQVRvRCxDQVdyRDs7O0FBQ0EsVUFBSyxPQUFPLENBQUMsT0FBYixFQUF1QjtBQUN0QixRQUFBLFdBQVcsR0FBRyxPQUFkO0FBQ0EsUUFBQSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQXRCO0FBQ0EsUUFBQSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQXZCO0FBQ0EsT0FoQm9ELENBa0JyRDs7O0FBQ0EsVUFBSyxDQUFDLE9BQU8sQ0FBQyxJQUFkLEVBQXFCO0FBQ3BCLFFBQUEsT0FBTyxDQUFDLElBQVIsR0FBZSxNQUFNLENBQUMsSUFBUCxFQUFmO0FBQ0EsT0FyQm9ELENBdUJyRDs7O0FBQ0EsTUFBQSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQWxCOztBQUNBLFVBQUssQ0FBQyxNQUFOLEVBQWU7QUFDZCxRQUFBLFFBQVEsQ0FBQyxNQUFULEdBQWtCLE1BQU0sR0FBRyxFQUEzQjtBQUNBOztBQUNELE1BQUEsWUFBVyxHQUFHLFFBQVEsQ0FBQyxNQUF2Qjs7QUFDQSxVQUFLLENBQUMsWUFBTixFQUFvQjtBQUNuQixRQUFBLFFBQVEsQ0FBQyxNQUFULEdBQWtCLFlBQVcsR0FBRyxxQkFBVSxDQUFWLEVBQWM7QUFDN0M7QUFDQTtBQUNBLGlCQUFPLE9BQU8sTUFBUCxLQUFrQixXQUFsQixLQUFrQyxDQUFDLENBQUQsSUFBTSxNQUFNLENBQUMsS0FBUCxDQUFhLFNBQWIsS0FBMkIsQ0FBQyxDQUFDLElBQXJFLElBQ04sTUFBTSxDQUFDLEtBQVAsQ0FBYSxRQUFiLENBQXNCLEtBQXRCLENBQTZCLFlBQVcsQ0FBQyxJQUF6QyxFQUErQyxTQUEvQyxDQURNLEdBRU4sU0FGRDtBQUdBLFNBTkQsQ0FEbUIsQ0FRbkI7OztBQUNBLFFBQUEsWUFBVyxDQUFDLElBQVosR0FBbUIsSUFBbkI7QUFDQSxPQXZDb0QsQ0F5Q3JEO0FBQ0E7OztBQUNBLE1BQUEsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFQLENBQWEsU0FBUyxDQUFDLEtBQUQsQ0FBdEIsRUFBZ0MsS0FBaEMsQ0FBdUMsR0FBdkMsQ0FBUjs7QUFDQSxXQUFNLENBQUMsR0FBRyxDQUFWLEVBQWEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUF2QixFQUErQixDQUFDLEVBQWhDLEVBQXFDO0FBRXBDLFFBQUEsR0FBRyxHQUFHLGNBQWMsQ0FBQyxJQUFmLENBQXFCLEtBQUssQ0FBQyxDQUFELENBQTFCLEtBQW1DLEVBQXpDO0FBQ0EsUUFBQSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUQsQ0FBVjtBQUNBLFFBQUEsVUFBVSxHQUFHLENBQUUsR0FBRyxDQUFDLENBQUQsQ0FBSCxJQUFVLEVBQVosRUFBaUIsS0FBakIsQ0FBd0IsR0FBeEIsRUFBOEIsSUFBOUIsRUFBYixDQUpvQyxDQU1wQzs7QUFDQSxRQUFBLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBUCxDQUFhLE9BQWIsQ0FBc0IsSUFBdEIsS0FBZ0MsRUFBMUMsQ0FQb0MsQ0FTcEM7O0FBQ0EsUUFBQSxJQUFJLEdBQUcsQ0FBRSxRQUFRLEdBQUcsT0FBTyxDQUFDLFlBQVgsR0FBMEIsT0FBTyxDQUFDLFFBQTVDLEtBQTBELElBQWpFLENBVm9DLENBWXBDOztBQUNBLFFBQUEsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFQLENBQWEsT0FBYixDQUFzQixJQUF0QixLQUFnQyxFQUExQyxDQWJvQyxDQWVwQzs7QUFDQSxRQUFBLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBUCxDQUFjO0FBQ3pCLFVBQUEsSUFBSSxFQUFFLElBRG1CO0FBRXpCLFVBQUEsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFELENBRlk7QUFHekIsVUFBQSxJQUFJLEVBQUUsSUFIbUI7QUFJekIsVUFBQSxPQUFPLEVBQUUsT0FKZ0I7QUFLekIsVUFBQSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBTFc7QUFNekIsVUFBQSxRQUFRLEVBQUUsUUFOZTtBQU96QixVQUFBLFNBQVMsRUFBRSxVQUFVLENBQUMsSUFBWCxDQUFnQixHQUFoQjtBQVBjLFNBQWQsRUFRVCxXQVJTLENBQVosQ0FoQm9DLENBMEJwQzs7QUFDQSxRQUFBLFFBQVEsR0FBRyxNQUFNLENBQUUsSUFBRixDQUFqQjs7QUFDQSxZQUFLLENBQUMsUUFBTixFQUFpQjtBQUNoQixVQUFBLFFBQVEsR0FBRyxNQUFNLENBQUUsSUFBRixDQUFOLEdBQWlCLEVBQTVCO0FBQ0EsVUFBQSxRQUFRLENBQUMsYUFBVCxHQUF5QixDQUF6QixDQUZnQixDQUloQjs7QUFDQSxjQUFLLENBQUMsT0FBTyxDQUFDLEtBQVQsSUFBa0IsT0FBTyxDQUFDLEtBQVIsQ0FBYyxJQUFkLENBQW9CLElBQXBCLEVBQTBCLElBQTFCLEVBQWdDLFVBQWhDLEVBQTRDLFlBQTVDLE1BQThELEtBQXJGLEVBQTZGO0FBQzVGO0FBQ0EsZ0JBQUssSUFBSSxDQUFDLGdCQUFWLEVBQTZCO0FBQzVCLGNBQUEsSUFBSSxDQUFDLGdCQUFMLENBQXVCLElBQXZCLEVBQTZCLFlBQTdCLEVBQTBDLEtBQTFDO0FBRUEsYUFIRCxNQUdPLElBQUssSUFBSSxDQUFDLFdBQVYsRUFBd0I7QUFDOUIsY0FBQSxJQUFJLENBQUMsV0FBTCxDQUFrQixPQUFPLElBQXpCLEVBQStCLFlBQS9CO0FBQ0E7QUFDRDtBQUNEOztBQUVELFlBQUssT0FBTyxDQUFDLEdBQWIsRUFBbUI7QUFDbEIsVUFBQSxPQUFPLENBQUMsR0FBUixDQUFZLElBQVosQ0FBa0IsSUFBbEIsRUFBd0IsU0FBeEI7O0FBRUEsY0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFWLENBQWtCLElBQXhCLEVBQStCO0FBQzlCLFlBQUEsU0FBUyxDQUFDLE9BQVYsQ0FBa0IsSUFBbEIsR0FBeUIsT0FBTyxDQUFDLElBQWpDO0FBQ0E7QUFDRCxTQWxEbUMsQ0FvRHBDOzs7QUFDQSxZQUFLLFFBQUwsRUFBZ0I7QUFDZixVQUFBLFFBQVEsQ0FBQyxNQUFULENBQWlCLFFBQVEsQ0FBQyxhQUFULEVBQWpCLEVBQTJDLENBQTNDLEVBQThDLFNBQTlDO0FBQ0EsU0FGRCxNQUVPO0FBQ04sVUFBQSxRQUFRLENBQUMsSUFBVCxDQUFlLFNBQWY7QUFDQSxTQXpEbUMsQ0EyRHBDOzs7QUFDQSxRQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWEsTUFBYixDQUFxQixJQUFyQixJQUE4QixJQUE5QjtBQUNBLE9BekdvRCxDQTJHckQ7OztBQUNBLE1BQUEsSUFBSSxHQUFHLElBQVA7QUFDQSxLQS9HYTtBQWlIZCxJQUFBLE1BQU0sRUFBRSxFQWpITTtBQW1IZDtBQUNBLElBQUEsTUFBTSxFQUFFLGdCQUFVLElBQVYsRUFBZ0IsS0FBaEIsRUFBdUIsT0FBdkIsRUFBZ0MsUUFBaEMsRUFBMEMsV0FBMUMsRUFBd0Q7QUFFL0QsVUFBSSxDQUFKO0FBQUEsVUFBTyxHQUFQO0FBQUEsVUFBWSxJQUFaO0FBQUEsVUFBa0IsUUFBbEI7QUFBQSxVQUE0QixVQUE1QjtBQUFBLFVBQXdDLFNBQXhDO0FBQUEsVUFDQyxDQUREO0FBQUEsVUFDSSxNQURKO0FBQUEsVUFDWSxPQURaO0FBQUEsVUFDcUIsU0FEckI7QUFBQSxVQUNnQyxTQURoQztBQUFBLFVBRUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFQLENBQWdCLElBQWhCLEtBQTBCLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZCxDQUZ0Qzs7QUFJQSxVQUFLLENBQUMsUUFBRCxJQUFhLEVBQUUsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFwQixDQUFsQixFQUFnRDtBQUMvQztBQUNBLE9BUjhELENBVS9EOzs7QUFDQSxNQUFBLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBUCxDQUFhLFNBQVMsQ0FBRSxLQUFLLElBQUksRUFBWCxDQUF0QixFQUF3QyxLQUF4QyxDQUE4QyxHQUE5QyxDQUFSOztBQUNBLFdBQU0sQ0FBQyxHQUFHLENBQVYsRUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQXZCLEVBQStCLENBQUMsRUFBaEMsRUFBcUM7QUFDcEMsUUFBQSxHQUFHLEdBQUcsY0FBYyxDQUFDLElBQWYsQ0FBcUIsS0FBSyxDQUFDLENBQUQsQ0FBMUIsS0FBbUMsRUFBekM7QUFDQSxRQUFBLElBQUksR0FBRyxRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUQsQ0FBckI7QUFDQSxRQUFBLFVBQVUsR0FBRyxHQUFHLENBQUMsQ0FBRCxDQUFoQixDQUhvQyxDQUtwQzs7QUFDQSxZQUFLLENBQUMsSUFBTixFQUFhO0FBQ1osZUFBTSxJQUFOLElBQWMsTUFBZCxFQUF1QjtBQUN0QixZQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWEsTUFBYixDQUFxQixJQUFyQixFQUEyQixJQUFJLEdBQUcsS0FBSyxDQUFFLENBQUYsQ0FBdkMsRUFBOEMsT0FBOUMsRUFBdUQsUUFBdkQsRUFBaUUsSUFBakU7QUFDQTs7QUFDRDtBQUNBOztBQUVELFFBQUEsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFQLENBQWEsT0FBYixDQUFzQixJQUF0QixLQUFnQyxFQUExQztBQUNBLFFBQUEsSUFBSSxHQUFHLENBQUUsUUFBUSxHQUFFLE9BQU8sQ0FBQyxZQUFWLEdBQXlCLE9BQU8sQ0FBQyxRQUEzQyxLQUF5RCxJQUFoRTtBQUNBLFFBQUEsU0FBUyxHQUFHLE1BQU0sQ0FBRSxJQUFGLENBQU4sSUFBa0IsRUFBOUI7QUFDQSxRQUFBLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBdEI7QUFDQSxRQUFBLFVBQVUsR0FBRyxVQUFVLEdBQUcsSUFBSSxNQUFKLENBQVcsWUFBWSxVQUFVLENBQUMsS0FBWCxDQUFpQixHQUFqQixFQUFzQixJQUF0QixHQUE2QixJQUE3QixDQUFrQyxlQUFsQyxDQUFaLEdBQWlFLFNBQTVFLENBQUgsR0FBNEYsSUFBbkgsQ0FqQm9DLENBbUJwQzs7QUFDQSxhQUFNLENBQUMsR0FBRyxDQUFWLEVBQWEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUEzQixFQUFtQyxDQUFDLEVBQXBDLEVBQXlDO0FBQ3hDLFVBQUEsU0FBUyxHQUFHLFNBQVMsQ0FBRSxDQUFGLENBQXJCOztBQUVBLGNBQUssQ0FBRSxXQUFXLElBQUksUUFBUSxLQUFLLFNBQVMsQ0FBQyxRQUF4QyxNQUNELENBQUMsT0FBRCxJQUFZLE9BQU8sQ0FBQyxJQUFSLEtBQWlCLFNBQVMsQ0FBQyxJQUR0QyxNQUVELENBQUMsVUFBRCxJQUFlLFVBQVUsQ0FBQyxJQUFYLENBQWlCLFNBQVMsQ0FBQyxTQUEzQixDQUZkLE1BR0QsQ0FBQyxRQUFELElBQWEsUUFBUSxLQUFLLFNBQVMsQ0FBQyxRQUFwQyxJQUFnRCxRQUFRLEtBQUssSUFBYixJQUFxQixTQUFTLENBQUMsUUFIOUUsQ0FBTCxFQUdnRztBQUMvRixZQUFBLFNBQVMsQ0FBQyxNQUFWLENBQWtCLENBQUMsRUFBbkIsRUFBdUIsQ0FBdkI7O0FBRUEsZ0JBQUssU0FBUyxDQUFDLFFBQWYsRUFBMEI7QUFDekIsY0FBQSxTQUFTLENBQUMsYUFBVjtBQUNBOztBQUNELGdCQUFLLE9BQU8sQ0FBQyxNQUFiLEVBQXNCO0FBQ3JCLGNBQUEsT0FBTyxDQUFDLE1BQVIsQ0FBZSxJQUFmLENBQXFCLElBQXJCLEVBQTJCLFNBQTNCO0FBQ0E7QUFDRDtBQUNELFNBcENtQyxDQXNDcEM7QUFDQTs7O0FBQ0EsWUFBSyxTQUFTLENBQUMsTUFBVixLQUFxQixDQUFyQixJQUEwQixTQUFTLEtBQUssU0FBUyxDQUFDLE1BQXZELEVBQWdFO0FBQy9ELGNBQUssQ0FBQyxPQUFPLENBQUMsUUFBVCxJQUFxQixPQUFPLENBQUMsUUFBUixDQUFpQixJQUFqQixDQUF1QixJQUF2QixFQUE2QixVQUE3QixFQUF5QyxRQUFRLENBQUMsTUFBbEQsTUFBK0QsS0FBekYsRUFBaUc7QUFDaEcsWUFBQSxNQUFNLENBQUMsV0FBUCxDQUFvQixJQUFwQixFQUEwQixJQUExQixFQUFnQyxRQUFRLENBQUMsTUFBekM7QUFDQTs7QUFFRCxpQkFBTyxNQUFNLENBQUUsSUFBRixDQUFiO0FBQ0E7QUFDRCxPQTNEOEQsQ0E2RC9EOzs7QUFDQSxVQUFLLE1BQU0sQ0FBQyxhQUFQLENBQXNCLE1BQXRCLENBQUwsRUFBc0M7QUFDckMsZUFBTyxRQUFRLENBQUMsTUFBaEIsQ0FEcUMsQ0FHckM7QUFDQTs7QUFDQSxRQUFBLE1BQU0sQ0FBQyxVQUFQLENBQW1CLElBQW5CLEVBQXlCLFFBQXpCLEVBQW1DLElBQW5DO0FBQ0E7QUFDRCxLQXpMYTtBQTJMZDtBQUNBO0FBQ0EsSUFBQSxXQUFXLEVBQUU7QUFDWixpQkFBVyxJQURDO0FBRVosaUJBQVcsSUFGQztBQUdaLG9CQUFjO0FBSEYsS0E3TEM7QUFtTWQsSUFBQSxPQUFPLEVBQUUsaUJBQVUsS0FBVixFQUFpQixJQUFqQixFQUF1QixJQUF2QixFQUE2QixZQUE3QixFQUE0QztBQUNwRDtBQUNBLFVBQUssSUFBSSxLQUFLLElBQUksQ0FBQyxRQUFMLEtBQWtCLENBQWxCLElBQXVCLElBQUksQ0FBQyxRQUFMLEtBQWtCLENBQTlDLENBQVQsRUFBNEQ7QUFDM0Q7QUFDQSxPQUptRCxDQU1wRDs7O0FBQ0EsVUFBSSxLQUFKO0FBQUEsVUFBVyxTQUFYO0FBQUEsVUFBc0IsQ0FBdEI7QUFBQSxVQUF5QixHQUF6QjtBQUFBLFVBQThCLEdBQTlCO0FBQUEsVUFBbUMsTUFBbkM7QUFBQSxVQUEyQyxPQUEzQztBQUFBLFVBQW9ELE1BQXBEO0FBQUEsVUFBNEQsU0FBNUQ7QUFBQSxVQUF1RSxVQUF2RTtBQUFBLFVBQ0MsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFOLElBQWMsS0FEdEI7QUFBQSxVQUVDLFVBQVUsR0FBRyxFQUZkLENBUG9ELENBV3BEOztBQUNBLFVBQUssV0FBVyxDQUFDLElBQVosQ0FBa0IsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFQLENBQWEsU0FBdEMsQ0FBTCxFQUF5RDtBQUN4RDtBQUNBOztBQUVELFVBQUssSUFBSSxDQUFDLE9BQUwsQ0FBYyxHQUFkLEtBQXVCLENBQTVCLEVBQWdDO0FBQy9CO0FBQ0EsUUFBQSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUwsQ0FBVyxDQUFYLEVBQWMsQ0FBQyxDQUFmLENBQVA7QUFDQSxRQUFBLFNBQVMsR0FBRyxJQUFaO0FBQ0E7O0FBRUQsVUFBSyxJQUFJLENBQUMsT0FBTCxDQUFjLEdBQWQsS0FBdUIsQ0FBNUIsRUFBZ0M7QUFDL0I7QUFDQSxRQUFBLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBTCxDQUFXLEdBQVgsQ0FBYjtBQUNBLFFBQUEsSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFYLEVBQVA7QUFDQSxRQUFBLFVBQVUsQ0FBQyxJQUFYO0FBQ0E7O0FBRUQsVUFBSyxDQUFDLENBQUMsSUFBRCxJQUFTLE1BQU0sQ0FBQyxLQUFQLENBQWEsV0FBYixDQUEwQixJQUExQixDQUFWLEtBQStDLENBQUMsTUFBTSxDQUFDLEtBQVAsQ0FBYSxNQUFiLENBQXFCLElBQXJCLENBQXJELEVBQW1GO0FBQ2xGO0FBQ0E7QUFDQSxPQWhDbUQsQ0FrQ3BEOzs7QUFDQSxNQUFBLEtBQUssR0FBRyxRQUFPLEtBQVAsTUFBaUIsUUFBakIsR0FDUDtBQUNBLE1BQUEsS0FBSyxDQUFFLE1BQU0sQ0FBQyxPQUFULENBQUwsR0FBMEIsS0FBMUIsR0FDQTtBQUNBLFVBQUksTUFBTSxDQUFDLEtBQVgsQ0FBa0IsSUFBbEIsRUFBd0IsS0FBeEIsQ0FKTyxHQUtQO0FBQ0EsVUFBSSxNQUFNLENBQUMsS0FBWCxDQUFrQixJQUFsQixDQU5EO0FBUUEsTUFBQSxLQUFLLENBQUMsSUFBTixHQUFhLElBQWI7QUFDQSxNQUFBLEtBQUssQ0FBQyxTQUFOLEdBQWtCLElBQWxCO0FBQ0EsTUFBQSxLQUFLLENBQUMsU0FBTixHQUFrQixTQUFsQjtBQUNBLE1BQUEsS0FBSyxDQUFDLFNBQU4sR0FBa0IsVUFBVSxDQUFDLElBQVgsQ0FBaUIsR0FBakIsQ0FBbEI7QUFDQSxNQUFBLEtBQUssQ0FBQyxZQUFOLEdBQXFCLEtBQUssQ0FBQyxTQUFOLEdBQWlCLElBQUksTUFBSixDQUFXLFlBQVksVUFBVSxDQUFDLElBQVgsQ0FBZ0IsZUFBaEIsQ0FBWixHQUErQyxTQUExRCxDQUFqQixHQUF3RixJQUE3RztBQUNBLE1BQUEsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFMLENBQWMsR0FBZCxJQUFzQixDQUF0QixHQUEwQixPQUFPLElBQWpDLEdBQXdDLEVBQWpELENBaERvRCxDQWtEcEQ7O0FBQ0EsVUFBSyxDQUFDLElBQU4sRUFBYTtBQUVaO0FBQ0EsUUFBQSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQWY7O0FBQ0EsYUFBTSxDQUFOLElBQVcsS0FBWCxFQUFtQjtBQUNsQixjQUFLLEtBQUssQ0FBRSxDQUFGLENBQUwsQ0FBVyxNQUFYLElBQXFCLEtBQUssQ0FBRSxDQUFGLENBQUwsQ0FBVyxNQUFYLENBQW1CLElBQW5CLENBQTFCLEVBQXNEO0FBQ3JELFlBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYSxPQUFiLENBQXNCLEtBQXRCLEVBQTZCLElBQTdCLEVBQW1DLEtBQUssQ0FBRSxDQUFGLENBQUwsQ0FBVyxNQUFYLENBQWtCLElBQXJELEVBQTJELElBQTNEO0FBQ0E7QUFDRDs7QUFDRDtBQUNBLE9BN0RtRCxDQStEcEQ7OztBQUNBLE1BQUEsS0FBSyxDQUFDLE1BQU4sR0FBZSxTQUFmOztBQUNBLFVBQUssQ0FBQyxLQUFLLENBQUMsTUFBWixFQUFxQjtBQUNwQixRQUFBLEtBQUssQ0FBQyxNQUFOLEdBQWUsSUFBZjtBQUNBLE9BbkVtRCxDQXFFcEQ7OztBQUNBLE1BQUEsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFSLEdBQWUsTUFBTSxDQUFDLFNBQVAsQ0FBa0IsSUFBbEIsQ0FBZixHQUEwQyxFQUFqRDtBQUNBLE1BQUEsSUFBSSxDQUFDLE9BQUwsQ0FBYyxLQUFkLEVBdkVvRCxDQXlFcEQ7O0FBQ0EsTUFBQSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQVAsQ0FBYSxPQUFiLENBQXNCLElBQXRCLEtBQWdDLEVBQTFDOztBQUNBLFVBQUssT0FBTyxDQUFDLE9BQVIsSUFBbUIsT0FBTyxDQUFDLE9BQVIsQ0FBZ0IsS0FBaEIsQ0FBdUIsSUFBdkIsRUFBNkIsSUFBN0IsTUFBd0MsS0FBaEUsRUFBd0U7QUFDdkU7QUFDQSxPQTdFbUQsQ0ErRXBEO0FBQ0E7OztBQUNBLE1BQUEsU0FBUyxHQUFHLENBQUMsQ0FBRSxJQUFGLEVBQVEsT0FBTyxDQUFDLFFBQVIsSUFBb0IsSUFBNUIsQ0FBRCxDQUFaOztBQUNBLFVBQUssQ0FBQyxZQUFELElBQWlCLENBQUMsT0FBTyxDQUFDLFFBQTFCLElBQXNDLENBQUMsTUFBTSxDQUFDLFFBQVAsQ0FBaUIsSUFBakIsQ0FBNUMsRUFBc0U7QUFFckUsUUFBQSxVQUFVLEdBQUcsT0FBTyxDQUFDLFlBQVIsSUFBd0IsSUFBckM7QUFDQSxRQUFBLEdBQUcsR0FBRyxXQUFXLENBQUMsSUFBWixDQUFrQixVQUFVLEdBQUcsSUFBL0IsSUFBd0MsSUFBeEMsR0FBK0MsSUFBSSxDQUFDLFVBQTFEOztBQUNBLGFBQU0sR0FBRyxHQUFHLElBQVosRUFBa0IsR0FBbEIsRUFBdUIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxVQUFqQyxFQUE4QztBQUM3QyxVQUFBLFNBQVMsQ0FBQyxJQUFWLENBQWUsQ0FBRSxHQUFGLEVBQU8sVUFBUCxDQUFmO0FBQ0EsVUFBQSxHQUFHLEdBQUcsR0FBTjtBQUNBLFNBUG9FLENBU3JFOzs7QUFDQSxZQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBTCxJQUFzQixRQUE1QixDQUFSLEVBQWdEO0FBQy9DLFVBQUEsU0FBUyxDQUFDLElBQVYsQ0FBZSxDQUFFLEdBQUcsQ0FBQyxXQUFKLElBQW1CLEdBQUcsQ0FBQyxZQUF2QixJQUF1QyxNQUF6QyxFQUFpRCxVQUFqRCxDQUFmO0FBQ0E7QUFDRCxPQS9GbUQsQ0FpR3BEOzs7QUFDQSxXQUFNLENBQUMsR0FBRyxDQUFWLEVBQWEsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFkLElBQXdCLENBQUMsS0FBSyxDQUFDLG9CQUFOLEVBQXRDLEVBQW9FLENBQUMsRUFBckUsRUFBMEU7QUFFekUsUUFBQSxHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUQsQ0FBVCxDQUFhLENBQWIsQ0FBTjtBQUNBLFFBQUEsS0FBSyxDQUFDLElBQU4sR0FBYSxTQUFTLENBQUMsQ0FBRCxDQUFULENBQWEsQ0FBYixDQUFiO0FBRUEsUUFBQSxNQUFNLEdBQUcsQ0FBRSxNQUFNLENBQUMsS0FBUCxDQUFjLEdBQWQsRUFBbUIsUUFBbkIsS0FBaUMsRUFBbkMsRUFBeUMsS0FBSyxDQUFDLElBQS9DLEtBQXlELE1BQU0sQ0FBQyxLQUFQLENBQWMsR0FBZCxFQUFtQixRQUFuQixDQUFsRTs7QUFDQSxZQUFLLE1BQUwsRUFBYztBQUNiLFVBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYyxHQUFkLEVBQW1CLElBQW5CO0FBQ0EsU0FSd0UsQ0FTekU7OztBQUNBLFFBQUEsTUFBTSxHQUFHLE1BQU0sSUFBSSxHQUFHLENBQUUsTUFBRixDQUF0Qjs7QUFDQSxZQUFLLE1BQU0sSUFBSSxNQUFNLENBQUMsVUFBUCxDQUFtQixHQUFuQixDQUFWLElBQXNDLE1BQU0sQ0FBQyxLQUFQLENBQWMsR0FBZCxFQUFtQixJQUFuQixNQUE4QixLQUF6RSxFQUFpRjtBQUNoRixVQUFBLEtBQUssQ0FBQyxjQUFOO0FBQ0E7QUFDRDs7QUFDRCxNQUFBLEtBQUssQ0FBQyxJQUFOLEdBQWEsSUFBYixDQWpIb0QsQ0FtSHBEOztBQUNBLFVBQUssQ0FBQyxZQUFELElBQWlCLENBQUMsS0FBSyxDQUFDLGtCQUFOLEVBQXZCLEVBQW9EO0FBRW5ELFlBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFULElBQXFCLE9BQU8sQ0FBQyxRQUFSLENBQWlCLEtBQWpCLENBQXdCLElBQUksQ0FBQyxhQUE3QixFQUE0QyxJQUE1QyxNQUF1RCxLQUE3RSxLQUNKLEVBQUUsSUFBSSxLQUFLLE9BQVQsSUFBb0IsTUFBTSxDQUFDLFFBQVAsQ0FBaUIsSUFBakIsRUFBdUIsR0FBdkIsQ0FBdEIsQ0FESSxJQUNtRCxNQUFNLENBQUMsVUFBUCxDQUFtQixJQUFuQixDQUR4RCxFQUNvRjtBQUVuRjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQUssTUFBTSxJQUFJLElBQUksQ0FBRSxJQUFGLENBQWQsS0FBNEIsSUFBSSxLQUFLLE9BQVQsSUFBb0IsSUFBSSxLQUFLLE1BQTlCLElBQXlDLEtBQUssQ0FBQyxNQUFOLENBQWEsV0FBYixLQUE2QixDQUFqRyxLQUF1RyxDQUFDLE1BQU0sQ0FBQyxRQUFQLENBQWlCLElBQWpCLENBQTdHLEVBQXVJO0FBRXRJO0FBQ0EsWUFBQSxHQUFHLEdBQUcsSUFBSSxDQUFFLE1BQUYsQ0FBVjs7QUFFQSxnQkFBSyxHQUFMLEVBQVc7QUFDVixjQUFBLElBQUksQ0FBRSxNQUFGLENBQUosR0FBaUIsSUFBakI7QUFDQSxhQVBxSSxDQVN0STs7O0FBQ0EsWUFBQSxNQUFNLENBQUMsS0FBUCxDQUFhLFNBQWIsR0FBeUIsSUFBekI7QUFDQSxZQUFBLElBQUksQ0FBRSxJQUFGLENBQUo7QUFDQSxZQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWEsU0FBYixHQUF5QixTQUF6Qjs7QUFFQSxnQkFBSyxHQUFMLEVBQVc7QUFDVixjQUFBLElBQUksQ0FBRSxNQUFGLENBQUosR0FBaUIsR0FBakI7QUFDQTtBQUNEO0FBQ0Q7QUFDRDs7QUFFRCxhQUFPLEtBQUssQ0FBQyxNQUFiO0FBQ0EsS0F0VmE7QUF3VmQsSUFBQSxRQUFRLEVBQUUsa0JBQVUsS0FBVixFQUFrQjtBQUUzQjtBQUNBLE1BQUEsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFQLENBQWEsR0FBYixDQUFrQixLQUFLLElBQUksTUFBTSxDQUFDLEtBQWxDLENBQVI7QUFFQSxVQUFJLENBQUo7QUFBQSxVQUFPLENBQVA7QUFBQSxVQUFVLEdBQVY7QUFBQSxVQUFlLEdBQWY7QUFBQSxVQUFvQixRQUFwQjtBQUFBLFVBQThCLE9BQTlCO0FBQUEsVUFBdUMsT0FBdkM7QUFBQSxVQUFnRCxTQUFoRDtBQUFBLFVBQTJELEdBQTNEO0FBQUEsVUFBZ0UsT0FBaEU7QUFBQSxVQUNDLFFBQVEsR0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZCxFQUFvQixRQUFwQixLQUFrQyxFQUFuQyxFQUF5QyxLQUFLLENBQUMsSUFBL0MsS0FBeUQsRUFEdkU7QUFBQSxVQUVDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFGMUI7QUFBQSxVQUdDLElBQUksR0FBRyxHQUFHLEtBQUgsQ0FBUyxJQUFULENBQWUsU0FBZixDQUhSO0FBQUEsVUFJQyxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUCxJQUFvQixDQUFDLEtBQUssQ0FBQyxTQUp0QztBQUFBLFVBS0MsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFQLENBQWEsT0FBYixDQUFzQixLQUFLLENBQUMsSUFBNUIsS0FBc0MsRUFMakQ7QUFBQSxVQU1DLFlBQVksR0FBRyxFQU5oQixDQUwyQixDQWEzQjs7QUFDQSxNQUFBLElBQUksQ0FBQyxDQUFELENBQUosR0FBVSxLQUFWO0FBQ0EsTUFBQSxLQUFLLENBQUMsY0FBTixHQUF1QixJQUF2QixDQWYyQixDQWlCM0I7O0FBQ0EsVUFBSyxPQUFPLENBQUMsV0FBUixJQUF1QixPQUFPLENBQUMsV0FBUixDQUFvQixJQUFwQixDQUEwQixJQUExQixFQUFnQyxLQUFoQyxNQUE0QyxLQUF4RSxFQUFnRjtBQUMvRTtBQUNBLE9BcEIwQixDQXNCM0I7QUFDQTs7O0FBQ0EsVUFBSyxhQUFhLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTixJQUFnQixLQUFLLENBQUMsSUFBTixLQUFlLE9BQWpDLENBQXRCLEVBQWtFO0FBRWpFLGFBQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFsQixFQUEwQixHQUFHLElBQUksSUFBakMsRUFBdUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxVQUFKLElBQWtCLElBQS9ELEVBQXNFO0FBRXJFO0FBQ0EsY0FBSyxHQUFHLENBQUMsUUFBSixLQUFpQixJQUFqQixJQUF5QixLQUFLLENBQUMsSUFBTixLQUFlLE9BQTdDLEVBQXVEO0FBQ3RELFlBQUEsUUFBUSxHQUFHLEVBQVg7QUFDQSxZQUFBLE9BQU8sR0FBRyxFQUFWOztBQUNBLGlCQUFNLENBQUMsR0FBRyxDQUFWLEVBQWEsQ0FBQyxHQUFHLGFBQWpCLEVBQWdDLENBQUMsRUFBakMsRUFBc0M7QUFDckMsY0FBQSxTQUFTLEdBQUcsUUFBUSxDQUFFLENBQUYsQ0FBcEI7QUFDQSxjQUFBLEdBQUcsR0FBRyxTQUFTLENBQUMsUUFBaEI7O0FBRUEsa0JBQUssUUFBUSxDQUFFLEdBQUYsQ0FBUixLQUFvQixTQUF6QixFQUFxQztBQUNwQyxnQkFBQSxRQUFRLENBQUUsR0FBRixDQUFSLEdBQWtCLE1BQU0sQ0FBRSxHQUFGLEVBQU8sSUFBUCxDQUFOLENBQW9CLEtBQXBCLENBQTJCLEdBQTNCLEtBQW9DLENBQXREO0FBQ0E7O0FBQ0Qsa0JBQUssUUFBUSxDQUFFLEdBQUYsQ0FBYixFQUF1QjtBQUN0QixnQkFBQSxPQUFPLENBQUMsSUFBUixDQUFjLFNBQWQ7QUFDQTtBQUNEOztBQUNELGdCQUFLLE9BQU8sQ0FBQyxNQUFiLEVBQXNCO0FBQ3JCLGNBQUEsWUFBWSxDQUFDLElBQWIsQ0FBa0I7QUFBRSxnQkFBQSxJQUFJLEVBQUUsR0FBUjtBQUFhLGdCQUFBLE9BQU8sRUFBRTtBQUF0QixlQUFsQjtBQUNBO0FBQ0Q7QUFDRDtBQUNELE9BaEQwQixDQWtEM0I7OztBQUNBLFVBQUssUUFBUSxDQUFDLE1BQVQsR0FBa0IsYUFBdkIsRUFBdUM7QUFDdEMsUUFBQSxZQUFZLENBQUMsSUFBYixDQUFrQjtBQUFFLFVBQUEsSUFBSSxFQUFFLElBQVI7QUFBYyxVQUFBLE9BQU8sRUFBRSxRQUFRLENBQUMsS0FBVCxDQUFnQixhQUFoQjtBQUF2QixTQUFsQjtBQUNBLE9BckQwQixDQXVEM0I7OztBQUNBLFdBQU0sQ0FBQyxHQUFHLENBQVYsRUFBYSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQWpCLElBQTJCLENBQUMsS0FBSyxDQUFDLG9CQUFOLEVBQXpDLEVBQXVFLENBQUMsRUFBeEUsRUFBNkU7QUFDNUUsUUFBQSxPQUFPLEdBQUcsWUFBWSxDQUFFLENBQUYsQ0FBdEI7QUFDQSxRQUFBLEtBQUssQ0FBQyxhQUFOLEdBQXNCLE9BQU8sQ0FBQyxJQUE5Qjs7QUFFQSxhQUFNLENBQUMsR0FBRyxDQUFWLEVBQWEsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxPQUFSLENBQWdCLE1BQXBCLElBQThCLENBQUMsS0FBSyxDQUFDLDZCQUFOLEVBQTVDLEVBQW1GLENBQUMsRUFBcEYsRUFBeUY7QUFDeEYsVUFBQSxTQUFTLEdBQUcsT0FBTyxDQUFDLE9BQVIsQ0FBaUIsQ0FBakIsQ0FBWixDQUR3RixDQUd4RjtBQUNBOztBQUNBLGNBQUssT0FBTyxJQUFLLENBQUMsS0FBSyxDQUFDLFNBQVAsSUFBb0IsQ0FBQyxTQUFTLENBQUMsU0FBM0MsSUFBeUQsS0FBSyxDQUFDLFlBQU4sSUFBc0IsS0FBSyxDQUFDLFlBQU4sQ0FBbUIsSUFBbkIsQ0FBeUIsU0FBUyxDQUFDLFNBQW5DLENBQXBGLEVBQXFJO0FBRXBJLFlBQUEsS0FBSyxDQUFDLElBQU4sR0FBYSxTQUFTLENBQUMsSUFBdkI7QUFDQSxZQUFBLEtBQUssQ0FBQyxTQUFOLEdBQWtCLFNBQWxCO0FBRUEsWUFBQSxHQUFHLEdBQUcsQ0FBRSxDQUFDLE1BQU0sQ0FBQyxLQUFQLENBQWEsT0FBYixDQUFzQixTQUFTLENBQUMsUUFBaEMsS0FBOEMsRUFBL0MsRUFBbUQsTUFBbkQsSUFBNkQsU0FBUyxDQUFDLE9BQXpFLEVBQ0gsS0FERyxDQUNJLE9BQU8sQ0FBQyxJQURaLEVBQ2tCLElBRGxCLENBQU47O0FBR0EsZ0JBQUssR0FBRyxLQUFLLFNBQWIsRUFBeUI7QUFDeEIsY0FBQSxLQUFLLENBQUMsTUFBTixHQUFlLEdBQWY7O0FBQ0Esa0JBQUssR0FBRyxLQUFLLEtBQWIsRUFBcUI7QUFDcEIsZ0JBQUEsS0FBSyxDQUFDLGNBQU47QUFDQSxnQkFBQSxLQUFLLENBQUMsZUFBTjtBQUNBO0FBQ0Q7QUFDRDtBQUNEO0FBQ0QsT0FsRjBCLENBb0YzQjs7O0FBQ0EsVUFBSyxPQUFPLENBQUMsWUFBYixFQUE0QjtBQUMzQixRQUFBLE9BQU8sQ0FBQyxZQUFSLENBQXFCLElBQXJCLENBQTJCLElBQTNCLEVBQWlDLEtBQWpDO0FBQ0E7O0FBRUQsYUFBTyxLQUFLLENBQUMsTUFBYjtBQUNBLEtBbGJhO0FBb2JkO0FBQ0E7QUFDQSxJQUFBLEtBQUssRUFBRSxtS0FBbUssS0FBbkssQ0FBeUssR0FBekssQ0F0Yk87QUF3YmQsSUFBQSxRQUFRLEVBQUUsRUF4Ykk7QUEwYmQsSUFBQSxRQUFRLEVBQUU7QUFDVCxNQUFBLEtBQUssRUFBRSw0QkFBNEIsS0FBNUIsQ0FBa0MsR0FBbEMsQ0FERTtBQUVULE1BQUEsTUFBTSxFQUFFLGdCQUFVLEtBQVYsRUFBaUIsUUFBakIsRUFBNEI7QUFFbkM7QUFDQSxZQUFLLEtBQUssQ0FBQyxLQUFOLElBQWUsSUFBcEIsRUFBMkI7QUFDMUIsVUFBQSxLQUFLLENBQUMsS0FBTixHQUFjLFFBQVEsQ0FBQyxRQUFULElBQXFCLElBQXJCLEdBQTRCLFFBQVEsQ0FBQyxRQUFyQyxHQUFnRCxRQUFRLENBQUMsT0FBdkU7QUFDQTs7QUFFRCxlQUFPLEtBQVA7QUFDQTtBQVZRLEtBMWJJO0FBdWNkLElBQUEsVUFBVSxFQUFFO0FBQ1gsTUFBQSxLQUFLLEVBQUUsbUdBQW1HLEtBQW5HLENBQXlHLEdBQXpHLENBREk7QUFFWCxNQUFBLE1BQU0sRUFBRSxnQkFBVSxLQUFWLEVBQWlCLFFBQWpCLEVBQTRCO0FBQ25DLFlBQUksUUFBSjtBQUFBLFlBQWMsR0FBZDtBQUFBLFlBQW1CLElBQW5CO0FBQUEsWUFDQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BRG5CO0FBQUEsWUFFQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBRnhCLENBRG1DLENBS25DOztBQUNBLFlBQUssS0FBSyxDQUFDLEtBQU4sSUFBZSxJQUFmLElBQXVCLFFBQVEsQ0FBQyxPQUFULElBQW9CLElBQWhELEVBQXVEO0FBQ3RELFVBQUEsUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFOLENBQWEsYUFBYixJQUE4QixRQUF6QztBQUNBLFVBQUEsR0FBRyxHQUFHLFFBQVEsQ0FBQyxlQUFmO0FBQ0EsVUFBQSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQWhCO0FBRUEsVUFBQSxLQUFLLENBQUMsS0FBTixHQUFjLFFBQVEsQ0FBQyxPQUFULElBQXFCLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBWCxJQUF5QixJQUFJLElBQUksSUFBSSxDQUFDLFVBQXRDLElBQW9ELENBQXpFLEtBQWlGLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBWCxJQUF5QixJQUFJLElBQUksSUFBSSxDQUFDLFVBQXRDLElBQW9ELENBQXJJLENBQWQ7QUFDQSxVQUFBLEtBQUssQ0FBQyxLQUFOLEdBQWMsUUFBUSxDQUFDLE9BQVQsSUFBcUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFYLElBQXlCLElBQUksSUFBSSxJQUFJLENBQUMsU0FBdEMsSUFBb0QsQ0FBekUsS0FBaUYsR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFYLElBQXlCLElBQUksSUFBSSxJQUFJLENBQUMsU0FBdEMsSUFBb0QsQ0FBckksQ0FBZDtBQUNBLFNBYmtDLENBZW5DOzs7QUFDQSxZQUFLLENBQUMsS0FBSyxDQUFDLGFBQVAsSUFBd0IsV0FBN0IsRUFBMkM7QUFDMUMsVUFBQSxLQUFLLENBQUMsYUFBTixHQUFzQixXQUFXLEtBQUssS0FBSyxDQUFDLE1BQXRCLEdBQStCLFFBQVEsQ0FBQyxTQUF4QyxHQUFvRCxXQUExRTtBQUNBLFNBbEJrQyxDQW9CbkM7QUFDQTs7O0FBQ0EsWUFBSyxDQUFDLEtBQUssQ0FBQyxLQUFQLElBQWdCLE1BQU0sS0FBSyxTQUFoQyxFQUE0QztBQUMzQyxVQUFBLEtBQUssQ0FBQyxLQUFOLEdBQWdCLE1BQU0sR0FBRyxDQUFULEdBQWEsQ0FBYixHQUFtQixNQUFNLEdBQUcsQ0FBVCxHQUFhLENBQWIsR0FBbUIsTUFBTSxHQUFHLENBQVQsR0FBYSxDQUFiLEdBQWlCLENBQXZFO0FBQ0E7O0FBRUQsZUFBTyxLQUFQO0FBQ0E7QUE3QlUsS0F2Y0U7QUF1ZWQsSUFBQSxHQUFHLEVBQUUsYUFBVSxLQUFWLEVBQWtCO0FBQ3RCLFVBQUssS0FBSyxDQUFFLE1BQU0sQ0FBQyxPQUFULENBQVYsRUFBK0I7QUFDOUIsZUFBTyxLQUFQO0FBQ0EsT0FIcUIsQ0FLdEI7OztBQUNBLFVBQUksQ0FBSjtBQUFBLFVBQU8sSUFBUDtBQUFBLFVBQ0MsYUFBYSxHQUFHLEtBRGpCO0FBQUEsVUFFQyxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQVAsQ0FBYSxRQUFiLENBQXVCLEtBQUssQ0FBQyxJQUE3QixLQUF1QyxFQUZsRDtBQUFBLFVBR0MsSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFSLEdBQWdCLEtBQUssS0FBTCxDQUFXLE1BQVgsQ0FBbUIsT0FBTyxDQUFDLEtBQTNCLENBQWhCLEdBQXFELEtBQUssS0FIbEU7QUFLQSxNQUFBLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBUCxDQUFjLGFBQWQsQ0FBUjs7QUFFQSxXQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBZixFQUF1QixDQUF2QixHQUE0QjtBQUMzQixRQUFBLElBQUksR0FBRyxJQUFJLENBQUUsRUFBRSxDQUFKLENBQVg7QUFDQSxRQUFBLEtBQUssQ0FBRSxJQUFGLENBQUwsR0FBZ0IsYUFBYSxDQUFFLElBQUYsQ0FBN0I7QUFDQSxPQWhCcUIsQ0FrQnRCOzs7QUFDQSxVQUFLLENBQUMsS0FBSyxDQUFDLE1BQVosRUFBcUI7QUFDcEIsUUFBQSxLQUFLLENBQUMsTUFBTixHQUFlLGFBQWEsQ0FBQyxVQUFkLElBQTRCLFFBQTNDO0FBQ0EsT0FyQnFCLENBdUJ0Qjs7O0FBQ0EsVUFBSyxLQUFLLENBQUMsTUFBTixDQUFhLFFBQWIsS0FBMEIsQ0FBL0IsRUFBbUM7QUFDbEMsUUFBQSxLQUFLLENBQUMsTUFBTixHQUFlLEtBQUssQ0FBQyxNQUFOLENBQWEsVUFBNUI7QUFDQSxPQTFCcUIsQ0E0QnRCOzs7QUFDQSxNQUFBLEtBQUssQ0FBQyxPQUFOLEdBQWdCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBeEI7QUFFQSxhQUFPLE9BQU8sQ0FBQyxNQUFSLEdBQWdCLE9BQU8sQ0FBQyxNQUFSLENBQWdCLEtBQWhCLEVBQXVCLGFBQXZCLENBQWhCLEdBQXlELEtBQWhFO0FBQ0EsS0F2Z0JhO0FBeWdCZCxJQUFBLE9BQU8sRUFBRTtBQUNSLE1BQUEsSUFBSSxFQUFFO0FBQ0w7QUFDQSxRQUFBLFFBQVEsRUFBRTtBQUZMLE9BREU7QUFNUixNQUFBLEtBQUssRUFBRTtBQUNOLFFBQUEsWUFBWSxFQUFFO0FBRFIsT0FOQztBQVNSLE1BQUEsSUFBSSxFQUFFO0FBQ0wsUUFBQSxZQUFZLEVBQUU7QUFEVCxPQVRFO0FBYVIsTUFBQSxZQUFZLEVBQUU7QUFDYixRQUFBLEtBQUssRUFBRSxlQUFVLElBQVYsRUFBZ0IsVUFBaEIsRUFBNEIsV0FBNUIsRUFBMEM7QUFDaEQ7QUFDQSxjQUFLLE1BQU0sQ0FBQyxRQUFQLENBQWlCLElBQWpCLENBQUwsRUFBK0I7QUFDOUIsaUJBQUssY0FBTCxHQUFzQixXQUF0QjtBQUNBO0FBQ0QsU0FOWTtBQVFiLFFBQUEsUUFBUSxFQUFFLGtCQUFVLFVBQVYsRUFBc0IsV0FBdEIsRUFBb0M7QUFDN0MsY0FBSyxLQUFLLGNBQUwsS0FBd0IsV0FBN0IsRUFBMkM7QUFDMUMsaUJBQUssY0FBTCxHQUFzQixJQUF0QjtBQUNBO0FBQ0Q7QUFaWTtBQWJOLEtBemdCSztBQXNpQmQsSUFBQSxRQUFRLEVBQUUsa0JBQVUsSUFBVixFQUFnQixJQUFoQixFQUFzQixLQUF0QixFQUE2QixNQUE3QixFQUFzQztBQUMvQztBQUNBO0FBQ0E7QUFDQSxVQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBUCxDQUNQLElBQUksTUFBTSxDQUFDLEtBQVgsRUFETyxFQUVQLEtBRk8sRUFHUDtBQUFFLFFBQUEsSUFBSSxFQUFFLElBQVI7QUFDQyxRQUFBLFdBQVcsRUFBRSxJQURkO0FBRUMsUUFBQSxhQUFhLEVBQUU7QUFGaEIsT0FITyxDQUFSOztBQVFBLFVBQUssTUFBTCxFQUFjO0FBQ2IsUUFBQSxNQUFNLENBQUMsS0FBUCxDQUFhLE9BQWIsQ0FBc0IsQ0FBdEIsRUFBeUIsSUFBekIsRUFBK0IsSUFBL0I7QUFDQSxPQUZELE1BRU87QUFDTixRQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWEsUUFBYixDQUFzQixJQUF0QixDQUE0QixJQUE1QixFQUFrQyxDQUFsQztBQUNBOztBQUNELFVBQUssQ0FBQyxDQUFDLGtCQUFGLEVBQUwsRUFBOEI7QUFDN0IsUUFBQSxLQUFLLENBQUMsY0FBTjtBQUNBO0FBQ0Q7QUExakJhLEdBQWYsQ0F2a0YrQixDQW9vRy9CO0FBQ0E7O0FBQ0EsRUFBQSxNQUFNLENBQUMsS0FBUCxDQUFhLE1BQWIsR0FBc0IsTUFBTSxDQUFDLEtBQVAsQ0FBYSxRQUFuQztBQUVBLEVBQUEsTUFBTSxDQUFDLFdBQVAsR0FBcUIsUUFBUSxDQUFDLG1CQUFULEdBQ3BCLFVBQVUsSUFBVixFQUFnQixJQUFoQixFQUFzQixNQUF0QixFQUErQjtBQUM5QixRQUFLLElBQUksQ0FBQyxtQkFBVixFQUFnQztBQUMvQixNQUFBLElBQUksQ0FBQyxtQkFBTCxDQUEwQixJQUExQixFQUFnQyxNQUFoQyxFQUF3QyxLQUF4QztBQUNBO0FBQ0QsR0FMbUIsR0FNcEIsVUFBVSxJQUFWLEVBQWdCLElBQWhCLEVBQXNCLE1BQXRCLEVBQStCO0FBQzlCLFFBQUksSUFBSSxHQUFHLE9BQU8sSUFBbEI7O0FBRUEsUUFBSyxJQUFJLENBQUMsV0FBVixFQUF3QjtBQUV2QjtBQUNBO0FBQ0EsVUFBSyxPQUFPLElBQUksQ0FBRSxJQUFGLENBQVgsS0FBd0IsV0FBN0IsRUFBMkM7QUFDMUMsUUFBQSxJQUFJLENBQUUsSUFBRixDQUFKLEdBQWUsSUFBZjtBQUNBOztBQUVELE1BQUEsSUFBSSxDQUFDLFdBQUwsQ0FBa0IsSUFBbEIsRUFBd0IsTUFBeEI7QUFDQTtBQUNELEdBbkJGOztBQXFCQSxFQUFBLE1BQU0sQ0FBQyxLQUFQLEdBQWUsVUFBVSxHQUFWLEVBQWUsS0FBZixFQUF1QjtBQUNyQztBQUNBLFFBQUssRUFBRSxnQkFBZ0IsTUFBTSxDQUFDLEtBQXpCLENBQUwsRUFBdUM7QUFDdEMsYUFBTyxJQUFJLE1BQU0sQ0FBQyxLQUFYLENBQWtCLEdBQWxCLEVBQXVCLEtBQXZCLENBQVA7QUFDQSxLQUpvQyxDQU1yQzs7O0FBQ0EsUUFBSyxHQUFHLElBQUksR0FBRyxDQUFDLElBQWhCLEVBQXVCO0FBQ3RCLFdBQUssYUFBTCxHQUFxQixHQUFyQjtBQUNBLFdBQUssSUFBTCxHQUFZLEdBQUcsQ0FBQyxJQUFoQixDQUZzQixDQUl0QjtBQUNBOztBQUNBLFdBQUssa0JBQUwsR0FBNEIsR0FBRyxDQUFDLGdCQUFKLElBQXdCLEdBQUcsQ0FBQyxXQUFKLEtBQW9CLEtBQTVDLElBQzNCLEdBQUcsQ0FBQyxpQkFBSixJQUF5QixHQUFHLENBQUMsaUJBQUosRUFEQSxHQUM0QixVQUQ1QixHQUN5QyxXQURuRSxDQU5zQixDQVN2QjtBQUNDLEtBVkQsTUFVTztBQUNOLFdBQUssSUFBTCxHQUFZLEdBQVo7QUFDQSxLQW5Cb0MsQ0FxQnJDOzs7QUFDQSxRQUFLLEtBQUwsRUFBYTtBQUNaLE1BQUEsTUFBTSxDQUFDLE1BQVAsQ0FBZSxJQUFmLEVBQXFCLEtBQXJCO0FBQ0EsS0F4Qm9DLENBMEJyQzs7O0FBQ0EsU0FBSyxTQUFMLEdBQWlCLEdBQUcsSUFBSSxHQUFHLENBQUMsU0FBWCxJQUF3QixNQUFNLENBQUMsR0FBUCxFQUF6QyxDQTNCcUMsQ0E2QnJDOztBQUNBLFNBQU0sTUFBTSxDQUFDLE9BQWIsSUFBeUIsSUFBekI7QUFDQSxHQS9CRDs7QUFpQ0EsV0FBUyxXQUFULEdBQXVCO0FBQ3RCLFdBQU8sS0FBUDtBQUNBOztBQUNELFdBQVMsVUFBVCxHQUFzQjtBQUNyQixXQUFPLElBQVA7QUFDQSxHQW5zRzhCLENBcXNHL0I7QUFDQTs7O0FBQ0EsRUFBQSxNQUFNLENBQUMsS0FBUCxDQUFhLFNBQWIsR0FBeUI7QUFDeEIsSUFBQSxjQUFjLEVBQUUsMEJBQVc7QUFDMUIsV0FBSyxrQkFBTCxHQUEwQixVQUExQjtBQUVBLFVBQUksQ0FBQyxHQUFHLEtBQUssYUFBYjs7QUFDQSxVQUFLLENBQUMsQ0FBTixFQUFVO0FBQ1Q7QUFDQSxPQU55QixDQVExQjs7O0FBQ0EsVUFBSyxDQUFDLENBQUMsY0FBUCxFQUF3QjtBQUN2QixRQUFBLENBQUMsQ0FBQyxjQUFGLEdBRHVCLENBR3hCO0FBQ0MsT0FKRCxNQUlPO0FBQ04sUUFBQSxDQUFDLENBQUMsV0FBRixHQUFnQixLQUFoQjtBQUNBO0FBQ0QsS0FqQnVCO0FBa0J4QixJQUFBLGVBQWUsRUFBRSwyQkFBVztBQUMzQixXQUFLLG9CQUFMLEdBQTRCLFVBQTVCO0FBRUEsVUFBSSxDQUFDLEdBQUcsS0FBSyxhQUFiOztBQUNBLFVBQUssQ0FBQyxDQUFOLEVBQVU7QUFDVDtBQUNBLE9BTjBCLENBTzNCOzs7QUFDQSxVQUFLLENBQUMsQ0FBQyxlQUFQLEVBQXlCO0FBQ3hCLFFBQUEsQ0FBQyxDQUFDLGVBQUY7QUFDQSxPQVYwQixDQVczQjs7O0FBQ0EsTUFBQSxDQUFDLENBQUMsWUFBRixHQUFpQixJQUFqQjtBQUNBLEtBL0J1QjtBQWdDeEIsSUFBQSx3QkFBd0IsRUFBRSxvQ0FBVztBQUNwQyxXQUFLLDZCQUFMLEdBQXFDLFVBQXJDO0FBQ0EsV0FBSyxlQUFMO0FBQ0EsS0FuQ3VCO0FBb0N4QixJQUFBLGtCQUFrQixFQUFFLFdBcENJO0FBcUN4QixJQUFBLG9CQUFvQixFQUFFLFdBckNFO0FBc0N4QixJQUFBLDZCQUE2QixFQUFFO0FBdENQLEdBQXpCLENBdnNHK0IsQ0FndkcvQjs7QUFDQSxFQUFBLE1BQU0sQ0FBQyxJQUFQLENBQVk7QUFDWCxJQUFBLFVBQVUsRUFBRSxXQUREO0FBRVgsSUFBQSxVQUFVLEVBQUU7QUFGRCxHQUFaLEVBR0csVUFBVSxJQUFWLEVBQWdCLEdBQWhCLEVBQXNCO0FBQ3hCLElBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYSxPQUFiLENBQXNCLElBQXRCLElBQStCO0FBQzlCLE1BQUEsWUFBWSxFQUFFLEdBRGdCO0FBRTlCLE1BQUEsUUFBUSxFQUFFLEdBRm9CO0FBSTlCLE1BQUEsTUFBTSxFQUFFLGdCQUFVLEtBQVYsRUFBa0I7QUFDekIsWUFBSSxHQUFKO0FBQUEsWUFDQyxNQUFNLEdBQUcsSUFEVjtBQUFBLFlBRUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxhQUZqQjtBQUFBLFlBR0MsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUhuQjtBQUFBLFlBSUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUp0QixDQUR5QixDQU96QjtBQUNBOztBQUNBLFlBQUssQ0FBQyxPQUFELElBQWEsT0FBTyxLQUFLLE1BQVosSUFBc0IsQ0FBQyxNQUFNLENBQUMsUUFBUCxDQUFpQixNQUFqQixFQUF5QixPQUF6QixDQUF6QyxFQUErRTtBQUM5RSxVQUFBLEtBQUssQ0FBQyxJQUFOLEdBQWEsU0FBUyxDQUFDLFFBQXZCO0FBQ0EsVUFBQSxHQUFHLEdBQUcsU0FBUyxDQUFDLE9BQVYsQ0FBa0IsS0FBbEIsQ0FBeUIsSUFBekIsRUFBK0IsU0FBL0IsQ0FBTjtBQUNBLFVBQUEsS0FBSyxDQUFDLElBQU4sR0FBYSxHQUFiO0FBQ0E7O0FBQ0QsZUFBTyxHQUFQO0FBQ0E7QUFuQjZCLEtBQS9CO0FBcUJBLEdBekJELEVBanZHK0IsQ0E0d0cvQjs7QUFDQSxNQUFLLENBQUMsTUFBTSxDQUFDLE9BQVAsQ0FBZSxhQUFyQixFQUFxQztBQUVwQyxJQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWEsT0FBYixDQUFxQixNQUFyQixHQUE4QjtBQUM3QixNQUFBLEtBQUssRUFBRSxpQkFBVztBQUNqQjtBQUNBLFlBQUssTUFBTSxDQUFDLFFBQVAsQ0FBaUIsSUFBakIsRUFBdUIsTUFBdkIsQ0FBTCxFQUF1QztBQUN0QyxpQkFBTyxLQUFQO0FBQ0EsU0FKZ0IsQ0FNakI7OztBQUNBLFFBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYSxHQUFiLENBQWtCLElBQWxCLEVBQXdCLGdDQUF4QixFQUEwRCxVQUFVLENBQVYsRUFBYztBQUN2RTtBQUNBLGNBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFiO0FBQUEsY0FDQyxJQUFJLEdBQUcsTUFBTSxDQUFDLFFBQVAsQ0FBaUIsSUFBakIsRUFBdUIsT0FBdkIsS0FBb0MsTUFBTSxDQUFDLFFBQVAsQ0FBaUIsSUFBakIsRUFBdUIsUUFBdkIsQ0FBcEMsR0FBd0UsSUFBSSxDQUFDLElBQTdFLEdBQW9GLFNBRDVGOztBQUVBLGNBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQVAsQ0FBYyxJQUFkLEVBQW9CLGtCQUFwQixDQUFkLEVBQXlEO0FBQ3hELFlBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYSxHQUFiLENBQWtCLElBQWxCLEVBQXdCLGdCQUF4QixFQUEwQyxVQUFVLEtBQVYsRUFBa0I7QUFDM0QsY0FBQSxLQUFLLENBQUMsY0FBTixHQUF1QixJQUF2QjtBQUNBLGFBRkQ7O0FBR0EsWUFBQSxNQUFNLENBQUMsS0FBUCxDQUFjLElBQWQsRUFBb0Isa0JBQXBCLEVBQXdDLElBQXhDO0FBQ0E7QUFDRCxTQVZELEVBUGlCLENBa0JqQjtBQUNBLE9BcEI0QjtBQXNCN0IsTUFBQSxZQUFZLEVBQUUsc0JBQVUsS0FBVixFQUFrQjtBQUMvQjtBQUNBLFlBQUssS0FBSyxDQUFDLGNBQVgsRUFBNEI7QUFDM0IsaUJBQU8sS0FBSyxDQUFDLGNBQWI7O0FBQ0EsY0FBSyxLQUFLLFVBQUwsSUFBbUIsQ0FBQyxLQUFLLENBQUMsU0FBL0IsRUFBMkM7QUFDMUMsWUFBQSxNQUFNLENBQUMsS0FBUCxDQUFhLFFBQWIsQ0FBdUIsUUFBdkIsRUFBaUMsS0FBSyxVQUF0QyxFQUFrRCxLQUFsRCxFQUF5RCxJQUF6RDtBQUNBO0FBQ0Q7QUFDRCxPQTlCNEI7QUFnQzdCLE1BQUEsUUFBUSxFQUFFLG9CQUFXO0FBQ3BCO0FBQ0EsWUFBSyxNQUFNLENBQUMsUUFBUCxDQUFpQixJQUFqQixFQUF1QixNQUF2QixDQUFMLEVBQXVDO0FBQ3RDLGlCQUFPLEtBQVA7QUFDQSxTQUptQixDQU1wQjs7O0FBQ0EsUUFBQSxNQUFNLENBQUMsS0FBUCxDQUFhLE1BQWIsQ0FBcUIsSUFBckIsRUFBMkIsVUFBM0I7QUFDQTtBQXhDNEIsS0FBOUI7QUEwQ0EsR0F6ekc4QixDQTJ6Ry9COzs7QUFDQSxNQUFLLENBQUMsTUFBTSxDQUFDLE9BQVAsQ0FBZSxhQUFyQixFQUFxQztBQUVwQyxJQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWEsT0FBYixDQUFxQixNQUFyQixHQUE4QjtBQUU3QixNQUFBLEtBQUssRUFBRSxpQkFBVztBQUVqQixZQUFLLFVBQVUsQ0FBQyxJQUFYLENBQWlCLEtBQUssUUFBdEIsQ0FBTCxFQUF3QztBQUN2QztBQUNBO0FBQ0E7QUFDQSxjQUFLLEtBQUssSUFBTCxLQUFjLFVBQWQsSUFBNEIsS0FBSyxJQUFMLEtBQWMsT0FBL0MsRUFBeUQ7QUFDeEQsWUFBQSxNQUFNLENBQUMsS0FBUCxDQUFhLEdBQWIsQ0FBa0IsSUFBbEIsRUFBd0Isd0JBQXhCLEVBQWtELFVBQVUsS0FBVixFQUFrQjtBQUNuRSxrQkFBSyxLQUFLLENBQUMsYUFBTixDQUFvQixZQUFwQixLQUFxQyxTQUExQyxFQUFzRDtBQUNyRCxxQkFBSyxhQUFMLEdBQXFCLElBQXJCO0FBQ0E7QUFDRCxhQUpEO0FBS0EsWUFBQSxNQUFNLENBQUMsS0FBUCxDQUFhLEdBQWIsQ0FBa0IsSUFBbEIsRUFBd0IsZUFBeEIsRUFBeUMsVUFBVSxLQUFWLEVBQWtCO0FBQzFELGtCQUFLLEtBQUssYUFBTCxJQUFzQixDQUFDLEtBQUssQ0FBQyxTQUFsQyxFQUE4QztBQUM3QyxxQkFBSyxhQUFMLEdBQXFCLEtBQXJCO0FBQ0EsZUFIeUQsQ0FJMUQ7OztBQUNBLGNBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYSxRQUFiLENBQXVCLFFBQXZCLEVBQWlDLElBQWpDLEVBQXVDLEtBQXZDLEVBQThDLElBQTlDO0FBQ0EsYUFORDtBQU9BOztBQUNELGlCQUFPLEtBQVA7QUFDQSxTQXJCZ0IsQ0FzQmpCOzs7QUFDQSxRQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWEsR0FBYixDQUFrQixJQUFsQixFQUF3Qix3QkFBeEIsRUFBa0QsVUFBVSxDQUFWLEVBQWM7QUFDL0QsY0FBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQWI7O0FBRUEsY0FBSyxVQUFVLENBQUMsSUFBWCxDQUFpQixJQUFJLENBQUMsUUFBdEIsS0FBb0MsQ0FBQyxNQUFNLENBQUMsS0FBUCxDQUFjLElBQWQsRUFBb0Isa0JBQXBCLENBQTFDLEVBQXFGO0FBQ3BGLFlBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYSxHQUFiLENBQWtCLElBQWxCLEVBQXdCLGdCQUF4QixFQUEwQyxVQUFVLEtBQVYsRUFBa0I7QUFDM0Qsa0JBQUssS0FBSyxVQUFMLElBQW1CLENBQUMsS0FBSyxDQUFDLFdBQTFCLElBQXlDLENBQUMsS0FBSyxDQUFDLFNBQXJELEVBQWlFO0FBQ2hFLGdCQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWEsUUFBYixDQUF1QixRQUF2QixFQUFpQyxLQUFLLFVBQXRDLEVBQWtELEtBQWxELEVBQXlELElBQXpEO0FBQ0E7QUFDRCxhQUpEOztBQUtBLFlBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYyxJQUFkLEVBQW9CLGtCQUFwQixFQUF3QyxJQUF4QztBQUNBO0FBQ0QsU0FYRDtBQVlBLE9BckM0QjtBQXVDN0IsTUFBQSxNQUFNLEVBQUUsZ0JBQVUsS0FBVixFQUFrQjtBQUN6QixZQUFJLElBQUksR0FBRyxLQUFLLENBQUMsTUFBakIsQ0FEeUIsQ0FHekI7O0FBQ0EsWUFBSyxTQUFTLElBQVQsSUFBaUIsS0FBSyxDQUFDLFdBQXZCLElBQXNDLEtBQUssQ0FBQyxTQUE1QyxJQUEwRCxJQUFJLENBQUMsSUFBTCxLQUFjLE9BQWQsSUFBeUIsSUFBSSxDQUFDLElBQUwsS0FBYyxVQUF0RyxFQUFvSDtBQUNuSCxpQkFBTyxLQUFLLENBQUMsU0FBTixDQUFnQixPQUFoQixDQUF3QixLQUF4QixDQUErQixJQUEvQixFQUFxQyxTQUFyQyxDQUFQO0FBQ0E7QUFDRCxPQTlDNEI7QUFnRDdCLE1BQUEsUUFBUSxFQUFFLG9CQUFXO0FBQ3BCLFFBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYSxNQUFiLENBQXFCLElBQXJCLEVBQTJCLFVBQTNCO0FBRUEsZUFBTyxDQUFDLFVBQVUsQ0FBQyxJQUFYLENBQWlCLEtBQUssUUFBdEIsQ0FBUjtBQUNBO0FBcEQ0QixLQUE5QjtBQXNEQSxHQXAzRzhCLENBczNHL0I7OztBQUNBLE1BQUssQ0FBQyxNQUFNLENBQUMsT0FBUCxDQUFlLGNBQXJCLEVBQXNDO0FBQ3JDLElBQUEsTUFBTSxDQUFDLElBQVAsQ0FBWTtBQUFFLE1BQUEsS0FBSyxFQUFFLFNBQVQ7QUFBb0IsTUFBQSxJQUFJLEVBQUU7QUFBMUIsS0FBWixFQUFvRCxVQUFVLElBQVYsRUFBZ0IsR0FBaEIsRUFBc0I7QUFFekU7QUFDQSxVQUFJLFFBQVEsR0FBRyxDQUFmO0FBQUEsVUFDQyxPQUFPLEdBQUcsU0FBVixPQUFVLENBQVUsS0FBVixFQUFrQjtBQUMzQixRQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWEsUUFBYixDQUF1QixHQUF2QixFQUE0QixLQUFLLENBQUMsTUFBbEMsRUFBMEMsTUFBTSxDQUFDLEtBQVAsQ0FBYSxHQUFiLENBQWtCLEtBQWxCLENBQTFDLEVBQXFFLElBQXJFO0FBQ0EsT0FIRjs7QUFLQSxNQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWEsT0FBYixDQUFzQixHQUF0QixJQUE4QjtBQUM3QixRQUFBLEtBQUssRUFBRSxpQkFBVztBQUNqQixjQUFLLFFBQVEsT0FBTyxDQUFwQixFQUF3QjtBQUN2QixZQUFBLFFBQVEsQ0FBQyxnQkFBVCxDQUEyQixJQUEzQixFQUFpQyxPQUFqQyxFQUEwQyxJQUExQztBQUNBO0FBQ0QsU0FMNEI7QUFNN0IsUUFBQSxRQUFRLEVBQUUsb0JBQVc7QUFDcEIsY0FBSyxFQUFFLFFBQUYsS0FBZSxDQUFwQixFQUF3QjtBQUN2QixZQUFBLFFBQVEsQ0FBQyxtQkFBVCxDQUE4QixJQUE5QixFQUFvQyxPQUFwQyxFQUE2QyxJQUE3QztBQUNBO0FBQ0Q7QUFWNEIsT0FBOUI7QUFZQSxLQXBCRDtBQXFCQTs7QUFFRCxFQUFBLE1BQU0sQ0FBQyxFQUFQLENBQVUsTUFBVixDQUFpQjtBQUVoQixJQUFBLEVBQUUsRUFBRSxZQUFVLEtBQVYsRUFBaUIsUUFBakIsRUFBMkIsSUFBM0IsRUFBaUMsRUFBakM7QUFBcUM7QUFBYSxJQUFBLEdBQWxELEVBQXdEO0FBQzNELFVBQUksTUFBSixFQUFZLElBQVosQ0FEMkQsQ0FHM0Q7O0FBQ0EsVUFBSyxRQUFPLEtBQVAsTUFBaUIsUUFBdEIsRUFBaUM7QUFDaEM7QUFDQSxZQUFLLE9BQU8sUUFBUCxLQUFvQixRQUF6QixFQUFvQztBQUFFO0FBQ3JDO0FBQ0EsVUFBQSxJQUFJLEdBQUcsSUFBSSxJQUFJLFFBQWY7QUFDQSxVQUFBLFFBQVEsR0FBRyxTQUFYO0FBQ0E7O0FBQ0QsYUFBTSxJQUFOLElBQWMsS0FBZCxFQUFzQjtBQUNyQixlQUFLLEVBQUwsQ0FBUyxJQUFULEVBQWUsUUFBZixFQUF5QixJQUF6QixFQUErQixLQUFLLENBQUUsSUFBRixDQUFwQyxFQUE4QyxHQUE5QztBQUNBOztBQUNELGVBQU8sSUFBUDtBQUNBOztBQUVELFVBQUssSUFBSSxJQUFJLElBQVIsSUFBZ0IsRUFBRSxJQUFJLElBQTNCLEVBQWtDO0FBQ2pDO0FBQ0EsUUFBQSxFQUFFLEdBQUcsUUFBTDtBQUNBLFFBQUEsSUFBSSxHQUFHLFFBQVEsR0FBRyxTQUFsQjtBQUNBLE9BSkQsTUFJTyxJQUFLLEVBQUUsSUFBSSxJQUFYLEVBQWtCO0FBQ3hCLFlBQUssT0FBTyxRQUFQLEtBQW9CLFFBQXpCLEVBQW9DO0FBQ25DO0FBQ0EsVUFBQSxFQUFFLEdBQUcsSUFBTDtBQUNBLFVBQUEsSUFBSSxHQUFHLFNBQVA7QUFDQSxTQUpELE1BSU87QUFDTjtBQUNBLFVBQUEsRUFBRSxHQUFHLElBQUw7QUFDQSxVQUFBLElBQUksR0FBRyxRQUFQO0FBQ0EsVUFBQSxRQUFRLEdBQUcsU0FBWDtBQUNBO0FBQ0Q7O0FBQ0QsVUFBSyxFQUFFLEtBQUssS0FBWixFQUFvQjtBQUNuQixRQUFBLEVBQUUsR0FBRyxXQUFMO0FBQ0EsT0FGRCxNQUVPLElBQUssQ0FBQyxFQUFOLEVBQVc7QUFDakIsZUFBTyxJQUFQO0FBQ0E7O0FBRUQsVUFBSyxHQUFHLEtBQUssQ0FBYixFQUFpQjtBQUNoQixRQUFBLE1BQU0sR0FBRyxFQUFUOztBQUNBLFFBQUEsRUFBRSxHQUFHLFlBQVUsS0FBVixFQUFrQjtBQUN0QjtBQUNBLFVBQUEsTUFBTSxHQUFHLEdBQVQsQ0FBYyxLQUFkO0FBQ0EsaUJBQU8sTUFBTSxDQUFDLEtBQVAsQ0FBYyxJQUFkLEVBQW9CLFNBQXBCLENBQVA7QUFDQSxTQUpELENBRmdCLENBT2hCOzs7QUFDQSxRQUFBLEVBQUUsQ0FBQyxJQUFILEdBQVUsTUFBTSxDQUFDLElBQVAsS0FBaUIsTUFBTSxDQUFDLElBQVAsR0FBYyxNQUFNLENBQUMsSUFBUCxFQUEvQixDQUFWO0FBQ0E7O0FBQ0QsYUFBTyxLQUFLLElBQUwsQ0FBVyxZQUFXO0FBQzVCLFFBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYSxHQUFiLENBQWtCLElBQWxCLEVBQXdCLEtBQXhCLEVBQStCLEVBQS9CLEVBQW1DLElBQW5DLEVBQXlDLFFBQXpDO0FBQ0EsT0FGTSxDQUFQO0FBR0EsS0F0RGU7QUF1RGhCLElBQUEsR0FBRyxFQUFFLGFBQVUsS0FBVixFQUFpQixRQUFqQixFQUEyQixJQUEzQixFQUFpQyxFQUFqQyxFQUFzQztBQUMxQyxhQUFPLEtBQUssRUFBTCxDQUFTLEtBQVQsRUFBZ0IsUUFBaEIsRUFBMEIsSUFBMUIsRUFBZ0MsRUFBaEMsRUFBb0MsQ0FBcEMsQ0FBUDtBQUNBLEtBekRlO0FBMERoQixJQUFBLEdBQUcsRUFBRSxhQUFVLEtBQVYsRUFBaUIsUUFBakIsRUFBMkIsRUFBM0IsRUFBZ0M7QUFDcEMsVUFBSSxTQUFKLEVBQWUsSUFBZjs7QUFDQSxVQUFLLEtBQUssSUFBSSxLQUFLLENBQUMsY0FBZixJQUFpQyxLQUFLLENBQUMsU0FBNUMsRUFBd0Q7QUFDdkQ7QUFDQSxRQUFBLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBbEI7QUFDQSxRQUFBLE1BQU0sQ0FBRSxLQUFLLENBQUMsY0FBUixDQUFOLENBQStCLEdBQS9CLENBQ0MsU0FBUyxDQUFDLFNBQVYsR0FBc0IsU0FBUyxDQUFDLFFBQVYsR0FBcUIsR0FBckIsR0FBMkIsU0FBUyxDQUFDLFNBQTNELEdBQXVFLFNBQVMsQ0FBQyxRQURsRixFQUVDLFNBQVMsQ0FBQyxRQUZYLEVBR0MsU0FBUyxDQUFDLE9BSFg7QUFLQSxlQUFPLElBQVA7QUFDQTs7QUFDRCxVQUFLLFFBQU8sS0FBUCxNQUFpQixRQUF0QixFQUFpQztBQUNoQztBQUNBLGFBQU0sSUFBTixJQUFjLEtBQWQsRUFBc0I7QUFDckIsZUFBSyxHQUFMLENBQVUsSUFBVixFQUFnQixRQUFoQixFQUEwQixLQUFLLENBQUUsSUFBRixDQUEvQjtBQUNBOztBQUNELGVBQU8sSUFBUDtBQUNBOztBQUNELFVBQUssUUFBUSxLQUFLLEtBQWIsSUFBc0IsT0FBTyxRQUFQLEtBQW9CLFVBQS9DLEVBQTREO0FBQzNEO0FBQ0EsUUFBQSxFQUFFLEdBQUcsUUFBTDtBQUNBLFFBQUEsUUFBUSxHQUFHLFNBQVg7QUFDQTs7QUFDRCxVQUFLLEVBQUUsS0FBSyxLQUFaLEVBQW9CO0FBQ25CLFFBQUEsRUFBRSxHQUFHLFdBQUw7QUFDQTs7QUFDRCxhQUFPLEtBQUssSUFBTCxDQUFVLFlBQVc7QUFDM0IsUUFBQSxNQUFNLENBQUMsS0FBUCxDQUFhLE1BQWIsQ0FBcUIsSUFBckIsRUFBMkIsS0FBM0IsRUFBa0MsRUFBbEMsRUFBc0MsUUFBdEM7QUFDQSxPQUZNLENBQVA7QUFHQSxLQXhGZTtBQTBGaEIsSUFBQSxJQUFJLEVBQUUsY0FBVSxLQUFWLEVBQWlCLElBQWpCLEVBQXVCLEVBQXZCLEVBQTRCO0FBQ2pDLGFBQU8sS0FBSyxFQUFMLENBQVMsS0FBVCxFQUFnQixJQUFoQixFQUFzQixJQUF0QixFQUE0QixFQUE1QixDQUFQO0FBQ0EsS0E1RmU7QUE2RmhCLElBQUEsTUFBTSxFQUFFLGdCQUFVLEtBQVYsRUFBaUIsRUFBakIsRUFBc0I7QUFDN0IsYUFBTyxLQUFLLEdBQUwsQ0FBVSxLQUFWLEVBQWlCLElBQWpCLEVBQXVCLEVBQXZCLENBQVA7QUFDQSxLQS9GZTtBQWlHaEIsSUFBQSxJQUFJLEVBQUUsY0FBVSxLQUFWLEVBQWlCLElBQWpCLEVBQXVCLEVBQXZCLEVBQTRCO0FBQ2pDLE1BQUEsTUFBTSxDQUFFLEtBQUssT0FBUCxDQUFOLENBQXVCLEVBQXZCLENBQTJCLEtBQTNCLEVBQWtDLEtBQUssUUFBdkMsRUFBaUQsSUFBakQsRUFBdUQsRUFBdkQ7QUFDQSxhQUFPLElBQVA7QUFDQSxLQXBHZTtBQXFHaEIsSUFBQSxHQUFHLEVBQUUsYUFBVSxLQUFWLEVBQWlCLEVBQWpCLEVBQXNCO0FBQzFCLE1BQUEsTUFBTSxDQUFFLEtBQUssT0FBUCxDQUFOLENBQXVCLEdBQXZCLENBQTRCLEtBQTVCLEVBQW1DLEtBQUssUUFBTCxJQUFpQixJQUFwRCxFQUEwRCxFQUExRDtBQUNBLGFBQU8sSUFBUDtBQUNBLEtBeEdlO0FBMEdoQixJQUFBLFFBQVEsRUFBRSxrQkFBVSxRQUFWLEVBQW9CLEtBQXBCLEVBQTJCLElBQTNCLEVBQWlDLEVBQWpDLEVBQXNDO0FBQy9DLGFBQU8sS0FBSyxFQUFMLENBQVMsS0FBVCxFQUFnQixRQUFoQixFQUEwQixJQUExQixFQUFnQyxFQUFoQyxDQUFQO0FBQ0EsS0E1R2U7QUE2R2hCLElBQUEsVUFBVSxFQUFFLG9CQUFVLFFBQVYsRUFBb0IsS0FBcEIsRUFBMkIsRUFBM0IsRUFBZ0M7QUFDM0M7QUFDQSxhQUFPLFNBQVMsQ0FBQyxNQUFWLElBQW9CLENBQXBCLEdBQXVCLEtBQUssR0FBTCxDQUFVLFFBQVYsRUFBb0IsSUFBcEIsQ0FBdkIsR0FBb0QsS0FBSyxHQUFMLENBQVUsS0FBVixFQUFpQixRQUFRLElBQUksSUFBN0IsRUFBbUMsRUFBbkMsQ0FBM0Q7QUFDQSxLQWhIZTtBQWtIaEIsSUFBQSxPQUFPLEVBQUUsaUJBQVUsSUFBVixFQUFnQixJQUFoQixFQUF1QjtBQUMvQixhQUFPLEtBQUssSUFBTCxDQUFVLFlBQVc7QUFDM0IsUUFBQSxNQUFNLENBQUMsS0FBUCxDQUFhLE9BQWIsQ0FBc0IsSUFBdEIsRUFBNEIsSUFBNUIsRUFBa0MsSUFBbEM7QUFDQSxPQUZNLENBQVA7QUFHQSxLQXRIZTtBQXVIaEIsSUFBQSxjQUFjLEVBQUUsd0JBQVUsSUFBVixFQUFnQixJQUFoQixFQUF1QjtBQUN0QyxVQUFLLEtBQUssQ0FBTCxDQUFMLEVBQWU7QUFDZCxlQUFPLE1BQU0sQ0FBQyxLQUFQLENBQWEsT0FBYixDQUFzQixJQUF0QixFQUE0QixJQUE1QixFQUFrQyxLQUFLLENBQUwsQ0FBbEMsRUFBMkMsSUFBM0MsQ0FBUDtBQUNBO0FBQ0QsS0EzSGU7QUE2SGhCLElBQUEsTUFBTSxFQUFFLGdCQUFVLEVBQVYsRUFBZTtBQUN0QjtBQUNBLFVBQUksSUFBSSxHQUFHLFNBQVg7QUFBQSxVQUNDLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSCxJQUFXLE1BQU0sQ0FBQyxJQUFQLEVBRG5CO0FBQUEsVUFFQyxDQUFDLEdBQUcsQ0FGTDtBQUFBLFVBR0MsT0FBTyxHQUFHLFNBQVYsT0FBVSxDQUFVLEtBQVYsRUFBa0I7QUFDM0I7QUFDQSxZQUFJLFVBQVUsR0FBRyxDQUFFLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZCxFQUFvQixlQUFlLEVBQUUsQ0FBQyxJQUF0QyxLQUFnRCxDQUFsRCxJQUF3RCxDQUF6RTs7QUFDQSxRQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZCxFQUFvQixlQUFlLEVBQUUsQ0FBQyxJQUF0QyxFQUE0QyxVQUFVLEdBQUcsQ0FBekQsRUFIMkIsQ0FLM0I7OztBQUNBLFFBQUEsS0FBSyxDQUFDLGNBQU4sR0FOMkIsQ0FRM0I7O0FBQ0EsZUFBTyxJQUFJLENBQUUsVUFBRixDQUFKLENBQW1CLEtBQW5CLENBQTBCLElBQTFCLEVBQWdDLFNBQWhDLEtBQStDLEtBQXREO0FBQ0EsT0FiRixDQUZzQixDQWlCdEI7OztBQUNBLE1BQUEsT0FBTyxDQUFDLElBQVIsR0FBZSxJQUFmOztBQUNBLGFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFqQixFQUEwQjtBQUN6QixRQUFBLElBQUksQ0FBRSxDQUFDLEVBQUgsQ0FBSixDQUFZLElBQVosR0FBbUIsSUFBbkI7QUFDQTs7QUFFRCxhQUFPLEtBQUssS0FBTCxDQUFZLE9BQVosQ0FBUDtBQUNBLEtBckplO0FBdUpoQixJQUFBLEtBQUssRUFBRSxlQUFVLE1BQVYsRUFBa0IsS0FBbEIsRUFBMEI7QUFDaEMsYUFBTyxLQUFLLFVBQUwsQ0FBaUIsTUFBakIsRUFBMEIsVUFBMUIsQ0FBc0MsS0FBSyxJQUFJLE1BQS9DLENBQVA7QUFDQTtBQXpKZSxHQUFqQjtBQTRKQSxFQUFBLE1BQU0sQ0FBQyxJQUFQLENBQWEsQ0FBQywwRUFDYix1RUFEYSxHQUViLCtEQUZZLEVBRXFELEtBRnJELENBRTJELEdBRjNELENBQWIsRUFFOEUsVUFBVSxDQUFWLEVBQWEsSUFBYixFQUFvQjtBQUVqRztBQUNBLElBQUEsTUFBTSxDQUFDLEVBQVAsQ0FBVyxJQUFYLElBQW9CLFVBQVUsSUFBVixFQUFnQixFQUFoQixFQUFxQjtBQUN4QyxVQUFLLEVBQUUsSUFBSSxJQUFYLEVBQWtCO0FBQ2pCLFFBQUEsRUFBRSxHQUFHLElBQUw7QUFDQSxRQUFBLElBQUksR0FBRyxJQUFQO0FBQ0E7O0FBRUQsYUFBTyxTQUFTLENBQUMsTUFBVixHQUFtQixDQUFuQixHQUNOLEtBQUssRUFBTCxDQUFTLElBQVQsRUFBZSxJQUFmLEVBQXFCLElBQXJCLEVBQTJCLEVBQTNCLENBRE0sR0FFTixLQUFLLE9BQUwsQ0FBYyxJQUFkLENBRkQ7QUFHQSxLQVREOztBQVdBLFFBQUssU0FBUyxDQUFDLElBQVYsQ0FBZ0IsSUFBaEIsQ0FBTCxFQUE4QjtBQUM3QixNQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWEsUUFBYixDQUF1QixJQUF2QixJQUFnQyxNQUFNLENBQUMsS0FBUCxDQUFhLFFBQTdDO0FBQ0E7O0FBRUQsUUFBSyxXQUFXLENBQUMsSUFBWixDQUFrQixJQUFsQixDQUFMLEVBQWdDO0FBQy9CLE1BQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYSxRQUFiLENBQXVCLElBQXZCLElBQWdDLE1BQU0sQ0FBQyxLQUFQLENBQWEsVUFBN0M7QUFDQTtBQUNELEdBdkJEO0FBd0JBOzs7Ozs7O0FBTUEsR0FBQyxVQUFVLE1BQVYsRUFBa0IsU0FBbEIsRUFBOEI7QUFFL0IsUUFBSSxPQUFKO0FBQUEsUUFDQyxVQUREO0FBQUEsUUFFQyxrQkFGRDtBQUFBLFFBR0MsSUFIRDtBQUFBLFFBSUMsT0FKRDtBQUFBLFFBS0MsS0FMRDtBQUFBLFFBTUMsUUFORDtBQUFBLFFBT0MsT0FQRDtBQUFBLFFBUUMsU0FSRDtBQUFBLFFBU0MsWUFURDtBQUFBLFFBV0MsZ0JBQWdCLEdBQUcsSUFYcEI7QUFBQSxRQVlDLFlBQVksR0FBRyxXQVpoQjtBQUFBLFFBY0MsT0FBTyxHQUFHLENBQUUsYUFBYSxJQUFJLENBQUMsTUFBTCxFQUFmLEVBQStCLE9BQS9CLENBQXdDLEdBQXhDLEVBQTZDLEVBQTdDLENBZFg7QUFBQSxRQWdCQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBaEJuQjtBQUFBLFFBaUJDLE9BQU8sR0FBRyxRQUFRLENBQUMsZUFqQnBCO0FBQUEsUUFrQkMsSUFBSSxHQUFHLENBbEJSO0FBQUEsUUFtQkMsS0FBSyxHQUFHLEdBQUcsS0FuQlo7QUFBQSxRQW9CQyxJQUFJLEdBQUcsR0FBRyxJQXBCWDtBQUFBLFFBc0JDO0FBQ0EsSUFBQSxZQUFZLEdBQUcsU0FBZixZQUFlLENBQVUsRUFBVixFQUFjLEtBQWQsRUFBc0I7QUFDcEMsTUFBQSxFQUFFLENBQUUsT0FBRixDQUFGLEdBQWdCLEtBQUssSUFBSSxJQUF6QjtBQUNBLGFBQU8sRUFBUDtBQUNBLEtBMUJGO0FBQUEsUUE0QkMsV0FBVyxHQUFHLFNBQWQsV0FBYyxHQUFXO0FBQ3hCLFVBQUksS0FBSyxHQUFHLEVBQVo7QUFBQSxVQUNDLElBQUksR0FBRyxFQURSO0FBR0EsYUFBTyxZQUFZLENBQUMsVUFBVSxHQUFWLEVBQWUsS0FBZixFQUF1QjtBQUMxQztBQUNBLFlBQUssSUFBSSxDQUFDLElBQUwsQ0FBVyxHQUFYLElBQW1CLElBQUksQ0FBQyxXQUE3QixFQUEyQztBQUMxQyxpQkFBTyxLQUFLLENBQUUsSUFBSSxDQUFDLEtBQUwsRUFBRixDQUFaO0FBQ0E7O0FBRUQsZUFBUSxLQUFLLENBQUUsR0FBRixDQUFMLEdBQWUsS0FBdkI7QUFDQSxPQVBrQixFQU9oQixLQVBnQixDQUFuQjtBQVFBLEtBeENGO0FBQUEsUUEwQ0MsVUFBVSxHQUFHLFdBQVcsRUExQ3pCO0FBQUEsUUEyQ0MsVUFBVSxHQUFHLFdBQVcsRUEzQ3pCO0FBQUEsUUE0Q0MsYUFBYSxHQUFHLFdBQVcsRUE1QzVCO0FBQUEsUUE4Q0M7QUFFQTtBQUNBLElBQUEsVUFBVSxHQUFHLHFCQWpEZDtBQUFBLFFBa0RDO0FBQ0EsSUFBQSxpQkFBaUIsR0FBRyxrQ0FuRHJCO0FBQUEsUUFxREM7QUFDQTtBQUNBO0FBQ0EsSUFBQSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsT0FBbEIsQ0FBMkIsR0FBM0IsRUFBZ0MsSUFBaEMsQ0F4RGQ7QUFBQSxRQTBEQztBQUNBLElBQUEsU0FBUyxHQUFHLGNBM0RiO0FBQUEsUUE0REMsVUFBVSxHQUFHLFFBQVEsVUFBUixHQUFxQixJQUFyQixHQUE0QixpQkFBNUIsR0FBZ0QsR0FBaEQsR0FBc0QsVUFBdEQsR0FDWixNQURZLEdBQ0gsU0FERyxHQUNTLFVBRFQsR0FDc0IsdUNBRHRCLEdBQ2dFLFVBRGhFLEdBQzZFLE9BRDdFLEdBQ3VGLFVBRHZGLEdBQ29HLE1BN0RsSDtBQUFBLFFBK0RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFBLE9BQU8sR0FBRyxPQUFPLGlCQUFQLEdBQTJCLDhEQUEzQixHQUE0RixVQUE1RixHQUF5RywwQkFwRXBIO0FBQUEsUUFzRUM7QUFDQSxJQUFBLEdBQUcsR0FBRyx5RUF2RVA7QUFBQSxRQXlFQztBQUNBLElBQUEsS0FBSyxHQUFHLElBQUksTUFBSixDQUFZLE1BQU0sVUFBTixHQUFtQiw2QkFBbkIsR0FBbUQsVUFBbkQsR0FBZ0UsSUFBNUUsRUFBa0YsR0FBbEYsQ0ExRVQ7QUFBQSxRQTRFQyxNQUFNLEdBQUcsSUFBSSxNQUFKLENBQVksTUFBTSxVQUFOLEdBQW1CLElBQW5CLEdBQTBCLFVBQTFCLEdBQXVDLEdBQW5ELENBNUVWO0FBQUEsUUE2RUMsWUFBWSxHQUFHLElBQUksTUFBSixDQUFZLE1BQU0sVUFBTixHQUFtQiwyQkFBbkIsR0FBaUQsVUFBakQsR0FBOEQsR0FBMUUsQ0E3RWhCO0FBQUEsUUE4RUMsT0FBTyxHQUFHLElBQUksTUFBSixDQUFZLE9BQVosQ0E5RVg7QUFBQSxRQWdGQztBQUNBLElBQUEsVUFBVSxHQUFHLG9DQWpGZDtBQUFBLFFBbUZDLElBQUksR0FBRyxPQW5GUjtBQUFBLFFBb0ZDLFFBQVEsR0FBRyxxQkFwRlo7QUFBQSxRQXFGQyxZQUFZLEdBQUcsU0FyRmhCO0FBQUEsUUF1RkMsT0FBTyxHQUFHLE1BdkZYO0FBQUEsUUF3RkMsT0FBTyxHQUFHLCtCQXhGWDtBQUFBLFFBMEZDLFVBQVUsR0FBRyxXQTFGZDtBQUFBLFFBNEZDLFNBQVMsR0FBRztBQUNYLFlBQU0sSUFBSSxNQUFKLENBQVksUUFBUSxpQkFBUixHQUE0QixHQUF4QyxDQURLO0FBRVgsZUFBUyxJQUFJLE1BQUosQ0FBWSxVQUFVLGlCQUFWLEdBQThCLEdBQTFDLENBRkU7QUFHWCxjQUFRLElBQUksTUFBSixDQUFZLHFCQUFxQixpQkFBckIsR0FBeUMsWUFBckQsQ0FIRztBQUlYLGFBQU8sSUFBSSxNQUFKLENBQVksT0FBTyxpQkFBaUIsQ0FBQyxPQUFsQixDQUEyQixHQUEzQixFQUFnQyxJQUFoQyxDQUFQLEdBQWdELEdBQTVELENBSkk7QUFLWCxjQUFRLElBQUksTUFBSixDQUFZLE1BQU0sVUFBbEIsQ0FMRztBQU1YLGdCQUFVLElBQUksTUFBSixDQUFZLE1BQU0sT0FBbEIsQ0FOQztBQU9YLGVBQVMsSUFBSSxNQUFKLENBQVksd0NBQXdDLFVBQXhDLEdBQ3BCLDhCQURvQixHQUNhLFVBRGIsR0FDMEIsYUFEMUIsR0FDMEMsVUFEMUMsR0FFcEIsWUFGb0IsR0FFTCxVQUZLLEdBRVEsUUFGcEIsRUFFOEIsR0FGOUIsQ0FQRTtBQVVYLGFBQU8sSUFBSSxNQUFKLENBQVksR0FBWixFQUFpQixJQUFqQixDQVZJO0FBV1g7QUFDQSxzQkFBZ0IsSUFBSSxNQUFKLENBQVksTUFBTSxVQUFOLEdBQW1CLFNBQW5CLEdBQStCLEdBQTNDLEVBQWdELEdBQWhEO0FBWkwsS0E1RmI7QUFBQSxRQTJHQztBQUVBO0FBQ0EsSUFBQSxNQUFNLEdBQUcsU0FBVCxNQUFTLENBQVUsRUFBVixFQUFlO0FBQ3ZCLFVBQUksR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFULENBQXVCLEtBQXZCLENBQVY7O0FBRUEsVUFBSTtBQUNILGVBQU8sRUFBRSxDQUFFLEdBQUYsQ0FBVDtBQUNBLE9BRkQsQ0FFRSxPQUFPLENBQVAsRUFBVTtBQUNYLGVBQU8sS0FBUDtBQUNBLE9BSkQsU0FJVTtBQUNUO0FBQ0EsUUFBQSxHQUFHLEdBQUcsSUFBTjtBQUNBO0FBQ0QsS0F6SEY7QUFBQSxRQTJIQztBQUNBLElBQUEsdUJBQXVCLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBVixFQUFnQjtBQUNoRCxNQUFBLEdBQUcsQ0FBQyxXQUFKLENBQWlCLFFBQVEsQ0FBQyxhQUFULENBQXVCLEVBQXZCLENBQWpCO0FBQ0EsYUFBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBSixDQUF5QixHQUF6QixFQUE4QixNQUF0QztBQUNBLEtBSCtCLENBNUhqQztBQUFBLFFBaUlDO0FBQ0EsSUFBQSx1QkFBdUIsR0FBRyxNQUFNLENBQUMsVUFBVSxHQUFWLEVBQWdCO0FBQ2hELE1BQUEsR0FBRyxDQUFDLFNBQUosR0FBZ0Isa0JBQWhCO0FBQ0EsYUFBTyxHQUFHLENBQUMsVUFBSixJQUFrQixRQUFPLEdBQUcsQ0FBQyxVQUFKLENBQWUsWUFBdEIsTUFBdUMsWUFBekQsSUFDTixHQUFHLENBQUMsVUFBSixDQUFlLFlBQWYsQ0FBNEIsTUFBNUIsTUFBd0MsR0FEekM7QUFFQSxLQUorQixDQWxJakM7QUFBQSxRQXdJQztBQUNBLElBQUEsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBVixFQUFnQjtBQUN6QyxNQUFBLEdBQUcsQ0FBQyxTQUFKLEdBQWdCLG1CQUFoQjs7QUFDQSxVQUFJLElBQUksV0FBVSxHQUFHLENBQUMsU0FBSixDQUFjLFlBQWQsQ0FBMkIsVUFBM0IsQ0FBVixDQUFSLENBRnlDLENBR3pDOzs7QUFDQSxhQUFPLElBQUksS0FBSyxTQUFULElBQXNCLElBQUksS0FBSyxRQUF0QztBQUNBLEtBTHdCLENBekkxQjtBQUFBLFFBZ0pDO0FBQ0EsSUFBQSxxQkFBcUIsR0FBRyxNQUFNLENBQUMsVUFBVSxHQUFWLEVBQWdCO0FBQzlDO0FBQ0EsTUFBQSxHQUFHLENBQUMsU0FBSixHQUFnQix3REFBaEI7O0FBQ0EsVUFBSyxDQUFDLEdBQUcsQ0FBQyxzQkFBTCxJQUErQixDQUFDLEdBQUcsQ0FBQyxzQkFBSixDQUEyQixHQUEzQixFQUFnQyxNQUFyRSxFQUE4RTtBQUM3RSxlQUFPLEtBQVA7QUFDQSxPQUw2QyxDQU85Qzs7O0FBQ0EsTUFBQSxHQUFHLENBQUMsU0FBSixDQUFjLFNBQWQsR0FBMEIsR0FBMUI7QUFDQSxhQUFPLEdBQUcsQ0FBQyxzQkFBSixDQUEyQixHQUEzQixFQUFnQyxNQUFoQyxLQUEyQyxDQUFsRDtBQUNBLEtBVjZCLENBakovQjtBQUFBLFFBNkpDO0FBQ0E7QUFDQSxJQUFBLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQVYsRUFBZ0I7QUFDekM7QUFDQSxNQUFBLEdBQUcsQ0FBQyxFQUFKLEdBQVMsT0FBTyxHQUFHLENBQW5CO0FBQ0EsTUFBQSxHQUFHLENBQUMsU0FBSixHQUFnQixjQUFjLE9BQWQsR0FBd0IsbUJBQXhCLEdBQThDLE9BQTlDLEdBQXdELFVBQXhFO0FBQ0EsTUFBQSxPQUFPLENBQUMsWUFBUixDQUFzQixHQUF0QixFQUEyQixPQUFPLENBQUMsVUFBbkMsRUFKeUMsQ0FNekM7O0FBQ0EsVUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLGlCQUFULElBQ1Y7QUFDQSxNQUFBLFFBQVEsQ0FBQyxpQkFBVCxDQUE0QixPQUE1QixFQUFzQyxNQUF0QyxLQUFpRCxJQUNqRDtBQUNBLE1BQUEsUUFBUSxDQUFDLGlCQUFULENBQTRCLE9BQU8sR0FBRyxDQUF0QyxFQUEwQyxNQUozQztBQUtBLE1BQUEsa0JBQWtCLEdBQUcsQ0FBQyxRQUFRLENBQUMsY0FBVCxDQUF5QixPQUF6QixDQUF0QixDQVp5QyxDQWN6Qzs7QUFDQSxNQUFBLE9BQU8sQ0FBQyxXQUFSLENBQXFCLEdBQXJCO0FBRUEsYUFBTyxJQUFQO0FBQ0EsS0FsQndCLENBL0oxQixDQUYrQixDQXFML0I7OztBQUNBLFFBQUk7QUFDSCxNQUFBLEtBQUssQ0FBQyxJQUFOLENBQVksT0FBTyxDQUFDLFVBQXBCLEVBQWdDLENBQWhDLEVBQW9DLENBQXBDLEVBQXVDLFFBQXZDO0FBQ0EsS0FGRCxDQUVFLE9BQVEsQ0FBUixFQUFZO0FBQ2IsTUFBQSxLQUFLLEdBQUcsZUFBVSxDQUFWLEVBQWM7QUFDckIsWUFBSSxJQUFKO0FBQUEsWUFBVSxPQUFPLEdBQUcsRUFBcEI7O0FBQ0EsZUFBUyxJQUFJLEdBQUcsS0FBSyxDQUFMLENBQWhCLEVBQTBCLENBQUMsRUFBM0IsRUFBZ0M7QUFDL0IsVUFBQSxPQUFPLENBQUMsSUFBUixDQUFjLElBQWQ7QUFDQTs7QUFDRCxlQUFPLE9BQVA7QUFDQSxPQU5EO0FBT0E7O0FBRUQsYUFBUyxNQUFULENBQWlCLFFBQWpCLEVBQTJCLE9BQTNCLEVBQW9DLE9BQXBDLEVBQTZDLElBQTdDLEVBQW9EO0FBQ25ELE1BQUEsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFyQjtBQUNBLE1BQUEsT0FBTyxHQUFHLE9BQU8sSUFBSSxRQUFyQjtBQUNBLFVBQUksS0FBSjtBQUFBLFVBQVcsSUFBWDtBQUFBLFVBQWlCLEdBQWpCO0FBQUEsVUFBc0IsQ0FBdEI7QUFBQSxVQUNDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFEcEI7O0FBR0EsVUFBSyxRQUFRLEtBQUssQ0FBYixJQUFrQixRQUFRLEtBQUssQ0FBcEMsRUFBd0M7QUFDdkMsZUFBTyxFQUFQO0FBQ0E7O0FBRUQsVUFBSyxDQUFDLFFBQUQsSUFBYSxPQUFPLFFBQVAsS0FBb0IsUUFBdEMsRUFBaUQ7QUFDaEQsZUFBTyxPQUFQO0FBQ0E7O0FBRUQsTUFBQSxHQUFHLEdBQUcsS0FBSyxDQUFFLE9BQUYsQ0FBWDs7QUFFQSxVQUFLLENBQUMsR0FBRCxJQUFRLENBQUMsSUFBZCxFQUFxQjtBQUNwQixZQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBWCxDQUFpQixRQUFqQixDQUFkLEVBQTZDO0FBQzVDO0FBQ0EsY0FBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUQsQ0FBZixFQUFzQjtBQUNyQixnQkFBSyxRQUFRLEtBQUssQ0FBbEIsRUFBc0I7QUFDckIsY0FBQSxJQUFJLEdBQUcsT0FBTyxDQUFDLGNBQVIsQ0FBd0IsQ0FBeEIsQ0FBUCxDQURxQixDQUVyQjtBQUNBOztBQUNBLGtCQUFLLElBQUksSUFBSSxJQUFJLENBQUMsVUFBbEIsRUFBK0I7QUFDOUI7QUFDQTtBQUNBLG9CQUFLLElBQUksQ0FBQyxFQUFMLEtBQVksQ0FBakIsRUFBcUI7QUFDcEIsa0JBQUEsT0FBTyxDQUFDLElBQVIsQ0FBYyxJQUFkO0FBQ0EseUJBQU8sT0FBUDtBQUNBO0FBQ0QsZUFQRCxNQU9PO0FBQ04sdUJBQU8sT0FBUDtBQUNBO0FBQ0QsYUFkRCxNQWNPO0FBQ047QUFDQSxrQkFBSyxPQUFPLENBQUMsYUFBUixLQUEwQixJQUFJLEdBQUcsT0FBTyxDQUFDLGFBQVIsQ0FBc0IsY0FBdEIsQ0FBc0MsQ0FBdEMsQ0FBakMsS0FDSixRQUFRLENBQUUsT0FBRixFQUFXLElBQVgsQ0FESixJQUN5QixJQUFJLENBQUMsRUFBTCxLQUFZLENBRDFDLEVBQzhDO0FBQzdDLGdCQUFBLE9BQU8sQ0FBQyxJQUFSLENBQWMsSUFBZDtBQUNBLHVCQUFPLE9BQVA7QUFDQTtBQUNELGFBdEJvQixDQXdCdEI7O0FBQ0MsV0F6QkQsTUF5Qk8sSUFBSyxLQUFLLENBQUMsQ0FBRCxDQUFWLEVBQWdCO0FBQ3RCLFlBQUEsSUFBSSxDQUFDLEtBQUwsQ0FBWSxPQUFaLEVBQXFCLEtBQUssQ0FBQyxJQUFOLENBQVcsT0FBTyxDQUFDLG9CQUFSLENBQThCLFFBQTlCLENBQVgsRUFBcUQsQ0FBckQsQ0FBckI7QUFDQSxtQkFBTyxPQUFQLENBRnNCLENBSXZCO0FBQ0MsV0FMTSxNQUtBLElBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUQsQ0FBVixLQUFrQixxQkFBbEIsSUFBMkMsT0FBTyxDQUFDLHNCQUF4RCxFQUFpRjtBQUN2RixZQUFBLElBQUksQ0FBQyxLQUFMLENBQVksT0FBWixFQUFxQixLQUFLLENBQUMsSUFBTixDQUFXLE9BQU8sQ0FBQyxzQkFBUixDQUFnQyxDQUFoQyxDQUFYLEVBQWdELENBQWhELENBQXJCO0FBQ0EsbUJBQU8sT0FBUDtBQUNBO0FBQ0Q7QUFDRCxPQXREa0QsQ0F3RG5EOzs7QUFDQSxhQUFPLE1BQU0sQ0FBRSxRQUFGLEVBQVksT0FBWixFQUFxQixPQUFyQixFQUE4QixJQUE5QixFQUFvQyxHQUFwQyxDQUFiO0FBQ0E7O0FBRUQsSUFBQSxNQUFNLENBQUMsT0FBUCxHQUFpQixVQUFVLElBQVYsRUFBZ0IsUUFBaEIsRUFBMkI7QUFDM0MsYUFBTyxNQUFNLENBQUUsSUFBRixFQUFRLElBQVIsRUFBYyxJQUFkLEVBQW9CLFFBQXBCLENBQWI7QUFDQSxLQUZEOztBQUlBLElBQUEsTUFBTSxDQUFDLGVBQVAsR0FBeUIsVUFBVSxJQUFWLEVBQWdCLElBQWhCLEVBQXVCO0FBQy9DLGFBQU8sTUFBTSxDQUFFLElBQUYsRUFBUSxJQUFSLEVBQWMsSUFBZCxFQUFvQixDQUFFLElBQUYsQ0FBcEIsQ0FBTixDQUFxQyxNQUFyQyxHQUE4QyxDQUFyRDtBQUNBLEtBRkQsQ0FsUStCLENBc1EvQjs7O0FBQ0EsYUFBUyxpQkFBVCxDQUE0QixJQUE1QixFQUFtQztBQUNsQyxhQUFPLFVBQVUsSUFBVixFQUFpQjtBQUN2QixZQUFJLElBQUksR0FBRyxJQUFJLENBQUMsUUFBTCxDQUFjLFdBQWQsRUFBWDtBQUNBLGVBQU8sSUFBSSxLQUFLLE9BQVQsSUFBb0IsSUFBSSxDQUFDLElBQUwsS0FBYyxJQUF6QztBQUNBLE9BSEQ7QUFJQSxLQTVROEIsQ0E4US9COzs7QUFDQSxhQUFTLGtCQUFULENBQTZCLElBQTdCLEVBQW9DO0FBQ25DLGFBQU8sVUFBVSxJQUFWLEVBQWlCO0FBQ3ZCLFlBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFMLENBQWMsV0FBZCxFQUFYO0FBQ0EsZUFBTyxDQUFDLElBQUksS0FBSyxPQUFULElBQW9CLElBQUksS0FBSyxRQUE5QixLQUEyQyxJQUFJLENBQUMsSUFBTCxLQUFjLElBQWhFO0FBQ0EsT0FIRDtBQUlBO0FBRUQ7Ozs7OztBQUlBLElBQUEsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFQLEdBQWlCLFVBQVUsSUFBVixFQUFpQjtBQUMzQyxVQUFJLElBQUo7QUFBQSxVQUNDLEdBQUcsR0FBRyxFQURQO0FBQUEsVUFFQyxDQUFDLEdBQUcsQ0FGTDtBQUFBLFVBR0MsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUhqQjs7QUFLQSxVQUFLLFFBQUwsRUFBZ0I7QUFDZixZQUFLLFFBQVEsS0FBSyxDQUFiLElBQWtCLFFBQVEsS0FBSyxDQUEvQixJQUFvQyxRQUFRLEtBQUssRUFBdEQsRUFBMkQ7QUFDMUQ7QUFDQTtBQUNBLGNBQUssT0FBTyxJQUFJLENBQUMsV0FBWixLQUE0QixRQUFqQyxFQUE0QztBQUMzQyxtQkFBTyxJQUFJLENBQUMsV0FBWjtBQUNBLFdBRkQsTUFFTztBQUNOO0FBQ0EsaUJBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFsQixFQUE4QixJQUE5QixFQUFvQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQWhELEVBQThEO0FBQzdELGNBQUEsR0FBRyxJQUFJLE9BQU8sQ0FBRSxJQUFGLENBQWQ7QUFDQTtBQUNEO0FBQ0QsU0FYRCxNQVdPLElBQUssUUFBUSxLQUFLLENBQWIsSUFBa0IsUUFBUSxLQUFLLENBQXBDLEVBQXdDO0FBQzlDLGlCQUFPLElBQUksQ0FBQyxTQUFaO0FBQ0EsU0FkYyxDQWVmOztBQUNBLE9BaEJELE1BZ0JPO0FBRU47QUFDQSxlQUFTLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBRCxDQUFwQixFQUEwQixDQUFDLEVBQTNCLEVBQWdDO0FBQy9CO0FBQ0EsVUFBQSxHQUFHLElBQUksT0FBTyxDQUFFLElBQUYsQ0FBZDtBQUNBO0FBQ0Q7O0FBQ0QsYUFBTyxHQUFQO0FBQ0EsS0EvQkQ7O0FBaUNBLElBQUEsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFQLEdBQWUsU0FBUyxLQUFULENBQWdCLElBQWhCLEVBQXVCO0FBQzdDO0FBQ0E7QUFDQSxVQUFJLGVBQWUsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBTCxJQUFzQixJQUF2QixFQUE2QixlQUEzRDtBQUNBLGFBQU8sZUFBZSxHQUFHLGVBQWUsQ0FBQyxRQUFoQixLQUE2QixNQUFoQyxHQUF5QyxLQUEvRDtBQUNBLEtBTEQsQ0EzVCtCLENBa1UvQjs7O0FBQ0EsSUFBQSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVAsR0FBa0IsT0FBTyxDQUFDLFFBQVIsR0FDNUIsVUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFpQjtBQUNoQixVQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsUUFBRixLQUFlLENBQWYsR0FBbUIsQ0FBQyxDQUFDLGVBQXJCLEdBQXVDLENBQW5EO0FBQUEsVUFDQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQURkO0FBRUEsYUFBTyxDQUFDLEtBQUssR0FBTixJQUFhLENBQUMsRUFBRyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQUosS0FBaUIsQ0FBeEIsSUFBNkIsS0FBSyxDQUFDLFFBQW5DLElBQStDLEtBQUssQ0FBQyxRQUFOLENBQWUsR0FBZixDQUFsRCxDQUFyQjtBQUNBLEtBTDJCLEdBTTVCLE9BQU8sQ0FBQyx1QkFBUixHQUNBLFVBQVUsQ0FBVixFQUFhLENBQWIsRUFBaUI7QUFDaEIsYUFBTyxDQUFDLElBQUksQ0FBQyxFQUFHLENBQUMsQ0FBQyx1QkFBRixDQUEyQixDQUEzQixJQUFpQyxFQUFwQyxDQUFiO0FBQ0EsS0FIRCxHQUlBLFVBQVUsQ0FBVixFQUFhLENBQWIsRUFBaUI7QUFDaEIsYUFBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQWYsRUFBNkI7QUFDNUIsWUFBSyxDQUFDLEtBQUssQ0FBWCxFQUFlO0FBQ2QsaUJBQU8sSUFBUDtBQUNBO0FBQ0Q7O0FBQ0QsYUFBTyxLQUFQO0FBQ0EsS0FqQkY7O0FBbUJBLElBQUEsTUFBTSxDQUFDLElBQVAsR0FBYyxVQUFVLElBQVYsRUFBZ0IsSUFBaEIsRUFBdUI7QUFDcEMsVUFBSSxJQUFKO0FBQUEsVUFDQyxHQUFHLEdBQUcsS0FBSyxDQUFFLElBQUYsQ0FEWjs7QUFHQSxVQUFLLENBQUMsR0FBTixFQUFZO0FBQ1gsUUFBQSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQUwsRUFBUDtBQUNBOztBQUNELFVBQUssSUFBSSxDQUFDLFVBQUwsQ0FBaUIsSUFBakIsQ0FBTCxFQUErQjtBQUM5QixlQUFPLElBQUksQ0FBQyxVQUFMLENBQWlCLElBQWpCLEVBQXlCLElBQXpCLENBQVA7QUFDQTs7QUFDRCxVQUFLLGdCQUFnQixJQUFJLEdBQXpCLEVBQStCO0FBQzlCLGVBQU8sSUFBSSxDQUFDLFlBQUwsQ0FBbUIsSUFBbkIsQ0FBUDtBQUNBOztBQUNELE1BQUEsSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBTCxDQUF1QixJQUF2QixDQUFQO0FBQ0EsYUFBTyxJQUFJLEdBQ1YsT0FBTyxJQUFJLENBQUUsSUFBRixDQUFYLEtBQXdCLFNBQXhCLEdBQ0MsSUFBSSxDQUFFLElBQUYsQ0FBSixHQUFlLElBQWYsR0FBc0IsSUFEdkIsR0FFQyxJQUFJLENBQUMsU0FBTCxHQUFpQixJQUFJLENBQUMsS0FBdEIsR0FBOEIsSUFIckIsR0FJVixJQUpEO0FBS0EsS0FuQkQ7O0FBcUJBLElBQUEsSUFBSSxHQUFHLE1BQU0sQ0FBQyxTQUFQLEdBQW1CO0FBRXpCO0FBQ0EsTUFBQSxXQUFXLEVBQUUsRUFIWTtBQUt6QixNQUFBLFlBQVksRUFBRSxZQUxXO0FBT3pCLE1BQUEsS0FBSyxFQUFFLFNBUGtCO0FBU3pCLE1BQUEsS0FBSyxFQUFFLElBQUksTUFBSixDQUFZLFlBQ2pCLGdCQUFnQixHQUFHLE9BQUgsR0FBYSxFQURaLEtBRWpCLHFCQUFxQixHQUFHLFFBQUgsR0FBYyxFQUZsQixDQUFaLENBVGtCO0FBY3pCO0FBQ0EsTUFBQSxVQUFVLEVBQUUsdUJBQXVCLEdBQ2xDLEVBRGtDLEdBRWxDO0FBQ0MsZ0JBQVEsY0FBVSxJQUFWLEVBQWlCO0FBQ3hCLGlCQUFPLElBQUksQ0FBQyxZQUFMLENBQW1CLE1BQW5CLEVBQTJCLENBQTNCLENBQVA7QUFDQSxTQUhGO0FBSUMsZ0JBQVEsY0FBVSxJQUFWLEVBQWlCO0FBQ3hCLGlCQUFPLElBQUksQ0FBQyxZQUFMLENBQWtCLE1BQWxCLENBQVA7QUFDQTtBQU5GLE9BakJ3QjtBQTBCekIsTUFBQSxJQUFJLEVBQUU7QUFDTCxjQUFNLGtCQUFrQixHQUN2QixVQUFVLEVBQVYsRUFBYyxPQUFkLEVBQXVCLEdBQXZCLEVBQTZCO0FBQzVCLGNBQUssUUFBTyxPQUFPLENBQUMsY0FBZixNQUFrQyxZQUFsQyxJQUFrRCxDQUFDLEdBQXhELEVBQThEO0FBQzdELGdCQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsY0FBUixDQUF3QixFQUF4QixDQUFSLENBRDZELENBRTdEO0FBQ0E7O0FBQ0EsbUJBQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFQLEdBQW9CLENBQUMsQ0FBRCxDQUFwQixHQUEwQixFQUFqQztBQUNBO0FBQ0QsU0FSc0IsR0FTdkIsVUFBVSxFQUFWLEVBQWMsT0FBZCxFQUF1QixHQUF2QixFQUE2QjtBQUM1QixjQUFLLFFBQU8sT0FBTyxDQUFDLGNBQWYsTUFBa0MsWUFBbEMsSUFBa0QsQ0FBQyxHQUF4RCxFQUE4RDtBQUM3RCxnQkFBSSxDQUFDLEdBQUcsT0FBTyxDQUFDLGNBQVIsQ0FBd0IsRUFBeEIsQ0FBUjtBQUVBLG1CQUFPLENBQUMsR0FDUCxDQUFDLENBQUMsRUFBRixLQUFTLEVBQVQsSUFBZSxRQUFPLENBQUMsQ0FBQyxnQkFBVCxNQUE4QixZQUE5QixJQUE4QyxDQUFDLENBQUMsZ0JBQUYsQ0FBbUIsSUFBbkIsRUFBeUIsS0FBekIsS0FBbUMsRUFBaEcsR0FDQyxDQUFDLENBQUQsQ0FERCxHQUVDLFNBSE0sR0FJUCxFQUpEO0FBS0E7QUFDRCxTQXBCRztBQXNCTCxlQUFPLHVCQUF1QixHQUM3QixVQUFVLEdBQVYsRUFBZSxPQUFmLEVBQXlCO0FBQ3hCLGNBQUssUUFBTyxPQUFPLENBQUMsb0JBQWYsTUFBd0MsWUFBN0MsRUFBNEQ7QUFDM0QsbUJBQU8sT0FBTyxDQUFDLG9CQUFSLENBQThCLEdBQTlCLENBQVA7QUFDQTtBQUNELFNBTDRCLEdBTTdCLFVBQVUsR0FBVixFQUFlLE9BQWYsRUFBeUI7QUFDeEIsY0FBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLG9CQUFSLENBQThCLEdBQTlCLENBQWQsQ0FEd0IsQ0FHeEI7O0FBQ0EsY0FBSyxHQUFHLEtBQUssR0FBYixFQUFtQjtBQUNsQixnQkFBSSxJQUFKO0FBQUEsZ0JBQ0MsR0FBRyxHQUFHLEVBRFA7QUFBQSxnQkFFQyxDQUFDLEdBQUcsQ0FGTDs7QUFJQSxtQkFBUyxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUQsQ0FBdkIsRUFBNkIsQ0FBQyxFQUE5QixFQUFtQztBQUNsQyxrQkFBSyxJQUFJLENBQUMsUUFBTCxLQUFrQixDQUF2QixFQUEyQjtBQUMxQixnQkFBQSxHQUFHLENBQUMsSUFBSixDQUFVLElBQVY7QUFDQTtBQUNEOztBQUVELG1CQUFPLEdBQVA7QUFDQTs7QUFDRCxpQkFBTyxPQUFQO0FBQ0EsU0E5Q0c7QUFnREwsZ0JBQVEsY0FBVSxHQUFWLEVBQWUsT0FBZixFQUF5QjtBQUNoQyxjQUFLLFFBQU8sT0FBTyxDQUFDLGlCQUFmLE1BQXFDLFlBQTFDLEVBQXlEO0FBQ3hELG1CQUFPLE9BQU8sQ0FBQyxpQkFBUixDQUEyQixJQUEzQixDQUFQO0FBQ0E7QUFDRCxTQXBESTtBQXNETCxpQkFBUyxlQUFVLFNBQVYsRUFBcUIsT0FBckIsRUFBOEIsR0FBOUIsRUFBb0M7QUFDNUMsY0FBSyxRQUFPLE9BQU8sQ0FBQyxzQkFBZixNQUEwQyxZQUExQyxJQUEwRCxDQUFDLEdBQWhFLEVBQXNFO0FBQ3JFLG1CQUFPLE9BQU8sQ0FBQyxzQkFBUixDQUFnQyxTQUFoQyxDQUFQO0FBQ0E7QUFDRDtBQTFESSxPQTFCbUI7QUF1RnpCLE1BQUEsUUFBUSxFQUFFO0FBQ1QsYUFBSztBQUFFLFVBQUEsR0FBRyxFQUFFLFlBQVA7QUFBcUIsVUFBQSxLQUFLLEVBQUU7QUFBNUIsU0FESTtBQUVULGFBQUs7QUFBRSxVQUFBLEdBQUcsRUFBRTtBQUFQLFNBRkk7QUFHVCxhQUFLO0FBQUUsVUFBQSxHQUFHLEVBQUUsaUJBQVA7QUFBMEIsVUFBQSxLQUFLLEVBQUU7QUFBakMsU0FISTtBQUlULGFBQUs7QUFBRSxVQUFBLEdBQUcsRUFBRTtBQUFQO0FBSkksT0F2RmU7QUE4RnpCLE1BQUEsU0FBUyxFQUFFO0FBQ1YsZ0JBQVEsY0FBVSxLQUFWLEVBQWtCO0FBQ3pCLFVBQUEsS0FBSyxDQUFDLENBQUQsQ0FBTCxHQUFXLEtBQUssQ0FBQyxDQUFELENBQUwsQ0FBUyxPQUFULENBQWtCLFVBQWxCLEVBQThCLEVBQTlCLENBQVgsQ0FEeUIsQ0FHekI7O0FBQ0EsVUFBQSxLQUFLLENBQUMsQ0FBRCxDQUFMLEdBQVcsQ0FBRSxLQUFLLENBQUMsQ0FBRCxDQUFMLElBQVksS0FBSyxDQUFDLENBQUQsQ0FBakIsSUFBd0IsRUFBMUIsRUFBK0IsT0FBL0IsQ0FBd0MsVUFBeEMsRUFBb0QsRUFBcEQsQ0FBWDs7QUFFQSxjQUFLLEtBQUssQ0FBQyxDQUFELENBQUwsS0FBYSxJQUFsQixFQUF5QjtBQUN4QixZQUFBLEtBQUssQ0FBQyxDQUFELENBQUwsR0FBVyxNQUFNLEtBQUssQ0FBQyxDQUFELENBQVgsR0FBaUIsR0FBNUI7QUFDQTs7QUFFRCxpQkFBTyxLQUFLLENBQUMsS0FBTixDQUFhLENBQWIsRUFBZ0IsQ0FBaEIsQ0FBUDtBQUNBLFNBWlM7QUFjVixpQkFBUyxlQUFVLEtBQVYsRUFBa0I7QUFDMUI7Ozs7Ozs7OztBQVNBLFVBQUEsS0FBSyxDQUFDLENBQUQsQ0FBTCxHQUFXLEtBQUssQ0FBQyxDQUFELENBQUwsQ0FBUyxXQUFULEVBQVg7O0FBRUEsY0FBSyxLQUFLLENBQUMsQ0FBRCxDQUFMLEtBQWEsS0FBbEIsRUFBMEI7QUFDekI7QUFDQSxnQkFBSyxDQUFDLEtBQUssQ0FBQyxDQUFELENBQVgsRUFBaUI7QUFDaEIsY0FBQSxNQUFNLENBQUMsS0FBUCxDQUFjLEtBQUssQ0FBQyxDQUFELENBQW5CO0FBQ0EsYUFKd0IsQ0FNekI7QUFDQTs7O0FBQ0EsWUFBQSxLQUFLLENBQUMsQ0FBRCxDQUFMLEdBQVcsRUFBRyxLQUFLLENBQUMsQ0FBRCxDQUFMLEdBQVcsS0FBSyxDQUFDLENBQUQsQ0FBTCxJQUFZLEtBQUssQ0FBQyxDQUFELENBQUwsSUFBWSxDQUF4QixDQUFYLEdBQXdDLEtBQU0sS0FBSyxDQUFDLENBQUQsQ0FBTCxLQUFhLE1BQWIsSUFBdUIsS0FBSyxDQUFDLENBQUQsQ0FBTCxLQUFhLEtBQTFDLENBQTNDLENBQVg7QUFDQSxZQUFBLEtBQUssQ0FBQyxDQUFELENBQUwsR0FBVyxFQUFLLEtBQUssQ0FBQyxDQUFELENBQUwsR0FBVyxLQUFLLENBQUMsQ0FBRCxDQUFsQixJQUEyQixLQUFLLENBQUMsQ0FBRCxDQUFMLEtBQWEsS0FBM0MsQ0FBWCxDQVR5QixDQVcxQjtBQUNDLFdBWkQsTUFZTyxJQUFLLEtBQUssQ0FBQyxDQUFELENBQVYsRUFBZ0I7QUFDdEIsWUFBQSxNQUFNLENBQUMsS0FBUCxDQUFjLEtBQUssQ0FBQyxDQUFELENBQW5CO0FBQ0E7O0FBRUQsaUJBQU8sS0FBUDtBQUNBLFNBM0NTO0FBNkNWLGtCQUFVLGdCQUFVLEtBQVYsRUFBaUIsT0FBakIsRUFBMEIsR0FBMUIsRUFBZ0M7QUFDekMsY0FBSSxRQUFKLEVBQWMsTUFBZDs7QUFDQSxjQUFLLFNBQVMsQ0FBQyxPQUFELENBQVQsQ0FBbUIsSUFBbkIsQ0FBeUIsS0FBSyxDQUFDLENBQUQsQ0FBOUIsQ0FBTCxFQUEyQztBQUMxQyxtQkFBTyxJQUFQO0FBQ0E7O0FBRUQsY0FBSyxLQUFLLENBQUMsQ0FBRCxDQUFWLEVBQWdCO0FBQ2YsWUFBQSxLQUFLLENBQUMsQ0FBRCxDQUFMLEdBQVcsS0FBSyxDQUFDLENBQUQsQ0FBaEI7QUFDQSxXQUZELE1BRU8sSUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUQsQ0FBdEIsRUFBNkI7QUFDbkM7QUFDQSxnQkFBSyxPQUFPLENBQUMsSUFBUixDQUFhLFFBQWIsT0FDSjtBQUNDLFlBQUEsTUFBTSxHQUFHLFFBQVEsQ0FBRSxRQUFGLEVBQVksT0FBWixFQUFxQixHQUFyQixFQUEwQixJQUExQixDQUZkLE9BR0o7QUFDQyxZQUFBLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBVCxDQUFrQixHQUFsQixFQUF1QixRQUFRLENBQUMsTUFBVCxHQUFrQixNQUF6QyxJQUFvRCxRQUFRLENBQUMsTUFKbkUsQ0FBTCxFQUlrRjtBQUVqRjtBQUNBLGNBQUEsUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFULENBQWdCLENBQWhCLEVBQW1CLE1BQW5CLENBQVg7QUFDQSxjQUFBLEtBQUssQ0FBQyxDQUFELENBQUwsR0FBVyxLQUFLLENBQUMsQ0FBRCxDQUFMLENBQVMsS0FBVCxDQUFnQixDQUFoQixFQUFtQixNQUFuQixDQUFYO0FBQ0E7O0FBQ0QsWUFBQSxLQUFLLENBQUMsQ0FBRCxDQUFMLEdBQVcsUUFBWDtBQUNBLFdBckJ3QyxDQXVCekM7OztBQUNBLGlCQUFPLEtBQUssQ0FBQyxLQUFOLENBQWEsQ0FBYixFQUFnQixDQUFoQixDQUFQO0FBQ0E7QUF0RVMsT0E5RmM7QUF1S3pCLE1BQUEsTUFBTSxFQUFFO0FBQ1AsY0FBTSxrQkFBa0IsR0FDdkIsVUFBVSxFQUFWLEVBQWU7QUFDZCxVQUFBLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBSCxDQUFZLFVBQVosRUFBd0IsRUFBeEIsQ0FBTDtBQUNBLGlCQUFPLFVBQVUsSUFBVixFQUFpQjtBQUN2QixtQkFBTyxJQUFJLENBQUMsWUFBTCxDQUFrQixJQUFsQixNQUE0QixFQUFuQztBQUNBLFdBRkQ7QUFHQSxTQU5zQixHQU92QixVQUFVLEVBQVYsRUFBZTtBQUNkLFVBQUEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFILENBQVksVUFBWixFQUF3QixFQUF4QixDQUFMO0FBQ0EsaUJBQU8sVUFBVSxJQUFWLEVBQWlCO0FBQ3ZCLGdCQUFJLElBQUksR0FBRyxRQUFPLElBQUksQ0FBQyxnQkFBWixNQUFpQyxZQUFqQyxJQUFpRCxJQUFJLENBQUMsZ0JBQUwsQ0FBc0IsSUFBdEIsQ0FBNUQ7QUFDQSxtQkFBTyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUwsS0FBZSxFQUE5QjtBQUNBLFdBSEQ7QUFJQSxTQWRLO0FBZ0JQLGVBQU8sYUFBVSxRQUFWLEVBQXFCO0FBQzNCLGNBQUssUUFBUSxLQUFLLEdBQWxCLEVBQXdCO0FBQ3ZCLG1CQUFPLFlBQVc7QUFBRSxxQkFBTyxJQUFQO0FBQWMsYUFBbEM7QUFDQTs7QUFDRCxVQUFBLFFBQVEsR0FBRyxRQUFRLENBQUMsT0FBVCxDQUFrQixVQUFsQixFQUE4QixFQUE5QixFQUFtQyxXQUFuQyxFQUFYO0FBRUEsaUJBQU8sVUFBVSxJQUFWLEVBQWlCO0FBQ3ZCLG1CQUFPLElBQUksQ0FBQyxRQUFMLElBQWlCLElBQUksQ0FBQyxRQUFMLENBQWMsV0FBZCxPQUFnQyxRQUF4RDtBQUNBLFdBRkQ7QUFHQSxTQXpCTTtBQTJCUCxpQkFBUyxlQUFVLFNBQVYsRUFBc0I7QUFDOUIsY0FBSSxPQUFPLEdBQUcsVUFBVSxDQUFFLE9BQUYsQ0FBVixDQUF1QixTQUF2QixDQUFkOztBQUNBLGNBQUssQ0FBQyxPQUFOLEVBQWdCO0FBQ2YsWUFBQSxPQUFPLEdBQUcsVUFBVSxDQUFFLFNBQUYsRUFBYSxJQUFJLE1BQUosQ0FBVyxRQUFRLFVBQVIsR0FBcUIsR0FBckIsR0FBMkIsU0FBM0IsR0FBdUMsR0FBdkMsR0FBNkMsVUFBN0MsR0FBMEQsS0FBckUsQ0FBYixDQUFwQjtBQUNBOztBQUNELGlCQUFPLFVBQVUsSUFBVixFQUFpQjtBQUN2QixtQkFBTyxPQUFPLENBQUMsSUFBUixDQUFjLElBQUksQ0FBQyxTQUFMLElBQW1CLFFBQU8sSUFBSSxDQUFDLFlBQVosTUFBNkIsWUFBN0IsSUFBNkMsSUFBSSxDQUFDLFlBQUwsQ0FBa0IsT0FBbEIsQ0FBaEUsSUFBK0YsRUFBN0csQ0FBUDtBQUNBLFdBRkQ7QUFHQSxTQW5DTTtBQXFDUCxnQkFBUSxjQUFVLElBQVYsRUFBZ0IsUUFBaEIsRUFBMEIsS0FBMUIsRUFBa0M7QUFDekMsY0FBSyxDQUFDLFFBQU4sRUFBaUI7QUFDaEIsbUJBQU8sVUFBVSxJQUFWLEVBQWlCO0FBQ3ZCLHFCQUFPLE1BQU0sQ0FBQyxJQUFQLENBQWEsSUFBYixFQUFtQixJQUFuQixLQUE2QixJQUFwQztBQUNBLGFBRkQ7QUFHQTs7QUFFRCxpQkFBTyxVQUFVLElBQVYsRUFBaUI7QUFDdkIsZ0JBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFQLENBQWEsSUFBYixFQUFtQixJQUFuQixDQUFiO0FBQUEsZ0JBQ0MsS0FBSyxHQUFHLE1BQU0sR0FBRyxFQURsQjs7QUFHQSxnQkFBSyxNQUFNLElBQUksSUFBZixFQUFzQjtBQUNyQixxQkFBTyxRQUFRLEtBQUssSUFBcEI7QUFDQTs7QUFFRCxvQkFBUyxRQUFUO0FBQ0MsbUJBQUssR0FBTDtBQUNDLHVCQUFPLEtBQUssS0FBSyxLQUFqQjs7QUFDRCxtQkFBSyxJQUFMO0FBQ0MsdUJBQU8sS0FBSyxLQUFLLEtBQWpCOztBQUNELG1CQUFLLElBQUw7QUFDQyx1QkFBTyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU4sQ0FBZSxLQUFmLE1BQTJCLENBQTNDOztBQUNELG1CQUFLLElBQUw7QUFDQyx1QkFBTyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU4sQ0FBZSxLQUFmLElBQXlCLENBQUMsQ0FBMUM7O0FBQ0QsbUJBQUssSUFBTDtBQUNDLHVCQUFPLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTixDQUFjLEtBQUssQ0FBQyxNQUFOLEdBQWUsS0FBSyxDQUFDLE1BQW5DLE1BQWdELEtBQWhFOztBQUNELG1CQUFLLElBQUw7QUFDQyx1QkFBTyxDQUFFLE1BQU0sS0FBTixHQUFjLEdBQWhCLEVBQXNCLE9BQXRCLENBQStCLEtBQS9CLElBQXlDLENBQUMsQ0FBakQ7O0FBQ0QsbUJBQUssSUFBTDtBQUNDLHVCQUFPLEtBQUssS0FBSyxLQUFWLElBQW1CLEtBQUssQ0FBQyxNQUFOLENBQWMsQ0FBZCxFQUFpQixLQUFLLENBQUMsTUFBTixHQUFlLENBQWhDLE1BQXdDLEtBQUssR0FBRyxHQUExRTtBQWRGO0FBZ0JBLFdBeEJEO0FBeUJBLFNBckVNO0FBdUVQLGlCQUFTLGVBQVUsSUFBVixFQUFnQixRQUFoQixFQUEwQixLQUExQixFQUFpQyxJQUFqQyxFQUF3QztBQUVoRCxjQUFLLElBQUksS0FBSyxLQUFkLEVBQXNCO0FBQ3JCLGdCQUFJLFFBQVEsR0FBRyxJQUFJLEVBQW5CO0FBRUEsbUJBQU8sVUFBVSxJQUFWLEVBQWlCO0FBQ3ZCLGtCQUFJLE1BQUo7QUFBQSxrQkFBWSxJQUFaO0FBQUEsa0JBQ0MsS0FBSyxHQUFHLENBRFQ7QUFBQSxrQkFFQyxJQUFJLEdBQUcsSUFGUjs7QUFJQSxrQkFBSyxLQUFLLEtBQUssQ0FBVixJQUFlLElBQUksS0FBSyxDQUE3QixFQUFpQztBQUNoQyx1QkFBTyxJQUFQO0FBQ0E7O0FBRUQsY0FBQSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQWQ7O0FBRUEsa0JBQUssTUFBTSxLQUFLLE1BQU0sQ0FBRSxPQUFGLENBQU4sS0FBc0IsUUFBdEIsSUFBa0MsQ0FBQyxJQUFJLENBQUMsTUFBN0MsQ0FBWCxFQUFrRTtBQUNqRSxxQkFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFVBQXBCLEVBQWdDLElBQWhDLEVBQXNDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBbEQsRUFBZ0U7QUFDL0Qsc0JBQUssSUFBSSxDQUFDLFFBQUwsS0FBa0IsQ0FBdkIsRUFBMkI7QUFDMUIsb0JBQUEsSUFBSSxDQUFDLE1BQUwsR0FBYyxFQUFFLEtBQWhCOztBQUNBLHdCQUFLLElBQUksS0FBSyxJQUFkLEVBQXFCO0FBQ3BCO0FBQ0E7QUFDRDtBQUNEOztBQUVELGdCQUFBLE1BQU0sQ0FBRSxPQUFGLENBQU4sR0FBb0IsUUFBcEI7QUFDQTs7QUFFRCxjQUFBLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTCxHQUFjLElBQXJCOztBQUVBLGtCQUFLLEtBQUssS0FBSyxDQUFmLEVBQW1CO0FBQ2xCLHVCQUFPLElBQUksS0FBSyxDQUFoQjtBQUVBLGVBSEQsTUFHTztBQUNOLHVCQUFTLElBQUksR0FBRyxLQUFQLEtBQWlCLENBQWpCLElBQXNCLElBQUksR0FBRyxLQUFQLElBQWdCLENBQS9DO0FBQ0E7QUFDRCxhQWhDRDtBQWlDQTs7QUFFRCxpQkFBTyxVQUFVLElBQVYsRUFBaUI7QUFDdkIsZ0JBQUksSUFBSSxHQUFHLElBQVg7O0FBRUEsb0JBQVMsSUFBVDtBQUNDLG1CQUFLLE1BQUw7QUFDQSxtQkFBSyxPQUFMO0FBQ0MsdUJBQVMsSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFyQixFQUF3QztBQUN2QyxzQkFBSyxJQUFJLENBQUMsUUFBTCxLQUFrQixDQUF2QixFQUEyQjtBQUMxQiwyQkFBTyxLQUFQO0FBQ0E7QUFDRDs7QUFFRCxvQkFBSyxJQUFJLEtBQUssT0FBZCxFQUF3QjtBQUN2Qix5QkFBTyxJQUFQO0FBQ0E7O0FBRUQsZ0JBQUEsSUFBSSxHQUFHLElBQVA7O0FBRUE7O0FBQ0QsbUJBQUssTUFBTDtBQUNDLHVCQUFTLElBQUksR0FBRyxJQUFJLENBQUMsV0FBckIsRUFBb0M7QUFDbkMsc0JBQUssSUFBSSxDQUFDLFFBQUwsS0FBa0IsQ0FBdkIsRUFBMkI7QUFDMUIsMkJBQU8sS0FBUDtBQUNBO0FBQ0Q7O0FBRUQsdUJBQU8sSUFBUDtBQXZCRjtBQXlCQSxXQTVCRDtBQTZCQSxTQTVJTTtBQThJUCxrQkFBVSxnQkFBVSxNQUFWLEVBQWtCLFFBQWxCLEVBQTRCLE9BQTVCLEVBQXFDLEdBQXJDLEVBQTJDO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBLGNBQUksSUFBSjtBQUFBLGNBQ0MsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFMLENBQWMsTUFBZCxLQUEwQixJQUFJLENBQUMsT0FBTCxDQUFjLE1BQU0sQ0FBQyxXQUFQLEVBQWQsQ0FEaEM7O0FBR0EsY0FBSyxDQUFDLEVBQU4sRUFBVztBQUNWLFlBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYyx5QkFBeUIsTUFBdkM7QUFDQSxXQVRtRCxDQVdwRDtBQUNBO0FBQ0E7OztBQUNBLGNBQUssQ0FBQyxFQUFFLENBQUUsT0FBRixDQUFSLEVBQXNCO0FBQ3JCLGdCQUFLLEVBQUUsQ0FBQyxNQUFILEdBQVksQ0FBakIsRUFBcUI7QUFDcEIsY0FBQSxJQUFJLEdBQUcsQ0FBRSxNQUFGLEVBQVUsTUFBVixFQUFrQixFQUFsQixFQUFzQixRQUF0QixDQUFQO0FBQ0EscUJBQU8sVUFBVSxJQUFWLEVBQWlCO0FBQ3ZCLHVCQUFPLEVBQUUsQ0FBRSxJQUFGLEVBQVEsQ0FBUixFQUFXLElBQVgsQ0FBVDtBQUNBLGVBRkQ7QUFHQTs7QUFDRCxtQkFBTyxFQUFQO0FBQ0E7O0FBRUQsaUJBQU8sRUFBRSxDQUFFLFFBQUYsRUFBWSxPQUFaLEVBQXFCLEdBQXJCLENBQVQ7QUFDQTtBQXZLTSxPQXZLaUI7QUFpVnpCLE1BQUEsT0FBTyxFQUFFO0FBQ1IsZUFBTyxZQUFZLENBQUMsVUFBVSxRQUFWLEVBQW9CLE9BQXBCLEVBQTZCLEdBQTdCLEVBQW1DO0FBQ3REO0FBQ0E7QUFDQTtBQUNBLGNBQUksT0FBTyxHQUFHLE9BQU8sQ0FBRSxRQUFRLENBQUMsT0FBVCxDQUFrQixLQUFsQixFQUF5QixJQUF6QixDQUFGLEVBQW1DLE9BQW5DLEVBQTRDLEdBQTVDLENBQXJCO0FBQ0EsaUJBQU8sVUFBVSxJQUFWLEVBQWlCO0FBQ3ZCLG1CQUFPLENBQUMsT0FBTyxDQUFFLElBQUYsQ0FBZjtBQUNBLFdBRkQ7QUFHQSxTQVJrQixDQURYO0FBV1IsbUJBQVcsaUJBQVUsSUFBVixFQUFpQjtBQUMzQixpQkFBTyxJQUFJLENBQUMsUUFBTCxLQUFrQixLQUF6QjtBQUNBLFNBYk87QUFlUixvQkFBWSxrQkFBVSxJQUFWLEVBQWlCO0FBQzVCLGlCQUFPLElBQUksQ0FBQyxRQUFMLEtBQWtCLElBQXpCO0FBQ0EsU0FqQk87QUFtQlIsbUJBQVcsaUJBQVUsSUFBVixFQUFpQjtBQUMzQjtBQUNBO0FBQ0EsY0FBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQUwsQ0FBYyxXQUFkLEVBQWY7QUFDQSxpQkFBUSxRQUFRLEtBQUssT0FBYixJQUF3QixDQUFDLENBQUMsSUFBSSxDQUFDLE9BQWhDLElBQTZDLFFBQVEsS0FBSyxRQUFiLElBQXlCLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBcEY7QUFDQSxTQXhCTztBQTBCUixvQkFBWSxrQkFBVSxJQUFWLEVBQWlCO0FBQzVCO0FBQ0E7QUFDQSxjQUFLLElBQUksQ0FBQyxVQUFWLEVBQXVCO0FBQ3RCLFlBQUEsSUFBSSxDQUFDLFVBQUwsQ0FBZ0IsYUFBaEI7QUFDQTs7QUFFRCxpQkFBTyxJQUFJLENBQUMsUUFBTCxLQUFrQixJQUF6QjtBQUNBLFNBbENPO0FBb0NSLGtCQUFVLGdCQUFVLElBQVYsRUFBaUI7QUFDMUIsaUJBQU8sQ0FBQyxJQUFJLENBQUMsT0FBTCxDQUFhLE9BQWIsRUFBdUIsSUFBdkIsQ0FBUjtBQUNBLFNBdENPO0FBd0NSLGlCQUFTLGVBQVUsSUFBVixFQUFpQjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBSSxRQUFKO0FBQ0EsVUFBQSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVo7O0FBQ0EsaUJBQVEsSUFBUixFQUFlO0FBQ2QsZ0JBQUssSUFBSSxDQUFDLFFBQUwsR0FBZ0IsR0FBaEIsSUFBdUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQWpCLE1BQStCLENBQXRELElBQTJELFFBQVEsS0FBSyxDQUE3RSxFQUFpRjtBQUNoRixxQkFBTyxLQUFQO0FBQ0E7O0FBQ0QsWUFBQSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVo7QUFDQTs7QUFDRCxpQkFBTyxJQUFQO0FBQ0EsU0F2RE87QUF5RFIsb0JBQVksWUFBWSxDQUFDLFVBQVUsSUFBVixFQUFpQjtBQUN6QyxpQkFBTyxVQUFVLElBQVYsRUFBaUI7QUFDdkIsbUJBQU8sQ0FBRSxJQUFJLENBQUMsV0FBTCxJQUFvQixJQUFJLENBQUMsU0FBekIsSUFBc0MsT0FBTyxDQUFFLElBQUYsQ0FBL0MsRUFBMEQsT0FBMUQsQ0FBbUUsSUFBbkUsSUFBNEUsQ0FBQyxDQUFwRjtBQUNBLFdBRkQ7QUFHQSxTQUp1QixDQXpEaEI7QUErRFIsZUFBTyxZQUFZLENBQUMsVUFBVSxRQUFWLEVBQXFCO0FBQ3hDLGlCQUFPLFVBQVUsSUFBVixFQUFpQjtBQUN2QixtQkFBTyxNQUFNLENBQUUsUUFBRixFQUFZLElBQVosQ0FBTixDQUF5QixNQUF6QixHQUFrQyxDQUF6QztBQUNBLFdBRkQ7QUFHQSxTQUprQixDQS9EWDtBQXFFUixrQkFBVSxnQkFBVSxJQUFWLEVBQWlCO0FBQzFCLGlCQUFPLE9BQU8sQ0FBQyxJQUFSLENBQWMsSUFBSSxDQUFDLFFBQW5CLENBQVA7QUFDQSxTQXZFTztBQXlFUixnQkFBUSxjQUFVLElBQVYsRUFBaUI7QUFDeEIsY0FBSSxJQUFKLEVBQVUsSUFBVixDQUR3QixDQUV4QjtBQUNBOztBQUNBLGlCQUFPLElBQUksQ0FBQyxRQUFMLENBQWMsV0FBZCxPQUFnQyxPQUFoQyxJQUNOLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFiLE1BQXVCLE1BRGpCLEtBRUosQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQUwsQ0FBa0IsTUFBbEIsQ0FBUixLQUFzQyxJQUF0QyxJQUE4QyxJQUFJLENBQUMsV0FBTCxPQUF1QixJQUZqRSxDQUFQO0FBR0EsU0FoRk87QUFrRlI7QUFDQSxpQkFBUyxpQkFBaUIsQ0FBQyxPQUFELENBbkZsQjtBQW9GUixvQkFBWSxpQkFBaUIsQ0FBQyxVQUFELENBcEZyQjtBQXFGUixnQkFBUSxpQkFBaUIsQ0FBQyxNQUFELENBckZqQjtBQXNGUixvQkFBWSxpQkFBaUIsQ0FBQyxVQUFELENBdEZyQjtBQXVGUixpQkFBUyxpQkFBaUIsQ0FBQyxPQUFELENBdkZsQjtBQXlGUixrQkFBVSxrQkFBa0IsQ0FBQyxRQUFELENBekZwQjtBQTBGUixpQkFBUyxrQkFBa0IsQ0FBQyxPQUFELENBMUZuQjtBQTRGUixrQkFBVSxnQkFBVSxJQUFWLEVBQWlCO0FBQzFCLGNBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFMLENBQWMsV0FBZCxFQUFYO0FBQ0EsaUJBQU8sSUFBSSxLQUFLLE9BQVQsSUFBb0IsSUFBSSxDQUFDLElBQUwsS0FBYyxRQUFsQyxJQUE4QyxJQUFJLEtBQUssUUFBOUQ7QUFDQSxTQS9GTztBQWlHUixpQkFBUyxlQUFVLElBQVYsRUFBaUI7QUFDekIsaUJBQU8sT0FBTyxDQUFDLElBQVIsQ0FBYyxJQUFJLENBQUMsUUFBbkIsQ0FBUDtBQUNBLFNBbkdPO0FBcUdSLGlCQUFTLGVBQVUsSUFBVixFQUFpQjtBQUN6QixjQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBZjtBQUNBLGlCQUFPLElBQUksS0FBSyxHQUFHLENBQUMsYUFBYixLQUErQixDQUFDLEdBQUcsQ0FBQyxRQUFMLElBQWlCLEdBQUcsQ0FBQyxRQUFKLEVBQWhELEtBQW1FLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBTCxJQUFhLElBQUksQ0FBQyxJQUFwQixDQUEzRTtBQUNBLFNBeEdPO0FBMEdSLGtCQUFVLGdCQUFVLElBQVYsRUFBaUI7QUFDMUIsaUJBQU8sSUFBSSxLQUFLLElBQUksQ0FBQyxhQUFMLENBQW1CLGFBQW5DO0FBQ0E7QUE1R08sT0FqVmdCO0FBZ2N6QixNQUFBLFVBQVUsRUFBRTtBQUNYLGlCQUFTLGVBQVUsUUFBVixFQUFvQixRQUFwQixFQUE4QixHQUE5QixFQUFvQztBQUM1QyxpQkFBTyxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQVQsQ0FBZ0IsQ0FBaEIsQ0FBSCxHQUF5QixDQUFFLFFBQVEsQ0FBQyxDQUFELENBQVYsQ0FBbkM7QUFDQSxTQUhVO0FBS1gsZ0JBQVEsY0FBVSxRQUFWLEVBQW9CLFFBQXBCLEVBQThCLEdBQTlCLEVBQW9DO0FBQzNDLGNBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFULEVBQVg7QUFDQSxpQkFBTyxHQUFHLEdBQUcsUUFBSCxHQUFjLENBQUUsSUFBRixDQUF4QjtBQUNBLFNBUlU7QUFVWCxnQkFBUSxjQUFVLFFBQVYsRUFBb0IsUUFBcEIsRUFBOEIsR0FBOUIsRUFBb0M7QUFDM0MsY0FBSSxPQUFPLEdBQUcsRUFBZDtBQUFBLGNBQ0MsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFILEdBQU8sQ0FEZjtBQUFBLGNBRUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxNQUZoQjs7QUFHQSxpQkFBUSxDQUFDLEdBQUcsR0FBWixFQUFpQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQXpCLEVBQTZCO0FBQzVCLFlBQUEsT0FBTyxDQUFDLElBQVIsQ0FBYyxRQUFRLENBQUMsQ0FBRCxDQUF0QjtBQUNBOztBQUNELGlCQUFPLE9BQVA7QUFDQSxTQWxCVTtBQW9CWCxlQUFPLGFBQVUsUUFBVixFQUFvQixRQUFwQixFQUE4QixHQUE5QixFQUFvQztBQUMxQyxjQUFJLE9BQU8sR0FBRyxFQUFkO0FBQUEsY0FDQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUgsR0FBTyxDQURmO0FBQUEsY0FFQyxHQUFHLEdBQUcsUUFBUSxDQUFDLE1BRmhCOztBQUdBLGlCQUFRLENBQUMsR0FBRyxHQUFaLEVBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBekIsRUFBNkI7QUFDNUIsWUFBQSxPQUFPLENBQUMsSUFBUixDQUFjLFFBQVEsQ0FBQyxDQUFELENBQXRCO0FBQ0E7O0FBQ0QsaUJBQU8sT0FBUDtBQUNBLFNBNUJVO0FBOEJYLGNBQU0sWUFBVSxRQUFWLEVBQW9CLFFBQXBCLEVBQThCLEdBQTlCLEVBQW9DO0FBQ3pDLGlCQUFPLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBVCxDQUFnQixDQUFDLFFBQWpCLENBQUgsR0FBaUMsUUFBUSxDQUFDLEtBQVQsQ0FBZ0IsQ0FBaEIsRUFBbUIsQ0FBQyxRQUFwQixDQUEzQztBQUNBLFNBaENVO0FBa0NYLGNBQU0sWUFBVSxRQUFWLEVBQW9CLFFBQXBCLEVBQThCLEdBQTlCLEVBQW9DO0FBQ3pDLGlCQUFPLEdBQUcsR0FBRyxRQUFRLENBQUMsS0FBVCxDQUFnQixDQUFoQixFQUFtQixDQUFDLFFBQUQsR0FBWSxDQUEvQixDQUFILEdBQXdDLFFBQVEsQ0FBQyxLQUFULENBQWdCLENBQUMsUUFBRCxHQUFZLENBQTVCLENBQWxEO0FBQ0EsU0FwQ1U7QUFzQ1gsY0FBTSxZQUFVLFFBQVYsRUFBb0IsUUFBcEIsRUFBOEIsR0FBOUIsRUFBb0M7QUFDekMsY0FBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQVQsQ0FBaUIsQ0FBQyxRQUFsQixFQUE0QixDQUE1QixDQUFYO0FBQ0EsaUJBQU8sR0FBRyxHQUFHLFFBQUgsR0FBYyxJQUF4QjtBQUNBO0FBekNVO0FBaGNhLEtBQTFCOztBQTZlQSxhQUFTLFlBQVQsQ0FBdUIsQ0FBdkIsRUFBMEIsQ0FBMUIsRUFBNkIsR0FBN0IsRUFBbUM7QUFDbEMsVUFBSyxDQUFDLEtBQUssQ0FBWCxFQUFlO0FBQ2QsZUFBTyxHQUFQO0FBQ0E7O0FBRUQsVUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFdBQVo7O0FBRUEsYUFBUSxHQUFSLEVBQWM7QUFDYixZQUFLLEdBQUcsS0FBSyxDQUFiLEVBQWlCO0FBQ2hCLGlCQUFPLENBQUMsQ0FBUjtBQUNBOztBQUVELFFBQUEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxXQUFWO0FBQ0E7O0FBRUQsYUFBTyxDQUFQO0FBQ0E7O0FBRUQsSUFBQSxTQUFTLEdBQUcsT0FBTyxDQUFDLHVCQUFSLEdBQ1gsVUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFpQjtBQUNoQixVQUFLLENBQUMsS0FBSyxDQUFYLEVBQWU7QUFDZCxRQUFBLFlBQVksR0FBRyxJQUFmO0FBQ0EsZUFBTyxDQUFQO0FBQ0E7O0FBRUQsYUFBTyxDQUFFLENBQUMsQ0FBQyxDQUFDLHVCQUFILElBQThCLENBQUMsQ0FBQyxDQUFDLHVCQUFqQyxHQUNSLENBQUMsQ0FBQyx1QkFETSxHQUVSLENBQUMsQ0FBQyx1QkFBRixDQUEwQixDQUExQixJQUErQixDQUZ6QixJQUdILENBQUMsQ0FIRSxHQUdFLENBSFQ7QUFJQSxLQVhVLEdBWVgsVUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFpQjtBQUNoQjtBQUNBLFVBQUssQ0FBQyxLQUFLLENBQVgsRUFBZTtBQUNkLFFBQUEsWUFBWSxHQUFHLElBQWY7QUFDQSxlQUFPLENBQVAsQ0FGYyxDQUlmO0FBQ0MsT0FMRCxNQUtPLElBQUssQ0FBQyxDQUFDLFdBQUYsSUFBaUIsQ0FBQyxDQUFDLFdBQXhCLEVBQXNDO0FBQzVDLGVBQU8sQ0FBQyxDQUFDLFdBQUYsR0FBZ0IsQ0FBQyxDQUFDLFdBQXpCO0FBQ0E7O0FBRUQsVUFBSSxFQUFKO0FBQUEsVUFBUSxFQUFSO0FBQUEsVUFDQyxFQUFFLEdBQUcsRUFETjtBQUFBLFVBRUMsRUFBRSxHQUFHLEVBRk47QUFBQSxVQUdDLEdBQUcsR0FBRyxDQUFDLENBQUMsVUFIVDtBQUFBLFVBSUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxVQUpUO0FBQUEsVUFLQyxHQUFHLEdBQUcsR0FMUCxDQVhnQixDQWtCaEI7O0FBQ0EsVUFBSyxHQUFHLEtBQUssR0FBYixFQUFtQjtBQUNsQixlQUFPLFlBQVksQ0FBRSxDQUFGLEVBQUssQ0FBTCxDQUFuQixDQURrQixDQUduQjtBQUNDLE9BSkQsTUFJTyxJQUFLLENBQUMsR0FBTixFQUFZO0FBQ2xCLGVBQU8sQ0FBQyxDQUFSO0FBRUEsT0FITSxNQUdBLElBQUssQ0FBQyxHQUFOLEVBQVk7QUFDbEIsZUFBTyxDQUFQO0FBQ0EsT0E1QmUsQ0E4QmhCO0FBQ0E7OztBQUNBLGFBQVEsR0FBUixFQUFjO0FBQ2IsUUFBQSxFQUFFLENBQUMsT0FBSCxDQUFZLEdBQVo7QUFDQSxRQUFBLEdBQUcsR0FBRyxHQUFHLENBQUMsVUFBVjtBQUNBOztBQUVELE1BQUEsR0FBRyxHQUFHLEdBQU47O0FBRUEsYUFBUSxHQUFSLEVBQWM7QUFDYixRQUFBLEVBQUUsQ0FBQyxPQUFILENBQVksR0FBWjtBQUNBLFFBQUEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxVQUFWO0FBQ0E7O0FBRUQsTUFBQSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQVI7QUFDQSxNQUFBLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBUixDQTdDZ0IsQ0ErQ2hCOztBQUNBLFdBQU0sSUFBSSxDQUFDLEdBQUcsQ0FBZCxFQUFpQixDQUFDLEdBQUcsRUFBSixJQUFVLENBQUMsR0FBRyxFQUEvQixFQUFtQyxDQUFDLEVBQXBDLEVBQXlDO0FBQ3hDLFlBQUssRUFBRSxDQUFDLENBQUQsQ0FBRixLQUFVLEVBQUUsQ0FBQyxDQUFELENBQWpCLEVBQXVCO0FBQ3RCLGlCQUFPLFlBQVksQ0FBRSxFQUFFLENBQUMsQ0FBRCxDQUFKLEVBQVMsRUFBRSxDQUFDLENBQUQsQ0FBWCxDQUFuQjtBQUNBO0FBQ0QsT0FwRGUsQ0FzRGhCOzs7QUFDQSxhQUFPLENBQUMsS0FBSyxFQUFOLEdBQ04sWUFBWSxDQUFFLENBQUYsRUFBSyxFQUFFLENBQUMsQ0FBRCxDQUFQLEVBQVksQ0FBQyxDQUFiLENBRE4sR0FFTixZQUFZLENBQUUsRUFBRSxDQUFDLENBQUQsQ0FBSixFQUFTLENBQVQsRUFBWSxDQUFaLENBRmI7QUFHQSxLQXRFRixDQTEyQitCLENBazdCL0I7QUFDQTs7QUFDQSxLQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sSUFBUCxDQUFhLFNBQWI7QUFDQSxJQUFBLGdCQUFnQixHQUFHLENBQUMsWUFBcEIsQ0FyN0IrQixDQXU3Qi9COztBQUNBLElBQUEsTUFBTSxDQUFDLFVBQVAsR0FBb0IsVUFBVSxPQUFWLEVBQW9CO0FBQ3ZDLFVBQUksSUFBSjtBQUFBLFVBQ0MsQ0FBQyxHQUFHLENBREw7QUFHQSxNQUFBLFlBQVksR0FBRyxnQkFBZjtBQUNBLE1BQUEsT0FBTyxDQUFDLElBQVIsQ0FBYyxTQUFkOztBQUVBLFVBQUssWUFBTCxFQUFvQjtBQUNuQixlQUFTLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBRCxDQUF2QixFQUE2QixDQUFDLEVBQTlCLEVBQW1DO0FBQ2xDLGNBQUssSUFBSSxLQUFLLE9BQU8sQ0FBRSxDQUFDLEdBQUcsQ0FBTixDQUFyQixFQUFpQztBQUNoQyxZQUFBLE9BQU8sQ0FBQyxNQUFSLENBQWdCLENBQUMsRUFBakIsRUFBcUIsQ0FBckI7QUFDQTtBQUNEO0FBQ0Q7O0FBRUQsYUFBTyxPQUFQO0FBQ0EsS0FoQkQ7O0FBa0JBLElBQUEsTUFBTSxDQUFDLEtBQVAsR0FBZSxVQUFVLEdBQVYsRUFBZ0I7QUFDOUIsWUFBTSxJQUFJLEtBQUosQ0FBVyw0Q0FBNEMsR0FBdkQsQ0FBTjtBQUNBLEtBRkQ7O0FBSUEsYUFBUyxRQUFULENBQW1CLFFBQW5CLEVBQTZCLE9BQTdCLEVBQXNDLEdBQXRDLEVBQTJDLFNBQTNDLEVBQXVEO0FBQ3RELFVBQUksT0FBSjtBQUFBLFVBQWEsS0FBYjtBQUFBLFVBQW9CLE1BQXBCO0FBQUEsVUFBNEIsSUFBNUI7QUFBQSxVQUNDLEtBREQ7QUFBQSxVQUNRLE1BRFI7QUFBQSxVQUNnQixLQURoQjtBQUFBLFVBQ3VCLENBRHZCO0FBQUEsVUFFQyxVQUZEO0FBQUEsVUFFYSxPQUZiO0FBQUEsVUFHQyxZQUFZLEdBQUcsQ0FBQyxHQUFELElBQVEsT0FBTyxLQUFLLFFBSHBDO0FBQUEsVUFJQztBQUNBLE1BQUEsR0FBRyxHQUFHLENBQUUsWUFBWSxHQUFHLEtBQUgsR0FBVyxFQUF6QixJQUFnQyxRQUFRLENBQUMsT0FBVCxDQUFrQixLQUFsQixFQUF5QixPQUF6QixDQUx2QztBQUFBLFVBTUMsTUFBTSxHQUFHLFVBQVUsQ0FBRSxPQUFGLENBQVYsQ0FBdUIsR0FBdkIsQ0FOVjs7QUFRQSxVQUFLLE1BQUwsRUFBYztBQUNiLGVBQU8sU0FBUyxHQUFHLENBQUgsR0FBTyxLQUFLLENBQUMsSUFBTixDQUFZLE1BQVosRUFBb0IsQ0FBcEIsQ0FBdkI7QUFDQTs7QUFFRCxNQUFBLEtBQUssR0FBRyxRQUFSO0FBQ0EsTUFBQSxNQUFNLEdBQUcsRUFBVDtBQUNBLE1BQUEsQ0FBQyxHQUFHLENBQUo7QUFDQSxNQUFBLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBbEI7QUFDQSxNQUFBLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBZjs7QUFFQSxhQUFRLEtBQVIsRUFBZ0I7QUFFZjtBQUNBLFlBQUssQ0FBQyxPQUFELEtBQWEsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFQLENBQWEsS0FBYixDQUFyQixDQUFMLEVBQWtEO0FBQ2pELGNBQUssS0FBTCxFQUFhO0FBQ1osWUFBQSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQU4sQ0FBYSxLQUFLLENBQUMsQ0FBRCxDQUFMLENBQVMsTUFBdEIsQ0FBUjtBQUNBLFlBQUEsTUFBTSxDQUFDLFFBQVAsR0FBa0IsS0FBbEI7QUFDQTs7QUFDRCxVQUFBLE1BQU0sQ0FBQyxJQUFQLENBQWEsTUFBTSxHQUFHLEVBQXRCO0FBQ0EsVUFBQSxLQUFLLEdBQUcsRUFBUixDQU5pRCxDQVFqRDtBQUNBOztBQUNBLGNBQUssWUFBTCxFQUFvQjtBQUNuQixZQUFBLEtBQUssR0FBRyxNQUFNLEtBQWQ7QUFDQTtBQUNEOztBQUVELFFBQUEsT0FBTyxHQUFHLEtBQVYsQ0FsQmUsQ0FvQmY7O0FBQ0EsWUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLElBQWIsQ0FBbUIsS0FBbkIsQ0FBZCxFQUE0QztBQUMzQyxVQUFBLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBRCxDQUFkO0FBQ0EsVUFBQSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQU4sQ0FBYSxLQUFLLENBQUMsQ0FBRCxDQUFMLENBQVMsTUFBdEIsQ0FBUixDQUYyQyxDQUkzQzs7QUFDQSxVQUFBLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBUCxDQUFZO0FBQ3JCLFlBQUEsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFOLEdBQVksT0FBWixDQUFxQixLQUFyQixFQUE0QixHQUE1QixDQURlO0FBRXJCLFlBQUEsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFELENBRlE7QUFHckIsWUFBQSxRQUFRLEVBQUU7QUFIVyxXQUFaLENBQVY7QUFLQSxTQS9CYyxDQWlDZjs7O0FBQ0EsYUFBTSxJQUFOLElBQWMsT0FBZCxFQUF3QjtBQUN2QixjQUFLLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBRSxJQUFGLENBQVQsQ0FBa0IsSUFBbEIsQ0FBd0IsS0FBeEIsQ0FBVCxNQUE4QyxDQUFDLFVBQVUsQ0FBRSxJQUFGLENBQVgsS0FDaEQsS0FBSyxHQUFHLFVBQVUsQ0FBRSxJQUFGLENBQVYsQ0FBbUIsS0FBbkIsRUFBMEIsT0FBMUIsRUFBbUMsR0FBbkMsQ0FEd0MsQ0FBOUMsQ0FBTCxFQUN3RDtBQUV2RCxZQUFBLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBRCxDQUFkO0FBQ0EsWUFBQSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQU4sQ0FBYSxLQUFLLENBQUMsQ0FBRCxDQUFMLENBQVMsTUFBdEIsQ0FBUjtBQUNBLFlBQUEsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFQLENBQVk7QUFDckIsY0FBQSxJQUFJLEVBQUUsSUFEZTtBQUVyQixjQUFBLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBTixFQUZhO0FBR3JCLGNBQUEsUUFBUSxFQUFFO0FBSFcsYUFBWixDQUFWO0FBS0E7QUFDRDs7QUFFRCxZQUFLLENBQUMsT0FBTixFQUFnQjtBQUNmO0FBQ0E7QUFDRCxPQXRFcUQsQ0F3RXREOzs7QUFDQSxVQUFLLEtBQUwsRUFBYTtBQUNaLFFBQUEsTUFBTSxDQUFDLFFBQVAsR0FBa0IsS0FBbEI7QUFDQSxPQTNFcUQsQ0E2RXREO0FBQ0E7QUFDQTs7O0FBQ0EsYUFBTyxTQUFTLEdBQ2YsS0FBSyxDQUFDLE1BRFMsR0FFZixLQUFLLEdBQ0osTUFBTSxDQUFDLEtBQVAsQ0FBYyxRQUFkLENBREksR0FFSjtBQUNBLE1BQUEsS0FBSyxDQUFDLElBQU4sQ0FBWSxVQUFVLENBQUMsR0FBRCxFQUFNLE1BQU4sQ0FBdEIsRUFBcUMsQ0FBckMsQ0FMRjtBQU1BOztBQUVELGFBQVMsYUFBVCxDQUF3QixPQUF4QixFQUFpQyxVQUFqQyxFQUE2QyxPQUE3QyxFQUFzRCxHQUF0RCxFQUE0RDtBQUMzRCxVQUFJLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBckI7QUFBQSxVQUNDLFFBQVEsR0FBRyxJQUFJLEVBRGhCOztBQUdBLFVBQUssQ0FBQyxPQUFOLEVBQWdCO0FBQ2Y7QUFDQSxRQUFBLE9BQU8sR0FBRyxpQkFBVSxJQUFWLEVBQWlCO0FBQzFCLGlCQUFPLElBQUksS0FBSyxPQUFoQjtBQUNBLFNBRkQ7QUFHQTs7QUFDRCxhQUFPLFVBQVUsQ0FBQyxLQUFYLEdBQ04sVUFBVSxJQUFWLEVBQWlCO0FBQ2hCLGVBQVMsSUFBSSxHQUFHLElBQUksQ0FBRSxHQUFGLENBQXBCLEVBQStCO0FBQzlCLGNBQUssSUFBSSxDQUFDLFFBQUwsS0FBa0IsQ0FBdkIsRUFBMkI7QUFDMUIsbUJBQU8sT0FBTyxDQUFFLElBQUYsQ0FBUCxJQUFtQixJQUExQjtBQUNBO0FBQ0Q7QUFDRCxPQVBLLEdBUU4sR0FBRyxHQUNGLFVBQVUsSUFBVixFQUFpQjtBQUNoQixlQUFTLElBQUksR0FBRyxJQUFJLENBQUUsR0FBRixDQUFwQixFQUErQjtBQUM5QixjQUFLLElBQUksQ0FBQyxRQUFMLEtBQWtCLENBQXZCLEVBQTJCO0FBQzFCLGdCQUFLLE9BQU8sQ0FBRSxJQUFGLENBQVosRUFBdUI7QUFDdEIscUJBQU8sSUFBUDtBQUNBO0FBQ0Q7QUFDRDtBQUNELE9BVEMsR0FVRixVQUFVLElBQVYsRUFBaUI7QUFDaEIsWUFBSSxLQUFKO0FBQUEsWUFDQyxNQUFNLEdBQUcsUUFBUSxHQUFHLEdBQVgsR0FBaUIsT0FEM0I7QUFBQSxZQUVDLFNBQVMsR0FBRyxNQUFNLEdBQUcsR0FBVCxHQUFlLFVBRjVCOztBQUdBLGVBQVMsSUFBSSxHQUFHLElBQUksQ0FBRSxHQUFGLENBQXBCLEVBQStCO0FBQzlCLGNBQUssSUFBSSxDQUFDLFFBQUwsS0FBa0IsQ0FBdkIsRUFBMkI7QUFDMUIsZ0JBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFFLE9BQUYsQ0FBYixNQUE4QixTQUFuQyxFQUErQztBQUM5QyxxQkFBTyxJQUFJLENBQUMsTUFBWjtBQUNBLGFBRkQsTUFFTyxJQUFLLE9BQU8sS0FBUCxLQUFpQixRQUFqQixJQUE2QixLQUFLLENBQUMsT0FBTixDQUFjLE1BQWQsTUFBMEIsQ0FBNUQsRUFBZ0U7QUFDdEUsa0JBQUssSUFBSSxDQUFDLE1BQVYsRUFBbUI7QUFDbEIsdUJBQU8sSUFBUDtBQUNBO0FBQ0QsYUFKTSxNQUlBO0FBQ04sY0FBQSxJQUFJLENBQUUsT0FBRixDQUFKLEdBQWtCLFNBQWxCOztBQUNBLGtCQUFLLE9BQU8sQ0FBRSxJQUFGLENBQVosRUFBdUI7QUFDdEIsZ0JBQUEsSUFBSSxDQUFDLE1BQUwsR0FBYyxJQUFkO0FBQ0EsdUJBQU8sSUFBUDtBQUNBOztBQUNELGNBQUEsSUFBSSxDQUFDLE1BQUwsR0FBYyxLQUFkO0FBQ0E7QUFDRDtBQUNEO0FBQ0QsT0F4Q0g7QUF5Q0E7O0FBRUQsYUFBUyxVQUFULENBQXFCLE1BQXJCLEVBQTZCLE1BQTdCLEVBQXNDO0FBQ3JDLGFBQU8sTUFBTSxHQUNaLFVBQVUsSUFBVixFQUFpQjtBQUNoQixZQUFJLE1BQU0sR0FBRyxNQUFNLENBQUUsSUFBRixDQUFuQjtBQUNBLGVBQU8sTUFBTSxJQUFJLE1BQU0sQ0FBRSxNQUFNLEtBQUssSUFBWCxHQUFrQixJQUFsQixHQUF5QixNQUEzQixDQUF2QjtBQUNBLE9BSlcsR0FLWixNQUxEO0FBTUEsS0FsbUM4QixDQW9tQy9COzs7QUFDQSxhQUFTLGlCQUFULENBQTRCLE1BQTVCLEVBQW9DLE9BQXBDLEVBQTZDLEdBQTdDLEVBQW1EO0FBQ2xELFVBQUksS0FBSjtBQUFBLFVBQVcsT0FBWDtBQUFBLFVBQ0MsQ0FBQyxHQUFHLENBREw7O0FBR0EsYUFBUyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUQsQ0FBdkIsRUFBNkIsQ0FBQyxFQUE5QixFQUFtQztBQUNsQyxZQUFLLElBQUksQ0FBQyxRQUFMLENBQWUsS0FBSyxDQUFDLElBQXJCLENBQUwsRUFBbUM7QUFDbEMsVUFBQSxPQUFPLEdBQUcsYUFBYSxDQUFFLE9BQUYsRUFBVyxJQUFJLENBQUMsUUFBTCxDQUFlLEtBQUssQ0FBQyxJQUFyQixDQUFYLEVBQXdDLE9BQXhDLEVBQWlELEdBQWpELENBQXZCO0FBQ0EsU0FGRCxNQUVPO0FBQ04sVUFBQSxPQUFPLEdBQUcsVUFBVSxDQUFFLE9BQUYsRUFBVyxJQUFJLENBQUMsTUFBTCxDQUFhLEtBQUssQ0FBQyxJQUFuQixFQUEwQixLQUExQixDQUFnQyxJQUFoQyxFQUFzQyxLQUFLLENBQUMsUUFBTixDQUFlLE1BQWYsQ0FBdUIsT0FBdkIsRUFBZ0MsR0FBaEMsQ0FBdEMsQ0FBWCxDQUFwQjtBQUNBO0FBQ0Q7O0FBRUQsYUFBTyxPQUFQO0FBQ0E7O0FBRUQsYUFBUyx3QkFBVCxDQUFtQyxRQUFuQyxFQUE4QztBQUM3QyxhQUFPLFVBQVUsSUFBVixFQUFpQjtBQUN2QixZQUFJLE9BQUo7QUFBQSxZQUNDLENBQUMsR0FBRyxDQURMOztBQUVBLGVBQVMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxDQUFELENBQTNCLEVBQWlDLENBQUMsRUFBbEMsRUFBdUM7QUFDdEMsY0FBSyxPQUFPLENBQUMsSUFBRCxDQUFaLEVBQXFCO0FBQ3BCLG1CQUFPLElBQVA7QUFDQTtBQUNEOztBQUNELGVBQU8sS0FBUDtBQUNBLE9BVEQ7QUFVQTs7QUFFRCxJQUFBLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBUCxHQUFpQixVQUFVLFFBQVYsRUFBb0IsT0FBcEIsRUFBNkIsR0FBN0IsRUFBbUM7QUFDN0QsVUFBSSxLQUFKO0FBQUEsVUFBVyxDQUFYO0FBQUEsVUFBYyxHQUFkO0FBQUEsVUFDQyxNQUFNLEdBQUcsYUFBYSxDQUFFLE9BQUYsQ0FBYixDQUEwQixRQUExQixDQURWLENBRDZELENBSTdEOztBQUNBLFVBQUssTUFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFQLEtBQW1CLE9BQWxDLEVBQTRDO0FBQzNDLGVBQU8sTUFBUDtBQUNBLE9BUDRELENBUzdEOzs7QUFDQSxNQUFBLEtBQUssR0FBRyxRQUFRLENBQUUsUUFBRixFQUFZLE9BQVosRUFBcUIsR0FBckIsQ0FBaEI7O0FBQ0EsV0FBTSxDQUFDLEdBQUcsQ0FBSixFQUFPLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBekIsRUFBaUMsQ0FBQyxHQUFHLEdBQXJDLEVBQTBDLENBQUMsRUFBM0MsRUFBZ0Q7QUFDL0MsUUFBQSxLQUFLLENBQUMsQ0FBRCxDQUFMLEdBQVcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUQsQ0FBTixFQUFXLE9BQVgsRUFBb0IsR0FBcEIsQ0FBNUI7QUFDQSxPQWI0RCxDQWU3RDs7O0FBQ0EsTUFBQSxNQUFNLEdBQUcsYUFBYSxDQUFFLFFBQUYsRUFBWSx3QkFBd0IsQ0FBQyxLQUFELENBQXBDLENBQXRCO0FBQ0EsTUFBQSxNQUFNLENBQUMsT0FBUCxHQUFpQixPQUFqQjtBQUNBLE1BQUEsTUFBTSxDQUFDLElBQVAsR0FBYyxNQUFNLENBQUMsT0FBUCxHQUFpQixDQUEvQjtBQUNBLGFBQU8sTUFBUDtBQUNBLEtBcEJEOztBQXNCQSxhQUFTLGdCQUFULENBQTJCLFFBQTNCLEVBQXFDLFFBQXJDLEVBQStDLE9BQS9DLEVBQXdELElBQXhELEVBQStEO0FBQzlELFVBQUksQ0FBQyxHQUFHLENBQVI7QUFBQSxVQUNDLEdBQUcsR0FBRyxRQUFRLENBQUMsTUFEaEI7O0FBRUEsYUFBUSxDQUFDLEdBQUcsR0FBWixFQUFpQixDQUFDLEVBQWxCLEVBQXVCO0FBQ3RCLFFBQUEsTUFBTSxDQUFFLFFBQUYsRUFBWSxRQUFRLENBQUMsQ0FBRCxDQUFwQixFQUF5QixPQUF6QixFQUFrQyxJQUFsQyxDQUFOO0FBQ0E7QUFDRDs7QUFFRCxhQUFTLGNBQVQsQ0FBeUIsUUFBekIsRUFBbUMsU0FBbkMsRUFBOEMsUUFBOUMsRUFBd0QsUUFBeEQsRUFBa0UsSUFBbEUsRUFBd0UsR0FBeEUsRUFBOEU7QUFDN0UsVUFBSSxPQUFKO0FBQUEsVUFDQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQUwsQ0FBaUIsU0FBUyxDQUFDLFdBQVYsRUFBakIsQ0FETjs7QUFHQSxVQUFLLENBQUMsRUFBTixFQUFXO0FBQ1YsUUFBQSxNQUFNLENBQUMsS0FBUCxDQUFjLFNBQWQ7QUFDQTs7QUFFRCxVQUFLLFFBQVEsSUFBSSxFQUFFLE9BQU8sR0FBRyxJQUFaLENBQWpCLEVBQXFDO0FBQ3BDLFFBQUEsZ0JBQWdCLENBQUUsUUFBUSxJQUFJLEdBQWQsRUFBbUIsUUFBbkIsRUFBOEIsT0FBTyxHQUFHLEVBQXhDLEVBQTZDLElBQTdDLENBQWhCO0FBQ0E7O0FBRUQsYUFBTyxPQUFPLENBQUMsTUFBUixHQUFpQixDQUFqQixHQUFxQixFQUFFLENBQUUsT0FBRixFQUFXLFFBQVgsRUFBcUIsR0FBckIsQ0FBdkIsR0FBb0QsRUFBM0Q7QUFDQTs7QUFFRCxhQUFTLFNBQVQsQ0FBb0IsTUFBcEIsRUFBNEIsT0FBNUIsRUFBcUMsT0FBckMsRUFBOEMsSUFBOUMsRUFBcUQ7QUFDcEQsVUFBSSxLQUFKO0FBQUEsVUFBVyxJQUFYO0FBQUEsVUFBaUIsQ0FBakI7QUFBQSxVQUFvQixRQUFwQjtBQUFBLFVBQThCLEtBQTlCO0FBQUEsVUFBcUMsUUFBckM7QUFBQSxVQUNDLE1BREQ7QUFBQSxVQUNTLFFBRFQ7QUFBQSxVQUNtQixLQURuQjtBQUFBLFVBQzBCLE9BRDFCO0FBQUEsVUFFQyxTQUZEO0FBQUEsVUFFWSxlQUZaO0FBQUEsVUFFNkIsR0FGN0I7QUFBQSxVQUdDLENBQUMsR0FBRyxDQUhMO0FBQUEsVUFJQyxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BSmQ7QUFBQSxVQUtDLElBQUksR0FBRyxTQUFTLENBQUMsS0FBRCxDQUxqQjtBQUFBLFVBTUM7QUFDQSxNQUFBLFVBQVUsR0FBRyxJQUFJLE1BQUosQ0FBWSxNQUFNLElBQUksQ0FBQyxNQUFYLEdBQW9CLEtBQXBCLEdBQTRCLFVBQTVCLEdBQXlDLEdBQXJELEVBQTBELEdBQTFELENBUGQ7QUFBQSxVQVFDO0FBQ0E7QUFDQSxNQUFBLFlBQVksR0FBRyxTQUFmLFlBQWUsR0FBVztBQUN6QixZQUFJLENBQUMsR0FBRyxDQUFSO0FBQUEsWUFDQyxHQUFHLEdBQUcsU0FBUyxDQUFDLE1BQVYsR0FBbUIsQ0FEMUI7O0FBRUEsZUFBUSxDQUFDLEdBQUcsR0FBWixFQUFpQixDQUFDLEVBQWxCLEVBQXVCO0FBQ3RCLGNBQUssU0FBUyxDQUFDLENBQUQsQ0FBVCxLQUFpQixTQUF0QixFQUFrQztBQUNqQyxZQUFBLEtBQUssQ0FBQyxDQUFELENBQUwsR0FBVyxTQUFYO0FBQ0E7QUFDRDtBQUNELE9BbEJGOztBQW9CQSxhQUFRLENBQUMsR0FBRyxHQUFaLEVBQWlCLENBQUMsRUFBbEIsRUFBdUI7QUFDdEIsUUFBQSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUQsQ0FBZDtBQUNBLFFBQUEsSUFBSSxHQUFHLEVBQVA7QUFDQSxRQUFBLFFBQVEsR0FBRyxJQUFYOztBQUNBLGFBQU0sQ0FBQyxHQUFHLENBQUosRUFBTyxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQTlCLEVBQXNDLENBQUMsR0FBRyxRQUExQyxFQUFvRCxDQUFDLEVBQXJELEVBQTBEO0FBQ3pELFVBQUEsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFELENBQWI7QUFDQSxVQUFBLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBakI7O0FBQ0EsY0FBSyxLQUFLLENBQUMsSUFBTixLQUFlLFFBQXBCLEVBQStCO0FBQzlCO0FBQ0EsWUFBQSxJQUFJLENBQUMsSUFBTCxDQUFVLEVBQVY7QUFDQSxZQUFBLE1BQU0sR0FBRyxDQUFUOztBQUNBLG1CQUFTLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBTCxDQUFXLFFBQVgsQ0FBakIsRUFBMEM7QUFDekMsY0FBQSxPQUFPLEdBQUcsSUFBVjtBQUNBLGNBQUEsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFMLEdBQWlCLEtBQUssQ0FBQyxLQUFOLEdBQWMsS0FBSyxDQUFDLENBQUQsQ0FBTCxDQUFTLE1BQXBEOztBQUNBLGtCQUFLLFNBQVMsR0FBRyxNQUFqQixFQUEwQjtBQUN6QixnQkFBQSxJQUFJLElBQUksUUFBUSxDQUFDLEtBQVQsQ0FBZ0IsTUFBaEIsRUFBd0IsS0FBSyxDQUFDLEtBQTlCLENBQVI7QUFDQSxnQkFBQSxNQUFNLEdBQUcsU0FBVDtBQUNBLGdCQUFBLGVBQWUsR0FBRyxDQUFFLE9BQUYsQ0FBbEI7O0FBRUEsb0JBQUssWUFBWSxDQUFDLElBQWIsQ0FBa0IsSUFBbEIsQ0FBTCxFQUErQjtBQUM5QixzQkFBSyxRQUFMLEVBQWdCO0FBQ2Ysb0JBQUEsZUFBZSxHQUFHLFFBQWxCO0FBQ0E7O0FBQ0Qsa0JBQUEsUUFBUSxHQUFHLElBQVg7QUFDQTs7QUFFRCxvQkFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLElBQWIsQ0FBbUIsSUFBbkIsQ0FBWixFQUF5QztBQUN4QyxrQkFBQSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUwsQ0FBWSxDQUFaLEVBQWUsQ0FBQyxDQUFoQixFQUFvQixPQUFwQixDQUE2QixZQUE3QixFQUEyQyxLQUEzQyxDQUFQO0FBQ0Esa0JBQUEsTUFBTTtBQUNOOztBQUVELG9CQUFLLEtBQUssQ0FBQyxNQUFOLEdBQWUsQ0FBcEIsRUFBd0I7QUFDdkIsa0JBQUEsS0FBSyxDQUFDLENBQUQsQ0FBTCxDQUFTLE9BQVQsQ0FBa0IsVUFBbEIsRUFBOEIsWUFBOUI7QUFDQTs7QUFDRCxnQkFBQSxRQUFRLEdBQUcsY0FBYyxDQUFFLElBQUYsRUFBUSxLQUFLLENBQUMsQ0FBRCxDQUFiLEVBQWtCLEtBQUssQ0FBQyxDQUFELENBQXZCLEVBQTRCLGVBQTVCLEVBQTZDLFFBQTdDLEVBQXVELEdBQXZELENBQXpCO0FBQ0E7O0FBQ0QsY0FBQSxJQUFJLEdBQUcsRUFBUDtBQUNBO0FBRUQ7O0FBRUQsY0FBSyxDQUFDLE9BQU4sRUFBZ0I7QUFDZixZQUFBLElBQUksSUFBSSxRQUFSO0FBQ0E7O0FBQ0QsVUFBQSxPQUFPLEdBQUcsS0FBVjtBQUNBOztBQUVELFlBQUssSUFBTCxFQUFZO0FBQ1gsY0FBSyxZQUFZLENBQUMsSUFBYixDQUFrQixJQUFsQixDQUFMLEVBQStCO0FBQzlCLFlBQUEsZ0JBQWdCLENBQUUsSUFBRixFQUFRLFFBQVEsSUFBSSxDQUFFLE9BQUYsQ0FBcEIsRUFBaUMsT0FBakMsRUFBMEMsSUFBMUMsQ0FBaEI7QUFDQSxXQUZELE1BRU87QUFDTixZQUFBLE1BQU0sQ0FBRSxJQUFGLEVBQVEsT0FBUixFQUFpQixPQUFqQixFQUEwQixJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQUwsQ0FBWSxRQUFaLENBQUgsR0FBMkIsUUFBekQsQ0FBTjtBQUNBO0FBQ0QsU0FORCxNQU1PO0FBQ04sVUFBQSxJQUFJLENBQUMsS0FBTCxDQUFZLE9BQVosRUFBcUIsUUFBckI7QUFDQTtBQUNELE9BN0VtRCxDQStFcEQ7OztBQUNBLGFBQU8sR0FBRyxLQUFLLENBQVIsR0FBWSxPQUFaLEdBQXNCLE1BQU0sQ0FBQyxVQUFQLENBQW1CLE9BQW5CLENBQTdCO0FBQ0E7O0FBRUQsYUFBUyxNQUFULENBQWlCLFFBQWpCLEVBQTJCLE9BQTNCLEVBQW9DLE9BQXBDLEVBQTZDLElBQTdDLEVBQW1ELEdBQW5ELEVBQXlEO0FBQ3hEO0FBQ0EsTUFBQSxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQVQsQ0FBa0IsS0FBbEIsRUFBeUIsSUFBekIsQ0FBWDtBQUNBLFVBQUksUUFBSjtBQUFBLFVBQWMsT0FBZDtBQUFBLFVBQXVCLE1BQXZCO0FBQUEsVUFBK0IsSUFBL0I7QUFBQSxVQUNDLENBREQ7QUFBQSxVQUNJLE1BREo7QUFBQSxVQUNZLEtBRFo7QUFBQSxVQUNtQixTQURuQjtBQUFBLFVBQzhCLFdBRDlCO0FBQUEsVUFDMkMsSUFEM0M7QUFBQSxVQUVDLEtBQUssR0FBRyxRQUFRLENBQUUsUUFBRixFQUFZLE9BQVosRUFBcUIsR0FBckIsQ0FGakI7QUFBQSxVQUdDLGVBQWUsR0FBRyxPQUFPLENBQUMsUUFIM0IsQ0FId0QsQ0FReEQ7O0FBQ0EsVUFBSyxTQUFTLENBQUMsS0FBRCxDQUFULENBQWlCLElBQWpCLENBQXNCLFFBQXRCLENBQUwsRUFBdUM7QUFDdEMsZUFBTyxTQUFTLENBQUUsS0FBRixFQUFTLE9BQVQsRUFBa0IsT0FBbEIsRUFBMkIsSUFBM0IsQ0FBaEI7QUFDQTs7QUFFRCxVQUFLLElBQUwsRUFBWTtBQUNYLFFBQUEsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFOLENBQVksSUFBWixFQUFrQixDQUFsQixDQUFYLENBRFcsQ0FHWjtBQUNBO0FBQ0MsT0FMRCxNQUtPLElBQUssS0FBSyxDQUFDLE1BQU4sS0FBaUIsQ0FBdEIsRUFBMEI7QUFFaEM7QUFDQSxZQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFOLENBQVksS0FBSyxDQUFDLENBQUQsQ0FBakIsRUFBc0IsQ0FBdEIsQ0FBVixFQUFxQyxNQUFyQyxHQUE4QyxDQUE5QyxJQUNILENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFELENBQWYsRUFBb0IsSUFBcEIsS0FBNkIsSUFEMUIsSUFFSCxlQUFlLEtBQUssQ0FGakIsSUFFc0IsQ0FBQyxHQUZ2QixJQUdILElBQUksQ0FBQyxRQUFMLENBQWUsTUFBTSxDQUFDLENBQUQsQ0FBTixDQUFVLElBQXpCLENBSEYsRUFHb0M7QUFFbkMsVUFBQSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUwsQ0FBVSxJQUFWLEVBQWlCLEtBQUssQ0FBQyxRQUFOLENBQWUsQ0FBZixFQUFrQixPQUFsQixDQUEyQixVQUEzQixFQUF1QyxFQUF2QyxDQUFqQixFQUE4RCxPQUE5RCxFQUF1RSxHQUF2RSxFQUE2RSxDQUE3RSxDQUFWOztBQUNBLGNBQUssQ0FBQyxPQUFOLEVBQWdCO0FBQ2YsbUJBQU8sT0FBUDtBQUNBOztBQUVELFVBQUEsUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFULENBQWdCLE1BQU0sQ0FBQyxLQUFQLEdBQWUsTUFBZixDQUFzQixNQUF0QyxDQUFYO0FBQ0E7O0FBRUQsUUFBQSxXQUFXLEdBQUssQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQVQsQ0FBZSxNQUFNLENBQUMsQ0FBRCxDQUFOLENBQVUsTUFBekIsQ0FBVCxLQUErQyxDQUFDLEtBQUssQ0FBQyxLQUF0RCxJQUErRCxPQUFPLENBQUMsVUFBekUsSUFBeUYsT0FBdkcsQ0FoQmdDLENBa0JoQzs7QUFDQSxRQUFBLFNBQVMsR0FBRyxFQUFaOztBQUNBLGFBQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFQLEdBQWdCLENBQTFCLEVBQTZCLENBQUMsSUFBSSxDQUFsQyxFQUFxQyxDQUFDLEVBQXRDLEVBQTJDO0FBQzFDLFVBQUEsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFELENBQWQ7QUFDQSxVQUFBLElBQUksR0FBRyxLQUFLLENBQUMsSUFBYjtBQUNBLFVBQUEsU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFOLEdBQWUsU0FBM0I7O0FBQ0EsY0FBSyxJQUFJLENBQUMsUUFBTCxDQUFlLElBQWYsQ0FBTCxFQUE2QjtBQUM1QjtBQUNBOztBQUNELGNBQUssSUFBSSxDQUFDLEtBQUwsQ0FBVyxJQUFYLENBQWdCLElBQWhCLENBQUwsRUFBNkI7QUFDNUIsWUFBQSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUwsQ0FBVyxJQUFYLEVBQW1CLEtBQUssQ0FBQyxRQUFOLENBQWUsQ0FBZixFQUFrQixPQUFsQixDQUEyQixVQUEzQixFQUF1QyxFQUF2QyxDQUFuQixFQUFnRSxXQUFoRSxFQUE2RSxHQUE3RSxDQUFYOztBQUNBLGdCQUFLLFFBQVEsSUFBSSxJQUFqQixFQUF3QjtBQUN2QjtBQUNBLGFBRkQsTUFFTztBQUNOLGNBQUEsUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFULENBQWdCLENBQWhCLEVBQW1CLFFBQVEsQ0FBQyxNQUFULEdBQWtCLFNBQVMsQ0FBQyxNQUEvQyxJQUNWLFNBQVMsQ0FBQyxPQUFWLENBQW1CLFNBQVMsQ0FBRSxJQUFGLENBQTVCLEVBQXNDLEVBQXRDLENBREQ7O0FBR0Esa0JBQUssQ0FBQyxRQUFOLEVBQWlCO0FBQ2hCLGdCQUFBLElBQUksQ0FBQyxLQUFMLENBQVksT0FBWixFQUFxQixLQUFLLENBQUMsSUFBTixDQUFXLFFBQVgsRUFBcUIsQ0FBckIsQ0FBckI7QUFDQTs7QUFFRDtBQUNBO0FBQ0Q7QUFDRDtBQUNELE9BN0R1RCxDQStEeEQ7OztBQUNBLFVBQUssUUFBTCxFQUFnQjtBQUNmLFFBQUEsT0FBTyxHQUFHLE9BQU8sQ0FBRSxRQUFGLEVBQVksT0FBWixFQUFxQixHQUFyQixDQUFqQjtBQUNBLFFBQUEsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFSLEVBQVY7O0FBQ0EsWUFBSyxRQUFRLElBQUksSUFBakIsRUFBd0I7QUFDdkIsVUFBQSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUwsQ0FBVSxLQUFWLEVBQWtCLEdBQWxCLEVBQXdCLFFBQVEsQ0FBQyxJQUFULENBQWUsUUFBZixLQUE2QixPQUFPLENBQUMsVUFBdEMsSUFBcUQsT0FBNUUsQ0FBWDtBQUNBOztBQUVELGFBQU0sQ0FBQyxHQUFHLENBQVYsRUFBYyxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUQsQ0FBN0IsRUFBbUMsQ0FBQyxFQUFwQyxFQUF5QztBQUN4QyxVQUFBLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBUixFQUFiOztBQUNBLGNBQUssT0FBTyxDQUFDLElBQUQsQ0FBWixFQUFxQjtBQUNwQixZQUFBLE9BQU8sQ0FBQyxJQUFSLENBQWMsSUFBZDtBQUNBO0FBQ0Q7QUFDRDs7QUFFRCxhQUFPLE9BQVA7QUFDQTs7QUFFRCxRQUFLLFFBQVEsQ0FBQyxnQkFBZCxFQUFpQztBQUNoQyxPQUFDLFlBQVc7QUFDWCxZQUFJLGlCQUFKO0FBQUEsWUFDQyxTQUFTLEdBQUcsTUFEYjtBQUFBLFlBRUMsT0FBTyxHQUFHLE9BRlg7QUFBQSxZQUdDLGdCQUFnQixHQUFHLCtDQUhwQjtBQUFBLFlBSUMsU0FBUyxHQUFHLEVBSmI7QUFBQSxZQUtDO0FBQ0E7QUFDQTtBQUNBLFFBQUEsYUFBYSxHQUFHLENBQUMsU0FBRCxDQVJqQjtBQUFBLFlBU0MsT0FBTyxHQUFHLE9BQU8sQ0FBQyxlQUFSLElBQ1QsT0FBTyxDQUFDLGtCQURDLElBRVQsT0FBTyxDQUFDLHFCQUZDLElBR1QsT0FBTyxDQUFDLGdCQUhDLElBSVQsT0FBTyxDQUFDLGlCQWJWLENBRFcsQ0FnQlg7QUFDQTs7QUFDQSxRQUFBLE1BQU0sQ0FBQyxVQUFVLEdBQVYsRUFBZ0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQUEsR0FBRyxDQUFDLFNBQUosR0FBZ0IsZ0RBQWhCLENBTnNCLENBUXRCOztBQUNBLGNBQUssQ0FBQyxHQUFHLENBQUMsZ0JBQUosQ0FBcUIsWUFBckIsRUFBbUMsTUFBekMsRUFBa0Q7QUFDakQsWUFBQSxTQUFTLENBQUMsSUFBVixDQUFnQixRQUFRLFVBQVIsR0FBcUIsOERBQXJDO0FBQ0EsV0FYcUIsQ0FhdEI7QUFDQTtBQUNBOzs7QUFDQSxjQUFLLENBQUMsR0FBRyxDQUFDLGdCQUFKLENBQXFCLFVBQXJCLEVBQWlDLE1BQXZDLEVBQWdEO0FBQy9DLFlBQUEsU0FBUyxDQUFDLElBQVYsQ0FBZSxVQUFmO0FBQ0E7QUFDRCxTQW5CSyxDQUFOO0FBcUJBLFFBQUEsTUFBTSxDQUFDLFVBQVUsR0FBVixFQUFnQjtBQUV0QjtBQUNBO0FBQ0EsVUFBQSxHQUFHLENBQUMsU0FBSixHQUFnQixpQkFBaEI7O0FBQ0EsY0FBSyxHQUFHLENBQUMsZ0JBQUosQ0FBcUIsWUFBckIsRUFBbUMsTUFBeEMsRUFBaUQ7QUFDaEQsWUFBQSxTQUFTLENBQUMsSUFBVixDQUFnQixXQUFXLFVBQVgsR0FBd0IsY0FBeEM7QUFDQSxXQVBxQixDQVN0QjtBQUNBOzs7QUFDQSxVQUFBLEdBQUcsQ0FBQyxTQUFKLEdBQWdCLHdCQUFoQjs7QUFDQSxjQUFLLENBQUMsR0FBRyxDQUFDLGdCQUFKLENBQXFCLFVBQXJCLEVBQWlDLE1BQXZDLEVBQWdEO0FBQy9DLFlBQUEsU0FBUyxDQUFDLElBQVYsQ0FBZSxVQUFmLEVBQTJCLFdBQTNCO0FBQ0E7QUFDRCxTQWZLLENBQU47QUFpQkEsUUFBQSxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQVYsSUFBb0IsSUFBSSxNQUFKLENBQVksU0FBUyxDQUFDLElBQVYsQ0FBZSxHQUFmLENBQVosQ0FBaEM7O0FBRUEsUUFBQSxNQUFNLEdBQUcsZ0JBQVUsUUFBVixFQUFvQixPQUFwQixFQUE2QixPQUE3QixFQUFzQyxJQUF0QyxFQUE0QyxHQUE1QyxFQUFrRDtBQUMxRDtBQUNBO0FBQ0E7QUFDQSxjQUFLLENBQUMsSUFBRCxJQUFTLENBQUMsR0FBVixLQUFrQixDQUFDLFNBQUQsSUFBYyxDQUFDLFNBQVMsQ0FBQyxJQUFWLENBQWdCLFFBQWhCLENBQWpDLENBQUwsRUFBb0U7QUFDbkUsZ0JBQUssT0FBTyxDQUFDLFFBQVIsS0FBcUIsQ0FBMUIsRUFBOEI7QUFDN0Isa0JBQUk7QUFDSCxnQkFBQSxJQUFJLENBQUMsS0FBTCxDQUFZLE9BQVosRUFBcUIsS0FBSyxDQUFDLElBQU4sQ0FBVyxPQUFPLENBQUMsZ0JBQVIsQ0FBMEIsUUFBMUIsQ0FBWCxFQUFpRCxDQUFqRCxDQUFyQjtBQUNBLHVCQUFPLE9BQVA7QUFDQSxlQUhELENBR0UsT0FBTSxRQUFOLEVBQWdCLENBQUUsQ0FKUyxDQUs5QjtBQUNBO0FBQ0E7QUFDQTs7QUFDQyxhQVRELE1BU08sSUFBSyxPQUFPLENBQUMsUUFBUixLQUFxQixDQUFyQixJQUEwQixPQUFPLENBQUMsUUFBUixDQUFpQixXQUFqQixPQUFtQyxRQUFsRSxFQUE2RTtBQUNuRixrQkFBSSxNQUFKO0FBQUEsa0JBQVksQ0FBWjtBQUFBLGtCQUFlLEdBQWY7QUFBQSxrQkFDQyxHQUFHLEdBQUcsT0FBTyxDQUFDLFlBQVIsQ0FBcUIsSUFBckIsQ0FEUDtBQUFBLGtCQUVDLEdBQUcsR0FBRyxHQUFHLElBQUksT0FGZDtBQUFBLGtCQUdDLFVBQVUsR0FBRyxRQUFRLENBQUMsSUFBVCxDQUFlLFFBQWYsS0FBNkIsT0FBTyxDQUFDLFVBQXJDLElBQW1ELE9BSGpFOztBQUtBLGtCQUFLLEdBQUwsRUFBVztBQUNWLGdCQUFBLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBSixDQUFhLE9BQWIsRUFBc0IsTUFBdEIsQ0FBTjtBQUNBLGVBRkQsTUFFTztBQUNOLGdCQUFBLE9BQU8sQ0FBQyxZQUFSLENBQXNCLElBQXRCLEVBQTRCLEdBQTVCO0FBQ0E7O0FBRUQsY0FBQSxNQUFNLEdBQUcsUUFBUSxDQUFDLFFBQUQsRUFBVyxPQUFYLEVBQW9CLEdBQXBCLENBQWpCLENBWm1GLENBYW5GO0FBQ0E7O0FBQ0EsY0FBQSxHQUFHLEdBQUcsVUFBVSxHQUFWLEdBQWdCLElBQXRCOztBQUNBLG1CQUFNLENBQUMsR0FBRyxDQUFKLEVBQU8sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUExQixFQUFrQyxDQUFDLEdBQUcsR0FBdEMsRUFBMkMsQ0FBQyxFQUE1QyxFQUFpRDtBQUNoRCxnQkFBQSxNQUFNLENBQUMsQ0FBRCxDQUFOLEdBQVksR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFELENBQU4sQ0FBVSxRQUE1QjtBQUNBOztBQUNELGtCQUFJO0FBQ0gsZ0JBQUEsSUFBSSxDQUFDLEtBQUwsQ0FBWSxPQUFaLEVBQXFCLEtBQUssQ0FBQyxJQUFOLENBQVksVUFBVSxDQUFDLGdCQUFYLENBQ2hDLE1BQU0sQ0FBQyxJQUFQLENBQVksR0FBWixDQURnQyxDQUFaLEVBRWxCLENBRmtCLENBQXJCO0FBR0EsdUJBQU8sT0FBUDtBQUNBLGVBTEQsQ0FLRSxPQUFNLFFBQU4sRUFBZ0IsQ0FDakIsQ0FORCxTQU1VO0FBQ1Qsb0JBQUssQ0FBQyxHQUFOLEVBQVk7QUFDWCxrQkFBQSxPQUFPLENBQUMsZUFBUixDQUF3QixJQUF4QjtBQUNBO0FBQ0Q7QUFDRDtBQUNEOztBQUVELGlCQUFPLFNBQVMsQ0FBRSxRQUFGLEVBQVksT0FBWixFQUFxQixPQUFyQixFQUE4QixJQUE5QixFQUFvQyxHQUFwQyxDQUFoQjtBQUNBLFNBaEREOztBQWtEQSxZQUFLLE9BQUwsRUFBZTtBQUNkLFVBQUEsTUFBTSxDQUFDLFVBQVUsR0FBVixFQUFnQjtBQUN0QjtBQUNBO0FBQ0EsWUFBQSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsSUFBUixDQUFjLEdBQWQsRUFBbUIsS0FBbkIsQ0FBcEIsQ0FIc0IsQ0FLdEI7QUFDQTs7QUFDQSxnQkFBSTtBQUNILGNBQUEsT0FBTyxDQUFDLElBQVIsQ0FBYyxHQUFkLEVBQW1CLG1CQUFuQjtBQUNBLGNBQUEsYUFBYSxDQUFDLElBQWQsQ0FBb0IsU0FBUyxDQUFDLFFBQUQsQ0FBVCxDQUFvQixNQUF4QyxFQUFnRCxTQUFTLENBQUMsS0FBRCxDQUFULENBQWlCLE1BQWpFLEVBQXlFLElBQXpFO0FBQ0EsYUFIRCxDQUdFLE9BQVEsQ0FBUixFQUFZLENBQUU7QUFDaEIsV0FYSyxDQUFOLENBRGMsQ0FjZDs7QUFDQSxVQUFBLGFBQWE7QUFBRztBQUE4QixjQUFJLE1BQUosQ0FBWSxhQUFhLENBQUMsSUFBZCxDQUFtQixHQUFuQixDQUFaLENBQTlDOztBQUVBLFVBQUEsTUFBTSxDQUFDLGVBQVAsR0FBeUIsVUFBVSxJQUFWLEVBQWdCLElBQWhCLEVBQXVCO0FBQy9DO0FBQ0EsWUFBQSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQUwsQ0FBYyxnQkFBZCxFQUFnQyxRQUFoQyxDQUFQLENBRitDLENBSS9DOztBQUNBLGdCQUFLLENBQUMsS0FBSyxDQUFFLElBQUYsQ0FBTixJQUFrQixDQUFDLGFBQWEsQ0FBQyxJQUFkLENBQW9CLElBQXBCLENBQW5CLEtBQWtELENBQUMsU0FBRCxJQUFjLENBQUMsU0FBUyxDQUFDLElBQVYsQ0FBZ0IsSUFBaEIsQ0FBakUsQ0FBTCxFQUFnRztBQUMvRixrQkFBSTtBQUNILG9CQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBUixDQUFjLElBQWQsRUFBb0IsSUFBcEIsQ0FBVixDQURHLENBR0g7O0FBQ0Esb0JBQUssR0FBRyxJQUFJLGlCQUFQLElBQ0g7QUFDQTtBQUNBLGdCQUFBLElBQUksQ0FBQyxRQUFMLElBQWlCLElBQUksQ0FBQyxRQUFMLENBQWMsUUFBZCxLQUEyQixFQUg5QyxFQUdtRDtBQUNsRCx5QkFBTyxHQUFQO0FBQ0E7QUFDRCxlQVZELENBVUUsT0FBTSxDQUFOLEVBQVMsQ0FBRTtBQUNiOztBQUVELG1CQUFPLE1BQU0sQ0FBRSxJQUFGLEVBQVEsSUFBUixFQUFjLElBQWQsRUFBb0IsQ0FBRSxJQUFGLENBQXBCLENBQU4sQ0FBcUMsTUFBckMsR0FBOEMsQ0FBckQ7QUFDQSxXQXBCRDtBQXFCQTtBQUNELE9BbkpEO0FBb0pBLEtBeCtDOEIsQ0EwK0MvQjs7O0FBQ0EsSUFBQSxJQUFJLENBQUMsVUFBTCxDQUFnQixLQUFoQixJQUF5QixJQUFJLENBQUMsVUFBTCxDQUFnQixJQUFoQixDQUF6QixDQTMrQytCLENBNitDL0I7O0FBQ0EsSUFBQSxJQUFJLENBQUMsT0FBTCxHQUFlLElBQUksQ0FBQyxPQUFwQixDQTkrQytCLENBZy9DL0I7O0FBQ0EsSUFBQSxNQUFNLENBQUMsSUFBUCxHQUFjLE1BQU0sQ0FBQyxJQUFyQjtBQUNBLElBQUEsTUFBTSxDQUFDLElBQVAsR0FBYyxNQUFkO0FBQ0EsSUFBQSxNQUFNLENBQUMsSUFBUCxHQUFjLE1BQU0sQ0FBQyxTQUFyQjtBQUNBLElBQUEsTUFBTSxDQUFDLElBQVAsQ0FBWSxHQUFaLElBQW1CLE1BQU0sQ0FBQyxJQUFQLENBQVksT0FBL0I7QUFDQSxJQUFBLE1BQU0sQ0FBQyxNQUFQLEdBQWdCLE1BQU0sQ0FBQyxVQUF2QjtBQUNBLElBQUEsTUFBTSxDQUFDLElBQVAsR0FBYyxNQUFNLENBQUMsT0FBckI7QUFDQSxJQUFBLE1BQU0sQ0FBQyxRQUFQLEdBQWtCLE1BQU0sQ0FBQyxLQUF6QjtBQUNBLElBQUEsTUFBTSxDQUFDLFFBQVAsR0FBa0IsTUFBTSxDQUFDLFFBQXpCO0FBR0MsR0EzL0NELEVBMi9DSSxNQTMvQ0o7O0FBNC9DQSxNQUFJLE1BQU0sR0FBRyxRQUFiO0FBQUEsTUFDQyxZQUFZLEdBQUcsZ0NBRGhCO0FBQUEsTUFFQyxRQUFRLEdBQUcsZ0JBRlo7QUFBQSxNQUdDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBUCxDQUFZLEtBQVosQ0FBa0IsWUFIbkM7QUFBQSxNQUlDO0FBQ0EsRUFBQSxnQkFBZ0IsR0FBRztBQUNsQixJQUFBLFFBQVEsRUFBRSxJQURRO0FBRWxCLElBQUEsUUFBUSxFQUFFLElBRlE7QUFHbEIsSUFBQSxJQUFJLEVBQUUsSUFIWTtBQUlsQixJQUFBLElBQUksRUFBRTtBQUpZLEdBTHBCO0FBWUEsRUFBQSxNQUFNLENBQUMsRUFBUCxDQUFVLE1BQVYsQ0FBaUI7QUFDaEIsSUFBQSxJQUFJLEVBQUUsY0FBVSxRQUFWLEVBQXFCO0FBQzFCLFVBQUksQ0FBSjtBQUFBLFVBQU8sQ0FBUDtBQUFBLFVBQVUsTUFBVjtBQUFBLFVBQWtCLENBQWxCO0FBQUEsVUFBcUIsQ0FBckI7QUFBQSxVQUF3QixHQUF4QjtBQUFBLFVBQ0MsSUFBSSxHQUFHLElBRFI7O0FBR0EsVUFBSyxPQUFPLFFBQVAsS0FBb0IsUUFBekIsRUFBb0M7QUFDbkMsZUFBTyxNQUFNLENBQUUsUUFBRixDQUFOLENBQW1CLE1BQW5CLENBQTBCLFlBQVc7QUFDM0MsZUFBTSxDQUFDLEdBQUcsQ0FBSixFQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBdEIsRUFBOEIsQ0FBQyxHQUFHLENBQWxDLEVBQXFDLENBQUMsRUFBdEMsRUFBMkM7QUFDMUMsZ0JBQUssTUFBTSxDQUFDLFFBQVAsQ0FBaUIsSUFBSSxDQUFFLENBQUYsQ0FBckIsRUFBNEIsSUFBNUIsQ0FBTCxFQUEwQztBQUN6QyxxQkFBTyxJQUFQO0FBQ0E7QUFDRDtBQUNELFNBTk0sQ0FBUDtBQU9BOztBQUVELE1BQUEsR0FBRyxHQUFHLEtBQUssU0FBTCxDQUFnQixFQUFoQixFQUFvQixNQUFwQixFQUE0QixRQUE1QixDQUFOOztBQUVBLFdBQU0sQ0FBQyxHQUFHLENBQUosRUFBTyxDQUFDLEdBQUcsS0FBSyxNQUF0QixFQUE4QixDQUFDLEdBQUcsQ0FBbEMsRUFBcUMsQ0FBQyxFQUF0QyxFQUEyQztBQUMxQyxRQUFBLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBYjtBQUNBLFFBQUEsTUFBTSxDQUFDLElBQVAsQ0FBYSxRQUFiLEVBQXVCLEtBQUssQ0FBTCxDQUF2QixFQUFnQyxHQUFoQzs7QUFFQSxZQUFLLENBQUMsR0FBRyxDQUFULEVBQWE7QUFDWjtBQUNBLGVBQU0sQ0FBQyxHQUFHLE1BQVYsRUFBa0IsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUExQixFQUFrQyxDQUFDLEVBQW5DLEVBQXdDO0FBQ3ZDLGlCQUFNLENBQUMsR0FBRyxDQUFWLEVBQWEsQ0FBQyxHQUFHLE1BQWpCLEVBQXlCLENBQUMsRUFBMUIsRUFBK0I7QUFDOUIsa0JBQUssR0FBRyxDQUFDLENBQUQsQ0FBSCxLQUFXLEdBQUcsQ0FBQyxDQUFELENBQW5CLEVBQXlCO0FBQ3hCLGdCQUFBLEdBQUcsQ0FBQyxNQUFKLENBQVcsQ0FBQyxFQUFaLEVBQWdCLENBQWhCO0FBQ0E7QUFDQTtBQUNEO0FBQ0Q7QUFDRDtBQUNEOztBQUVELGFBQU8sR0FBUDtBQUNBLEtBbkNlO0FBcUNoQixJQUFBLEdBQUcsRUFBRSxhQUFVLE1BQVYsRUFBbUI7QUFDdkIsVUFBSSxDQUFKO0FBQUEsVUFDQyxPQUFPLEdBQUcsTUFBTSxDQUFFLE1BQUYsRUFBVSxJQUFWLENBRGpCO0FBQUEsVUFFQyxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BRmY7QUFJQSxhQUFPLEtBQUssTUFBTCxDQUFZLFlBQVc7QUFDN0IsYUFBTSxDQUFDLEdBQUcsQ0FBVixFQUFhLENBQUMsR0FBRyxHQUFqQixFQUFzQixDQUFDLEVBQXZCLEVBQTRCO0FBQzNCLGNBQUssTUFBTSxDQUFDLFFBQVAsQ0FBaUIsSUFBakIsRUFBdUIsT0FBTyxDQUFDLENBQUQsQ0FBOUIsQ0FBTCxFQUEyQztBQUMxQyxtQkFBTyxJQUFQO0FBQ0E7QUFDRDtBQUNELE9BTk0sQ0FBUDtBQU9BLEtBakRlO0FBbURoQixJQUFBLEdBQUcsRUFBRSxhQUFVLFFBQVYsRUFBcUI7QUFDekIsYUFBTyxLQUFLLFNBQUwsQ0FBZ0IsTUFBTSxDQUFDLElBQUQsRUFBTyxRQUFQLEVBQWlCLEtBQWpCLENBQXRCLEVBQStDLEtBQS9DLEVBQXNELFFBQXRELENBQVA7QUFDQSxLQXJEZTtBQXVEaEIsSUFBQSxNQUFNLEVBQUUsZ0JBQVUsUUFBVixFQUFxQjtBQUM1QixhQUFPLEtBQUssU0FBTCxDQUFnQixNQUFNLENBQUMsSUFBRCxFQUFPLFFBQVAsRUFBaUIsSUFBakIsQ0FBdEIsRUFBOEMsUUFBOUMsRUFBd0QsUUFBeEQsQ0FBUDtBQUNBLEtBekRlO0FBMkRoQixJQUFBLEVBQUUsRUFBRSxZQUFVLFFBQVYsRUFBcUI7QUFDeEIsYUFBTyxDQUFDLENBQUMsUUFBRixLQUNOLE9BQU8sUUFBUCxLQUFvQixRQUFwQixHQUNDO0FBQ0E7QUFDQSxNQUFBLGFBQWEsQ0FBQyxJQUFkLENBQW9CLFFBQXBCLElBQ0MsTUFBTSxDQUFFLFFBQUYsRUFBWSxLQUFLLE9BQWpCLENBQU4sQ0FBaUMsS0FBakMsQ0FBd0MsS0FBSyxDQUFMLENBQXhDLEtBQXFELENBRHRELEdBRUMsTUFBTSxDQUFDLE1BQVAsQ0FBZSxRQUFmLEVBQXlCLElBQXpCLEVBQWdDLE1BQWhDLEdBQXlDLENBTDNDLEdBTUMsS0FBSyxNQUFMLENBQWEsUUFBYixFQUF3QixNQUF4QixHQUFpQyxDQVA1QixDQUFQO0FBUUEsS0FwRWU7QUFzRWhCLElBQUEsT0FBTyxFQUFFLGlCQUFVLFNBQVYsRUFBcUIsT0FBckIsRUFBK0I7QUFDdkMsVUFBSSxHQUFKO0FBQUEsVUFDQyxDQUFDLEdBQUcsQ0FETDtBQUFBLFVBRUMsQ0FBQyxHQUFHLEtBQUssTUFGVjtBQUFBLFVBR0MsR0FBRyxHQUFHLEVBSFA7QUFBQSxVQUlDLEdBQUcsR0FBRyxhQUFhLENBQUMsSUFBZCxDQUFvQixTQUFwQixLQUFtQyxPQUFPLFNBQVAsS0FBcUIsUUFBeEQsR0FDTCxNQUFNLENBQUUsU0FBRixFQUFhLE9BQU8sSUFBSSxLQUFLLE9BQTdCLENBREQsR0FFTCxDQU5GOztBQVFBLGFBQVEsQ0FBQyxHQUFHLENBQVosRUFBZSxDQUFDLEVBQWhCLEVBQXFCO0FBQ3BCLFFBQUEsR0FBRyxHQUFHLEtBQUssQ0FBTCxDQUFOOztBQUVBLGVBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFYLElBQTRCLEdBQUcsS0FBSyxPQUFwQyxJQUErQyxHQUFHLENBQUMsUUFBSixLQUFpQixFQUF4RSxFQUE2RTtBQUM1RSxjQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSixDQUFVLEdBQVYsSUFBaUIsQ0FBQyxDQUFyQixHQUF5QixNQUFNLENBQUMsSUFBUCxDQUFZLGVBQVosQ0FBNEIsR0FBNUIsRUFBaUMsU0FBakMsQ0FBakMsRUFBK0U7QUFDOUUsWUFBQSxHQUFHLENBQUMsSUFBSixDQUFVLEdBQVY7QUFDQTtBQUNBOztBQUNELFVBQUEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxVQUFWO0FBQ0E7QUFDRDs7QUFFRCxNQUFBLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBSixHQUFhLENBQWIsR0FBaUIsTUFBTSxDQUFDLE1BQVAsQ0FBZSxHQUFmLENBQWpCLEdBQXdDLEdBQTlDO0FBRUEsYUFBTyxLQUFLLFNBQUwsQ0FBZ0IsR0FBaEIsRUFBcUIsU0FBckIsRUFBZ0MsU0FBaEMsQ0FBUDtBQUNBLEtBOUZlO0FBZ0doQjtBQUNBO0FBQ0EsSUFBQSxLQUFLLEVBQUUsZUFBVSxJQUFWLEVBQWlCO0FBRXZCO0FBQ0EsVUFBSyxDQUFDLElBQU4sRUFBYTtBQUNaLGVBQVMsS0FBSyxDQUFMLEtBQVcsS0FBSyxDQUFMLEVBQVEsVUFBckIsR0FBb0MsS0FBSyxPQUFMLEdBQWUsTUFBbkQsR0FBNEQsQ0FBQyxDQUFwRTtBQUNBLE9BTHNCLENBT3ZCOzs7QUFDQSxVQUFLLE9BQU8sSUFBUCxLQUFnQixRQUFyQixFQUFnQztBQUMvQixlQUFPLE1BQU0sQ0FBQyxPQUFQLENBQWdCLEtBQUssQ0FBTCxDQUFoQixFQUF5QixNQUFNLENBQUUsSUFBRixDQUEvQixDQUFQO0FBQ0EsT0FWc0IsQ0FZdkI7OztBQUNBLGFBQU8sTUFBTSxDQUFDLE9BQVAsRUFDTjtBQUNBLE1BQUEsSUFBSSxDQUFDLE1BQUwsR0FBYyxJQUFJLENBQUMsQ0FBRCxDQUFsQixHQUF3QixJQUZsQixFQUV3QixJQUZ4QixDQUFQO0FBR0EsS0FsSGU7QUFvSGhCLElBQUEsR0FBRyxFQUFFLGFBQVUsUUFBVixFQUFvQixPQUFwQixFQUE4QjtBQUNsQyxVQUFJLEdBQUcsR0FBRyxPQUFPLFFBQVAsS0FBb0IsUUFBcEIsR0FDUixNQUFNLENBQUUsUUFBRixFQUFZLE9BQVosQ0FERSxHQUVSLE1BQU0sQ0FBQyxTQUFQLENBQWtCLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBckIsR0FBZ0MsQ0FBRSxRQUFGLENBQWhDLEdBQStDLFFBQWpFLENBRkY7QUFBQSxVQUdDLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBUCxDQUFjLEtBQUssR0FBTCxFQUFkLEVBQTBCLEdBQTFCLENBSFA7QUFLQSxhQUFPLEtBQUssU0FBTCxDQUFnQixjQUFjLENBQUUsR0FBRyxDQUFDLENBQUQsQ0FBTCxDQUFkLElBQTRCLGNBQWMsQ0FBRSxHQUFHLENBQUMsQ0FBRCxDQUFMLENBQTFDLEdBQ3RCLEdBRHNCLEdBRXRCLE1BQU0sQ0FBQyxNQUFQLENBQWUsR0FBZixDQUZNLENBQVA7QUFHQSxLQTdIZTtBQStIaEIsSUFBQSxPQUFPLEVBQUUsaUJBQVUsUUFBVixFQUFxQjtBQUM3QixhQUFPLEtBQUssR0FBTCxDQUFVLFFBQVEsSUFBSSxJQUFaLEdBQ2hCLEtBQUssVUFEVyxHQUNFLEtBQUssVUFBTCxDQUFnQixNQUFoQixDQUF1QixRQUF2QixDQURaLENBQVA7QUFHQTtBQW5JZSxHQUFqQjtBQXNJQSxFQUFBLE1BQU0sQ0FBQyxFQUFQLENBQVUsT0FBVixHQUFvQixNQUFNLENBQUMsRUFBUCxDQUFVLE9BQTlCLENBdnRLK0IsQ0F5dEsvQjtBQUNBOztBQUNBLFdBQVMsY0FBVCxDQUF5QixJQUF6QixFQUFnQztBQUMvQixXQUFPLENBQUMsSUFBRCxJQUFTLENBQUMsSUFBSSxDQUFDLFVBQWYsSUFBNkIsSUFBSSxDQUFDLFVBQUwsQ0FBZ0IsUUFBaEIsS0FBNkIsRUFBakU7QUFDQTs7QUFFRCxXQUFTLE9BQVQsQ0FBa0IsR0FBbEIsRUFBdUIsR0FBdkIsRUFBNkI7QUFDNUIsT0FBRztBQUNGLE1BQUEsR0FBRyxHQUFHLEdBQUcsQ0FBRSxHQUFGLENBQVQ7QUFDQSxLQUZELFFBRVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFKLEtBQWlCLENBRmxDOztBQUlBLFdBQU8sR0FBUDtBQUNBOztBQUVELEVBQUEsTUFBTSxDQUFDLElBQVAsQ0FBWTtBQUNYLElBQUEsTUFBTSxFQUFFLGdCQUFVLElBQVYsRUFBaUI7QUFDeEIsVUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQWxCO0FBQ0EsYUFBTyxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVAsS0FBb0IsRUFBOUIsR0FBbUMsTUFBbkMsR0FBNEMsSUFBbkQ7QUFDQSxLQUpVO0FBS1gsSUFBQSxPQUFPLEVBQUUsaUJBQVUsSUFBVixFQUFpQjtBQUN6QixhQUFPLE1BQU0sQ0FBQyxHQUFQLENBQVksSUFBWixFQUFrQixZQUFsQixDQUFQO0FBQ0EsS0FQVTtBQVFYLElBQUEsWUFBWSxFQUFFLHNCQUFVLElBQVYsRUFBZ0IsQ0FBaEIsRUFBbUIsS0FBbkIsRUFBMkI7QUFDeEMsYUFBTyxNQUFNLENBQUMsR0FBUCxDQUFZLElBQVosRUFBa0IsWUFBbEIsRUFBZ0MsS0FBaEMsQ0FBUDtBQUNBLEtBVlU7QUFXWCxJQUFBLElBQUksRUFBRSxjQUFVLElBQVYsRUFBaUI7QUFDdEIsYUFBTyxPQUFPLENBQUUsSUFBRixFQUFRLGFBQVIsQ0FBZDtBQUNBLEtBYlU7QUFjWCxJQUFBLElBQUksRUFBRSxjQUFVLElBQVYsRUFBaUI7QUFDdEIsYUFBTyxPQUFPLENBQUUsSUFBRixFQUFRLGlCQUFSLENBQWQ7QUFDQSxLQWhCVTtBQWlCWCxJQUFBLE9BQU8sRUFBRSxpQkFBVSxJQUFWLEVBQWlCO0FBQ3pCLGFBQU8sTUFBTSxDQUFDLEdBQVAsQ0FBWSxJQUFaLEVBQWtCLGFBQWxCLENBQVA7QUFDQSxLQW5CVTtBQW9CWCxJQUFBLE9BQU8sRUFBRSxpQkFBVSxJQUFWLEVBQWlCO0FBQ3pCLGFBQU8sTUFBTSxDQUFDLEdBQVAsQ0FBWSxJQUFaLEVBQWtCLGlCQUFsQixDQUFQO0FBQ0EsS0F0QlU7QUF1QlgsSUFBQSxTQUFTLEVBQUUsbUJBQVUsSUFBVixFQUFnQixDQUFoQixFQUFtQixLQUFuQixFQUEyQjtBQUNyQyxhQUFPLE1BQU0sQ0FBQyxHQUFQLENBQVksSUFBWixFQUFrQixhQUFsQixFQUFpQyxLQUFqQyxDQUFQO0FBQ0EsS0F6QlU7QUEwQlgsSUFBQSxTQUFTLEVBQUUsbUJBQVUsSUFBVixFQUFnQixDQUFoQixFQUFtQixLQUFuQixFQUEyQjtBQUNyQyxhQUFPLE1BQU0sQ0FBQyxHQUFQLENBQVksSUFBWixFQUFrQixpQkFBbEIsRUFBcUMsS0FBckMsQ0FBUDtBQUNBLEtBNUJVO0FBNkJYLElBQUEsUUFBUSxFQUFFLGtCQUFVLElBQVYsRUFBaUI7QUFDMUIsYUFBTyxNQUFNLENBQUMsT0FBUCxDQUFnQixDQUFFLElBQUksQ0FBQyxVQUFMLElBQW1CLEVBQXJCLEVBQTBCLFVBQTFDLEVBQXNELElBQXRELENBQVA7QUFDQSxLQS9CVTtBQWdDWCxJQUFBLFFBQVEsRUFBRSxrQkFBVSxJQUFWLEVBQWlCO0FBQzFCLGFBQU8sTUFBTSxDQUFDLE9BQVAsQ0FBZ0IsSUFBSSxDQUFDLFVBQXJCLENBQVA7QUFDQSxLQWxDVTtBQW1DWCxJQUFBLFFBQVEsRUFBRSxrQkFBVSxJQUFWLEVBQWlCO0FBQzFCLGFBQU8sTUFBTSxDQUFDLFFBQVAsQ0FBaUIsSUFBakIsRUFBdUIsUUFBdkIsSUFDTixJQUFJLENBQUMsZUFBTCxJQUF3QixJQUFJLENBQUMsYUFBTCxDQUFtQixRQURyQyxHQUVOLE1BQU0sQ0FBQyxLQUFQLENBQWMsRUFBZCxFQUFrQixJQUFJLENBQUMsVUFBdkIsQ0FGRDtBQUdBO0FBdkNVLEdBQVosRUF3Q0csVUFBVSxJQUFWLEVBQWdCLEVBQWhCLEVBQXFCO0FBQ3ZCLElBQUEsTUFBTSxDQUFDLEVBQVAsQ0FBVyxJQUFYLElBQW9CLFVBQVUsS0FBVixFQUFpQixRQUFqQixFQUE0QjtBQUMvQyxVQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBUCxDQUFZLElBQVosRUFBa0IsRUFBbEIsRUFBc0IsS0FBdEIsQ0FBVjs7QUFFQSxVQUFLLENBQUMsTUFBTSxDQUFDLElBQVAsQ0FBYSxJQUFiLENBQU4sRUFBNEI7QUFDM0IsUUFBQSxRQUFRLEdBQUcsS0FBWDtBQUNBOztBQUVELFVBQUssUUFBUSxJQUFJLE9BQU8sUUFBUCxLQUFvQixRQUFyQyxFQUFnRDtBQUMvQyxRQUFBLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBUCxDQUFlLFFBQWYsRUFBeUIsR0FBekIsQ0FBTjtBQUNBOztBQUVELE1BQUEsR0FBRyxHQUFHLEtBQUssTUFBTCxHQUFjLENBQWQsSUFBbUIsQ0FBQyxnQkFBZ0IsQ0FBRSxJQUFGLENBQXBDLEdBQStDLE1BQU0sQ0FBQyxNQUFQLENBQWUsR0FBZixDQUEvQyxHQUFzRSxHQUE1RTs7QUFFQSxVQUFLLEtBQUssTUFBTCxHQUFjLENBQWQsSUFBbUIsWUFBWSxDQUFDLElBQWIsQ0FBbUIsSUFBbkIsQ0FBeEIsRUFBb0Q7QUFDbkQsUUFBQSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQUosRUFBTjtBQUNBOztBQUVELGFBQU8sS0FBSyxTQUFMLENBQWdCLEdBQWhCLEVBQXFCLElBQXJCLEVBQTJCLFVBQVUsQ0FBQyxJQUFYLENBQWlCLFNBQWpCLEVBQTZCLElBQTdCLENBQWtDLEdBQWxDLENBQTNCLENBQVA7QUFDQSxLQWxCRDtBQW1CQSxHQTVERDtBQThEQSxFQUFBLE1BQU0sQ0FBQyxNQUFQLENBQWM7QUFDYixJQUFBLE1BQU0sRUFBRSxnQkFBVSxJQUFWLEVBQWdCLEtBQWhCLEVBQXVCLEdBQXZCLEVBQTZCO0FBQ3BDLFVBQUssR0FBTCxFQUFXO0FBQ1YsUUFBQSxJQUFJLEdBQUcsVUFBVSxJQUFWLEdBQWlCLEdBQXhCO0FBQ0E7O0FBRUQsYUFBTyxLQUFLLENBQUMsTUFBTixLQUFpQixDQUFqQixHQUNOLE1BQU0sQ0FBQyxJQUFQLENBQVksZUFBWixDQUE0QixLQUFLLENBQUMsQ0FBRCxDQUFqQyxFQUFzQyxJQUF0QyxJQUE4QyxDQUFFLEtBQUssQ0FBQyxDQUFELENBQVAsQ0FBOUMsR0FBNkQsRUFEdkQsR0FFTixNQUFNLENBQUMsSUFBUCxDQUFZLE9BQVosQ0FBb0IsSUFBcEIsRUFBMEIsS0FBMUIsQ0FGRDtBQUdBLEtBVFk7QUFXYixJQUFBLEdBQUcsRUFBRSxhQUFVLElBQVYsRUFBZ0IsSUFBaEIsRUFBcUIsS0FBckIsRUFBNkI7QUFDakMsVUFBSSxPQUFPLEdBQUcsRUFBZDtBQUFBLFVBQ0MsR0FBRyxHQUFHLElBQUksQ0FBRSxJQUFGLENBRFg7O0FBR0EsYUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLFFBQUosS0FBaUIsQ0FBeEIsS0FBOEIsS0FBSyxLQUFLLFNBQVYsSUFBdUIsR0FBRyxDQUFDLFFBQUosS0FBaUIsQ0FBeEMsSUFBNkMsQ0FBQyxNQUFNLENBQUUsR0FBRixDQUFOLENBQWMsRUFBZCxDQUFrQixLQUFsQixDQUE1RSxDQUFSLEVBQWlIO0FBQ2hILFlBQUssR0FBRyxDQUFDLFFBQUosS0FBaUIsQ0FBdEIsRUFBMEI7QUFDekIsVUFBQSxPQUFPLENBQUMsSUFBUixDQUFjLEdBQWQ7QUFDQTs7QUFDRCxRQUFBLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBRCxDQUFUO0FBQ0E7O0FBQ0QsYUFBTyxPQUFQO0FBQ0EsS0F0Qlk7QUF3QmIsSUFBQSxPQUFPLEVBQUUsaUJBQVUsQ0FBVixFQUFhLElBQWIsRUFBb0I7QUFDNUIsVUFBSSxDQUFDLEdBQUcsRUFBUjs7QUFFQSxhQUFRLENBQVIsRUFBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQWpCLEVBQStCO0FBQzlCLFlBQUssQ0FBQyxDQUFDLFFBQUYsS0FBZSxDQUFmLElBQW9CLENBQUMsS0FBSyxJQUEvQixFQUFzQztBQUNyQyxVQUFBLENBQUMsQ0FBQyxJQUFGLENBQVEsQ0FBUjtBQUNBO0FBQ0Q7O0FBRUQsYUFBTyxDQUFQO0FBQ0E7QUFsQ1ksR0FBZCxFQXJ5SytCLENBMDBLL0I7O0FBQ0EsV0FBUyxNQUFULENBQWlCLFFBQWpCLEVBQTJCLFNBQTNCLEVBQXNDLElBQXRDLEVBQTZDO0FBRTVDO0FBQ0E7QUFDQSxJQUFBLFNBQVMsR0FBRyxTQUFTLElBQUksQ0FBekI7O0FBRUEsUUFBSyxNQUFNLENBQUMsVUFBUCxDQUFtQixTQUFuQixDQUFMLEVBQXNDO0FBQ3JDLGFBQU8sTUFBTSxDQUFDLElBQVAsQ0FBWSxRQUFaLEVBQXNCLFVBQVUsSUFBVixFQUFnQixDQUFoQixFQUFvQjtBQUNoRCxZQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQVYsQ0FBZ0IsSUFBaEIsRUFBc0IsQ0FBdEIsRUFBeUIsSUFBekIsQ0FBZjtBQUNBLGVBQU8sTUFBTSxLQUFLLElBQWxCO0FBQ0EsT0FITSxDQUFQO0FBS0EsS0FORCxNQU1PLElBQUssU0FBUyxDQUFDLFFBQWYsRUFBMEI7QUFDaEMsYUFBTyxNQUFNLENBQUMsSUFBUCxDQUFZLFFBQVosRUFBc0IsVUFBVSxJQUFWLEVBQWdCLENBQWhCLEVBQW9CO0FBQ2hELGVBQVMsSUFBSSxLQUFLLFNBQVgsS0FBMkIsSUFBbEM7QUFDQSxPQUZNLENBQVA7QUFJQSxLQUxNLE1BS0EsSUFBSyxPQUFPLFNBQVAsS0FBcUIsUUFBMUIsRUFBcUM7QUFDM0MsVUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQVAsQ0FBWSxRQUFaLEVBQXNCLFVBQVUsSUFBVixFQUFpQjtBQUNyRCxlQUFPLElBQUksQ0FBQyxRQUFMLEtBQWtCLENBQXpCO0FBQ0EsT0FGYyxDQUFmOztBQUlBLFVBQUssUUFBUSxDQUFDLElBQVQsQ0FBZSxTQUFmLENBQUwsRUFBa0M7QUFDakMsZUFBTyxNQUFNLENBQUMsTUFBUCxDQUFjLFNBQWQsRUFBeUIsUUFBekIsRUFBbUMsQ0FBQyxJQUFwQyxDQUFQO0FBQ0EsT0FGRCxNQUVPO0FBQ04sUUFBQSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQVAsQ0FBZSxTQUFmLEVBQTBCLFFBQTFCLENBQVo7QUFDQTtBQUNEOztBQUVELFdBQU8sTUFBTSxDQUFDLElBQVAsQ0FBWSxRQUFaLEVBQXNCLFVBQVUsSUFBVixFQUFnQixDQUFoQixFQUFvQjtBQUNoRCxhQUFTLE1BQU0sQ0FBQyxPQUFQLENBQWdCLElBQWhCLEVBQXNCLFNBQXRCLEtBQXFDLENBQXZDLEtBQStDLElBQXREO0FBQ0EsS0FGTSxDQUFQO0FBR0E7O0FBQ0QsV0FBUyxrQkFBVCxDQUE2QixRQUE3QixFQUF3QztBQUN2QyxRQUFJLElBQUksR0FBRyxTQUFTLENBQUMsS0FBVixDQUFpQixHQUFqQixDQUFYO0FBQUEsUUFDQSxRQUFRLEdBQUcsUUFBUSxDQUFDLHNCQUFULEVBRFg7O0FBR0EsUUFBSyxRQUFRLENBQUMsYUFBZCxFQUE4QjtBQUM3QixhQUFRLElBQUksQ0FBQyxNQUFiLEVBQXNCO0FBQ3JCLFFBQUEsUUFBUSxDQUFDLGFBQVQsQ0FDQyxJQUFJLENBQUMsR0FBTCxFQUREO0FBR0E7QUFDRDs7QUFDRCxXQUFPLFFBQVA7QUFDQTs7QUFFRCxNQUFJLFNBQVMsR0FBRyx3RkFDZCx5RUFERjtBQUFBLE1BRUMsYUFBYSxHQUFHLDRCQUZqQjtBQUFBLE1BR0Msa0JBQWtCLEdBQUcsTUFIdEI7QUFBQSxNQUlDLFNBQVMsR0FBRyx5RUFKYjtBQUFBLE1BS0MsUUFBUSxHQUFHLFdBTFo7QUFBQSxNQU1DLE1BQU0sR0FBRyxTQU5WO0FBQUEsTUFPQyxLQUFLLEdBQUcsV0FQVDtBQUFBLE1BUUMsWUFBWSxHQUFHLHlCQVJoQjtBQUFBLE1BU0MsUUFBUSxHQUFHLHdDQVRaO0FBQUEsTUFVQyxZQUFZLEdBQUcsSUFBSSxNQUFKLENBQVcsU0FBUyxTQUFULEdBQXFCLFVBQWhDLEVBQTRDLEdBQTVDLENBVmhCO0FBQUEsTUFXQyxjQUFjLEdBQUcsc0JBWGxCO0FBQUEsTUFZQztBQUNBLEVBQUEsUUFBUSxHQUFHLG1DQWJaO0FBQUEsTUFjQyxXQUFXLEdBQUcsc0JBZGY7QUFBQSxNQWVDLFlBQVksR0FBRywwQ0FmaEI7QUFBQSxNQWdCQyxPQUFPLEdBQUc7QUFDVCxJQUFBLE1BQU0sRUFBRSxDQUFFLENBQUYsRUFBSyw4QkFBTCxFQUFxQyxXQUFyQyxDQURDO0FBRVQsSUFBQSxNQUFNLEVBQUUsQ0FBRSxDQUFGLEVBQUssWUFBTCxFQUFtQixhQUFuQixDQUZDO0FBR1QsSUFBQSxLQUFLLEVBQUUsQ0FBRSxDQUFGLEVBQUssU0FBTCxFQUFnQixVQUFoQixDQUhFO0FBSVQsSUFBQSxFQUFFLEVBQUUsQ0FBRSxDQUFGLEVBQUssZ0JBQUwsRUFBdUIsa0JBQXZCLENBSks7QUFLVCxJQUFBLEVBQUUsRUFBRSxDQUFFLENBQUYsRUFBSyxvQkFBTCxFQUEyQix1QkFBM0IsQ0FMSztBQU1ULElBQUEsR0FBRyxFQUFFLENBQUUsQ0FBRixFQUFLLGtDQUFMLEVBQXlDLHFCQUF6QyxDQU5JO0FBT1QsSUFBQSxJQUFJLEVBQUUsQ0FBRSxDQUFGLEVBQUssT0FBTCxFQUFjLFFBQWQsQ0FQRztBQVFULElBQUEsUUFBUSxFQUFFLENBQUUsQ0FBRixFQUFLLEVBQUwsRUFBUyxFQUFUO0FBUkQsR0FoQlg7QUFBQSxNQTBCQyxZQUFZLEdBQUcsa0JBQWtCLENBQUUsUUFBRixDQTFCbEM7QUFBQSxNQTJCQyxXQUFXLEdBQUcsWUFBWSxDQUFDLFdBQWIsQ0FBMEIsUUFBUSxDQUFDLGFBQVQsQ0FBdUIsS0FBdkIsQ0FBMUIsQ0EzQmY7QUE2QkEsRUFBQSxPQUFPLENBQUMsUUFBUixHQUFtQixPQUFPLENBQUMsTUFBM0I7QUFDQSxFQUFBLE9BQU8sQ0FBQyxLQUFSLEdBQWdCLE9BQU8sQ0FBQyxLQUFSLEdBQWdCLE9BQU8sQ0FBQyxRQUFSLEdBQW1CLE9BQU8sQ0FBQyxPQUFSLEdBQWtCLE9BQU8sQ0FBQyxLQUE3RTtBQUNBLEVBQUEsT0FBTyxDQUFDLEVBQVIsR0FBYSxPQUFPLENBQUMsRUFBckIsQ0F6NUsrQixDQTI1Sy9CO0FBQ0E7O0FBQ0EsTUFBSyxDQUFDLE1BQU0sQ0FBQyxPQUFQLENBQWUsYUFBckIsRUFBcUM7QUFDcEMsSUFBQSxPQUFPLENBQUMsUUFBUixHQUFtQixDQUFFLENBQUYsRUFBSyxRQUFMLEVBQWUsUUFBZixDQUFuQjtBQUNBOztBQUVELEVBQUEsTUFBTSxDQUFDLEVBQVAsQ0FBVSxNQUFWLENBQWlCO0FBQ2hCLElBQUEsSUFBSSxFQUFFLGNBQVUsS0FBVixFQUFrQjtBQUN2QixhQUFPLE1BQU0sQ0FBQyxNQUFQLENBQWUsSUFBZixFQUFxQixVQUFVLEtBQVYsRUFBa0I7QUFDN0MsZUFBTyxLQUFLLEtBQUssU0FBVixHQUNOLE1BQU0sQ0FBQyxJQUFQLENBQWEsSUFBYixDQURNLEdBRU4sS0FBSyxLQUFMLEdBQWEsTUFBYixDQUFxQixDQUFFLEtBQUssQ0FBTCxLQUFXLEtBQUssQ0FBTCxFQUFRLGFBQW5CLElBQW9DLFFBQXRDLEVBQWlELGNBQWpELENBQWlFLEtBQWpFLENBQXJCLENBRkQ7QUFHQSxPQUpNLEVBSUosSUFKSSxFQUlFLEtBSkYsRUFJUyxTQUFTLENBQUMsTUFKbkIsQ0FBUDtBQUtBLEtBUGU7QUFTaEIsSUFBQSxPQUFPLEVBQUUsaUJBQVUsSUFBVixFQUFpQjtBQUN6QixVQUFLLE1BQU0sQ0FBQyxVQUFQLENBQW1CLElBQW5CLENBQUwsRUFBaUM7QUFDaEMsZUFBTyxLQUFLLElBQUwsQ0FBVSxVQUFTLENBQVQsRUFBWTtBQUM1QixVQUFBLE1BQU0sQ0FBQyxJQUFELENBQU4sQ0FBYSxPQUFiLENBQXNCLElBQUksQ0FBQyxJQUFMLENBQVUsSUFBVixFQUFnQixDQUFoQixDQUF0QjtBQUNBLFNBRk0sQ0FBUDtBQUdBOztBQUVELFVBQUssS0FBSyxDQUFMLENBQUwsRUFBZTtBQUNkO0FBQ0EsWUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFFLElBQUYsRUFBUSxLQUFLLENBQUwsRUFBUSxhQUFoQixDQUFOLENBQXNDLEVBQXRDLENBQXlDLENBQXpDLEVBQTRDLEtBQTVDLENBQWtELElBQWxELENBQVg7O0FBRUEsWUFBSyxLQUFLLENBQUwsRUFBUSxVQUFiLEVBQTBCO0FBQ3pCLFVBQUEsSUFBSSxDQUFDLFlBQUwsQ0FBbUIsS0FBSyxDQUFMLENBQW5CO0FBQ0E7O0FBRUQsUUFBQSxJQUFJLENBQUMsR0FBTCxDQUFTLFlBQVc7QUFDbkIsY0FBSSxJQUFJLEdBQUcsSUFBWDs7QUFFQSxpQkFBUSxJQUFJLENBQUMsVUFBTCxJQUFtQixJQUFJLENBQUMsVUFBTCxDQUFnQixRQUFoQixLQUE2QixDQUF4RCxFQUE0RDtBQUMzRCxZQUFBLElBQUksR0FBRyxJQUFJLENBQUMsVUFBWjtBQUNBOztBQUVELGlCQUFPLElBQVA7QUFDQSxTQVJELEVBUUcsTUFSSCxDQVFXLElBUlg7QUFTQTs7QUFFRCxhQUFPLElBQVA7QUFDQSxLQXBDZTtBQXNDaEIsSUFBQSxTQUFTLEVBQUUsbUJBQVUsSUFBVixFQUFpQjtBQUMzQixVQUFLLE1BQU0sQ0FBQyxVQUFQLENBQW1CLElBQW5CLENBQUwsRUFBaUM7QUFDaEMsZUFBTyxLQUFLLElBQUwsQ0FBVSxVQUFTLENBQVQsRUFBWTtBQUM1QixVQUFBLE1BQU0sQ0FBQyxJQUFELENBQU4sQ0FBYSxTQUFiLENBQXdCLElBQUksQ0FBQyxJQUFMLENBQVUsSUFBVixFQUFnQixDQUFoQixDQUF4QjtBQUNBLFNBRk0sQ0FBUDtBQUdBOztBQUVELGFBQU8sS0FBSyxJQUFMLENBQVUsWUFBVztBQUMzQixZQUFJLElBQUksR0FBRyxNQUFNLENBQUUsSUFBRixDQUFqQjtBQUFBLFlBQ0MsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFMLEVBRFo7O0FBR0EsWUFBSyxRQUFRLENBQUMsTUFBZCxFQUF1QjtBQUN0QixVQUFBLFFBQVEsQ0FBQyxPQUFULENBQWtCLElBQWxCO0FBRUEsU0FIRCxNQUdPO0FBQ04sVUFBQSxJQUFJLENBQUMsTUFBTCxDQUFhLElBQWI7QUFDQTtBQUNELE9BVk0sQ0FBUDtBQVdBLEtBeERlO0FBMERoQixJQUFBLElBQUksRUFBRSxjQUFVLElBQVYsRUFBaUI7QUFDdEIsVUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVAsQ0FBbUIsSUFBbkIsQ0FBakI7QUFFQSxhQUFPLEtBQUssSUFBTCxDQUFVLFVBQVMsQ0FBVCxFQUFZO0FBQzVCLFFBQUEsTUFBTSxDQUFFLElBQUYsQ0FBTixDQUFlLE9BQWYsQ0FBd0IsVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFMLENBQVUsSUFBVixFQUFnQixDQUFoQixDQUFILEdBQXdCLElBQTFEO0FBQ0EsT0FGTSxDQUFQO0FBR0EsS0FoRWU7QUFrRWhCLElBQUEsTUFBTSxFQUFFLGtCQUFXO0FBQ2xCLGFBQU8sS0FBSyxNQUFMLEdBQWMsSUFBZCxDQUFtQixZQUFXO0FBQ3BDLFlBQUssQ0FBQyxNQUFNLENBQUMsUUFBUCxDQUFpQixJQUFqQixFQUF1QixNQUF2QixDQUFOLEVBQXdDO0FBQ3ZDLFVBQUEsTUFBTSxDQUFFLElBQUYsQ0FBTixDQUFlLFdBQWYsQ0FBNEIsS0FBSyxVQUFqQztBQUNBO0FBQ0QsT0FKTSxFQUlKLEdBSkksRUFBUDtBQUtBLEtBeEVlO0FBMEVoQixJQUFBLE1BQU0sRUFBRSxrQkFBVztBQUNsQixhQUFPLEtBQUssUUFBTCxDQUFjLFNBQWQsRUFBeUIsSUFBekIsRUFBK0IsVUFBVSxJQUFWLEVBQWlCO0FBQ3RELFlBQUssS0FBSyxRQUFMLEtBQWtCLENBQWxCLElBQXVCLEtBQUssUUFBTCxLQUFrQixFQUE5QyxFQUFtRDtBQUNsRCxlQUFLLFdBQUwsQ0FBa0IsSUFBbEI7QUFDQTtBQUNELE9BSk0sQ0FBUDtBQUtBLEtBaEZlO0FBa0ZoQixJQUFBLE9BQU8sRUFBRSxtQkFBVztBQUNuQixhQUFPLEtBQUssUUFBTCxDQUFjLFNBQWQsRUFBeUIsSUFBekIsRUFBK0IsVUFBVSxJQUFWLEVBQWlCO0FBQ3RELFlBQUssS0FBSyxRQUFMLEtBQWtCLENBQWxCLElBQXVCLEtBQUssUUFBTCxLQUFrQixFQUE5QyxFQUFtRDtBQUNsRCxlQUFLLFlBQUwsQ0FBbUIsSUFBbkIsRUFBeUIsS0FBSyxVQUE5QjtBQUNBO0FBQ0QsT0FKTSxDQUFQO0FBS0EsS0F4RmU7QUEwRmhCLElBQUEsTUFBTSxFQUFFLGtCQUFXO0FBQ2xCLFVBQUssQ0FBQyxjQUFjLENBQUUsS0FBSyxDQUFMLENBQUYsQ0FBcEIsRUFBa0M7QUFDakMsZUFBTyxLQUFLLFFBQUwsQ0FBYyxTQUFkLEVBQXlCLEtBQXpCLEVBQWdDLFVBQVUsSUFBVixFQUFpQjtBQUN2RCxlQUFLLFVBQUwsQ0FBZ0IsWUFBaEIsQ0FBOEIsSUFBOUIsRUFBb0MsSUFBcEM7QUFDQSxTQUZNLENBQVA7QUFHQTs7QUFFRCxVQUFLLFNBQVMsQ0FBQyxNQUFmLEVBQXdCO0FBQ3ZCLFlBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFQLENBQWMsU0FBZCxDQUFWO0FBQ0EsZUFBTyxLQUFLLFNBQUwsQ0FBZ0IsTUFBTSxDQUFDLEtBQVAsQ0FBYyxHQUFkLEVBQW1CLElBQW5CLENBQWhCLEVBQTJDLFFBQTNDLEVBQXFELEtBQUssUUFBMUQsQ0FBUDtBQUNBO0FBQ0QsS0FyR2U7QUF1R2hCLElBQUEsS0FBSyxFQUFFLGlCQUFXO0FBQ2pCLFVBQUssQ0FBQyxjQUFjLENBQUUsS0FBSyxDQUFMLENBQUYsQ0FBcEIsRUFBa0M7QUFDakMsZUFBTyxLQUFLLFFBQUwsQ0FBYyxTQUFkLEVBQXlCLEtBQXpCLEVBQWdDLFVBQVUsSUFBVixFQUFpQjtBQUN2RCxlQUFLLFVBQUwsQ0FBZ0IsWUFBaEIsQ0FBOEIsSUFBOUIsRUFBb0MsS0FBSyxXQUF6QztBQUNBLFNBRk0sQ0FBUDtBQUdBOztBQUVELFVBQUssU0FBUyxDQUFDLE1BQWYsRUFBd0I7QUFDdkIsWUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQVAsQ0FBYyxTQUFkLENBQVY7QUFDQSxlQUFPLEtBQUssU0FBTCxDQUFnQixNQUFNLENBQUMsS0FBUCxDQUFjLElBQWQsRUFBb0IsR0FBcEIsQ0FBaEIsRUFBMkMsT0FBM0MsRUFBb0QsS0FBSyxRQUF6RCxDQUFQO0FBQ0E7QUFDRCxLQWxIZTtBQW9IaEI7QUFDQSxJQUFBLE1BQU0sRUFBRSxnQkFBVSxRQUFWLEVBQW9CLFFBQXBCLEVBQStCO0FBQ3RDLFVBQUksSUFBSjtBQUFBLFVBQ0MsQ0FBQyxHQUFHLENBREw7O0FBR0EsYUFBUSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUwsQ0FBUixLQUFvQixJQUE1QixFQUFrQyxDQUFDLEVBQW5DLEVBQXdDO0FBQ3ZDLFlBQUssQ0FBQyxRQUFELElBQWEsTUFBTSxDQUFDLE1BQVAsQ0FBZSxRQUFmLEVBQXlCLENBQUUsSUFBRixDQUF6QixFQUFvQyxNQUF0RCxFQUErRDtBQUM5RCxjQUFLLENBQUMsUUFBRCxJQUFhLElBQUksQ0FBQyxRQUFMLEtBQWtCLENBQXBDLEVBQXdDO0FBQ3ZDLFlBQUEsTUFBTSxDQUFDLFNBQVAsQ0FBa0IsSUFBSSxDQUFDLG9CQUFMLENBQTBCLEdBQTFCLENBQWxCO0FBQ0EsWUFBQSxNQUFNLENBQUMsU0FBUCxDQUFrQixDQUFFLElBQUYsQ0FBbEI7QUFDQTs7QUFFRCxjQUFLLElBQUksQ0FBQyxVQUFWLEVBQXVCO0FBQ3RCLFlBQUEsSUFBSSxDQUFDLFVBQUwsQ0FBZ0IsV0FBaEIsQ0FBNkIsSUFBN0I7QUFDQTtBQUNEO0FBQ0Q7O0FBRUQsYUFBTyxJQUFQO0FBQ0EsS0F2SWU7QUF5SWhCLElBQUEsS0FBSyxFQUFFLGlCQUFXO0FBQ2pCLFVBQUksSUFBSjtBQUFBLFVBQ0MsQ0FBQyxHQUFHLENBREw7O0FBR0EsYUFBUSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUwsQ0FBUixLQUFvQixJQUE1QixFQUFrQyxDQUFDLEVBQW5DLEVBQXdDO0FBQ3ZDO0FBQ0EsWUFBSyxJQUFJLENBQUMsUUFBTCxLQUFrQixDQUF2QixFQUEyQjtBQUMxQixVQUFBLE1BQU0sQ0FBQyxTQUFQLENBQWtCLElBQUksQ0FBQyxvQkFBTCxDQUEwQixHQUExQixDQUFsQjtBQUNBLFNBSnNDLENBTXZDOzs7QUFDQSxlQUFRLElBQUksQ0FBQyxVQUFiLEVBQTBCO0FBQ3pCLFVBQUEsSUFBSSxDQUFDLFdBQUwsQ0FBa0IsSUFBSSxDQUFDLFVBQXZCO0FBQ0E7QUFDRDs7QUFFRCxhQUFPLElBQVA7QUFDQSxLQTFKZTtBQTRKaEIsSUFBQSxLQUFLLEVBQUUsZUFBVSxhQUFWLEVBQXlCLGlCQUF6QixFQUE2QztBQUNuRCxNQUFBLGFBQWEsR0FBRyxhQUFhLElBQUksSUFBakIsR0FBd0IsS0FBeEIsR0FBZ0MsYUFBaEQ7QUFDQSxNQUFBLGlCQUFpQixHQUFHLGlCQUFpQixJQUFJLElBQXJCLEdBQTRCLGFBQTVCLEdBQTRDLGlCQUFoRTtBQUVBLGFBQU8sS0FBSyxHQUFMLENBQVUsWUFBWTtBQUM1QixlQUFPLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZCxFQUFvQixhQUFwQixFQUFtQyxpQkFBbkMsQ0FBUDtBQUNBLE9BRk0sQ0FBUDtBQUdBLEtBbktlO0FBcUtoQixJQUFBLElBQUksRUFBRSxjQUFVLEtBQVYsRUFBa0I7QUFDdkIsYUFBTyxNQUFNLENBQUMsTUFBUCxDQUFlLElBQWYsRUFBcUIsVUFBVSxLQUFWLEVBQWtCO0FBQzdDLFlBQUksSUFBSSxHQUFHLEtBQUssQ0FBTCxLQUFXLEVBQXRCO0FBQUEsWUFDQyxDQUFDLEdBQUcsQ0FETDtBQUFBLFlBRUMsQ0FBQyxHQUFHLEtBQUssTUFGVjs7QUFJQSxZQUFLLEtBQUssS0FBSyxTQUFmLEVBQTJCO0FBQzFCLGlCQUFPLElBQUksQ0FBQyxRQUFMLEtBQWtCLENBQWxCLEdBQ04sSUFBSSxDQUFDLFNBQUwsQ0FBZSxPQUFmLENBQXdCLGFBQXhCLEVBQXVDLEVBQXZDLENBRE0sR0FFTixTQUZEO0FBR0EsU0FUNEMsQ0FXN0M7OztBQUNBLFlBQUssT0FBTyxLQUFQLEtBQWlCLFFBQWpCLElBQTZCLENBQUMsWUFBWSxDQUFDLElBQWIsQ0FBbUIsS0FBbkIsQ0FBOUIsS0FDRixNQUFNLENBQUMsT0FBUCxDQUFlLGFBQWYsSUFBZ0MsQ0FBQyxZQUFZLENBQUMsSUFBYixDQUFtQixLQUFuQixDQUQvQixNQUVGLE1BQU0sQ0FBQyxPQUFQLENBQWUsaUJBQWYsSUFBb0MsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFuQixDQUF5QixLQUF6QixDQUZuQyxLQUdKLENBQUMsT0FBTyxDQUFFLENBQUUsUUFBUSxDQUFDLElBQVQsQ0FBZSxLQUFmLEtBQTBCLENBQUMsRUFBRCxFQUFLLEVBQUwsQ0FBNUIsRUFBdUMsQ0FBdkMsRUFBMEMsV0FBMUMsRUFBRixDQUhULEVBR3VFO0FBRXRFLFVBQUEsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFOLENBQWUsU0FBZixFQUEwQixXQUExQixDQUFSOztBQUVBLGNBQUk7QUFDSCxtQkFBTyxDQUFDLEdBQUcsQ0FBWCxFQUFjLENBQUMsRUFBZixFQUFvQjtBQUNuQjtBQUNBLGNBQUEsSUFBSSxHQUFHLEtBQUssQ0FBTCxLQUFXLEVBQWxCOztBQUNBLGtCQUFLLElBQUksQ0FBQyxRQUFMLEtBQWtCLENBQXZCLEVBQTJCO0FBQzFCLGdCQUFBLE1BQU0sQ0FBQyxTQUFQLENBQWtCLElBQUksQ0FBQyxvQkFBTCxDQUEyQixHQUEzQixDQUFsQjtBQUNBLGdCQUFBLElBQUksQ0FBQyxTQUFMLEdBQWlCLEtBQWpCO0FBQ0E7QUFDRDs7QUFFRCxZQUFBLElBQUksR0FBRyxDQUFQLENBVkcsQ0FZSjtBQUNDLFdBYkQsQ0FhRSxPQUFNLENBQU4sRUFBUyxDQUFFO0FBQ2I7O0FBRUQsWUFBSyxJQUFMLEVBQVk7QUFDWCxlQUFLLEtBQUwsR0FBYSxNQUFiLENBQXFCLEtBQXJCO0FBQ0E7QUFDRCxPQXRDTSxFQXNDSixJQXRDSSxFQXNDRSxLQXRDRixFQXNDUyxTQUFTLENBQUMsTUF0Q25CLENBQVA7QUF1Q0EsS0E3TWU7QUErTWhCLElBQUEsV0FBVyxFQUFFLHFCQUFVLEtBQVYsRUFBa0I7QUFDOUIsVUFBSyxDQUFDLGNBQWMsQ0FBRSxLQUFLLENBQUwsQ0FBRixDQUFwQixFQUFrQztBQUNqQztBQUNBO0FBQ0EsWUFBSyxNQUFNLENBQUMsVUFBUCxDQUFtQixLQUFuQixDQUFMLEVBQWtDO0FBQ2pDLGlCQUFPLEtBQUssSUFBTCxDQUFVLFVBQVMsQ0FBVCxFQUFZO0FBQzVCLGdCQUFJLElBQUksR0FBRyxNQUFNLENBQUMsSUFBRCxDQUFqQjtBQUFBLGdCQUF5QixHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUwsRUFBL0I7QUFDQSxZQUFBLElBQUksQ0FBQyxXQUFMLENBQWtCLEtBQUssQ0FBQyxJQUFOLENBQVksSUFBWixFQUFrQixDQUFsQixFQUFxQixHQUFyQixDQUFsQjtBQUNBLFdBSE0sQ0FBUDtBQUlBOztBQUVELFlBQUssT0FBTyxLQUFQLEtBQWlCLFFBQXRCLEVBQWlDO0FBQ2hDLFVBQUEsS0FBSyxHQUFHLE1BQU0sQ0FBRSxLQUFGLENBQU4sQ0FBZ0IsTUFBaEIsRUFBUjtBQUNBOztBQUVELGVBQU8sS0FBSyxJQUFMLENBQVUsWUFBVztBQUMzQixjQUFJLElBQUksR0FBRyxLQUFLLFdBQWhCO0FBQUEsY0FDQyxNQUFNLEdBQUcsS0FBSyxVQURmO0FBR0EsVUFBQSxNQUFNLENBQUUsSUFBRixDQUFOLENBQWUsTUFBZjs7QUFFQSxjQUFLLElBQUwsRUFBWTtBQUNYLFlBQUEsTUFBTSxDQUFDLElBQUQsQ0FBTixDQUFhLE1BQWIsQ0FBcUIsS0FBckI7QUFDQSxXQUZELE1BRU87QUFDTixZQUFBLE1BQU0sQ0FBQyxNQUFELENBQU4sQ0FBZSxNQUFmLENBQXVCLEtBQXZCO0FBQ0E7QUFDRCxTQVhNLENBQVA7QUFZQTs7QUFFRCxhQUFPLEtBQUssTUFBTCxHQUNOLEtBQUssU0FBTCxDQUFnQixNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVAsQ0FBa0IsS0FBbEIsSUFBMkIsS0FBSyxFQUFoQyxHQUFxQyxLQUF0QyxDQUF0QixFQUFvRSxhQUFwRSxFQUFtRixLQUFuRixDQURNLEdBRU4sSUFGRDtBQUdBLEtBL09lO0FBaVBoQixJQUFBLE1BQU0sRUFBRSxnQkFBVSxRQUFWLEVBQXFCO0FBQzVCLGFBQU8sS0FBSyxNQUFMLENBQWEsUUFBYixFQUF1QixJQUF2QixDQUFQO0FBQ0EsS0FuUGU7QUFxUGhCLElBQUEsUUFBUSxFQUFFLGtCQUFVLElBQVYsRUFBZ0IsS0FBaEIsRUFBdUIsUUFBdkIsRUFBa0M7QUFFM0M7QUFDQSxNQUFBLElBQUksR0FBRyxHQUFHLE1BQUgsQ0FBVSxLQUFWLENBQWlCLEVBQWpCLEVBQXFCLElBQXJCLENBQVA7QUFFQSxVQUFJLE9BQUo7QUFBQSxVQUFhLEtBQWI7QUFBQSxVQUFvQixRQUFwQjtBQUFBLFVBQThCLFFBQTlCO0FBQUEsVUFDQyxDQUFDLEdBQUcsQ0FETDtBQUFBLFVBRUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFELENBRmI7QUFBQSxVQUdDLE9BQU8sR0FBRyxFQUhYO0FBQUEsVUFJQyxDQUFDLEdBQUcsS0FBSyxNQUpWLENBTDJDLENBVzNDOztBQUNBLFVBQUssQ0FBQyxNQUFNLENBQUMsT0FBUCxDQUFlLFVBQWhCLElBQThCLENBQUMsR0FBRyxDQUFsQyxJQUF1QyxPQUFPLEtBQVAsS0FBaUIsUUFBeEQsSUFBb0UsUUFBUSxDQUFDLElBQVQsQ0FBZSxLQUFmLENBQXpFLEVBQWtHO0FBQ2pHLGVBQU8sS0FBSyxJQUFMLENBQVUsWUFBVztBQUMzQixVQUFBLE1BQU0sQ0FBQyxJQUFELENBQU4sQ0FBYSxRQUFiLENBQXVCLElBQXZCLEVBQTZCLEtBQTdCLEVBQW9DLFFBQXBDO0FBQ0EsU0FGTSxDQUFQO0FBR0E7O0FBRUQsVUFBSyxNQUFNLENBQUMsVUFBUCxDQUFrQixLQUFsQixDQUFMLEVBQWdDO0FBQy9CLGVBQU8sS0FBSyxJQUFMLENBQVUsVUFBUyxDQUFULEVBQVk7QUFDNUIsY0FBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUQsQ0FBakI7QUFDQSxVQUFBLElBQUksQ0FBQyxDQUFELENBQUosR0FBVSxLQUFLLENBQUMsSUFBTixDQUFZLElBQVosRUFBa0IsQ0FBbEIsRUFBcUIsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFMLEVBQUgsR0FBaUIsU0FBM0MsQ0FBVjtBQUNBLFVBQUEsSUFBSSxDQUFDLFFBQUwsQ0FBZSxJQUFmLEVBQXFCLEtBQXJCLEVBQTRCLFFBQTVCO0FBQ0EsU0FKTSxDQUFQO0FBS0E7O0FBRUQsVUFBSyxLQUFLLENBQUwsQ0FBTCxFQUFlO0FBQ2QsUUFBQSxPQUFPLEdBQUcsTUFBTSxDQUFDLGFBQVAsQ0FBc0IsSUFBdEIsRUFBNEIsSUFBNUIsRUFBa0MsT0FBbEMsQ0FBVjtBQUNBLFFBQUEsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFuQjtBQUNBLFFBQUEsS0FBSyxHQUFHLFFBQVEsQ0FBQyxVQUFqQjs7QUFFQSxZQUFLLFFBQVEsQ0FBQyxVQUFULENBQW9CLE1BQXBCLEtBQStCLENBQXBDLEVBQXdDO0FBQ3ZDLFVBQUEsUUFBUSxHQUFHLEtBQVg7QUFDQTs7QUFFRCxZQUFLLEtBQUwsRUFBYTtBQUNaLFVBQUEsS0FBSyxHQUFHLEtBQUssSUFBSSxNQUFNLENBQUMsUUFBUCxDQUFpQixLQUFqQixFQUF3QixJQUF4QixDQUFqQixDQURZLENBR1o7QUFDQTtBQUNBOztBQUNBLGVBQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxTQUFSLElBQXFCLENBQUMsR0FBRyxDQUExQyxFQUE2QyxDQUFDLEdBQUcsQ0FBakQsRUFBb0QsQ0FBQyxFQUFyRCxFQUEwRDtBQUN6RCxZQUFBLFFBQVEsQ0FBQyxJQUFULENBQ0MsS0FBSyxJQUFJLE1BQU0sQ0FBQyxRQUFQLENBQWlCLEtBQUssQ0FBTCxDQUFqQixFQUEwQixPQUExQixDQUFULEdBQ0MsWUFBWSxDQUFFLEtBQUssQ0FBTCxDQUFGLEVBQVcsT0FBWCxDQURiLEdBRUMsS0FBSyxDQUFMLENBSEYsRUFJQyxDQUFDLEtBQUssUUFBTixHQUNDLFFBREQsR0FFQyxNQUFNLENBQUMsS0FBUCxDQUFjLFFBQWQsRUFBd0IsSUFBeEIsRUFBOEIsSUFBOUIsQ0FORjtBQVFBO0FBQ0QsU0F6QmEsQ0EyQmQ7OztBQUNBLFFBQUEsUUFBUSxHQUFHLEtBQUssR0FBRyxJQUFuQjs7QUFFQSxZQUFLLE9BQU8sQ0FBQyxNQUFiLEVBQXNCO0FBQ3JCLFVBQUEsTUFBTSxDQUFDLElBQVAsQ0FBYSxPQUFiLEVBQXNCLFVBQVUsQ0FBVixFQUFhLElBQWIsRUFBb0I7QUFDekMsZ0JBQUssSUFBSSxDQUFDLEdBQVYsRUFBZ0I7QUFDZixrQkFBSyxNQUFNLENBQUMsSUFBWixFQUFtQjtBQUNsQixnQkFBQSxNQUFNLENBQUMsSUFBUCxDQUFZO0FBQ1gsa0JBQUEsR0FBRyxFQUFFLElBQUksQ0FBQyxHQURDO0FBRVgsa0JBQUEsSUFBSSxFQUFFLEtBRks7QUFHWCxrQkFBQSxRQUFRLEVBQUUsUUFIQztBQUlYLGtCQUFBLEtBQUssRUFBRSxLQUpJO0FBS1gsa0JBQUEsTUFBTSxFQUFFLEtBTEc7QUFNWCw0QkFBVTtBQU5DLGlCQUFaO0FBUUEsZUFURCxNQVNPO0FBQ04sZ0JBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYSxTQUFiO0FBQ0E7QUFDRCxhQWJELE1BYU87QUFDTixjQUFBLE1BQU0sQ0FBQyxVQUFQLENBQW1CLENBQUUsSUFBSSxDQUFDLElBQUwsSUFBYSxJQUFJLENBQUMsV0FBbEIsSUFBaUMsSUFBSSxDQUFDLFNBQXRDLElBQW1ELEVBQXJELEVBQTBELE9BQTFELENBQW1FLFlBQW5FLEVBQWlGLEVBQWpGLENBQW5CO0FBQ0E7O0FBRUQsZ0JBQUssSUFBSSxDQUFDLFVBQVYsRUFBdUI7QUFDdEIsY0FBQSxJQUFJLENBQUMsVUFBTCxDQUFnQixXQUFoQixDQUE2QixJQUE3QjtBQUNBO0FBQ0QsV0FyQkQ7QUFzQkE7QUFDRDs7QUFFRCxhQUFPLElBQVA7QUFDQTtBQXhVZSxHQUFqQjs7QUEyVUEsV0FBUyxZQUFULENBQXVCLElBQXZCLEVBQTZCLEdBQTdCLEVBQW1DO0FBQ2xDLFdBQU8sSUFBSSxDQUFDLG9CQUFMLENBQTJCLEdBQTNCLEVBQWlDLENBQWpDLEtBQXVDLElBQUksQ0FBQyxXQUFMLENBQWtCLElBQUksQ0FBQyxhQUFMLENBQW1CLGFBQW5CLENBQWtDLEdBQWxDLENBQWxCLENBQTlDO0FBQ0E7O0FBRUQsV0FBUyxjQUFULENBQXlCLEdBQXpCLEVBQThCLElBQTlCLEVBQXFDO0FBRXBDLFFBQUssSUFBSSxDQUFDLFFBQUwsS0FBa0IsQ0FBbEIsSUFBdUIsQ0FBQyxNQUFNLENBQUMsT0FBUCxDQUFnQixHQUFoQixDQUE3QixFQUFxRDtBQUNwRDtBQUNBOztBQUVELFFBQUksSUFBSjtBQUFBLFFBQVUsQ0FBVjtBQUFBLFFBQWEsQ0FBYjtBQUFBLFFBQ0MsT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFQLENBQWMsR0FBZCxDQURYO0FBQUEsUUFFQyxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQVAsQ0FBYyxJQUFkLEVBQW9CLE9BQXBCLENBRlg7QUFBQSxRQUdDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFIbEI7O0FBS0EsUUFBSyxNQUFMLEVBQWM7QUFDYixhQUFPLE9BQU8sQ0FBQyxNQUFmO0FBQ0EsTUFBQSxPQUFPLENBQUMsTUFBUixHQUFpQixFQUFqQjs7QUFFQSxXQUFNLElBQU4sSUFBYyxNQUFkLEVBQXVCO0FBQ3RCLGFBQU0sQ0FBQyxHQUFHLENBQUosRUFBTyxDQUFDLEdBQUcsTUFBTSxDQUFFLElBQUYsQ0FBTixDQUFlLE1BQWhDLEVBQXdDLENBQUMsR0FBRyxDQUE1QyxFQUErQyxDQUFDLEVBQWhELEVBQXFEO0FBQ3BELFVBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYSxHQUFiLENBQWtCLElBQWxCLEVBQXdCLElBQXhCLEVBQThCLE1BQU0sQ0FBRSxJQUFGLENBQU4sQ0FBZ0IsQ0FBaEIsQ0FBOUI7QUFDQTtBQUNEO0FBQ0QsS0FwQm1DLENBc0JwQzs7O0FBQ0EsUUFBSyxPQUFPLENBQUMsSUFBYixFQUFvQjtBQUNuQixNQUFBLE9BQU8sQ0FBQyxJQUFSLEdBQWUsTUFBTSxDQUFDLE1BQVAsQ0FBZSxFQUFmLEVBQW1CLE9BQU8sQ0FBQyxJQUEzQixDQUFmO0FBQ0E7QUFDRDs7QUFFRCxXQUFTLGtCQUFULENBQTZCLEdBQTdCLEVBQWtDLElBQWxDLEVBQXlDO0FBQ3hDLFFBQUksUUFBSixDQUR3QyxDQUd4Qzs7QUFDQSxRQUFLLElBQUksQ0FBQyxRQUFMLEtBQWtCLENBQXZCLEVBQTJCO0FBQzFCO0FBQ0EsS0FOdUMsQ0FReEM7QUFDQTs7O0FBQ0EsUUFBSyxJQUFJLENBQUMsZUFBVixFQUE0QjtBQUMzQixNQUFBLElBQUksQ0FBQyxlQUFMO0FBQ0EsS0FadUMsQ0FjeEM7QUFDQTs7O0FBQ0EsUUFBSyxJQUFJLENBQUMsZUFBVixFQUE0QjtBQUMzQixNQUFBLElBQUksQ0FBQyxlQUFMLENBQXNCLEdBQXRCO0FBQ0E7O0FBRUQsSUFBQSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQUwsQ0FBYyxXQUFkLEVBQVg7O0FBRUEsUUFBSyxRQUFRLEtBQUssUUFBbEIsRUFBNkI7QUFDNUI7QUFDQTtBQUNBLFVBQUssSUFBSSxDQUFDLFVBQVYsRUFBdUI7QUFDdEIsUUFBQSxJQUFJLENBQUMsU0FBTCxHQUFpQixHQUFHLENBQUMsU0FBckI7QUFDQSxPQUwyQixDQU81QjtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsVUFBSyxNQUFNLENBQUMsT0FBUCxDQUFlLFVBQWYsSUFBOEIsR0FBRyxDQUFDLFNBQUosSUFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBUCxDQUFZLElBQUksQ0FBQyxTQUFqQixDQUFyRCxFQUFvRjtBQUNuRixRQUFBLElBQUksQ0FBQyxTQUFMLEdBQWlCLEdBQUcsQ0FBQyxTQUFyQjtBQUNBO0FBRUQsS0FmRCxNQWVPLElBQUssUUFBUSxLQUFLLE9BQWIsSUFBd0IsY0FBYyxDQUFDLElBQWYsQ0FBcUIsR0FBRyxDQUFDLElBQXpCLENBQTdCLEVBQStEO0FBQ3JFO0FBQ0E7QUFDQTtBQUVBLE1BQUEsSUFBSSxDQUFDLGNBQUwsR0FBc0IsSUFBSSxDQUFDLE9BQUwsR0FBZSxHQUFHLENBQUMsT0FBekMsQ0FMcUUsQ0FPckU7QUFDQTs7QUFDQSxVQUFLLElBQUksQ0FBQyxLQUFMLEtBQWUsR0FBRyxDQUFDLEtBQXhCLEVBQWdDO0FBQy9CLFFBQUEsSUFBSSxDQUFDLEtBQUwsR0FBYSxHQUFHLENBQUMsS0FBakI7QUFDQSxPQVhvRSxDQWF0RTtBQUNBOztBQUNDLEtBZk0sTUFlQSxJQUFLLFFBQVEsS0FBSyxRQUFsQixFQUE2QjtBQUNuQyxNQUFBLElBQUksQ0FBQyxRQUFMLEdBQWdCLEdBQUcsQ0FBQyxlQUFwQixDQURtQyxDQUdwQztBQUNBO0FBQ0MsS0FMTSxNQUtBLElBQUssUUFBUSxLQUFLLE9BQWIsSUFBd0IsUUFBUSxLQUFLLFVBQTFDLEVBQXVEO0FBQzdELE1BQUEsSUFBSSxDQUFDLFlBQUwsR0FBb0IsR0FBRyxDQUFDLFlBQXhCLENBRDZELENBRzlEO0FBQ0MsS0FKTSxNQUlBLElBQUssUUFBUSxLQUFLLFFBQWIsSUFBeUIsSUFBSSxDQUFDLElBQUwsS0FBYyxHQUFHLENBQUMsSUFBaEQsRUFBdUQ7QUFDN0QsTUFBQSxJQUFJLENBQUMsSUFBTCxHQUFZLEdBQUcsQ0FBQyxJQUFoQjtBQUNBLEtBL0R1QyxDQWlFeEM7QUFDQTs7O0FBQ0EsSUFBQSxJQUFJLENBQUMsZUFBTCxDQUFzQixNQUFNLENBQUMsT0FBN0I7QUFDQTs7QUFFRCxFQUFBLE1BQU0sQ0FBQyxhQUFQLEdBQXVCLFVBQVUsSUFBVixFQUFnQixPQUFoQixFQUF5QixPQUF6QixFQUFtQztBQUN6RCxRQUFJLFFBQUo7QUFBQSxRQUFjLFNBQWQ7QUFBQSxRQUF5QixRQUF6QjtBQUFBLFFBQ0MsS0FBSyxHQUFHLElBQUksQ0FBRSxDQUFGLENBRGIsQ0FEeUQsQ0FJekQ7QUFDQTtBQUNBOztBQUNBLElBQUEsT0FBTyxHQUFHLE9BQU8sSUFBSSxRQUFyQjtBQUNBLElBQUEsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVQsSUFBcUIsT0FBTyxDQUFDLENBQUQsQ0FBNUIsSUFBbUMsT0FBN0M7QUFDQSxJQUFBLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBUixJQUF5QixPQUFuQyxDQVR5RCxDQVd6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLFFBQUssSUFBSSxDQUFDLE1BQUwsS0FBZ0IsQ0FBaEIsSUFBcUIsT0FBTyxLQUFQLEtBQWlCLFFBQXRDLElBQWtELEtBQUssQ0FBQyxNQUFOLEdBQWUsR0FBakUsSUFBd0UsT0FBTyxLQUFLLFFBQXBGLElBQ0osS0FBSyxDQUFDLE1BQU4sQ0FBYSxDQUFiLE1BQW9CLEdBRGhCLElBQ3VCLENBQUMsUUFBUSxDQUFDLElBQVQsQ0FBZSxLQUFmLENBRHhCLEtBRUgsTUFBTSxDQUFDLE9BQVAsQ0FBZSxVQUFmLElBQTZCLENBQUMsUUFBUSxDQUFDLElBQVQsQ0FBZSxLQUFmLENBRjNCLE1BR0gsTUFBTSxDQUFDLE9BQVAsQ0FBZSxVQUFmLElBQTZCLENBQUMsWUFBWSxDQUFDLElBQWIsQ0FBbUIsS0FBbkIsQ0FIM0IsQ0FBTCxFQUc4RDtBQUU3RDtBQUNBLE1BQUEsU0FBUyxHQUFHLElBQVo7QUFDQSxNQUFBLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUCxDQUFrQixLQUFsQixDQUFYO0FBQ0EsTUFBQSxRQUFRLEdBQUcsUUFBUSxLQUFLLFNBQXhCO0FBQ0E7O0FBRUQsUUFBSyxDQUFDLFFBQU4sRUFBaUI7QUFDaEIsTUFBQSxRQUFRLEdBQUcsT0FBTyxDQUFDLHNCQUFSLEVBQVg7QUFDQSxNQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZCxFQUFvQixPQUFwQixFQUE2QixRQUE3QixFQUF1QyxPQUF2QyxFQUZnQixDQUloQjtBQUNBOztBQUNBLFVBQUssU0FBTCxFQUFpQjtBQUNoQixRQUFBLE1BQU0sQ0FBQyxTQUFQLENBQWtCLEtBQWxCLElBQTRCLFFBQVEsSUFBSSxRQUF4QztBQUNBO0FBQ0Q7O0FBRUQsV0FBTztBQUFFLE1BQUEsUUFBUSxFQUFFLFFBQVo7QUFBc0IsTUFBQSxTQUFTLEVBQUU7QUFBakMsS0FBUDtBQUNBLEdBdkNEOztBQXlDQSxFQUFBLE1BQU0sQ0FBQyxTQUFQLEdBQW1CLEVBQW5CO0FBRUEsRUFBQSxNQUFNLENBQUMsSUFBUCxDQUFZO0FBQ1gsSUFBQSxRQUFRLEVBQUUsUUFEQztBQUVYLElBQUEsU0FBUyxFQUFFLFNBRkE7QUFHWCxJQUFBLFlBQVksRUFBRSxRQUhIO0FBSVgsSUFBQSxXQUFXLEVBQUUsT0FKRjtBQUtYLElBQUEsVUFBVSxFQUFFO0FBTEQsR0FBWixFQU1HLFVBQVUsSUFBVixFQUFnQixRQUFoQixFQUEyQjtBQUM3QixJQUFBLE1BQU0sQ0FBQyxFQUFQLENBQVcsSUFBWCxJQUFvQixVQUFVLFFBQVYsRUFBcUI7QUFDeEMsVUFBSSxLQUFKO0FBQUEsVUFDQyxDQUFDLEdBQUcsQ0FETDtBQUFBLFVBRUMsR0FBRyxHQUFHLEVBRlA7QUFBQSxVQUdDLE1BQU0sR0FBRyxNQUFNLENBQUUsUUFBRixDQUhoQjtBQUFBLFVBSUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUpaO0FBQUEsVUFLQyxNQUFNLEdBQUcsS0FBSyxNQUFMLEtBQWdCLENBQWhCLElBQXFCLEtBQUssQ0FBTCxFQUFRLFVBTHZDOztBQU9BLFVBQUssQ0FBQyxNQUFNLElBQUksSUFBVixJQUFrQixNQUFNLElBQUksTUFBTSxDQUFDLFFBQVAsS0FBb0IsRUFBOUIsSUFBb0MsTUFBTSxDQUFDLFVBQVAsQ0FBa0IsTUFBbEIsS0FBNkIsQ0FBcEYsS0FBMEYsQ0FBQyxLQUFLLENBQXJHLEVBQXlHO0FBQ3hHLFFBQUEsTUFBTSxDQUFFLFFBQUYsQ0FBTixDQUFvQixLQUFLLENBQUwsQ0FBcEI7QUFDQSxlQUFPLElBQVA7QUFDQSxPQUhELE1BR087QUFDTixlQUFRLENBQUMsR0FBRyxDQUFaLEVBQWUsQ0FBQyxFQUFoQixFQUFxQjtBQUNwQixVQUFBLEtBQUssR0FBRyxDQUFFLENBQUMsR0FBRyxDQUFKLEdBQVEsS0FBSyxLQUFMLENBQVcsSUFBWCxDQUFSLEdBQTJCLElBQTdCLEVBQW9DLEdBQXBDLEVBQVI7QUFDQSxVQUFBLE1BQU0sQ0FBRSxNQUFNLENBQUMsQ0FBRCxDQUFSLENBQU4sQ0FBcUIsUUFBckIsRUFBaUMsS0FBakM7QUFDQSxVQUFBLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBSixDQUFZLEtBQVosQ0FBTjtBQUNBOztBQUVELGVBQU8sS0FBSyxTQUFMLENBQWdCLEdBQWhCLEVBQXFCLElBQXJCLEVBQTJCLE1BQU0sQ0FBQyxRQUFsQyxDQUFQO0FBQ0E7QUFDRCxLQXBCRDtBQXFCQSxHQTVCRDs7QUE4QkEsV0FBUyxNQUFULENBQWlCLElBQWpCLEVBQXdCO0FBQ3ZCLFFBQUssT0FBTyxJQUFJLENBQUMsb0JBQVosS0FBcUMsV0FBMUMsRUFBd0Q7QUFDdkQsYUFBTyxJQUFJLENBQUMsb0JBQUwsQ0FBMkIsR0FBM0IsQ0FBUDtBQUVBLEtBSEQsTUFHTyxJQUFLLE9BQU8sSUFBSSxDQUFDLGdCQUFaLEtBQWlDLFdBQXRDLEVBQW9EO0FBQzFELGFBQU8sSUFBSSxDQUFDLGdCQUFMLENBQXVCLEdBQXZCLENBQVA7QUFFQSxLQUhNLE1BR0E7QUFDTixhQUFPLEVBQVA7QUFDQTtBQUNELEdBcjZMOEIsQ0F1NkwvQjs7O0FBQ0EsV0FBUyxpQkFBVCxDQUE0QixJQUE1QixFQUFtQztBQUNsQyxRQUFLLGNBQWMsQ0FBQyxJQUFmLENBQXFCLElBQUksQ0FBQyxJQUExQixDQUFMLEVBQXdDO0FBQ3ZDLE1BQUEsSUFBSSxDQUFDLGNBQUwsR0FBc0IsSUFBSSxDQUFDLE9BQTNCO0FBQ0E7QUFDRDs7QUFFRCxFQUFBLE1BQU0sQ0FBQyxNQUFQLENBQWM7QUFDYixJQUFBLEtBQUssRUFBRSxlQUFVLElBQVYsRUFBZ0IsYUFBaEIsRUFBK0IsaUJBQS9CLEVBQW1EO0FBQ3pELFVBQUksV0FBSixFQUNDLFlBREQsRUFFQyxDQUZELEVBR0MsS0FIRDs7QUFLQSxVQUFLLE1BQU0sQ0FBQyxPQUFQLENBQWUsVUFBZixJQUE2QixNQUFNLENBQUMsUUFBUCxDQUFnQixJQUFoQixDQUE3QixJQUFzRCxDQUFDLFlBQVksQ0FBQyxJQUFiLENBQW1CLE1BQU0sSUFBSSxDQUFDLFFBQVgsR0FBc0IsR0FBekMsQ0FBNUQsRUFBNkc7QUFDNUcsUUFBQSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQUwsQ0FBZ0IsSUFBaEIsQ0FBUixDQUQ0RyxDQUc3RztBQUNDLE9BSkQsTUFJTztBQUNOLFFBQUEsV0FBVyxDQUFDLFNBQVosR0FBd0IsSUFBSSxDQUFDLFNBQTdCO0FBQ0EsUUFBQSxXQUFXLENBQUMsV0FBWixDQUF5QixLQUFLLEdBQUcsV0FBVyxDQUFDLFVBQTdDO0FBQ0E7O0FBRUQsVUFBSyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQVAsQ0FBZSxZQUFoQixJQUFnQyxDQUFDLE1BQU0sQ0FBQyxPQUFQLENBQWUsY0FBakQsTUFDRixJQUFJLENBQUMsUUFBTCxLQUFrQixDQUFsQixJQUF1QixJQUFJLENBQUMsUUFBTCxLQUFrQixFQUR2QyxLQUM4QyxDQUFDLE1BQU0sQ0FBQyxRQUFQLENBQWdCLElBQWhCLENBRHBELEVBQzRFO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxRQUFBLGtCQUFrQixDQUFFLElBQUYsRUFBUSxLQUFSLENBQWxCLENBUDJFLENBUzNFOztBQUNBLFFBQUEsV0FBVyxHQUFHLE1BQU0sQ0FBRSxJQUFGLENBQXBCO0FBQ0EsUUFBQSxZQUFZLEdBQUcsTUFBTSxDQUFFLEtBQUYsQ0FBckIsQ0FYMkUsQ0FhM0U7QUFDQTtBQUNBOztBQUNBLGFBQU0sQ0FBQyxHQUFHLENBQVYsRUFBYSxXQUFXLENBQUMsQ0FBRCxDQUF4QixFQUE2QixFQUFFLENBQS9CLEVBQW1DO0FBQ2xDO0FBQ0EsY0FBSyxZQUFZLENBQUMsQ0FBRCxDQUFqQixFQUF1QjtBQUN0QixZQUFBLGtCQUFrQixDQUFFLFdBQVcsQ0FBQyxDQUFELENBQWIsRUFBa0IsWUFBWSxDQUFDLENBQUQsQ0FBOUIsQ0FBbEI7QUFDQTtBQUNEO0FBQ0QsT0F0Q3dELENBd0N6RDs7O0FBQ0EsVUFBSyxhQUFMLEVBQXFCO0FBQ3BCLFFBQUEsY0FBYyxDQUFFLElBQUYsRUFBUSxLQUFSLENBQWQ7O0FBRUEsWUFBSyxpQkFBTCxFQUF5QjtBQUN4QixVQUFBLFdBQVcsR0FBRyxNQUFNLENBQUUsSUFBRixDQUFwQjtBQUNBLFVBQUEsWUFBWSxHQUFHLE1BQU0sQ0FBRSxLQUFGLENBQXJCOztBQUVBLGVBQU0sQ0FBQyxHQUFHLENBQVYsRUFBYSxXQUFXLENBQUMsQ0FBRCxDQUF4QixFQUE2QixFQUFFLENBQS9CLEVBQW1DO0FBQ2xDLFlBQUEsY0FBYyxDQUFFLFdBQVcsQ0FBQyxDQUFELENBQWIsRUFBa0IsWUFBWSxDQUFDLENBQUQsQ0FBOUIsQ0FBZDtBQUNBO0FBQ0Q7QUFDRDs7QUFFRCxNQUFBLFdBQVcsR0FBRyxZQUFZLEdBQUcsSUFBN0IsQ0F0RHlELENBd0R6RDs7QUFDQSxhQUFPLEtBQVA7QUFDQSxLQTNEWTtBQTZEYixJQUFBLEtBQUssRUFBRSxlQUFVLEtBQVYsRUFBaUIsT0FBakIsRUFBMEIsUUFBMUIsRUFBb0MsT0FBcEMsRUFBOEM7QUFDcEQsVUFBSSxDQUFKO0FBQUEsVUFBTyxDQUFQO0FBQUEsVUFBVSxJQUFWO0FBQUEsVUFBZ0IsR0FBaEI7QUFBQSxVQUFxQixJQUFyQjtBQUFBLFVBQTJCLEtBQTNCO0FBQUEsVUFBa0MsR0FBbEM7QUFBQSxVQUF1QyxPQUF2QztBQUFBLFVBQWdELEtBQWhEO0FBQUEsVUFBdUQsR0FBdkQ7QUFBQSxVQUE0RCxZQUE1RDtBQUFBLFVBQTBFLE1BQTFFO0FBQUEsVUFDQyxJQUFJLEdBQUcsT0FBTyxLQUFLLFFBQVosSUFBd0IsWUFEaEM7QUFBQSxVQUVDLEdBQUcsR0FBRyxFQUZQLENBRG9ELENBS3BEOztBQUNBLFVBQUssQ0FBQyxPQUFELElBQVksT0FBTyxPQUFPLENBQUMsc0JBQWYsS0FBMEMsV0FBM0QsRUFBeUU7QUFDeEUsUUFBQSxPQUFPLEdBQUcsUUFBVjtBQUNBLE9BUm1ELENBVXBEOzs7QUFDQSxXQUFNLENBQUMsR0FBRyxDQUFWLEVBQWEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUQsQ0FBYixLQUFxQixJQUFsQyxFQUF3QyxDQUFDLEVBQXpDLEVBQThDO0FBQzdDLFlBQUssT0FBTyxJQUFQLEtBQWdCLFFBQXJCLEVBQWdDO0FBQy9CLFVBQUEsSUFBSSxJQUFJLEVBQVI7QUFDQTs7QUFFRCxZQUFLLENBQUMsSUFBTixFQUFhO0FBQ1o7QUFDQSxTQVA0QyxDQVM3Qzs7O0FBQ0EsWUFBSyxPQUFPLElBQVAsS0FBZ0IsUUFBckIsRUFBZ0M7QUFDL0IsY0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFOLENBQVksSUFBWixDQUFOLEVBQTJCO0FBQzFCLFlBQUEsSUFBSSxHQUFHLE9BQU8sQ0FBQyxjQUFSLENBQXdCLElBQXhCLENBQVA7QUFDQSxXQUZELE1BRU87QUFDTjtBQUNBLFlBQUEsSUFBSSxHQUFHLElBQUksSUFBSSxrQkFBa0IsQ0FBRSxPQUFGLENBQWpDO0FBQ0EsWUFBQSxHQUFHLEdBQUcsT0FBTyxDQUFDLGFBQVIsQ0FBc0IsS0FBdEIsQ0FBTjtBQUNBLFlBQUEsSUFBSSxDQUFDLFdBQUwsQ0FBa0IsR0FBbEIsRUFKTSxDQU1OOztBQUNBLFlBQUEsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFMLENBQWEsU0FBYixFQUF3QixXQUF4QixDQUFQLENBUE0sQ0FTTjs7QUFDQSxZQUFBLEdBQUcsR0FBRyxDQUFFLFFBQVEsQ0FBQyxJQUFULENBQWUsSUFBZixLQUF5QixDQUFDLEVBQUQsRUFBSyxFQUFMLENBQTNCLEVBQXNDLENBQXRDLEVBQXlDLFdBQXpDLEVBQU47QUFDQSxZQUFBLElBQUksR0FBRyxPQUFPLENBQUUsR0FBRixDQUFQLElBQWtCLE9BQU8sQ0FBQyxRQUFqQztBQUNBLFlBQUEsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFELENBQVo7QUFDQSxZQUFBLEdBQUcsQ0FBQyxTQUFKLEdBQWdCLElBQUksQ0FBQyxDQUFELENBQUosR0FBVSxJQUFWLEdBQWlCLElBQUksQ0FBQyxDQUFELENBQXJDLENBYk0sQ0FlTjs7QUFDQSxtQkFBUSxLQUFLLEVBQWIsRUFBa0I7QUFDakIsY0FBQSxHQUFHLEdBQUcsR0FBRyxDQUFDLFNBQVY7QUFDQSxhQWxCSyxDQW9CTjs7O0FBQ0EsZ0JBQUssQ0FBQyxNQUFNLENBQUMsT0FBUCxDQUFlLEtBQXJCLEVBQTZCO0FBRTVCO0FBQ0EsY0FBQSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQVAsQ0FBWSxJQUFaLENBQVY7QUFDQyxjQUFBLEtBQUssR0FBRyxHQUFHLEtBQUssT0FBUixJQUFtQixDQUFDLE9BQXBCLEdBQ1AsR0FBRyxDQUFDLFVBQUosSUFBa0IsR0FBRyxDQUFDLFVBQUosQ0FBZSxVQUQxQixHQUdQO0FBQ0EsY0FBQSxJQUFJLENBQUMsQ0FBRCxDQUFKLEtBQVksU0FBWixJQUF5QixDQUFDLE9BQTFCLEdBQ0MsR0FBRyxDQUFDLFVBREwsR0FFQyxFQU5GOztBQVFELG1CQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTixHQUFlLENBQXpCLEVBQTRCLENBQUMsSUFBSSxDQUFqQyxFQUFxQyxFQUFFLENBQXZDLEVBQTJDO0FBQzFDLG9CQUFLLE1BQU0sQ0FBQyxRQUFQLENBQWlCLEtBQUssQ0FBRSxDQUFGLENBQXRCLEVBQTZCLE9BQTdCLEtBQTBDLENBQUMsS0FBSyxDQUFFLENBQUYsQ0FBTCxDQUFXLFVBQVgsQ0FBc0IsTUFBdEUsRUFBK0U7QUFDOUUsa0JBQUEsS0FBSyxDQUFFLENBQUYsQ0FBTCxDQUFXLFVBQVgsQ0FBc0IsV0FBdEIsQ0FBbUMsS0FBSyxDQUFFLENBQUYsQ0FBeEM7QUFDQTtBQUNEO0FBQ0QsYUF0Q0ssQ0F3Q047OztBQUNBLGdCQUFLLENBQUMsTUFBTSxDQUFDLE9BQVAsQ0FBZSxpQkFBaEIsSUFBcUMsa0JBQWtCLENBQUMsSUFBbkIsQ0FBeUIsSUFBekIsQ0FBMUMsRUFBNEU7QUFDM0UsY0FBQSxHQUFHLENBQUMsWUFBSixDQUFrQixPQUFPLENBQUMsY0FBUixDQUF3QixrQkFBa0IsQ0FBQyxJQUFuQixDQUF3QixJQUF4QixFQUE4QixDQUE5QixDQUF4QixDQUFsQixFQUE4RSxHQUFHLENBQUMsVUFBbEY7QUFDQTs7QUFFRCxZQUFBLElBQUksR0FBRyxHQUFHLENBQUMsVUFBWCxDQTdDTSxDQStDTjs7QUFDQSxZQUFBLEdBQUcsQ0FBQyxVQUFKLENBQWUsV0FBZixDQUE0QixHQUE1QjtBQUNBO0FBQ0Q7O0FBRUQsWUFBSyxJQUFJLENBQUMsUUFBVixFQUFxQjtBQUNwQixVQUFBLEdBQUcsQ0FBQyxJQUFKLENBQVUsSUFBVjtBQUNBLFNBRkQsTUFFTztBQUNOLFVBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYyxHQUFkLEVBQW1CLElBQW5CO0FBQ0E7QUFDRCxPQWpGbUQsQ0FtRnBEOzs7QUFDQSxVQUFLLEdBQUwsRUFBVztBQUNWLFFBQUEsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBcEI7QUFDQSxPQXRGbUQsQ0F3RnBEO0FBQ0E7OztBQUNBLFVBQUssQ0FBQyxNQUFNLENBQUMsT0FBUCxDQUFlLGFBQXJCLEVBQXFDO0FBQ3BDLGFBQU0sQ0FBQyxHQUFHLENBQVYsRUFBYSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBRCxDQUFYLEtBQW1CLElBQWhDLEVBQXNDLENBQUMsRUFBdkMsRUFBNEM7QUFDM0MsY0FBSyxNQUFNLENBQUMsUUFBUCxDQUFpQixJQUFqQixFQUF1QixPQUF2QixDQUFMLEVBQXdDO0FBQ3ZDLFlBQUEsaUJBQWlCLENBQUUsSUFBRixDQUFqQjtBQUNBLFdBRkQsTUFFTyxJQUFLLE9BQU8sSUFBSSxDQUFDLG9CQUFaLEtBQXFDLFdBQTFDLEVBQXdEO0FBQzlELFlBQUEsTUFBTSxDQUFDLElBQVAsQ0FBYSxJQUFJLENBQUMsb0JBQUwsQ0FBMEIsT0FBMUIsQ0FBYixFQUFpRCxpQkFBakQ7QUFDQTtBQUNEO0FBQ0QsT0FsR21ELENBb0dwRDs7O0FBQ0EsVUFBSyxRQUFMLEVBQWdCO0FBQ2Y7QUFDQSxRQUFBLFlBQVksR0FBRyxzQkFBVSxJQUFWLEVBQWlCO0FBQy9CO0FBQ0EsY0FBSyxDQUFDLElBQUksQ0FBQyxJQUFOLElBQWMsV0FBVyxDQUFDLElBQVosQ0FBa0IsSUFBSSxDQUFDLElBQXZCLENBQW5CLEVBQW1EO0FBQ2xEO0FBQ0E7QUFDQSxtQkFBTyxPQUFPLEdBQ2IsT0FBTyxDQUFDLElBQVIsQ0FBYyxJQUFJLENBQUMsVUFBTCxHQUFrQixJQUFJLENBQUMsVUFBTCxDQUFnQixXQUFoQixDQUE2QixJQUE3QixDQUFsQixHQUF3RCxJQUF0RSxDQURhLEdBRWIsUUFBUSxDQUFDLFdBQVQsQ0FBc0IsSUFBdEIsQ0FGRDtBQUdBO0FBQ0QsU0FURDs7QUFXQSxhQUFNLENBQUMsR0FBRyxDQUFWLEVBQWEsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUQsQ0FBWCxLQUFtQixJQUFoQyxFQUFzQyxDQUFDLEVBQXZDLEVBQTRDO0FBQzNDO0FBQ0EsY0FBSyxFQUFHLE1BQU0sQ0FBQyxRQUFQLENBQWlCLElBQWpCLEVBQXVCLFFBQXZCLEtBQXFDLFlBQVksQ0FBRSxJQUFGLENBQXBELENBQUwsRUFBc0U7QUFDckU7QUFDQSxZQUFBLFFBQVEsQ0FBQyxXQUFULENBQXNCLElBQXRCOztBQUNBLGdCQUFLLE9BQU8sSUFBSSxDQUFDLG9CQUFaLEtBQXFDLFdBQTFDLEVBQXdEO0FBQ3ZEO0FBQ0EsY0FBQSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQVAsQ0FBYSxNQUFNLENBQUMsS0FBUCxDQUFjLEVBQWQsRUFBa0IsSUFBSSxDQUFDLG9CQUFMLENBQTBCLFFBQTFCLENBQWxCLENBQWIsRUFBc0UsWUFBdEUsQ0FBVCxDQUZ1RCxDQUl2RDs7QUFDQSxjQUFBLEdBQUcsQ0FBQyxNQUFKLENBQVcsS0FBWCxDQUFrQixHQUFsQixFQUF1QixDQUFDLENBQUMsR0FBRyxDQUFMLEVBQVEsQ0FBUixFQUFXLE1BQVgsQ0FBbUIsTUFBbkIsQ0FBdkI7QUFDQSxjQUFBLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBWjtBQUNBO0FBQ0Q7QUFDRDtBQUNEOztBQUVELGFBQU8sR0FBUDtBQUNBLEtBak1ZO0FBbU1iLElBQUEsU0FBUyxFQUFFLG1CQUFVLEtBQVY7QUFBaUI7QUFBZSxJQUFBLFVBQWhDLEVBQTZDO0FBQ3ZELFVBQUksSUFBSjtBQUFBLFVBQVUsRUFBVjtBQUFBLFVBQWMsSUFBZDtBQUFBLFVBQW9CLElBQXBCO0FBQUEsVUFDQyxDQUFDLEdBQUcsQ0FETDtBQUFBLFVBRUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUZ0QjtBQUFBLFVBR0MsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUhoQjtBQUFBLFVBSUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxPQUFQLENBQWUsYUFKaEM7QUFBQSxVQUtDLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBUCxDQUFhLE9BTHhCOztBQU9BLGFBQVEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUQsQ0FBYixLQUFxQixJQUE3QixFQUFtQyxDQUFDLEVBQXBDLEVBQXlDO0FBRXhDLFlBQUssVUFBVSxJQUFJLE1BQU0sQ0FBQyxVQUFQLENBQW1CLElBQW5CLENBQW5CLEVBQStDO0FBRTlDLFVBQUEsRUFBRSxHQUFHLElBQUksQ0FBRSxXQUFGLENBQVQ7QUFDQSxVQUFBLElBQUksR0FBRyxFQUFFLElBQUksS0FBSyxDQUFFLEVBQUYsQ0FBbEI7O0FBRUEsY0FBSyxJQUFMLEVBQVk7QUFDWCxnQkFBSyxJQUFJLENBQUMsTUFBVixFQUFtQjtBQUNsQixtQkFBTSxJQUFOLElBQWMsSUFBSSxDQUFDLE1BQW5CLEVBQTRCO0FBQzNCLG9CQUFLLE9BQU8sQ0FBRSxJQUFGLENBQVosRUFBdUI7QUFDdEIsa0JBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYSxNQUFiLENBQXFCLElBQXJCLEVBQTJCLElBQTNCLEVBRHNCLENBR3ZCO0FBQ0MsaUJBSkQsTUFJTztBQUNOLGtCQUFBLE1BQU0sQ0FBQyxXQUFQLENBQW9CLElBQXBCLEVBQTBCLElBQTFCLEVBQWdDLElBQUksQ0FBQyxNQUFyQztBQUNBO0FBQ0Q7QUFDRCxhQVhVLENBYVg7OztBQUNBLGdCQUFLLEtBQUssQ0FBRSxFQUFGLENBQVYsRUFBbUI7QUFFbEIscUJBQU8sS0FBSyxDQUFFLEVBQUYsQ0FBWixDQUZrQixDQUlsQjtBQUNBO0FBQ0E7O0FBQ0Esa0JBQUssYUFBTCxFQUFxQjtBQUNwQix1QkFBTyxJQUFJLENBQUUsV0FBRixDQUFYO0FBRUEsZUFIRCxNQUdPLElBQUssSUFBSSxDQUFDLGVBQVYsRUFBNEI7QUFDbEMsZ0JBQUEsSUFBSSxDQUFDLGVBQUwsQ0FBc0IsV0FBdEI7QUFFQSxlQUhNLE1BR0E7QUFDTixnQkFBQSxJQUFJLENBQUUsV0FBRixDQUFKLEdBQXNCLElBQXRCO0FBQ0E7O0FBRUQsY0FBQSxNQUFNLENBQUMsVUFBUCxDQUFrQixJQUFsQixDQUF3QixFQUF4QjtBQUNBO0FBQ0Q7QUFDRDtBQUNEO0FBQ0Q7QUF0UFksR0FBZCxFQTk2TCtCLENBc3FNL0I7O0FBQ0EsR0FBQyxZQUFXO0FBRVosUUFBSSxPQUFKLEVBQWEsT0FBYixDQUZZLENBSVo7QUFDQTtBQUNBOztBQUNBLElBQUEsTUFBTSxDQUFDLE9BQVAsR0FBaUIsVUFBVSxFQUFWLEVBQWU7QUFDL0IsTUFBQSxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQUgsRUFBTDtBQUVBLFVBQUksS0FBSyxHQUFHLHdCQUF3QixJQUF4QixDQUE4QixFQUE5QixLQUNYLHdCQUF3QixJQUF4QixDQUE4QixFQUE5QixDQURXLElBRVgscUNBQXFDLElBQXJDLENBQTJDLEVBQTNDLENBRlcsSUFHWCxrQkFBa0IsSUFBbEIsQ0FBd0IsRUFBeEIsQ0FIVyxJQUlYLEVBQUUsQ0FBQyxPQUFILENBQVcsWUFBWCxJQUEyQixDQUEzQixJQUFnQyxnQ0FBZ0MsSUFBaEMsQ0FBc0MsRUFBdEMsQ0FKckIsSUFLWCxFQUxEO0FBT0EsYUFBTztBQUNOLFFBQUEsT0FBTyxFQUFFLEtBQUssQ0FBRSxDQUFGLENBQUwsSUFBYyxFQURqQjtBQUVOLFFBQUEsT0FBTyxFQUFFLEtBQUssQ0FBRSxDQUFGLENBQUwsSUFBYztBQUZqQixPQUFQO0FBSUEsS0FkRDs7QUFnQkEsSUFBQSxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQVAsQ0FBZ0IsU0FBUyxDQUFDLFNBQTFCLENBQVY7QUFDQSxJQUFBLE9BQU8sR0FBRyxFQUFWOztBQUVBLFFBQUssT0FBTyxDQUFDLE9BQWIsRUFBdUI7QUFDdEIsTUFBQSxPQUFPLENBQUUsT0FBTyxDQUFDLE9BQVYsQ0FBUCxHQUE2QixJQUE3QjtBQUNBLE1BQUEsT0FBTyxDQUFDLE9BQVIsR0FBa0IsT0FBTyxDQUFDLE9BQTFCO0FBQ0EsS0E3QlcsQ0ErQlo7OztBQUNBLFFBQUssT0FBTyxDQUFDLE1BQWIsRUFBc0I7QUFDckIsTUFBQSxPQUFPLENBQUMsTUFBUixHQUFpQixJQUFqQjtBQUNBLEtBRkQsTUFFTyxJQUFLLE9BQU8sQ0FBQyxNQUFiLEVBQXNCO0FBQzVCLE1BQUEsT0FBTyxDQUFDLE1BQVIsR0FBaUIsSUFBakI7QUFDQTs7QUFFRCxJQUFBLE1BQU0sQ0FBQyxPQUFQLEdBQWlCLE9BQWpCOztBQUVBLElBQUEsTUFBTSxDQUFDLEdBQVAsR0FBYSxZQUFXO0FBQ3ZCLGVBQVMsU0FBVCxDQUFvQixRQUFwQixFQUE4QixPQUE5QixFQUF3QztBQUN2QyxlQUFPLElBQUksU0FBUyxDQUFDLEVBQVYsQ0FBYSxJQUFqQixDQUF1QixRQUF2QixFQUFpQyxPQUFqQyxDQUFQO0FBQ0E7O0FBQ0QsTUFBQSxNQUFNLENBQUMsTUFBUCxDQUFlLElBQWYsRUFBcUIsU0FBckIsRUFBZ0MsSUFBaEM7QUFDQSxNQUFBLFNBQVMsQ0FBQyxVQUFWLEdBQXVCLElBQXZCO0FBQ0EsTUFBQSxTQUFTLENBQUMsRUFBVixHQUFlLFNBQVMsQ0FBQyxTQUFWLEdBQXNCLE1BQXJDO0FBQ0EsTUFBQSxTQUFTLENBQUMsRUFBVixDQUFhLFdBQWIsR0FBMkIsU0FBM0I7QUFDQSxNQUFBLFNBQVMsQ0FBQyxHQUFWLEdBQWdCLEtBQUssR0FBckI7O0FBQ0EsTUFBQSxTQUFTLENBQUMsRUFBVixDQUFhLElBQWIsR0FBb0IsU0FBUyxJQUFULENBQWUsUUFBZixFQUF5QixPQUF6QixFQUFtQztBQUN0RCxZQUFLLE9BQU8sSUFBSSxPQUFPLFlBQVksTUFBOUIsSUFBd0MsRUFBRSxPQUFPLFlBQVksU0FBckIsQ0FBN0MsRUFBK0U7QUFDOUUsVUFBQSxPQUFPLEdBQUcsU0FBUyxDQUFFLE9BQUYsQ0FBbkI7QUFDQTs7QUFFRCxlQUFPLE1BQU0sQ0FBQyxFQUFQLENBQVUsSUFBVixDQUFlLElBQWYsQ0FBcUIsSUFBckIsRUFBMkIsUUFBM0IsRUFBcUMsT0FBckMsRUFBOEMsYUFBOUMsQ0FBUDtBQUNBLE9BTkQ7O0FBT0EsTUFBQSxTQUFTLENBQUMsRUFBVixDQUFhLElBQWIsQ0FBa0IsU0FBbEIsR0FBOEIsU0FBUyxDQUFDLEVBQXhDO0FBQ0EsVUFBSSxhQUFhLEdBQUcsU0FBUyxDQUFDLFFBQUQsQ0FBN0I7QUFDQSxhQUFPLFNBQVA7QUFDQSxLQW5CRDtBQXFCQyxHQTdERDs7QUE4REEsTUFBSSxNQUFKO0FBQUEsTUFBWSxNQUFaO0FBQUEsTUFBb0IsU0FBcEI7QUFBQSxNQUNDLE1BQU0sR0FBRyxpQkFEVjtBQUFBLE1BRUMsUUFBUSxHQUFHLGlCQUZaO0FBQUEsTUFHQyxTQUFTLEdBQUcsMkJBSGI7QUFBQSxNQUlDO0FBQ0E7QUFDQSxFQUFBLFlBQVksR0FBRywyQkFOaEI7QUFBQSxNQU9DLE9BQU8sR0FBRyxTQVBYO0FBQUEsTUFRQyxTQUFTLEdBQUcsSUFBSSxNQUFKLENBQVksT0FBTyxTQUFQLEdBQW1CLFFBQS9CLEVBQXlDLEdBQXpDLENBUmI7QUFBQSxNQVNDLFNBQVMsR0FBRyxJQUFJLE1BQUosQ0FBWSxPQUFPLFNBQVAsR0FBbUIsaUJBQS9CLEVBQWtELEdBQWxELENBVGI7QUFBQSxNQVVDLE9BQU8sR0FBRyxJQUFJLE1BQUosQ0FBWSxjQUFjLFNBQWQsR0FBMEIsR0FBdEMsRUFBMkMsR0FBM0MsQ0FWWDtBQUFBLE1BV0MsV0FBVyxHQUFHLEVBWGY7QUFBQSxNQWFDLE9BQU8sR0FBRztBQUFFLElBQUEsUUFBUSxFQUFFLFVBQVo7QUFBd0IsSUFBQSxVQUFVLEVBQUUsUUFBcEM7QUFBOEMsSUFBQSxPQUFPLEVBQUU7QUFBdkQsR0FiWDtBQUFBLE1BY0Msa0JBQWtCLEdBQUc7QUFDcEIsSUFBQSxhQUFhLEVBQUUsQ0FESztBQUVwQixJQUFBLFVBQVUsRUFBRTtBQUZRLEdBZHRCO0FBQUEsTUFtQkMsU0FBUyxHQUFHLENBQUUsS0FBRixFQUFTLE9BQVQsRUFBa0IsUUFBbEIsRUFBNEIsTUFBNUIsQ0FuQmI7QUFBQSxNQW9CQyxXQUFXLEdBQUcsQ0FBRSxRQUFGLEVBQVksR0FBWixFQUFpQixLQUFqQixFQUF3QixJQUF4QixDQXBCZjtBQUFBLE1Bc0JDLFlBQVksR0FBRyxNQUFNLENBQUMsRUFBUCxDQUFVLE1BdEIxQixDQXJ1TStCLENBNnZNL0I7O0FBQ0EsV0FBUyxjQUFULENBQXlCLEtBQXpCLEVBQWdDLElBQWhDLEVBQXVDO0FBRXRDO0FBQ0EsUUFBSyxJQUFJLElBQUksS0FBYixFQUFxQjtBQUNwQixhQUFPLElBQVA7QUFDQSxLQUxxQyxDQU90Qzs7O0FBQ0EsUUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQUwsQ0FBWSxDQUFaLEVBQWUsV0FBZixLQUErQixJQUFJLENBQUMsS0FBTCxDQUFXLENBQVgsQ0FBN0M7QUFBQSxRQUNDLFFBQVEsR0FBRyxJQURaO0FBQUEsUUFFQyxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BRmpCOztBQUlBLFdBQVEsQ0FBQyxFQUFULEVBQWM7QUFDYixNQUFBLElBQUksR0FBRyxXQUFXLENBQUUsQ0FBRixDQUFYLEdBQW1CLE9BQTFCOztBQUNBLFVBQUssSUFBSSxJQUFJLEtBQWIsRUFBcUI7QUFDcEIsZUFBTyxJQUFQO0FBQ0E7QUFDRDs7QUFFRCxXQUFPLFFBQVA7QUFDQTs7QUFFRCxXQUFTLFFBQVQsQ0FBbUIsSUFBbkIsRUFBeUIsRUFBekIsRUFBOEI7QUFDN0IsSUFBQSxJQUFJLEdBQUcsRUFBRSxJQUFJLElBQWI7QUFDQSxXQUFPLE1BQU0sQ0FBQyxHQUFQLENBQVksSUFBWixFQUFrQixTQUFsQixNQUFrQyxNQUFsQyxJQUE0QyxDQUFDLE1BQU0sQ0FBQyxRQUFQLENBQWlCLElBQUksQ0FBQyxhQUF0QixFQUFxQyxJQUFyQyxDQUFwRDtBQUNBOztBQUVELFdBQVMsUUFBVCxDQUFtQixRQUFuQixFQUE2QixJQUE3QixFQUFvQztBQUNuQyxRQUFJLElBQUo7QUFBQSxRQUFVLE9BQVY7QUFBQSxRQUNDLE1BQU0sR0FBRyxFQURWO0FBQUEsUUFFQyxLQUFLLEdBQUcsQ0FGVDtBQUFBLFFBR0MsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUhuQjs7QUFLQSxXQUFRLEtBQUssR0FBRyxNQUFoQixFQUF3QixLQUFLLEVBQTdCLEVBQWtDO0FBQ2pDLE1BQUEsSUFBSSxHQUFHLFFBQVEsQ0FBRSxLQUFGLENBQWY7O0FBQ0EsVUFBSyxDQUFDLElBQUksQ0FBQyxLQUFYLEVBQW1CO0FBQ2xCO0FBQ0E7O0FBQ0QsTUFBQSxNQUFNLENBQUUsS0FBRixDQUFOLEdBQWtCLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZCxFQUFvQixZQUFwQixDQUFsQjs7QUFDQSxVQUFLLElBQUwsRUFBWTtBQUNYO0FBQ0E7QUFDQSxZQUFLLENBQUMsTUFBTSxDQUFFLEtBQUYsQ0FBUCxJQUFvQixJQUFJLENBQUMsS0FBTCxDQUFXLE9BQVgsS0FBdUIsTUFBaEQsRUFBeUQ7QUFDeEQsVUFBQSxJQUFJLENBQUMsS0FBTCxDQUFXLE9BQVgsR0FBcUIsRUFBckI7QUFDQSxTQUxVLENBT1g7QUFDQTtBQUNBOzs7QUFDQSxZQUFLLElBQUksQ0FBQyxLQUFMLENBQVcsT0FBWCxLQUF1QixFQUF2QixJQUE2QixRQUFRLENBQUUsSUFBRixDQUExQyxFQUFxRDtBQUNwRCxVQUFBLE1BQU0sQ0FBRSxLQUFGLENBQU4sR0FBa0IsTUFBTSxDQUFDLEtBQVAsQ0FBYyxJQUFkLEVBQW9CLFlBQXBCLEVBQWtDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFOLENBQXBELENBQWxCO0FBQ0E7QUFDRCxPQWJELE1BYU87QUFDTixRQUFBLE9BQU8sR0FBRyxNQUFNLENBQUUsSUFBRixFQUFRLFNBQVIsQ0FBaEI7O0FBRUEsWUFBSyxDQUFDLE1BQU0sQ0FBRSxLQUFGLENBQVAsSUFBb0IsT0FBTyxLQUFLLE1BQXJDLEVBQThDO0FBQzdDLFVBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYyxJQUFkLEVBQW9CLFlBQXBCLEVBQWtDLE9BQWxDO0FBQ0E7QUFDRDtBQUNELEtBaENrQyxDQWtDbkM7QUFDQTs7O0FBQ0EsU0FBTSxLQUFLLEdBQUcsQ0FBZCxFQUFpQixLQUFLLEdBQUcsTUFBekIsRUFBaUMsS0FBSyxFQUF0QyxFQUEyQztBQUMxQyxNQUFBLElBQUksR0FBRyxRQUFRLENBQUUsS0FBRixDQUFmOztBQUNBLFVBQUssQ0FBQyxJQUFJLENBQUMsS0FBWCxFQUFtQjtBQUNsQjtBQUNBOztBQUNELFVBQUssQ0FBQyxJQUFELElBQVMsSUFBSSxDQUFDLEtBQUwsQ0FBVyxPQUFYLEtBQXVCLE1BQWhDLElBQTBDLElBQUksQ0FBQyxLQUFMLENBQVcsT0FBWCxLQUF1QixFQUF0RSxFQUEyRTtBQUMxRSxRQUFBLElBQUksQ0FBQyxLQUFMLENBQVcsT0FBWCxHQUFxQixJQUFJLEdBQUcsTUFBTSxDQUFFLEtBQUYsQ0FBTixJQUFtQixFQUF0QixHQUEyQixNQUFwRDtBQUNBO0FBQ0Q7O0FBRUQsV0FBTyxRQUFQO0FBQ0E7O0FBRUQsRUFBQSxNQUFNLENBQUMsRUFBUCxDQUFVLE1BQVYsQ0FBaUI7QUFDaEIsSUFBQSxHQUFHLEVBQUUsYUFBVSxJQUFWLEVBQWdCLEtBQWhCLEVBQXdCO0FBQzVCLGFBQU8sTUFBTSxDQUFDLE1BQVAsQ0FBZSxJQUFmLEVBQXFCLFVBQVUsSUFBVixFQUFnQixJQUFoQixFQUFzQixLQUF0QixFQUE4QjtBQUN6RCxlQUFPLEtBQUssS0FBSyxTQUFWLEdBQ04sTUFBTSxDQUFDLEtBQVAsQ0FBYyxJQUFkLEVBQW9CLElBQXBCLEVBQTBCLEtBQTFCLENBRE0sR0FFTixNQUFNLENBQUMsR0FBUCxDQUFZLElBQVosRUFBa0IsSUFBbEIsQ0FGRDtBQUdBLE9BSk0sRUFJSixJQUpJLEVBSUUsS0FKRixFQUlTLFNBQVMsQ0FBQyxNQUFWLEdBQW1CLENBSjVCLENBQVA7QUFLQSxLQVBlO0FBUWhCLElBQUEsSUFBSSxFQUFFLGdCQUFXO0FBQ2hCLGFBQU8sUUFBUSxDQUFFLElBQUYsRUFBUSxJQUFSLENBQWY7QUFDQSxLQVZlO0FBV2hCLElBQUEsSUFBSSxFQUFFLGdCQUFXO0FBQ2hCLGFBQU8sUUFBUSxDQUFFLElBQUYsQ0FBZjtBQUNBLEtBYmU7QUFjaEIsSUFBQSxNQUFNLEVBQUUsZ0JBQVUsS0FBVixFQUFpQixHQUFqQixFQUF1QjtBQUM5QixVQUFJLElBQUksR0FBRyxPQUFPLEtBQVAsS0FBaUIsU0FBNUI7O0FBRUEsVUFBSyxNQUFNLENBQUMsVUFBUCxDQUFtQixLQUFuQixLQUE4QixNQUFNLENBQUMsVUFBUCxDQUFtQixHQUFuQixDQUFuQyxFQUE4RDtBQUM3RCxlQUFPLFlBQVksQ0FBQyxLQUFiLENBQW9CLElBQXBCLEVBQTBCLFNBQTFCLENBQVA7QUFDQTs7QUFFRCxhQUFPLEtBQUssSUFBTCxDQUFVLFlBQVc7QUFDM0IsWUFBSyxJQUFJLEdBQUcsS0FBSCxHQUFXLFFBQVEsQ0FBRSxJQUFGLENBQTVCLEVBQXVDO0FBQ3RDLFVBQUEsTUFBTSxDQUFFLElBQUYsQ0FBTixDQUFlLElBQWY7QUFDQSxTQUZELE1BRU87QUFDTixVQUFBLE1BQU0sQ0FBRSxJQUFGLENBQU4sQ0FBZSxJQUFmO0FBQ0E7QUFDRCxPQU5NLENBQVA7QUFPQTtBQTVCZSxHQUFqQjtBQStCQSxFQUFBLE1BQU0sQ0FBQyxNQUFQLENBQWM7QUFDYjtBQUNBO0FBQ0EsSUFBQSxRQUFRLEVBQUU7QUFDVCxNQUFBLE9BQU8sRUFBRTtBQUNSLFFBQUEsR0FBRyxFQUFFLGFBQVUsSUFBVixFQUFnQixRQUFoQixFQUEyQjtBQUMvQixjQUFLLFFBQUwsRUFBZ0I7QUFDZjtBQUNBLGdCQUFJLEdBQUcsR0FBRyxNQUFNLENBQUUsSUFBRixFQUFRLFNBQVIsQ0FBaEI7QUFDQSxtQkFBTyxHQUFHLEtBQUssRUFBUixHQUFhLEdBQWIsR0FBbUIsR0FBMUI7QUFFQTtBQUNEO0FBUk87QUFEQSxLQUhHO0FBZ0JiO0FBQ0EsSUFBQSxTQUFTLEVBQUU7QUFDVixxQkFBZSxJQURMO0FBRVYsb0JBQWMsSUFGSjtBQUdWLG9CQUFjLElBSEo7QUFJVixpQkFBVyxJQUpEO0FBS1YsaUJBQVcsSUFMRDtBQU1WLGdCQUFVLElBTkE7QUFPVixnQkFBVSxJQVBBO0FBUVYsY0FBUTtBQVJFLEtBakJFO0FBNEJiO0FBQ0E7QUFDQSxJQUFBLFFBQVEsRUFBRTtBQUNUO0FBQ0EsZUFBUyxNQUFNLENBQUMsT0FBUCxDQUFlLFFBQWYsR0FBMEIsVUFBMUIsR0FBdUM7QUFGdkMsS0E5Qkc7QUFtQ2I7QUFDQSxJQUFBLEtBQUssRUFBRSxlQUFVLElBQVYsRUFBZ0IsSUFBaEIsRUFBc0IsS0FBdEIsRUFBNkIsS0FBN0IsRUFBcUM7QUFDM0M7QUFDQSxVQUFLLENBQUMsSUFBRCxJQUFTLElBQUksQ0FBQyxRQUFMLEtBQWtCLENBQTNCLElBQWdDLElBQUksQ0FBQyxRQUFMLEtBQWtCLENBQWxELElBQXVELENBQUMsSUFBSSxDQUFDLEtBQWxFLEVBQTBFO0FBQ3pFO0FBQ0EsT0FKMEMsQ0FNM0M7OztBQUNBLFVBQUksR0FBSjtBQUFBLFVBQVMsSUFBVDtBQUFBLFVBQWUsS0FBZjtBQUFBLFVBQ0MsUUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFQLENBQWtCLElBQWxCLENBRFo7QUFBQSxVQUVDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FGZDtBQUlBLE1BQUEsSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFQLENBQWlCLFFBQWpCLE1BQWlDLE1BQU0sQ0FBQyxRQUFQLENBQWlCLFFBQWpCLElBQThCLGNBQWMsQ0FBRSxLQUFGLEVBQVMsUUFBVCxDQUE3RSxDQUFQLENBWDJDLENBYTNDO0FBQ0E7O0FBQ0EsTUFBQSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVAsQ0FBaUIsSUFBakIsS0FBMkIsTUFBTSxDQUFDLFFBQVAsQ0FBaUIsUUFBakIsQ0FBbkMsQ0FmMkMsQ0FpQjNDOztBQUNBLFVBQUssS0FBSyxLQUFLLFNBQWYsRUFBMkI7QUFDMUIsUUFBQSxJQUFJLFdBQVUsS0FBVixDQUFKLENBRDBCLENBRzFCOztBQUNBLFlBQUssSUFBSSxLQUFLLFFBQVQsS0FBc0IsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFSLENBQWMsS0FBZCxDQUE1QixDQUFMLEVBQTBEO0FBQ3pELFVBQUEsS0FBSyxHQUFHLENBQUUsR0FBRyxDQUFDLENBQUQsQ0FBSCxHQUFTLENBQVgsSUFBaUIsR0FBRyxDQUFDLENBQUQsQ0FBcEIsR0FBMEIsVUFBVSxDQUFFLE1BQU0sQ0FBQyxHQUFQLENBQVksSUFBWixFQUFrQixJQUFsQixDQUFGLENBQTVDLENBRHlELENBRXpEOztBQUNBLFVBQUEsSUFBSSxHQUFHLFFBQVA7QUFDQSxTQVJ5QixDQVUxQjs7O0FBQ0EsWUFBSyxLQUFLLElBQUksSUFBVCxJQUFpQixJQUFJLEtBQUssUUFBVCxJQUFxQixLQUFLLENBQUUsS0FBRixDQUFoRCxFQUE0RDtBQUMzRDtBQUNBLFNBYnlCLENBZTFCOzs7QUFDQSxZQUFLLElBQUksS0FBSyxRQUFULElBQXFCLENBQUMsTUFBTSxDQUFDLFNBQVAsQ0FBa0IsUUFBbEIsQ0FBM0IsRUFBMEQ7QUFDekQsVUFBQSxLQUFLLElBQUksSUFBVDtBQUNBLFNBbEJ5QixDQW9CMUI7OztBQUNBLFlBQUssQ0FBQyxLQUFELElBQVUsRUFBRSxTQUFTLEtBQVgsQ0FBVixJQUErQixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBTixDQUFXLElBQVgsRUFBaUIsS0FBakIsRUFBd0IsS0FBeEIsQ0FBVCxNQUE4QyxTQUFsRixFQUE4RjtBQUM3RjtBQUNBO0FBQ0EsY0FBSTtBQUNILFlBQUEsS0FBSyxDQUFFLElBQUYsQ0FBTCxHQUFnQixLQUFoQjtBQUNBLFdBRkQsQ0FFRSxPQUFNLENBQU4sRUFBUyxDQUFFO0FBQ2I7QUFFRCxPQTdCRCxNQTZCTztBQUNOO0FBQ0EsWUFBSyxLQUFLLElBQUksU0FBUyxLQUFsQixJQUEyQixDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBTixDQUFXLElBQVgsRUFBaUIsS0FBakIsRUFBd0IsS0FBeEIsQ0FBUCxNQUE0QyxTQUE1RSxFQUF3RjtBQUN2RixpQkFBTyxHQUFQO0FBQ0EsU0FKSyxDQU1OOzs7QUFDQSxlQUFPLEtBQUssQ0FBRSxJQUFGLENBQVo7QUFDQTtBQUNELEtBNUZZO0FBOEZiLElBQUEsR0FBRyxFQUFFLGFBQVUsSUFBVixFQUFnQixJQUFoQixFQUFzQixPQUF0QixFQUErQixLQUEvQixFQUF1QztBQUMzQyxVQUFJLEdBQUo7QUFBQSxVQUFTLEdBQVQ7QUFBQSxVQUFjLEtBQWQ7QUFBQSxVQUNDLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUCxDQUFrQixJQUFsQixDQURaLENBRDJDLENBSTNDOztBQUNBLE1BQUEsSUFBSSxHQUFHLE1BQU0sQ0FBQyxRQUFQLENBQWlCLFFBQWpCLE1BQWlDLE1BQU0sQ0FBQyxRQUFQLENBQWlCLFFBQWpCLElBQThCLGNBQWMsQ0FBRSxJQUFJLENBQUMsS0FBUCxFQUFjLFFBQWQsQ0FBN0UsQ0FBUCxDQUwyQyxDQU8zQztBQUNBOztBQUNBLE1BQUEsS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFQLENBQWlCLElBQWpCLEtBQTJCLE1BQU0sQ0FBQyxRQUFQLENBQWlCLFFBQWpCLENBQW5DLENBVDJDLENBVzNDOztBQUNBLFVBQUssS0FBSyxJQUFJLFNBQVMsS0FBdkIsRUFBK0I7QUFDOUIsUUFBQSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQU4sQ0FBVyxJQUFYLEVBQWlCLElBQWpCLEVBQXVCLEtBQXZCLENBQU47QUFDQSxPQWQwQyxDQWdCM0M7OztBQUNBLFVBQUssR0FBRyxLQUFLLFNBQWIsRUFBeUI7QUFDeEIsUUFBQSxHQUFHLEdBQUcsTUFBTSxDQUFFLElBQUYsRUFBUSxJQUFSLENBQVo7QUFDQSxPQW5CMEMsQ0FxQjNDOzs7QUFDQSxVQUFLLEdBQUcsS0FBSyxRQUFSLElBQW9CLElBQUksSUFBSSxrQkFBakMsRUFBc0Q7QUFDckQsUUFBQSxHQUFHLEdBQUcsa0JBQWtCLENBQUUsSUFBRixDQUF4QjtBQUNBLE9BeEIwQyxDQTBCM0M7OztBQUNBLFVBQUssT0FBTyxJQUFJLEtBQUssS0FBSyxTQUExQixFQUFzQztBQUNyQyxRQUFBLEdBQUcsR0FBRyxVQUFVLENBQUUsR0FBRixDQUFoQjtBQUNBLGVBQU8sT0FBTyxJQUFJLE1BQU0sQ0FBQyxTQUFQLENBQWtCLEdBQWxCLENBQVgsR0FBcUMsR0FBRyxJQUFJLENBQTVDLEdBQWdELEdBQXZEO0FBQ0E7O0FBQ0QsYUFBTyxHQUFQO0FBQ0EsS0E5SFk7QUFnSWI7QUFDQSxJQUFBLElBQUksRUFBRSxjQUFVLElBQVYsRUFBZ0IsT0FBaEIsRUFBeUIsUUFBekIsRUFBb0M7QUFDekMsVUFBSSxHQUFKO0FBQUEsVUFBUyxJQUFUO0FBQUEsVUFDQyxHQUFHLEdBQUcsRUFEUCxDQUR5QyxDQUl6Qzs7QUFDQSxXQUFNLElBQU4sSUFBYyxPQUFkLEVBQXdCO0FBQ3ZCLFFBQUEsR0FBRyxDQUFFLElBQUYsQ0FBSCxHQUFjLElBQUksQ0FBQyxLQUFMLENBQVksSUFBWixDQUFkO0FBQ0EsUUFBQSxJQUFJLENBQUMsS0FBTCxDQUFZLElBQVosSUFBcUIsT0FBTyxDQUFFLElBQUYsQ0FBNUI7QUFDQTs7QUFFRCxNQUFBLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBVCxDQUFlLElBQWYsQ0FBTixDQVZ5QyxDQVl6Qzs7QUFDQSxXQUFNLElBQU4sSUFBYyxPQUFkLEVBQXdCO0FBQ3ZCLFFBQUEsSUFBSSxDQUFDLEtBQUwsQ0FBWSxJQUFaLElBQXFCLEdBQUcsQ0FBRSxJQUFGLENBQXhCO0FBQ0E7O0FBRUQsYUFBTyxHQUFQO0FBQ0E7QUFuSlksR0FBZCxFQXoyTStCLENBKy9NL0I7QUFDQTs7QUFDQSxNQUFLLE1BQU0sQ0FBQyxnQkFBWixFQUErQjtBQUM5QixJQUFBLE1BQU0sR0FBRyxnQkFBVSxJQUFWLEVBQWdCLElBQWhCLEVBQXVCO0FBQy9CLFVBQUksR0FBSjtBQUFBLFVBQVMsS0FBVDtBQUFBLFVBQWdCLFFBQWhCO0FBQUEsVUFBMEIsUUFBMUI7QUFBQSxVQUNDLFFBQVEsR0FBRyxNQUFNLENBQUMsZ0JBQVAsQ0FBeUIsSUFBekIsRUFBK0IsSUFBL0IsQ0FEWjtBQUFBLFVBRUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUZkOztBQUlBLFVBQUssUUFBTCxFQUFnQjtBQUVmLFFBQUEsR0FBRyxHQUFHLFFBQVEsQ0FBRSxJQUFGLENBQWQ7O0FBQ0EsWUFBSyxHQUFHLEtBQUssRUFBUixJQUFjLENBQUMsTUFBTSxDQUFDLFFBQVAsQ0FBaUIsSUFBSSxDQUFDLGFBQXRCLEVBQXFDLElBQXJDLENBQXBCLEVBQWtFO0FBQ2pFLFVBQUEsR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZCxFQUFvQixJQUFwQixDQUFOO0FBQ0EsU0FMYyxDQU9mO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxZQUFLLFNBQVMsQ0FBQyxJQUFWLENBQWdCLEdBQWhCLEtBQXlCLE9BQU8sQ0FBQyxJQUFSLENBQWMsSUFBZCxDQUE5QixFQUFxRDtBQUNwRCxVQUFBLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBZDtBQUNBLFVBQUEsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFqQjtBQUNBLFVBQUEsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFqQjtBQUVBLFVBQUEsS0FBSyxDQUFDLFFBQU4sR0FBaUIsS0FBSyxDQUFDLFFBQU4sR0FBaUIsS0FBSyxDQUFDLEtBQU4sR0FBYyxHQUFoRDtBQUNBLFVBQUEsR0FBRyxHQUFHLFFBQVEsQ0FBQyxLQUFmO0FBRUEsVUFBQSxLQUFLLENBQUMsS0FBTixHQUFjLEtBQWQ7QUFDQSxVQUFBLEtBQUssQ0FBQyxRQUFOLEdBQWlCLFFBQWpCO0FBQ0EsVUFBQSxLQUFLLENBQUMsUUFBTixHQUFpQixRQUFqQjtBQUNBO0FBQ0Q7O0FBRUQsYUFBTyxHQUFQO0FBQ0EsS0EvQkQ7QUFnQ0EsR0FqQ0QsTUFpQ08sSUFBSyxRQUFRLENBQUMsZUFBVCxDQUF5QixZQUE5QixFQUE2QztBQUNuRCxJQUFBLE1BQU0sR0FBRyxnQkFBVSxJQUFWLEVBQWdCLElBQWhCLEVBQXVCO0FBQy9CLFVBQUksSUFBSjtBQUFBLFVBQVUsTUFBVjtBQUFBLFVBQ0MsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFMLElBQXFCLElBQUksQ0FBQyxZQUFMLENBQW1CLElBQW5CLENBRDVCO0FBQUEsVUFFQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBRmQsQ0FEK0IsQ0FLL0I7QUFDQTs7QUFDQSxVQUFLLEdBQUcsSUFBSSxJQUFQLElBQWUsS0FBZixJQUF3QixLQUFLLENBQUUsSUFBRixDQUFsQyxFQUE2QztBQUM1QyxRQUFBLEdBQUcsR0FBRyxLQUFLLENBQUUsSUFBRixDQUFYO0FBQ0EsT0FUOEIsQ0FXL0I7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxVQUFLLFNBQVMsQ0FBQyxJQUFWLENBQWdCLEdBQWhCLEtBQXlCLENBQUMsU0FBUyxDQUFDLElBQVYsQ0FBZ0IsSUFBaEIsQ0FBL0IsRUFBd0Q7QUFFdkQ7QUFDQSxRQUFBLElBQUksR0FBRyxLQUFLLENBQUMsSUFBYjtBQUNBLFFBQUEsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFMLElBQXFCLElBQUksQ0FBQyxZQUFMLENBQWtCLElBQWhELENBSnVELENBTXZEOztBQUNBLFlBQUssTUFBTCxFQUFjO0FBQ2IsVUFBQSxJQUFJLENBQUMsWUFBTCxDQUFrQixJQUFsQixHQUF5QixJQUFJLENBQUMsWUFBTCxDQUFrQixJQUEzQztBQUNBOztBQUNELFFBQUEsS0FBSyxDQUFDLElBQU4sR0FBYSxJQUFJLEtBQUssVUFBVCxHQUFzQixLQUF0QixHQUE4QixHQUEzQztBQUNBLFFBQUEsR0FBRyxHQUFHLEtBQUssQ0FBQyxTQUFOLEdBQWtCLElBQXhCLENBWHVELENBYXZEOztBQUNBLFFBQUEsS0FBSyxDQUFDLElBQU4sR0FBYSxJQUFiOztBQUNBLFlBQUssTUFBTCxFQUFjO0FBQ2IsVUFBQSxJQUFJLENBQUMsWUFBTCxDQUFrQixJQUFsQixHQUF5QixNQUF6QjtBQUNBO0FBQ0Q7O0FBRUQsYUFBTyxHQUFHLEtBQUssRUFBUixHQUFhLE1BQWIsR0FBc0IsR0FBN0I7QUFDQSxLQXZDRDtBQXdDQTs7QUFFRCxXQUFTLGlCQUFULENBQTRCLElBQTVCLEVBQWtDLEtBQWxDLEVBQXlDLFFBQXpDLEVBQW9EO0FBQ25ELFFBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQyxJQUFWLENBQWdCLEtBQWhCLENBQWQ7QUFDQSxXQUFPLE9BQU8sR0FDWixJQUFJLENBQUMsR0FBTCxDQUFVLENBQVYsRUFBYSxPQUFPLENBQUUsQ0FBRixDQUFQLElBQWlCLFFBQVEsSUFBSSxDQUE3QixDQUFiLEtBQW9ELE9BQU8sQ0FBRSxDQUFGLENBQVAsSUFBZ0IsSUFBcEUsQ0FEWSxHQUVaLEtBRkY7QUFHQTs7QUFFRCxXQUFTLG9CQUFULENBQStCLElBQS9CLEVBQXFDLElBQXJDLEVBQTJDLEtBQTNDLEVBQWtELFdBQWxELEVBQWdFO0FBQy9ELFFBQUksQ0FBQyxHQUFHLEtBQUssTUFBTyxXQUFXLEdBQUcsUUFBSCxHQUFjLFNBQWhDLENBQUwsR0FDUDtBQUNBLEtBRk8sR0FHUDtBQUNBLElBQUEsSUFBSSxLQUFLLE9BQVQsR0FBbUIsQ0FBbkIsR0FBdUIsQ0FKeEI7QUFBQSxRQU1DLEdBQUcsR0FBRyxDQU5QOztBQVFBLFdBQVEsQ0FBQyxHQUFHLENBQVosRUFBZSxDQUFDLElBQUksQ0FBcEIsRUFBd0I7QUFDdkI7QUFDQSxVQUFLLEtBQUssS0FBSyxRQUFmLEVBQTBCO0FBQ3pCO0FBQ0E7QUFDQSxRQUFBLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBUCxDQUFZLElBQVosRUFBa0IsS0FBSyxHQUFHLFNBQVMsQ0FBRSxDQUFGLENBQW5DLEVBQTBDLElBQTFDLENBQVA7QUFDQSxPQU5zQixDQVF2Qjs7O0FBQ0EsVUFBSyxXQUFMLEVBQW1CO0FBQ2xCO0FBQ0EsWUFBSyxLQUFLLEtBQUssU0FBZixFQUEyQjtBQUMxQixVQUFBLEdBQUcsSUFBSSxVQUFVLENBQUUsTUFBTSxDQUFFLElBQUYsRUFBUSxZQUFZLFNBQVMsQ0FBRSxDQUFGLENBQTdCLENBQVIsQ0FBVixJQUE0RCxDQUFuRTtBQUNBLFNBSmlCLENBTWxCOzs7QUFDQSxZQUFLLEtBQUssS0FBSyxRQUFmLEVBQTBCO0FBQ3pCLFVBQUEsR0FBRyxJQUFJLFVBQVUsQ0FBRSxNQUFNLENBQUUsSUFBRixFQUFRLFdBQVcsU0FBUyxDQUFFLENBQUYsQ0FBcEIsR0FBNEIsT0FBcEMsQ0FBUixDQUFWLElBQXFFLENBQTVFO0FBQ0E7QUFDRCxPQVZELE1BVU87QUFDTjtBQUNBLFFBQUEsR0FBRyxJQUFJLFVBQVUsQ0FBRSxNQUFNLENBQUUsSUFBRixFQUFRLFlBQVksU0FBUyxDQUFFLENBQUYsQ0FBN0IsQ0FBUixDQUFWLElBQTRELENBQW5FLENBRk0sQ0FJTjs7QUFDQSxZQUFLLEtBQUssS0FBSyxTQUFmLEVBQTJCO0FBQzFCLFVBQUEsR0FBRyxJQUFJLFVBQVUsQ0FBRSxNQUFNLENBQUUsSUFBRixFQUFRLFdBQVcsU0FBUyxDQUFFLENBQUYsQ0FBcEIsR0FBNEIsT0FBcEMsQ0FBUixDQUFWLElBQXFFLENBQTVFO0FBQ0E7QUFDRDtBQUNEOztBQUVELFdBQU8sR0FBUDtBQUNBOztBQUVELFdBQVMsZ0JBQVQsQ0FBMkIsSUFBM0IsRUFBaUMsSUFBakMsRUFBdUMsS0FBdkMsRUFBK0M7QUFFOUM7QUFDQSxRQUFJLEdBQUcsR0FBRyxJQUFJLEtBQUssT0FBVCxHQUFtQixJQUFJLENBQUMsV0FBeEIsR0FBc0MsSUFBSSxDQUFDLFlBQXJEO0FBQUEsUUFDQyxnQkFBZ0IsR0FBRyxJQURwQjtBQUFBLFFBRUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFQLENBQWUsU0FBZixJQUE0QixNQUFNLENBQUMsR0FBUCxDQUFZLElBQVosRUFBa0IsV0FBbEIsTUFBb0MsWUFGL0UsQ0FIOEMsQ0FPOUM7QUFDQTtBQUNBOztBQUNBLFFBQUssR0FBRyxJQUFJLENBQVAsSUFBWSxHQUFHLElBQUksSUFBeEIsRUFBK0I7QUFDOUI7QUFDQSxNQUFBLEdBQUcsR0FBRyxNQUFNLENBQUUsSUFBRixFQUFRLElBQVIsQ0FBWjs7QUFDQSxVQUFLLEdBQUcsR0FBRyxDQUFOLElBQVcsR0FBRyxJQUFJLElBQXZCLEVBQThCO0FBQzdCLFFBQUEsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFMLENBQVksSUFBWixDQUFOO0FBQ0EsT0FMNkIsQ0FPOUI7OztBQUNBLFVBQUssU0FBUyxDQUFDLElBQVYsQ0FBZSxHQUFmLENBQUwsRUFBMkI7QUFDMUIsZUFBTyxHQUFQO0FBQ0EsT0FWNkIsQ0FZOUI7QUFDQTs7O0FBQ0EsTUFBQSxnQkFBZ0IsR0FBRyxXQUFXLEtBQU0sTUFBTSxDQUFDLE9BQVAsQ0FBZSxpQkFBZixJQUFvQyxHQUFHLEtBQUssSUFBSSxDQUFDLEtBQUwsQ0FBWSxJQUFaLENBQWxELENBQTlCLENBZDhCLENBZ0I5Qjs7QUFDQSxNQUFBLEdBQUcsR0FBRyxVQUFVLENBQUUsR0FBRixDQUFWLElBQXFCLENBQTNCO0FBQ0EsS0E1QjZDLENBOEI5Qzs7O0FBQ0EsV0FBUyxHQUFHLEdBQ1gsb0JBQW9CLENBQ25CLElBRG1CLEVBRW5CLElBRm1CLEVBR25CLEtBQUssS0FBTSxXQUFXLEdBQUcsUUFBSCxHQUFjLFNBQS9CLENBSGMsRUFJbkIsZ0JBSm1CLENBRGQsR0FPSCxJQVBKO0FBUUEsR0FycU44QixDQXdxTi9COzs7QUFDQSxXQUFTLGtCQUFULENBQTZCLFFBQTdCLEVBQXdDO0FBQ3ZDLFFBQUssV0FBVyxDQUFFLFFBQUYsQ0FBaEIsRUFBK0I7QUFDOUIsYUFBTyxXQUFXLENBQUUsUUFBRixDQUFsQjtBQUNBOztBQUVELFFBQUksSUFBSSxHQUFHLE1BQU0sQ0FBRSxNQUFNLFFBQU4sR0FBaUIsR0FBbkIsQ0FBTixDQUErQixRQUEvQixDQUF5QyxRQUFRLENBQUMsSUFBbEQsQ0FBWDtBQUFBLFFBQ0MsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFMLENBQVMsU0FBVCxDQURYO0FBRUEsSUFBQSxJQUFJLENBQUMsTUFBTCxHQVB1QyxDQVN2QztBQUNBOztBQUNBLFFBQUssT0FBTyxLQUFLLE1BQVosSUFBc0IsT0FBTyxLQUFLLEVBQXZDLEVBQTRDO0FBQzNDO0FBQ0EsTUFBQSxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQVQsQ0FBYyxXQUFkLENBQ1IsTUFBTSxJQUFJLE1BQU0sQ0FBQyxNQUFQLENBQWUsUUFBUSxDQUFDLGFBQVQsQ0FBdUIsUUFBdkIsQ0FBZixFQUFpRDtBQUMxRCxRQUFBLFdBQVcsRUFBRSxDQUQ2QztBQUUxRCxRQUFBLEtBQUssRUFBRSxDQUZtRDtBQUcxRCxRQUFBLE1BQU0sRUFBRTtBQUhrRCxPQUFqRCxDQURGLENBQVQsQ0FGMkMsQ0FVM0M7QUFDQTtBQUNBOztBQUNBLFVBQUssQ0FBQyxTQUFELElBQWMsQ0FBQyxNQUFNLENBQUMsYUFBM0IsRUFBMkM7QUFDMUMsUUFBQSxTQUFTLEdBQUcsQ0FBRSxNQUFNLENBQUMsYUFBUCxJQUF3QixNQUFNLENBQUMsZUFBakMsRUFBbUQsUUFBL0Q7QUFDQSxRQUFBLFNBQVMsQ0FBQyxLQUFWLENBQWdCLDZCQUFoQjtBQUNBLFFBQUEsU0FBUyxDQUFDLEtBQVY7QUFDQTs7QUFFRCxNQUFBLElBQUksR0FBRyxTQUFTLENBQUMsSUFBVixDQUFlLFdBQWYsQ0FBNEIsU0FBUyxDQUFDLGFBQVYsQ0FBd0IsUUFBeEIsQ0FBNUIsQ0FBUDtBQUVBLE1BQUEsT0FBTyxHQUFHLE1BQU0sQ0FBRSxJQUFGLEVBQVEsU0FBUixDQUFoQjtBQUNBLE1BQUEsUUFBUSxDQUFDLElBQVQsQ0FBYyxXQUFkLENBQTJCLE1BQTNCO0FBQ0EsS0FsQ3NDLENBb0N2Qzs7O0FBQ0EsSUFBQSxXQUFXLENBQUUsUUFBRixDQUFYLEdBQTBCLE9BQTFCO0FBRUEsV0FBTyxPQUFQO0FBQ0E7O0FBRUQsRUFBQSxNQUFNLENBQUMsSUFBUCxDQUFZLENBQUUsUUFBRixFQUFZLE9BQVosQ0FBWixFQUFtQyxVQUFVLENBQVYsRUFBYSxJQUFiLEVBQW9CO0FBQ3RELElBQUEsTUFBTSxDQUFDLFFBQVAsQ0FBaUIsSUFBakIsSUFBMEI7QUFDekIsTUFBQSxHQUFHLEVBQUUsYUFBVSxJQUFWLEVBQWdCLFFBQWhCLEVBQTBCLEtBQTFCLEVBQWtDO0FBQ3RDLFlBQUssUUFBTCxFQUFnQjtBQUNmO0FBQ0E7QUFDQSxjQUFLLElBQUksQ0FBQyxXQUFMLEtBQXFCLENBQXJCLElBQTBCLFlBQVksQ0FBQyxJQUFiLENBQW1CLE1BQU0sQ0FBRSxJQUFGLEVBQVEsU0FBUixDQUF6QixDQUEvQixFQUFnRjtBQUMvRSxtQkFBTyxNQUFNLENBQUMsSUFBUCxDQUFhLElBQWIsRUFBbUIsT0FBbkIsRUFBNEIsWUFBVztBQUM3QyxxQkFBTyxnQkFBZ0IsQ0FBRSxJQUFGLEVBQVEsSUFBUixFQUFjLEtBQWQsQ0FBdkI7QUFDQSxhQUZNLENBQVA7QUFHQSxXQUpELE1BSU87QUFDTixtQkFBTyxnQkFBZ0IsQ0FBRSxJQUFGLEVBQVEsSUFBUixFQUFjLEtBQWQsQ0FBdkI7QUFDQTtBQUNEO0FBQ0QsT0Fid0I7QUFlekIsTUFBQSxHQUFHLEVBQUUsYUFBVSxJQUFWLEVBQWdCLEtBQWhCLEVBQXVCLEtBQXZCLEVBQStCO0FBQ25DLGVBQU8saUJBQWlCLENBQUUsSUFBRixFQUFRLEtBQVIsRUFBZSxLQUFLLEdBQzNDLG9CQUFvQixDQUNuQixJQURtQixFQUVuQixJQUZtQixFQUduQixLQUhtQixFQUluQixNQUFNLENBQUMsT0FBUCxDQUFlLFNBQWYsSUFBNEIsTUFBTSxDQUFDLEdBQVAsQ0FBWSxJQUFaLEVBQWtCLFdBQWxCLE1BQW9DLFlBSjdDLENBRHVCLEdBTXZDLENBTm1CLENBQXhCO0FBUUE7QUF4QndCLEtBQTFCO0FBMEJBLEdBM0JEOztBQTZCQSxNQUFLLENBQUMsTUFBTSxDQUFDLE9BQVAsQ0FBZSxPQUFyQixFQUErQjtBQUM5QixJQUFBLE1BQU0sQ0FBQyxRQUFQLENBQWdCLE9BQWhCLEdBQTBCO0FBQ3pCLE1BQUEsR0FBRyxFQUFFLGFBQVUsSUFBVixFQUFnQixRQUFoQixFQUEyQjtBQUMvQjtBQUNBLGVBQU8sUUFBUSxDQUFDLElBQVQsQ0FBZSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBakIsR0FBZ0MsSUFBSSxDQUFDLFlBQUwsQ0FBa0IsTUFBbEQsR0FBMkQsSUFBSSxDQUFDLEtBQUwsQ0FBVyxNQUF2RSxLQUFrRixFQUFqRyxJQUNKLE9BQU8sVUFBVSxDQUFFLE1BQU0sQ0FBQyxFQUFULENBQW5CLEdBQXFDLEVBRC9CLEdBRU4sUUFBUSxHQUFHLEdBQUgsR0FBUyxFQUZsQjtBQUdBLE9BTndCO0FBUXpCLE1BQUEsR0FBRyxFQUFFLGFBQVUsSUFBVixFQUFnQixLQUFoQixFQUF3QjtBQUM1QixZQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBakI7QUFBQSxZQUNDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFEckI7QUFBQSxZQUVDLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUCxDQUFrQixLQUFsQixJQUE0QixtQkFBbUIsS0FBSyxHQUFHLEdBQTNCLEdBQWlDLEdBQTdELEdBQW1FLEVBRjlFO0FBQUEsWUFHQyxNQUFNLEdBQUcsWUFBWSxJQUFJLFlBQVksQ0FBQyxNQUE3QixJQUF1QyxLQUFLLENBQUMsTUFBN0MsSUFBdUQsRUFIakUsQ0FENEIsQ0FNNUI7QUFDQTs7QUFDQSxRQUFBLEtBQUssQ0FBQyxJQUFOLEdBQWEsQ0FBYixDQVI0QixDQVU1Qjs7QUFDQSxZQUFLLEtBQUssSUFBSSxDQUFULElBQWMsTUFBTSxDQUFDLElBQVAsQ0FBYSxNQUFNLENBQUMsT0FBUCxDQUFnQixNQUFoQixFQUF3QixFQUF4QixDQUFiLE1BQWdELEVBQTlELElBQ0osS0FBSyxDQUFDLGVBRFAsRUFDeUI7QUFFeEI7QUFDQTtBQUNBO0FBQ0EsVUFBQSxLQUFLLENBQUMsZUFBTixDQUF1QixRQUF2QixFQUx3QixDQU94Qjs7QUFDQSxjQUFLLFlBQVksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFuQyxFQUE0QztBQUMzQztBQUNBO0FBQ0QsU0F2QjJCLENBeUI1Qjs7O0FBQ0EsUUFBQSxLQUFLLENBQUMsTUFBTixHQUFlLE1BQU0sQ0FBQyxJQUFQLENBQWEsTUFBYixJQUNkLE1BQU0sQ0FBQyxPQUFQLENBQWdCLE1BQWhCLEVBQXdCLE9BQXhCLENBRGMsR0FFZCxNQUFNLEdBQUcsR0FBVCxHQUFlLE9BRmhCO0FBR0E7QUFyQ3dCLEtBQTFCO0FBdUNBLEdBeHhOOEIsQ0EweE4vQjtBQUNBOzs7QUFDQSxFQUFBLE1BQU0sQ0FBQyxZQUFXO0FBQ2pCLFFBQUssQ0FBQyxNQUFNLENBQUMsT0FBUCxDQUFlLG1CQUFyQixFQUEyQztBQUMxQyxNQUFBLE1BQU0sQ0FBQyxRQUFQLENBQWdCLFdBQWhCLEdBQThCO0FBQzdCLFFBQUEsR0FBRyxFQUFFLGFBQVUsSUFBVixFQUFnQixRQUFoQixFQUEyQjtBQUMvQjtBQUNBO0FBQ0EsaUJBQU8sTUFBTSxDQUFDLElBQVAsQ0FBYSxJQUFiLEVBQW1CO0FBQUUsdUJBQVc7QUFBYixXQUFuQixFQUFrRCxZQUFXO0FBQ25FLGdCQUFLLFFBQUwsRUFBZ0I7QUFDZixxQkFBTyxNQUFNLENBQUUsSUFBRixFQUFRLGFBQVIsQ0FBYjtBQUNBO0FBQ0QsV0FKTSxDQUFQO0FBS0E7QUFUNEIsT0FBOUI7QUFXQSxLQWJnQixDQWVqQjtBQUNBO0FBQ0E7OztBQUNBLFFBQUssQ0FBQyxNQUFNLENBQUMsT0FBUCxDQUFlLGFBQWhCLElBQWlDLE1BQU0sQ0FBQyxFQUFQLENBQVUsUUFBaEQsRUFBMkQ7QUFDMUQsTUFBQSxNQUFNLENBQUMsSUFBUCxDQUFhLENBQUUsS0FBRixFQUFTLE1BQVQsQ0FBYixFQUFnQyxVQUFVLENBQVYsRUFBYSxJQUFiLEVBQW9CO0FBQ25ELFFBQUEsTUFBTSxDQUFDLFFBQVAsQ0FBaUIsSUFBakIsSUFBMEI7QUFDekIsVUFBQSxHQUFHLEVBQUUsYUFBVSxJQUFWLEVBQWdCLFFBQWhCLEVBQTJCO0FBQy9CLGdCQUFLLFFBQUwsRUFBZ0I7QUFDZixrQkFBSSxHQUFHLEdBQUcsTUFBTSxDQUFFLElBQUYsRUFBUSxJQUFSLENBQWhCLENBRGUsQ0FFZjs7QUFDQSxxQkFBTyxTQUFTLENBQUMsSUFBVixDQUFnQixHQUFoQixJQUF3QixNQUFNLENBQUUsSUFBRixDQUFOLENBQWUsUUFBZixHQUEyQixJQUEzQixJQUFvQyxJQUE1RCxHQUFtRSxHQUExRTtBQUNBO0FBQ0Q7QUFQd0IsU0FBMUI7QUFTQSxPQVZEO0FBV0E7QUFFRCxHQWhDSyxDQUFOOztBQWtDQSxNQUFLLE1BQU0sQ0FBQyxJQUFQLElBQWUsTUFBTSxDQUFDLElBQVAsQ0FBWSxPQUFoQyxFQUEwQztBQUN6QyxJQUFBLE1BQU0sQ0FBQyxJQUFQLENBQVksT0FBWixDQUFvQixNQUFwQixHQUE2QixVQUFVLElBQVYsRUFBaUI7QUFDN0MsYUFBUyxJQUFJLENBQUMsV0FBTCxLQUFxQixDQUFyQixJQUEwQixJQUFJLENBQUMsWUFBTCxLQUFzQixDQUFsRCxJQUEwRCxDQUFDLE1BQU0sQ0FBQyxPQUFQLENBQWUscUJBQWhCLElBQXlDLENBQUUsSUFBSSxDQUFDLEtBQUwsSUFBYyxJQUFJLENBQUMsS0FBTCxDQUFXLE9BQTFCLElBQXNDLE1BQU0sQ0FBRSxJQUFGLEVBQVEsU0FBUixDQUE3QyxNQUFzRSxNQUFoTDtBQUNBLEtBRkQ7O0FBSUEsSUFBQSxNQUFNLENBQUMsSUFBUCxDQUFZLE9BQVosQ0FBb0IsT0FBcEIsR0FBOEIsVUFBVSxJQUFWLEVBQWlCO0FBQzlDLGFBQU8sQ0FBQyxNQUFNLENBQUMsSUFBUCxDQUFZLE9BQVosQ0FBb0IsTUFBcEIsQ0FBNEIsSUFBNUIsQ0FBUjtBQUNBLEtBRkQ7QUFHQSxHQXQwTjhCLENBdzBOL0I7OztBQUNBLEVBQUEsTUFBTSxDQUFDLElBQVAsQ0FBWTtBQUNYLElBQUEsTUFBTSxFQUFFLEVBREc7QUFFWCxJQUFBLE9BQU8sRUFBRSxFQUZFO0FBR1gsSUFBQSxNQUFNLEVBQUU7QUFIRyxHQUFaLEVBSUcsVUFBVSxNQUFWLEVBQWtCLE1BQWxCLEVBQTJCO0FBQzdCLElBQUEsTUFBTSxDQUFDLFFBQVAsQ0FBaUIsTUFBTSxHQUFHLE1BQTFCLElBQXFDO0FBQ3BDLE1BQUEsTUFBTSxFQUFFLGdCQUFVLEtBQVYsRUFBa0I7QUFDekIsWUFBSSxDQUFKO0FBQUEsWUFFQztBQUNBLFFBQUEsS0FBSyxHQUFHLE9BQU8sS0FBUCxLQUFpQixRQUFqQixHQUE0QixLQUFLLENBQUMsS0FBTixDQUFZLEdBQVosQ0FBNUIsR0FBK0MsQ0FBRSxLQUFGLENBSHhEO0FBQUEsWUFJQyxRQUFRLEdBQUcsRUFKWjs7QUFNQSxhQUFNLENBQUMsR0FBRyxDQUFWLEVBQWEsQ0FBQyxHQUFHLENBQWpCLEVBQW9CLENBQUMsRUFBckIsRUFBMEI7QUFDekIsVUFBQSxRQUFRLENBQUUsTUFBTSxHQUFHLFNBQVMsQ0FBRSxDQUFGLENBQWxCLEdBQTBCLE1BQTVCLENBQVIsR0FDQyxLQUFLLENBQUUsQ0FBRixDQUFMLElBQWMsS0FBSyxDQUFFLENBQUMsR0FBRyxDQUFOLENBQW5CLElBQWdDLEtBQUssQ0FBRSxDQUFGLENBRHRDO0FBRUE7O0FBRUQsZUFBTyxRQUFQO0FBQ0E7QUFkbUMsS0FBckM7O0FBaUJBLFFBQUssQ0FBQyxPQUFPLENBQUMsSUFBUixDQUFjLE1BQWQsQ0FBTixFQUErQjtBQUM5QixNQUFBLE1BQU0sQ0FBQyxRQUFQLENBQWlCLE1BQU0sR0FBRyxNQUExQixFQUFtQyxHQUFuQyxHQUF5QyxpQkFBekM7QUFDQTtBQUNELEdBekJEO0FBMEJBLE1BQUksR0FBRyxHQUFHLE1BQVY7QUFBQSxNQUNDLFFBQVEsR0FBRyxPQURaO0FBQUEsTUFFQyxLQUFLLEdBQUcsUUFGVDtBQUFBLE1BR0MsTUFBTSxHQUFHLGtIQUhWO0FBQUEsTUFJQyxlQUFlLEdBQUcsdUJBSm5CO0FBTUEsRUFBQSxNQUFNLENBQUMsRUFBUCxDQUFVLE1BQVYsQ0FBaUI7QUFDaEIsSUFBQSxTQUFTLEVBQUUscUJBQVc7QUFDckIsYUFBTyxNQUFNLENBQUMsS0FBUCxDQUFjLEtBQUssY0FBTCxFQUFkLENBQVA7QUFDQSxLQUhlO0FBSWhCLElBQUEsY0FBYyxFQUFFLDBCQUFXO0FBQzFCLGFBQU8sS0FBSyxHQUFMLENBQVMsWUFBVTtBQUN6QixlQUFPLEtBQUssUUFBTCxHQUFnQixNQUFNLENBQUMsU0FBUCxDQUFrQixLQUFLLFFBQXZCLENBQWhCLEdBQW9ELElBQTNEO0FBQ0EsT0FGTSxFQUdOLE1BSE0sQ0FHQyxZQUFVO0FBQ2pCLGVBQU8sS0FBSyxJQUFMLElBQWEsQ0FBQyxLQUFLLFFBQW5CLEtBQ0osS0FBSyxPQUFMLElBQWdCLGVBQWUsQ0FBQyxJQUFoQixDQUFzQixLQUFLLFFBQTNCLENBQWhCLElBQ0QsTUFBTSxDQUFDLElBQVAsQ0FBYSxLQUFLLElBQWxCLENBRkssQ0FBUDtBQUdBLE9BUE0sRUFRTixHQVJNLENBUUYsVUFBVSxDQUFWLEVBQWEsSUFBYixFQUFtQjtBQUN2QixZQUFJLEdBQUcsR0FBRyxNQUFNLENBQUUsSUFBRixDQUFOLENBQWUsR0FBZixFQUFWO0FBRUEsZUFBTyxHQUFHLElBQUksSUFBUCxHQUNOLElBRE0sR0FFTixNQUFNLENBQUMsT0FBUCxDQUFnQixHQUFoQixJQUNDLE1BQU0sQ0FBQyxHQUFQLENBQVksR0FBWixFQUFpQixVQUFVLEdBQVYsRUFBZSxDQUFmLEVBQWtCO0FBQ2xDLGlCQUFPO0FBQUUsWUFBQSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQWI7QUFBbUIsWUFBQSxLQUFLLEVBQUUsR0FBRyxDQUFDLE9BQUosQ0FBYSxLQUFiLEVBQW9CLE1BQXBCO0FBQTFCLFdBQVA7QUFDQSxTQUZELENBREQsR0FJQztBQUFFLFVBQUEsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFiO0FBQW1CLFVBQUEsS0FBSyxFQUFFLEdBQUcsQ0FBQyxPQUFKLENBQWEsS0FBYixFQUFvQixNQUFwQjtBQUExQixTQU5GO0FBT0EsT0FsQk0sRUFrQkosR0FsQkksRUFBUDtBQW1CQTtBQXhCZSxHQUFqQixFQXoyTitCLENBbzROL0I7QUFDQTs7QUFDQSxFQUFBLE1BQU0sQ0FBQyxLQUFQLEdBQWUsVUFBVSxDQUFWLEVBQWEsV0FBYixFQUEyQjtBQUN6QyxRQUFJLE1BQUo7QUFBQSxRQUNDLENBQUMsR0FBRyxFQURMO0FBQUEsUUFFQyxHQUFHLEdBQUcsU0FBTixHQUFNLENBQVUsR0FBVixFQUFlLEtBQWYsRUFBdUI7QUFDNUI7QUFDQSxNQUFBLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBUCxDQUFtQixLQUFuQixJQUE2QixLQUFLLEVBQWxDLEdBQXlDLEtBQUssSUFBSSxJQUFULEdBQWdCLEVBQWhCLEdBQXFCLEtBQXRFO0FBQ0EsTUFBQSxDQUFDLENBQUUsQ0FBQyxDQUFDLE1BQUosQ0FBRCxHQUFnQixrQkFBa0IsQ0FBRSxHQUFGLENBQWxCLEdBQTRCLEdBQTVCLEdBQWtDLGtCQUFrQixDQUFFLEtBQUYsQ0FBcEU7QUFDQSxLQU5GLENBRHlDLENBU3pDOzs7QUFDQSxRQUFLLFdBQVcsS0FBSyxTQUFyQixFQUFpQztBQUNoQyxNQUFBLFdBQVcsR0FBRyxNQUFNLENBQUMsWUFBUCxJQUF1QixNQUFNLENBQUMsWUFBUCxDQUFvQixXQUF6RDtBQUNBLEtBWndDLENBY3pDOzs7QUFDQSxRQUFLLE1BQU0sQ0FBQyxPQUFQLENBQWdCLENBQWhCLEtBQXlCLENBQUMsQ0FBQyxNQUFGLElBQVksQ0FBQyxNQUFNLENBQUMsYUFBUCxDQUFzQixDQUF0QixDQUEzQyxFQUF5RTtBQUN4RTtBQUNBLE1BQUEsTUFBTSxDQUFDLElBQVAsQ0FBYSxDQUFiLEVBQWdCLFlBQVc7QUFDMUIsUUFBQSxHQUFHLENBQUUsS0FBSyxJQUFQLEVBQWEsS0FBSyxLQUFsQixDQUFIO0FBQ0EsT0FGRDtBQUlBLEtBTkQsTUFNTztBQUNOO0FBQ0E7QUFDQSxXQUFNLE1BQU4sSUFBZ0IsQ0FBaEIsRUFBb0I7QUFDbkIsUUFBQSxXQUFXLENBQUUsTUFBRixFQUFVLENBQUMsQ0FBRSxNQUFGLENBQVgsRUFBdUIsV0FBdkIsRUFBb0MsR0FBcEMsQ0FBWDtBQUNBO0FBQ0QsS0EzQndDLENBNkJ6Qzs7O0FBQ0EsV0FBTyxDQUFDLENBQUMsSUFBRixDQUFRLEdBQVIsRUFBYyxPQUFkLENBQXVCLEdBQXZCLEVBQTRCLEdBQTVCLENBQVA7QUFDQSxHQS9CRDs7QUFpQ0EsV0FBUyxXQUFULENBQXNCLE1BQXRCLEVBQThCLEdBQTlCLEVBQW1DLFdBQW5DLEVBQWdELEdBQWhELEVBQXNEO0FBQ3JELFFBQUksSUFBSjs7QUFFQSxRQUFLLE1BQU0sQ0FBQyxPQUFQLENBQWdCLEdBQWhCLENBQUwsRUFBNkI7QUFDNUI7QUFDQSxNQUFBLE1BQU0sQ0FBQyxJQUFQLENBQWEsR0FBYixFQUFrQixVQUFVLENBQVYsRUFBYSxDQUFiLEVBQWlCO0FBQ2xDLFlBQUssV0FBVyxJQUFJLFFBQVEsQ0FBQyxJQUFULENBQWUsTUFBZixDQUFwQixFQUE4QztBQUM3QztBQUNBLFVBQUEsR0FBRyxDQUFFLE1BQUYsRUFBVSxDQUFWLENBQUg7QUFFQSxTQUpELE1BSU87QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQUEsV0FBVyxDQUFFLE1BQU0sR0FBRyxHQUFULElBQWlCLFFBQU8sQ0FBUCxNQUFhLFFBQWIsR0FBd0IsQ0FBeEIsR0FBNEIsRUFBN0MsSUFBb0QsR0FBdEQsRUFBMkQsQ0FBM0QsRUFBOEQsV0FBOUQsRUFBMkUsR0FBM0UsQ0FBWDtBQUNBO0FBQ0QsT0FmRDtBQWlCQSxLQW5CRCxNQW1CTyxJQUFLLENBQUMsV0FBRCxJQUFnQixNQUFNLENBQUMsSUFBUCxDQUFhLEdBQWIsTUFBdUIsUUFBNUMsRUFBdUQ7QUFDN0Q7QUFDQSxXQUFNLElBQU4sSUFBYyxHQUFkLEVBQW9CO0FBQ25CLFFBQUEsV0FBVyxDQUFFLE1BQU0sR0FBRyxHQUFULEdBQWUsSUFBZixHQUFzQixHQUF4QixFQUE2QixHQUFHLENBQUUsSUFBRixDQUFoQyxFQUEwQyxXQUExQyxFQUF1RCxHQUF2RCxDQUFYO0FBQ0E7QUFFRCxLQU5NLE1BTUE7QUFDTjtBQUNBLE1BQUEsR0FBRyxDQUFFLE1BQUYsRUFBVSxHQUFWLENBQUg7QUFDQTtBQUNEOztBQUNELE1BQUk7QUFDSCxFQUFBLFlBREQ7QUFBQSxNQUVDO0FBQ0EsRUFBQSxZQUhEO0FBQUEsTUFLQyxLQUFLLEdBQUcsTUFMVDtBQUFBLE1BTUMsUUFBUSxHQUFHLCtCQU5aO0FBQUEsTUFNNkM7QUFDNUM7QUFDQSxFQUFBLGNBQWMsR0FBRyw2REFSbEI7QUFBQSxNQVNDLFVBQVUsR0FBRyxnQkFUZDtBQUFBLE1BVUMsU0FBUyxHQUFHLE9BVmI7QUFBQSxNQVdDLE1BQU0sR0FBRyxJQVhWO0FBQUEsTUFZQyxPQUFPLEdBQUcscURBWlg7QUFBQSxNQWFDLEdBQUcsR0FBRyxlQWJQO0FBQUEsTUFjQyxJQUFJLEdBQUcsZ0RBZFI7QUFBQSxNQWdCQztBQUNBLEVBQUEsS0FBSyxHQUFHLE1BQU0sQ0FBQyxFQUFQLENBQVUsSUFqQm5COztBQW1CQzs7Ozs7Ozs7O0FBU0EsRUFBQSxVQUFVLEdBQUcsRUE1QmQ7O0FBOEJDOzs7OztBQUtBLEVBQUEsVUFBVSxHQUFHLEVBbkNkO0FBQUEsTUFxQ0M7QUFDQSxFQUFBLFFBQVEsR0FBRyxDQUFDLElBQUQsSUFBUyxDQUFDLEdBQUQsQ0F0Q3JCLENBeDhOK0IsQ0FnL04vQjtBQUNBOztBQUNBLE1BQUk7QUFDSCxJQUFBLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBeEI7QUFDQSxHQUZELENBRUUsT0FBTyxDQUFQLEVBQVc7QUFDWjtBQUNBO0FBQ0EsSUFBQSxZQUFZLEdBQUcsUUFBUSxDQUFDLGFBQVQsQ0FBd0IsR0FBeEIsQ0FBZjtBQUNBLElBQUEsWUFBWSxDQUFDLElBQWIsR0FBb0IsRUFBcEI7QUFDQSxJQUFBLFlBQVksR0FBRyxZQUFZLENBQUMsSUFBNUI7QUFDQSxHQTEvTjhCLENBNC9OL0I7OztBQUNBLEVBQUEsWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFMLENBQVcsWUFBWSxDQUFDLFdBQWIsRUFBWCxLQUEyQyxFQUExRCxDQTcvTitCLENBKy9OL0I7O0FBQ0EsV0FBUywyQkFBVCxDQUFzQyxTQUF0QyxFQUFrRDtBQUVqRDtBQUNBLFdBQU8sVUFBVSxrQkFBVixFQUE4QixJQUE5QixFQUFxQztBQUUzQyxVQUFLLE9BQU8sa0JBQVAsS0FBOEIsUUFBbkMsRUFBOEM7QUFDN0MsUUFBQSxJQUFJLEdBQUcsa0JBQVA7QUFDQSxRQUFBLGtCQUFrQixHQUFHLEdBQXJCO0FBQ0E7O0FBRUQsVUFBSSxRQUFKO0FBQUEsVUFBYyxJQUFkO0FBQUEsVUFBb0IsV0FBcEI7QUFBQSxVQUNDLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxXQUFuQixHQUFpQyxLQUFqQyxDQUF3QyxXQUF4QyxDQURiO0FBQUEsVUFFQyxDQUFDLEdBQUcsQ0FGTDtBQUFBLFVBR0MsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUhwQjs7QUFLQSxVQUFLLE1BQU0sQ0FBQyxVQUFQLENBQW1CLElBQW5CLENBQUwsRUFBaUM7QUFDaEM7QUFDQSxlQUFRLENBQUMsR0FBRyxNQUFaLEVBQW9CLENBQUMsRUFBckIsRUFBMEI7QUFDekIsVUFBQSxRQUFRLEdBQUcsU0FBUyxDQUFFLENBQUYsQ0FBcEIsQ0FEeUIsQ0FFekI7QUFDQTs7QUFDQSxVQUFBLFdBQVcsR0FBRyxNQUFNLElBQU4sQ0FBWSxRQUFaLENBQWQ7O0FBQ0EsY0FBSyxXQUFMLEVBQW1CO0FBQ2xCLFlBQUEsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFULENBQWlCLENBQWpCLEtBQXdCLEdBQW5DO0FBQ0E7O0FBQ0QsVUFBQSxJQUFJLEdBQUcsU0FBUyxDQUFFLFFBQUYsQ0FBVCxHQUF3QixTQUFTLENBQUUsUUFBRixDQUFULElBQXlCLEVBQXhELENBUnlCLENBU3pCOztBQUNBLFVBQUEsSUFBSSxDQUFFLFdBQVcsR0FBRyxTQUFILEdBQWUsTUFBNUIsQ0FBSixDQUEwQyxJQUExQztBQUNBO0FBQ0Q7QUFDRCxLQTNCRDtBQTRCQSxHQS9oTzhCLENBaWlPL0I7OztBQUNBLFdBQVMsNkJBQVQsQ0FBd0MsU0FBeEMsRUFBbUQsT0FBbkQsRUFBNEQsZUFBNUQsRUFBNkUsS0FBN0UsRUFDRTtBQUFTO0FBRFgsSUFDMkI7QUFBVTtBQURyQyxJQUNzRDtBQUVyRCxJQUFBLFFBQVEsR0FBRyxRQUFRLElBQUksT0FBTyxDQUFDLFNBQVIsQ0FBbUIsQ0FBbkIsQ0FBdkI7QUFDQSxJQUFBLFNBQVMsR0FBRyxTQUFTLElBQUksRUFBekI7QUFFQSxJQUFBLFNBQVMsQ0FBRSxRQUFGLENBQVQsR0FBd0IsSUFBeEI7QUFFQSxRQUFJLFNBQUo7QUFBQSxRQUNDLElBQUksR0FBRyxTQUFTLENBQUUsUUFBRixDQURqQjtBQUFBLFFBRUMsQ0FBQyxHQUFHLENBRkw7QUFBQSxRQUdDLE1BQU0sR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQVIsR0FBaUIsQ0FIL0I7QUFBQSxRQUlDLFdBQVcsR0FBSyxTQUFTLEtBQUssVUFKL0I7O0FBTUEsV0FBUSxDQUFDLEdBQUcsTUFBSixLQUFnQixXQUFXLElBQUksQ0FBQyxTQUFoQyxDQUFSLEVBQXFELENBQUMsRUFBdEQsRUFBMkQ7QUFDMUQsTUFBQSxTQUFTLEdBQUcsSUFBSSxDQUFFLENBQUYsQ0FBSixDQUFXLE9BQVgsRUFBb0IsZUFBcEIsRUFBcUMsS0FBckMsQ0FBWixDQUQwRCxDQUUxRDtBQUNBOztBQUNBLFVBQUssT0FBTyxTQUFQLEtBQXFCLFFBQTFCLEVBQXFDO0FBQ3BDLFlBQUssQ0FBQyxXQUFELElBQWdCLFNBQVMsQ0FBRSxTQUFGLENBQTlCLEVBQThDO0FBQzdDLFVBQUEsU0FBUyxHQUFHLFNBQVo7QUFDQSxTQUZELE1BRU87QUFDTixVQUFBLE9BQU8sQ0FBQyxTQUFSLENBQWtCLE9BQWxCLENBQTJCLFNBQTNCO0FBQ0EsVUFBQSxTQUFTLEdBQUcsNkJBQTZCLENBQ3ZDLFNBRHVDLEVBQzVCLE9BRDRCLEVBQ25CLGVBRG1CLEVBQ0YsS0FERSxFQUNLLFNBREwsRUFDZ0IsU0FEaEIsQ0FBekM7QUFFQTtBQUNEO0FBQ0QsS0ExQm9ELENBMkJyRDtBQUNBOzs7QUFDQSxRQUFLLENBQUUsV0FBVyxJQUFJLENBQUMsU0FBbEIsS0FBaUMsQ0FBQyxTQUFTLENBQUUsR0FBRixDQUFoRCxFQUEwRDtBQUN6RCxNQUFBLFNBQVMsR0FBRyw2QkFBNkIsQ0FDdkMsU0FEdUMsRUFDNUIsT0FENEIsRUFDbkIsZUFEbUIsRUFDRixLQURFLEVBQ0ssR0FETCxFQUNVLFNBRFYsQ0FBekM7QUFFQSxLQWhDb0QsQ0FpQ3JEO0FBQ0E7OztBQUNBLFdBQU8sU0FBUDtBQUNBLEdBdmtPOEIsQ0F5a08vQjtBQUNBO0FBQ0E7OztBQUNBLFdBQVMsVUFBVCxDQUFxQixNQUFyQixFQUE2QixHQUE3QixFQUFtQztBQUNsQyxRQUFJLEdBQUo7QUFBQSxRQUFTLElBQVQ7QUFBQSxRQUNDLFdBQVcsR0FBRyxNQUFNLENBQUMsWUFBUCxDQUFvQixXQUFwQixJQUFtQyxFQURsRDs7QUFFQSxTQUFNLEdBQU4sSUFBYSxHQUFiLEVBQW1CO0FBQ2xCLFVBQUssR0FBRyxDQUFFLEdBQUYsQ0FBSCxLQUFlLFNBQXBCLEVBQWdDO0FBQy9CLFNBQUUsV0FBVyxDQUFFLEdBQUYsQ0FBWCxHQUFxQixNQUFyQixHQUFnQyxJQUFJLEtBQU0sSUFBSSxHQUFHLEVBQWIsQ0FBdEMsRUFBNkQsR0FBN0QsSUFBcUUsR0FBRyxDQUFFLEdBQUYsQ0FBeEU7QUFDQTtBQUNEOztBQUNELFFBQUssSUFBTCxFQUFZO0FBQ1gsTUFBQSxNQUFNLENBQUMsTUFBUCxDQUFlLElBQWYsRUFBcUIsTUFBckIsRUFBNkIsSUFBN0I7QUFDQTtBQUNEOztBQUVELEVBQUEsTUFBTSxDQUFDLEVBQVAsQ0FBVSxJQUFWLEdBQWlCLFVBQVUsR0FBVixFQUFlLE1BQWYsRUFBdUIsUUFBdkIsRUFBa0M7QUFDbEQsUUFBSyxPQUFPLEdBQVAsS0FBZSxRQUFmLElBQTJCLEtBQWhDLEVBQXdDO0FBQ3ZDLGFBQU8sS0FBSyxDQUFDLEtBQU4sQ0FBYSxJQUFiLEVBQW1CLFNBQW5CLENBQVA7QUFDQSxLQUhpRCxDQUtsRDs7O0FBQ0EsUUFBSyxDQUFDLEtBQUssTUFBWCxFQUFvQjtBQUNuQixhQUFPLElBQVA7QUFDQTs7QUFFRCxRQUFJLFFBQUo7QUFBQSxRQUFjLElBQWQ7QUFBQSxRQUFvQixRQUFwQjtBQUFBLFFBQ0MsSUFBSSxHQUFHLElBRFI7QUFBQSxRQUVDLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBSixDQUFZLEdBQVosQ0FGUDs7QUFJQSxRQUFLLEdBQUcsSUFBSSxDQUFaLEVBQWdCO0FBQ2YsTUFBQSxRQUFRLEdBQUcsR0FBRyxDQUFDLEtBQUosQ0FBVyxHQUFYLEVBQWdCLEdBQUcsQ0FBQyxNQUFwQixDQUFYO0FBQ0EsTUFBQSxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUosQ0FBVyxDQUFYLEVBQWMsR0FBZCxDQUFOO0FBQ0EsS0FqQmlELENBbUJsRDs7O0FBQ0EsUUFBSyxNQUFNLENBQUMsVUFBUCxDQUFtQixNQUFuQixDQUFMLEVBQW1DO0FBRWxDO0FBQ0EsTUFBQSxRQUFRLEdBQUcsTUFBWDtBQUNBLE1BQUEsTUFBTSxHQUFHLFNBQVQsQ0FKa0MsQ0FNbkM7QUFDQyxLQVBELE1BT08sSUFBSyxNQUFNLElBQUksUUFBTyxNQUFQLE1BQWtCLFFBQWpDLEVBQTRDO0FBQ2xELE1BQUEsSUFBSSxHQUFHLE1BQVA7QUFDQSxLQTdCaUQsQ0ErQmxEOzs7QUFDQSxJQUFBLE1BQU0sQ0FBQyxJQUFQLENBQVk7QUFDWCxNQUFBLEdBQUcsRUFBRSxHQURNO0FBR1g7QUFDQSxNQUFBLElBQUksRUFBRSxJQUpLO0FBS1gsTUFBQSxRQUFRLEVBQUUsTUFMQztBQU1YLE1BQUEsSUFBSSxFQUFFLE1BTks7QUFPWCxNQUFBLFFBQVEsRUFBRSxrQkFBVSxLQUFWLEVBQWlCLE1BQWpCLEVBQTBCO0FBQ25DLFlBQUssUUFBTCxFQUFnQjtBQUNmLFVBQUEsSUFBSSxDQUFDLElBQUwsQ0FBVyxRQUFYLEVBQXFCLFFBQVEsSUFBSSxDQUFFLEtBQUssQ0FBQyxZQUFSLEVBQXNCLE1BQXRCLEVBQThCLEtBQTlCLENBQWpDO0FBQ0E7QUFDRDtBQVhVLEtBQVosRUFZRyxJQVpILENBWVEsVUFBVSxZQUFWLEVBQXlCO0FBRWhDO0FBQ0EsTUFBQSxRQUFRLEdBQUcsU0FBWCxDQUhnQyxDQUtoQzs7QUFDQSxNQUFBLElBQUksQ0FBQyxJQUFMLENBQVcsUUFBUSxHQUVsQjtBQUNBLE1BQUEsTUFBTSxDQUFDLE9BQUQsQ0FBTixDQUVDO0FBQ0E7QUFIRCxPQUlFLE1BSkYsQ0FJVSxZQUFZLENBQUMsT0FBYixDQUFzQixPQUF0QixFQUErQixFQUEvQixDQUpWLEVBTUM7QUFORCxPQU9FLElBUEYsQ0FPUSxRQVBSLENBSGtCLEdBWWxCO0FBQ0EsTUFBQSxZQWJEO0FBZUEsS0FqQ0Q7QUFtQ0EsV0FBTyxJQUFQO0FBQ0EsR0FwRUQsQ0F6bE8rQixDQStwTy9COzs7QUFDQSxFQUFBLE1BQU0sQ0FBQyxJQUFQLENBQWEsaUVBQWlFLEtBQWpFLENBQXdFLEdBQXhFLENBQWIsRUFBNEYsVUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQjtBQUMzRyxJQUFBLE1BQU0sQ0FBQyxFQUFQLENBQVcsQ0FBWCxJQUFpQixVQUFVLENBQVYsRUFBYTtBQUM3QixhQUFPLEtBQUssRUFBTCxDQUFTLENBQVQsRUFBWSxDQUFaLENBQVA7QUFDQSxLQUZEO0FBR0EsR0FKRDtBQU1BLEVBQUEsTUFBTSxDQUFDLElBQVAsQ0FBYSxDQUFFLEtBQUYsRUFBUyxNQUFULENBQWIsRUFBZ0MsVUFBVSxDQUFWLEVBQWEsTUFBYixFQUFzQjtBQUNyRCxJQUFBLE1BQU0sQ0FBRSxNQUFGLENBQU4sR0FBbUIsVUFBVSxHQUFWLEVBQWUsSUFBZixFQUFxQixRQUFyQixFQUErQixJQUEvQixFQUFzQztBQUN4RDtBQUNBLFVBQUssTUFBTSxDQUFDLFVBQVAsQ0FBbUIsSUFBbkIsQ0FBTCxFQUFpQztBQUNoQyxRQUFBLElBQUksR0FBRyxJQUFJLElBQUksUUFBZjtBQUNBLFFBQUEsUUFBUSxHQUFHLElBQVg7QUFDQSxRQUFBLElBQUksR0FBRyxTQUFQO0FBQ0E7O0FBRUQsYUFBTyxNQUFNLENBQUMsSUFBUCxDQUFZO0FBQ2xCLFFBQUEsSUFBSSxFQUFFLE1BRFk7QUFFbEIsUUFBQSxHQUFHLEVBQUUsR0FGYTtBQUdsQixRQUFBLElBQUksRUFBRSxJQUhZO0FBSWxCLFFBQUEsT0FBTyxFQUFFLFFBSlM7QUFLbEIsUUFBQSxRQUFRLEVBQUU7QUFMUSxPQUFaLENBQVA7QUFPQSxLQWZEO0FBZ0JBLEdBakJEO0FBbUJBLEVBQUEsTUFBTSxDQUFDLE1BQVAsQ0FBYztBQUViLElBQUEsU0FBUyxFQUFFLG1CQUFVLEdBQVYsRUFBZSxRQUFmLEVBQTBCO0FBQ3BDLGFBQU8sTUFBTSxDQUFDLEdBQVAsQ0FBWSxHQUFaLEVBQWlCLFNBQWpCLEVBQTRCLFFBQTVCLEVBQXNDLFFBQXRDLENBQVA7QUFDQSxLQUpZO0FBTWIsSUFBQSxPQUFPLEVBQUUsaUJBQVUsR0FBVixFQUFlLElBQWYsRUFBcUIsUUFBckIsRUFBZ0M7QUFDeEMsYUFBTyxNQUFNLENBQUMsR0FBUCxDQUFZLEdBQVosRUFBaUIsSUFBakIsRUFBdUIsUUFBdkIsRUFBaUMsTUFBakMsQ0FBUDtBQUNBLEtBUlk7QUFVYjtBQUNBO0FBQ0E7QUFDQSxJQUFBLFNBQVMsRUFBRSxtQkFBVSxNQUFWLEVBQWtCLFFBQWxCLEVBQTZCO0FBQ3ZDLFVBQUssUUFBTCxFQUFnQjtBQUNmO0FBQ0EsUUFBQSxVQUFVLENBQUUsTUFBRixFQUFVLE1BQU0sQ0FBQyxZQUFqQixDQUFWO0FBQ0EsT0FIRCxNQUdPO0FBQ047QUFDQSxRQUFBLFFBQVEsR0FBRyxNQUFYO0FBQ0EsUUFBQSxNQUFNLEdBQUcsTUFBTSxDQUFDLFlBQWhCO0FBQ0E7O0FBQ0QsTUFBQSxVQUFVLENBQUUsTUFBRixFQUFVLFFBQVYsQ0FBVjtBQUNBLGFBQU8sTUFBUDtBQUNBLEtBeEJZO0FBMEJiLElBQUEsWUFBWSxFQUFFO0FBQ2IsTUFBQSxHQUFHLEVBQUUsWUFEUTtBQUViLE1BQUEsT0FBTyxFQUFFLGNBQWMsQ0FBQyxJQUFmLENBQXFCLFlBQVksQ0FBRSxDQUFGLENBQWpDLENBRkk7QUFHYixNQUFBLE1BQU0sRUFBRSxJQUhLO0FBSWIsTUFBQSxJQUFJLEVBQUUsS0FKTztBQUtiLE1BQUEsV0FBVyxFQUFFLGtEQUxBO0FBTWIsTUFBQSxXQUFXLEVBQUUsSUFOQTtBQU9iLE1BQUEsS0FBSyxFQUFFLElBUE07O0FBUWI7Ozs7Ozs7Ozs7O0FBWUEsTUFBQSxPQUFPLEVBQUU7QUFDUixRQUFBLEdBQUcsRUFBRSwyQkFERztBQUVSLFFBQUEsSUFBSSxFQUFFLFdBRkU7QUFHUixRQUFBLElBQUksRUFBRSxZQUhFO0FBSVIsUUFBQSxJQUFJLEVBQUUsbUNBSkU7QUFLUixhQUFLO0FBTEcsT0FwQkk7QUE0QmIsTUFBQSxRQUFRLEVBQUU7QUFDVCxRQUFBLEdBQUcsRUFBRSxLQURJO0FBRVQsUUFBQSxJQUFJLEVBQUUsTUFGRztBQUdULFFBQUEsSUFBSSxFQUFFO0FBSEcsT0E1Qkc7QUFrQ2IsTUFBQSxjQUFjLEVBQUU7QUFDZixRQUFBLEdBQUcsRUFBRSxhQURVO0FBRWYsUUFBQSxJQUFJLEVBQUU7QUFGUyxPQWxDSDtBQXVDYjtBQUNBO0FBQ0E7QUFDQSxNQUFBLFVBQVUsRUFBRTtBQUVYO0FBQ0Esa0JBQVUsTUFBTSxDQUFDLE1BSE47QUFLWDtBQUNBLHFCQUFhLElBTkY7QUFRWDtBQUNBLHFCQUFhLE1BQU0sQ0FBQyxTQVRUO0FBV1g7QUFDQSxvQkFBWSxNQUFNLENBQUM7QUFaUixPQTFDQztBQXlEYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQUEsV0FBVyxFQUFFO0FBQ1osUUFBQSxPQUFPLEVBQUUsSUFERztBQUVaLFFBQUEsR0FBRyxFQUFFO0FBRk87QUE3REEsS0ExQkQ7QUE2RmIsSUFBQSxhQUFhLEVBQUUsMkJBQTJCLENBQUUsVUFBRixDQTdGN0I7QUE4RmIsSUFBQSxhQUFhLEVBQUUsMkJBQTJCLENBQUUsVUFBRixDQTlGN0I7QUFnR2I7QUFDQSxJQUFBLElBQUksRUFBRSxjQUFVLEdBQVYsRUFBZSxPQUFmLEVBQXlCO0FBRTlCO0FBQ0EsVUFBSyxRQUFPLEdBQVAsTUFBZSxRQUFwQixFQUErQjtBQUM5QixRQUFBLE9BQU8sR0FBRyxHQUFWO0FBQ0EsUUFBQSxHQUFHLEdBQUcsU0FBTjtBQUNBLE9BTjZCLENBUTlCOzs7QUFDQSxNQUFBLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBckI7QUFFQSxVQUFJO0FBQ0gsTUFBQSxhQUREO0FBQUEsVUFFQztBQUNBLE1BQUEscUJBSEQ7QUFBQSxVQUlDLGVBSkQ7QUFBQSxVQUtDO0FBQ0EsTUFBQSxTQU5EO0FBQUEsVUFPQztBQUNBLE1BQUEsWUFSRDtBQUFBLFVBU0M7QUFDQSxNQUFBLEtBVkQ7QUFBQSxVQVdDO0FBQ0EsTUFBQSxXQVpEO0FBQUEsVUFhQztBQUNBLE1BQUEsQ0FkRDtBQUFBLFVBZUM7QUFDQSxNQUFBLENBQUMsR0FBRyxNQUFNLENBQUMsU0FBUCxDQUFrQixFQUFsQixFQUFzQixPQUF0QixDQWhCTDtBQUFBLFVBaUJDO0FBQ0EsTUFBQSxlQUFlLEdBQUcsQ0FBQyxDQUFDLE9BQUYsSUFBYSxDQWxCaEM7QUFBQSxVQW1CQztBQUNBO0FBQ0E7QUFDQSxNQUFBLGtCQUFrQixHQUFHLGVBQWUsS0FBSyxDQUFwQixLQUNsQixlQUFlLENBQUMsUUFBaEIsSUFBNEIsZUFBZSxZQUFZLE1BRHJDLElBRWxCLE1BQU0sQ0FBRSxlQUFGLENBRlksR0FFVSxNQUFNLENBQUMsS0F4QnZDO0FBQUEsVUF5QkM7QUFDQSxNQUFBLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUCxFQTFCWjtBQUFBLFVBMkJDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxTQUFQLENBQWtCLGFBQWxCLENBM0JwQjtBQUFBLFVBNEJDO0FBQ0EsTUFBQSxVQUFVLEdBQUcsQ0FBQyxDQUFDLFVBQUYsSUFBZ0IsRUE3QjlCO0FBQUEsVUE4QkM7QUFDQSxNQUFBLGNBQWMsR0FBRyxFQS9CbEI7QUFBQSxVQWdDQyxtQkFBbUIsR0FBRyxFQWhDdkI7QUFBQSxVQWlDQztBQUNBLE1BQUEsS0FBSyxHQUFHLENBbENUO0FBQUEsVUFtQ0M7QUFDQSxNQUFBLFFBQVEsR0FBRyxVQXBDWjtBQUFBLFVBcUNDO0FBQ0EsTUFBQSxLQUFLLEdBQUc7QUFFUCxRQUFBLFVBQVUsRUFBRSxDQUZMO0FBSVA7QUFDQSxRQUFBLGdCQUFnQixFQUFFLDBCQUFVLElBQVYsRUFBZ0IsS0FBaEIsRUFBd0I7QUFDekMsY0FBSyxDQUFDLEtBQU4sRUFBYztBQUNiLGdCQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBTCxFQUFaO0FBQ0EsWUFBQSxJQUFJLEdBQUcsbUJBQW1CLENBQUUsS0FBRixDQUFuQixHQUErQixtQkFBbUIsQ0FBRSxLQUFGLENBQW5CLElBQWdDLElBQXRFO0FBQ0EsWUFBQSxjQUFjLENBQUUsSUFBRixDQUFkLEdBQXlCLEtBQXpCO0FBQ0E7O0FBQ0QsaUJBQU8sSUFBUDtBQUNBLFNBWk07QUFjUDtBQUNBLFFBQUEscUJBQXFCLEVBQUUsaUNBQVc7QUFDakMsaUJBQU8sS0FBSyxLQUFLLENBQVYsR0FBYyxxQkFBZCxHQUFzQyxJQUE3QztBQUNBLFNBakJNO0FBbUJQO0FBQ0EsUUFBQSxpQkFBaUIsRUFBRSwyQkFBVSxHQUFWLEVBQWdCO0FBQ2xDLGNBQUksS0FBSjs7QUFDQSxjQUFLLEtBQUssS0FBSyxDQUFmLEVBQW1CO0FBQ2xCLGdCQUFLLENBQUMsZUFBTixFQUF3QjtBQUN2QixjQUFBLGVBQWUsR0FBRyxFQUFsQjs7QUFDQSxxQkFBUyxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQVQsQ0FBZSxxQkFBZixDQUFqQixFQUE0RDtBQUMzRCxnQkFBQSxlQUFlLENBQUUsS0FBSyxDQUFDLENBQUQsQ0FBTCxDQUFTLFdBQVQsRUFBRixDQUFmLEdBQTRDLEtBQUssQ0FBRSxDQUFGLENBQWpEO0FBQ0E7QUFDRDs7QUFDRCxZQUFBLEtBQUssR0FBRyxlQUFlLENBQUUsR0FBRyxDQUFDLFdBQUosRUFBRixDQUF2QjtBQUNBOztBQUNELGlCQUFPLEtBQUssS0FBSyxTQUFWLEdBQXNCLElBQXRCLEdBQTZCLEtBQXBDO0FBQ0EsU0FoQ007QUFrQ1A7QUFDQSxRQUFBLGdCQUFnQixFQUFFLDBCQUFVLElBQVYsRUFBaUI7QUFDbEMsY0FBSyxDQUFDLEtBQU4sRUFBYztBQUNiLFlBQUEsQ0FBQyxDQUFDLFFBQUYsR0FBYSxJQUFiO0FBQ0E7O0FBQ0QsaUJBQU8sSUFBUDtBQUNBLFNBeENNO0FBMENQO0FBQ0EsUUFBQSxLQUFLLEVBQUUsZUFBVSxVQUFWLEVBQXVCO0FBQzdCLFVBQUEsVUFBVSxHQUFHLFVBQVUsSUFBSSxRQUEzQjs7QUFDQSxjQUFLLFNBQUwsRUFBaUI7QUFDaEIsWUFBQSxTQUFTLENBQUMsS0FBVixDQUFpQixVQUFqQjtBQUNBOztBQUNELFVBQUEsSUFBSSxDQUFFLENBQUYsRUFBSyxVQUFMLENBQUo7QUFDQSxpQkFBTyxJQUFQO0FBQ0E7QUFsRE0sT0F0Q1QsQ0FYOEIsQ0FzRzlCO0FBQ0E7QUFDQTs7QUFDQSxlQUFTLElBQVQsQ0FBZSxNQUFmLEVBQXVCLGdCQUF2QixFQUF5QyxTQUF6QyxFQUFvRCxPQUFwRCxFQUE4RDtBQUM3RCxZQUFJLFNBQUo7QUFBQSxZQUFlLE9BQWY7QUFBQSxZQUF3QixLQUF4QjtBQUFBLFlBQStCLFFBQS9CO0FBQUEsWUFBeUMsUUFBekM7QUFBQSxZQUNDLFVBQVUsR0FBRyxnQkFEZCxDQUQ2RCxDQUk3RDs7QUFDQSxZQUFLLEtBQUssS0FBSyxDQUFmLEVBQW1CO0FBQ2xCO0FBQ0EsU0FQNEQsQ0FTN0Q7OztBQUNBLFFBQUEsS0FBSyxHQUFHLENBQVIsQ0FWNkQsQ0FZN0Q7O0FBQ0EsWUFBSyxZQUFMLEVBQW9CO0FBQ25CLFVBQUEsWUFBWSxDQUFFLFlBQUYsQ0FBWjtBQUNBLFNBZjRELENBaUI3RDtBQUNBOzs7QUFDQSxRQUFBLFNBQVMsR0FBRyxTQUFaLENBbkI2RCxDQXFCN0Q7O0FBQ0EsUUFBQSxxQkFBcUIsR0FBRyxPQUFPLElBQUksRUFBbkMsQ0F0QjZELENBd0I3RDs7QUFDQSxRQUFBLEtBQUssQ0FBQyxVQUFOLEdBQW1CLE1BQU0sR0FBRyxDQUFULEdBQWEsQ0FBYixHQUFpQixDQUFwQyxDQXpCNkQsQ0EyQjdEOztBQUNBLFlBQUssU0FBTCxFQUFpQjtBQUNoQixVQUFBLFFBQVEsR0FBRyxtQkFBbUIsQ0FBRSxDQUFGLEVBQUssS0FBTCxFQUFZLFNBQVosQ0FBOUI7QUFDQSxTQTlCNEQsQ0FnQzdEOzs7QUFDQSxZQUFLLE1BQU0sSUFBSSxHQUFWLElBQWlCLE1BQU0sR0FBRyxHQUExQixJQUFpQyxNQUFNLEtBQUssR0FBakQsRUFBdUQ7QUFFdEQ7QUFDQSxjQUFLLENBQUMsQ0FBQyxVQUFQLEVBQW9CO0FBRW5CLFlBQUEsUUFBUSxHQUFHLEtBQUssQ0FBQyxpQkFBTixDQUF3QixlQUF4QixDQUFYOztBQUNBLGdCQUFLLFFBQUwsRUFBZ0I7QUFDZixjQUFBLE1BQU0sQ0FBQyxZQUFQLENBQXFCLGFBQXJCLElBQXVDLFFBQXZDO0FBQ0E7O0FBQ0QsWUFBQSxRQUFRLEdBQUcsS0FBSyxDQUFDLGlCQUFOLENBQXdCLE1BQXhCLENBQVg7O0FBQ0EsZ0JBQUssUUFBTCxFQUFnQjtBQUNmLGNBQUEsTUFBTSxDQUFDLElBQVAsQ0FBYSxhQUFiLElBQStCLFFBQS9CO0FBQ0E7QUFDRCxXQWJxRCxDQWV0RDs7O0FBQ0EsY0FBSyxNQUFNLEtBQUssR0FBaEIsRUFBc0I7QUFFckIsWUFBQSxVQUFVLEdBQUcsYUFBYjtBQUNBLFlBQUEsU0FBUyxHQUFHLElBQVosQ0FIcUIsQ0FLdEI7QUFDQyxXQU5ELE1BTU87QUFFTixZQUFBLFNBQVMsR0FBRyxXQUFXLENBQUUsQ0FBRixFQUFLLFFBQUwsQ0FBdkI7QUFDQSxZQUFBLFVBQVUsR0FBRyxTQUFTLENBQUMsS0FBdkI7QUFDQSxZQUFBLE9BQU8sR0FBRyxTQUFTLENBQUMsSUFBcEI7QUFDQSxZQUFBLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBbEI7QUFDQSxZQUFBLFNBQVMsR0FBRyxDQUFDLEtBQWI7QUFDQTtBQUNELFNBOUJELE1BOEJPO0FBQ047QUFDQTtBQUNBLFVBQUEsS0FBSyxHQUFHLFVBQVI7O0FBQ0EsY0FBSyxDQUFDLFVBQUQsSUFBZSxNQUFwQixFQUE2QjtBQUM1QixZQUFBLFVBQVUsR0FBRyxPQUFiOztBQUNBLGdCQUFLLE1BQU0sR0FBRyxDQUFkLEVBQWtCO0FBQ2pCLGNBQUEsTUFBTSxHQUFHLENBQVQ7QUFDQTtBQUNEO0FBQ0QsU0F6RTRELENBMkU3RDs7O0FBQ0EsUUFBQSxLQUFLLENBQUMsTUFBTixHQUFlLE1BQWY7QUFDQSxRQUFBLEtBQUssQ0FBQyxVQUFOLEdBQW1CLE1BQU8sZ0JBQWdCLElBQUksVUFBM0IsQ0FBbkIsQ0E3RTZELENBK0U3RDs7QUFDQSxZQUFLLFNBQUwsRUFBaUI7QUFDaEIsVUFBQSxRQUFRLENBQUMsV0FBVCxDQUFzQixlQUF0QixFQUF1QyxDQUFFLE9BQUYsRUFBVyxVQUFYLEVBQXVCLEtBQXZCLENBQXZDO0FBQ0EsU0FGRCxNQUVPO0FBQ04sVUFBQSxRQUFRLENBQUMsVUFBVCxDQUFxQixlQUFyQixFQUFzQyxDQUFFLEtBQUYsRUFBUyxVQUFULEVBQXFCLEtBQXJCLENBQXRDO0FBQ0EsU0FwRjRELENBc0Y3RDs7O0FBQ0EsUUFBQSxLQUFLLENBQUMsVUFBTixDQUFrQixVQUFsQjtBQUNBLFFBQUEsVUFBVSxHQUFHLFNBQWI7O0FBRUEsWUFBSyxXQUFMLEVBQW1CO0FBQ2xCLFVBQUEsa0JBQWtCLENBQUMsT0FBbkIsQ0FBNEIsVUFBVyxTQUFTLEdBQUcsU0FBSCxHQUFlLE9BQW5DLENBQTVCLEVBQ0UsQ0FBRSxLQUFGLEVBQVMsQ0FBVCxFQUFZLFNBQVMsR0FBRyxPQUFILEdBQWEsS0FBbEMsQ0FERjtBQUVBLFNBN0Y0RCxDQStGN0Q7OztBQUNBLFFBQUEsZ0JBQWdCLENBQUMsUUFBakIsQ0FBMkIsZUFBM0IsRUFBNEMsQ0FBRSxLQUFGLEVBQVMsVUFBVCxDQUE1Qzs7QUFFQSxZQUFLLFdBQUwsRUFBbUI7QUFDbEIsVUFBQSxrQkFBa0IsQ0FBQyxPQUFuQixDQUE0QixjQUE1QixFQUE0QyxDQUFFLEtBQUYsRUFBUyxDQUFULENBQTVDLEVBRGtCLENBRWxCOztBQUNBLGNBQUssQ0FBRyxHQUFFLE1BQU0sQ0FBQyxNQUFqQixFQUE0QjtBQUMzQixZQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWEsT0FBYixDQUFzQixVQUF0QjtBQUNBO0FBQ0Q7QUFDRCxPQWxONkIsQ0FvTjlCOzs7QUFDQSxNQUFBLFFBQVEsQ0FBQyxPQUFULENBQWtCLEtBQWxCO0FBQ0EsTUFBQSxLQUFLLENBQUMsT0FBTixHQUFnQixLQUFLLENBQUMsSUFBdEI7QUFDQSxNQUFBLEtBQUssQ0FBQyxLQUFOLEdBQWMsS0FBSyxDQUFDLElBQXBCO0FBQ0EsTUFBQSxLQUFLLENBQUMsUUFBTixHQUFpQixnQkFBZ0IsQ0FBQyxHQUFsQyxDQXhOOEIsQ0EwTjlCOztBQUNBLE1BQUEsS0FBSyxDQUFDLFVBQU4sR0FBbUIsVUFBVSxHQUFWLEVBQWdCO0FBQ2xDLFlBQUssR0FBTCxFQUFXO0FBQ1YsY0FBSSxHQUFKOztBQUNBLGNBQUssS0FBSyxHQUFHLENBQWIsRUFBaUI7QUFDaEIsaUJBQU0sR0FBTixJQUFhLEdBQWIsRUFBbUI7QUFDbEIsY0FBQSxVQUFVLENBQUUsR0FBRixDQUFWLEdBQW9CLENBQUUsVUFBVSxDQUFDLEdBQUQsQ0FBWixFQUFtQixHQUFHLENBQUMsR0FBRCxDQUF0QixDQUFwQjtBQUNBO0FBQ0QsV0FKRCxNQUlPO0FBQ04sWUFBQSxHQUFHLEdBQUcsR0FBRyxDQUFFLEtBQUssQ0FBQyxNQUFSLENBQVQ7QUFDQSxZQUFBLEtBQUssQ0FBQyxNQUFOLENBQWMsR0FBZDtBQUNBO0FBQ0Q7O0FBQ0QsZUFBTyxJQUFQO0FBQ0EsT0FiRCxDQTNOOEIsQ0EwTzlCO0FBQ0E7QUFDQTs7O0FBQ0EsTUFBQSxDQUFDLENBQUMsR0FBRixHQUFRLENBQUUsQ0FBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQVgsSUFBbUIsRUFBckIsRUFBMEIsT0FBMUIsQ0FBbUMsS0FBbkMsRUFBMEMsRUFBMUMsRUFBK0MsT0FBL0MsQ0FBd0QsU0FBeEQsRUFBbUUsWUFBWSxDQUFFLENBQUYsQ0FBWixHQUFvQixJQUF2RixDQUFSLENBN084QixDQStPOUI7O0FBQ0EsTUFBQSxDQUFDLENBQUMsU0FBRixHQUFjLE1BQU0sQ0FBQyxJQUFQLENBQWEsQ0FBQyxDQUFDLFFBQUYsSUFBYyxHQUEzQixFQUFpQyxXQUFqQyxHQUErQyxLQUEvQyxDQUFzRCxXQUF0RCxDQUFkLENBaFA4QixDQWtQOUI7O0FBQ0EsVUFBSyxDQUFDLENBQUMsV0FBRixJQUFpQixJQUF0QixFQUE2QjtBQUM1QixRQUFBLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBTCxDQUFXLENBQUMsQ0FBQyxHQUFGLENBQU0sV0FBTixFQUFYLENBQVI7QUFDQSxRQUFBLENBQUMsQ0FBQyxXQUFGLEdBQWdCLENBQUMsRUFBRyxLQUFLLEtBQ3RCLEtBQUssQ0FBRSxDQUFGLENBQUwsSUFBYyxZQUFZLENBQUUsQ0FBRixDQUExQixJQUFtQyxLQUFLLENBQUUsQ0FBRixDQUFMLElBQWMsWUFBWSxDQUFFLENBQUYsQ0FBN0QsSUFDRCxDQUFFLEtBQUssQ0FBRSxDQUFGLENBQUwsS0FBZ0IsS0FBSyxDQUFFLENBQUYsQ0FBTCxLQUFlLE9BQWYsR0FBeUIsRUFBekIsR0FBOEIsR0FBOUMsQ0FBRixNQUNHLFlBQVksQ0FBRSxDQUFGLENBQVosS0FBdUIsWUFBWSxDQUFFLENBQUYsQ0FBWixLQUFzQixPQUF0QixHQUFnQyxFQUFoQyxHQUFxQyxHQUE1RCxDQURILENBRnVCLENBQVIsQ0FBakI7QUFLQSxPQTFQNkIsQ0E0UDlCOzs7QUFDQSxVQUFLLENBQUMsQ0FBQyxJQUFGLElBQVUsQ0FBQyxDQUFDLFdBQVosSUFBMkIsT0FBTyxDQUFDLENBQUMsSUFBVCxLQUFrQixRQUFsRCxFQUE2RDtBQUM1RCxRQUFBLENBQUMsQ0FBQyxJQUFGLEdBQVMsTUFBTSxDQUFDLEtBQVAsQ0FBYyxDQUFDLENBQUMsSUFBaEIsRUFBc0IsQ0FBQyxDQUFDLFdBQXhCLENBQVQ7QUFDQSxPQS9QNkIsQ0FpUTlCOzs7QUFDQSxNQUFBLDZCQUE2QixDQUFFLFVBQUYsRUFBYyxDQUFkLEVBQWlCLE9BQWpCLEVBQTBCLEtBQTFCLENBQTdCLENBbFE4QixDQW9ROUI7O0FBQ0EsVUFBSyxLQUFLLEtBQUssQ0FBZixFQUFtQjtBQUNsQixlQUFPLEtBQVA7QUFDQSxPQXZRNkIsQ0F5UTlCOzs7QUFDQSxNQUFBLFdBQVcsR0FBRyxDQUFDLENBQUMsTUFBaEIsQ0ExUThCLENBNFE5Qjs7QUFDQSxNQUFBLENBQUMsQ0FBQyxJQUFGLEdBQVMsQ0FBQyxDQUFDLElBQUYsQ0FBTyxXQUFQLEVBQVQsQ0E3UThCLENBK1E5Qjs7QUFDQSxNQUFBLENBQUMsQ0FBQyxVQUFGLEdBQWUsQ0FBQyxVQUFVLENBQUMsSUFBWCxDQUFpQixDQUFDLENBQUMsSUFBbkIsQ0FBaEIsQ0FoUjhCLENBa1I5Qjs7QUFDQSxVQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsTUFBUCxPQUFvQixDQUF4QyxFQUE0QztBQUMzQyxRQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWEsT0FBYixDQUFzQixXQUF0QjtBQUNBLE9BclI2QixDQXVSOUI7OztBQUNBLFVBQUssQ0FBQyxDQUFDLENBQUMsVUFBUixFQUFxQjtBQUVwQjtBQUNBLFlBQUssQ0FBQyxDQUFDLElBQVAsRUFBYztBQUNiLFVBQUEsQ0FBQyxDQUFDLEdBQUYsSUFBUyxDQUFFLE1BQU0sQ0FBQyxJQUFQLENBQWEsQ0FBQyxDQUFDLEdBQWYsSUFBdUIsR0FBdkIsR0FBNkIsR0FBL0IsSUFBdUMsQ0FBQyxDQUFDLElBQWxELENBRGEsQ0FFYjs7QUFDQSxpQkFBTyxDQUFDLENBQUMsSUFBVDtBQUNBLFNBUG1CLENBU3BCOzs7QUFDQSxRQUFBLGFBQWEsR0FBRyxDQUFDLENBQUMsR0FBbEIsQ0FWb0IsQ0FZcEI7O0FBQ0EsWUFBSyxDQUFDLENBQUMsS0FBRixLQUFZLEtBQWpCLEVBQXlCO0FBRXhCLGNBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFQLEVBQVQ7QUFBQSxjQUNDO0FBQ0EsVUFBQSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUYsQ0FBTSxPQUFOLENBQWUsR0FBZixFQUFvQixTQUFTLEVBQTdCLENBRlAsQ0FGd0IsQ0FNeEI7O0FBQ0EsVUFBQSxDQUFDLENBQUMsR0FBRixHQUFRLEdBQUcsSUFBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQVosR0FBb0IsQ0FBRSxNQUFNLENBQUMsSUFBUCxDQUFhLENBQUMsQ0FBQyxHQUFmLElBQXVCLEdBQXZCLEdBQTZCLEdBQS9CLElBQXVDLElBQXZDLEdBQThDLEVBQWxFLEdBQXVFLEVBQTVFLENBQVg7QUFDQTtBQUNELE9BOVM2QixDQWdUOUI7OztBQUNBLFVBQUssQ0FBQyxDQUFDLElBQUYsSUFBVSxDQUFDLENBQUMsVUFBWixJQUEwQixDQUFDLENBQUMsV0FBRixLQUFrQixLQUE1QyxJQUFxRCxPQUFPLENBQUMsV0FBbEUsRUFBZ0Y7QUFDL0UsUUFBQSxLQUFLLENBQUMsZ0JBQU4sQ0FBd0IsY0FBeEIsRUFBd0MsQ0FBQyxDQUFDLFdBQTFDO0FBQ0EsT0FuVDZCLENBcVQ5Qjs7O0FBQ0EsVUFBSyxDQUFDLENBQUMsVUFBUCxFQUFvQjtBQUNuQixRQUFBLGFBQWEsR0FBRyxhQUFhLElBQUksQ0FBQyxDQUFDLEdBQW5DOztBQUNBLFlBQUssTUFBTSxDQUFDLFlBQVAsQ0FBcUIsYUFBckIsQ0FBTCxFQUE0QztBQUMzQyxVQUFBLEtBQUssQ0FBQyxnQkFBTixDQUF3QixtQkFBeEIsRUFBNkMsTUFBTSxDQUFDLFlBQVAsQ0FBcUIsYUFBckIsQ0FBN0M7QUFDQTs7QUFDRCxZQUFLLE1BQU0sQ0FBQyxJQUFQLENBQWEsYUFBYixDQUFMLEVBQW9DO0FBQ25DLFVBQUEsS0FBSyxDQUFDLGdCQUFOLENBQXdCLGVBQXhCLEVBQXlDLE1BQU0sQ0FBQyxJQUFQLENBQWEsYUFBYixDQUF6QztBQUNBO0FBQ0QsT0E5VDZCLENBZ1U5Qjs7O0FBQ0EsTUFBQSxLQUFLLENBQUMsZ0JBQU4sQ0FDQyxRQURELEVBRUMsQ0FBQyxDQUFDLFNBQUYsQ0FBYSxDQUFiLEtBQW9CLENBQUMsQ0FBQyxPQUFGLENBQVcsQ0FBQyxDQUFDLFNBQUYsQ0FBWSxDQUFaLENBQVgsQ0FBcEIsR0FDQyxDQUFDLENBQUMsT0FBRixDQUFXLENBQUMsQ0FBQyxTQUFGLENBQVksQ0FBWixDQUFYLEtBQWdDLENBQUMsQ0FBQyxTQUFGLENBQWEsQ0FBYixNQUFxQixHQUFyQixHQUEyQixPQUFPLFFBQVAsR0FBa0IsVUFBN0MsR0FBMEQsRUFBMUYsQ0FERCxHQUVDLENBQUMsQ0FBQyxPQUFGLENBQVcsR0FBWCxDQUpGLEVBalU4QixDQXdVOUI7O0FBQ0EsV0FBTSxDQUFOLElBQVcsQ0FBQyxDQUFDLE9BQWIsRUFBdUI7QUFDdEIsUUFBQSxLQUFLLENBQUMsZ0JBQU4sQ0FBd0IsQ0FBeEIsRUFBMkIsQ0FBQyxDQUFDLE9BQUYsQ0FBVyxDQUFYLENBQTNCO0FBQ0EsT0EzVTZCLENBNlU5Qjs7O0FBQ0EsVUFBSyxDQUFDLENBQUMsVUFBRixLQUFrQixDQUFDLENBQUMsVUFBRixDQUFhLElBQWIsQ0FBbUIsZUFBbkIsRUFBb0MsS0FBcEMsRUFBMkMsQ0FBM0MsTUFBbUQsS0FBbkQsSUFBNEQsS0FBSyxLQUFLLENBQXhGLENBQUwsRUFBbUc7QUFDakc7QUFDQSxlQUFPLEtBQUssQ0FBQyxLQUFOLEVBQVA7QUFFRCxPQWxWNkIsQ0FvVjlCOzs7QUFDQSxNQUFBLFFBQVEsR0FBRyxPQUFYLENBclY4QixDQXVWOUI7O0FBQ0EsV0FBTSxDQUFOLElBQVc7QUFBRSxRQUFBLE9BQU8sRUFBRSxDQUFYO0FBQWMsUUFBQSxLQUFLLEVBQUUsQ0FBckI7QUFBd0IsUUFBQSxRQUFRLEVBQUU7QUFBbEMsT0FBWCxFQUFtRDtBQUNsRCxRQUFBLEtBQUssQ0FBRSxDQUFGLENBQUwsQ0FBWSxDQUFDLENBQUUsQ0FBRixDQUFiO0FBQ0EsT0ExVjZCLENBNFY5Qjs7O0FBQ0EsTUFBQSxTQUFTLEdBQUcsNkJBQTZCLENBQUUsVUFBRixFQUFjLENBQWQsRUFBaUIsT0FBakIsRUFBMEIsS0FBMUIsQ0FBekMsQ0E3VjhCLENBK1Y5Qjs7QUFDQSxVQUFLLENBQUMsU0FBTixFQUFrQjtBQUNqQixRQUFBLElBQUksQ0FBRSxDQUFDLENBQUgsRUFBTSxjQUFOLENBQUo7QUFDQSxPQUZELE1BRU87QUFDTixRQUFBLEtBQUssQ0FBQyxVQUFOLEdBQW1CLENBQW5CLENBRE0sQ0FFTjs7QUFDQSxZQUFLLFdBQUwsRUFBbUI7QUFDbEIsVUFBQSxrQkFBa0IsQ0FBQyxPQUFuQixDQUE0QixVQUE1QixFQUF3QyxDQUFFLEtBQUYsRUFBUyxDQUFULENBQXhDO0FBQ0EsU0FMSyxDQU1OOzs7QUFDQSxZQUFLLENBQUMsQ0FBQyxLQUFGLElBQVcsQ0FBQyxDQUFDLE9BQUYsR0FBWSxDQUE1QixFQUFnQztBQUMvQixVQUFBLFlBQVksR0FBRyxVQUFVLENBQUUsWUFBVTtBQUNwQyxZQUFBLEtBQUssQ0FBQyxLQUFOLENBQWEsU0FBYjtBQUNBLFdBRndCLEVBRXRCLENBQUMsQ0FBQyxPQUZvQixDQUF6QjtBQUdBOztBQUVELFlBQUk7QUFDSCxVQUFBLEtBQUssR0FBRyxDQUFSO0FBQ0EsVUFBQSxTQUFTLENBQUMsSUFBVixDQUFnQixjQUFoQixFQUFnQyxJQUFoQztBQUNBLFNBSEQsQ0FHRSxPQUFPLENBQVAsRUFBVTtBQUNYO0FBQ0EsY0FBSyxLQUFLLEdBQUcsQ0FBYixFQUFpQjtBQUNoQixZQUFBLElBQUksQ0FBRSxDQUFDLENBQUgsRUFBTSxDQUFOLENBQUosQ0FEZ0IsQ0FFakI7QUFDQyxXQUhELE1BR087QUFDTixrQkFBTSxDQUFOO0FBQ0E7QUFDRDtBQUNEOztBQUVELGFBQU8sS0FBUDtBQUNBLEtBL2RZO0FBaWViO0FBQ0EsSUFBQSxNQUFNLEVBQUUsQ0FsZUs7QUFvZWI7QUFDQSxJQUFBLFlBQVksRUFBRSxFQXJlRDtBQXNlYixJQUFBLElBQUksRUFBRTtBQXRlTyxHQUFkO0FBMGVBOzs7Ozs7QUFLQSxXQUFTLG1CQUFULENBQThCLENBQTlCLEVBQWlDLEtBQWpDLEVBQXdDLFNBQXhDLEVBQW9EO0FBRW5ELFFBQUksRUFBSjtBQUFBLFFBQVEsSUFBUjtBQUFBLFFBQWMsYUFBZDtBQUFBLFFBQTZCLGFBQTdCO0FBQUEsUUFDQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBRGQ7QUFBQSxRQUVDLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FGZjtBQUFBLFFBR0MsY0FBYyxHQUFHLENBQUMsQ0FBQyxjQUhwQixDQUZtRCxDQU9uRDs7QUFDQSxTQUFNLElBQU4sSUFBYyxjQUFkLEVBQStCO0FBQzlCLFVBQUssSUFBSSxJQUFJLFNBQWIsRUFBeUI7QUFDeEIsUUFBQSxLQUFLLENBQUUsY0FBYyxDQUFDLElBQUQsQ0FBaEIsQ0FBTCxHQUFnQyxTQUFTLENBQUUsSUFBRixDQUF6QztBQUNBO0FBQ0QsS0Faa0QsQ0FjbkQ7OztBQUNBLFdBQU8sU0FBUyxDQUFFLENBQUYsQ0FBVCxLQUFtQixHQUExQixFQUFnQztBQUMvQixNQUFBLFNBQVMsQ0FBQyxLQUFWOztBQUNBLFVBQUssRUFBRSxLQUFLLFNBQVosRUFBd0I7QUFDdkIsUUFBQSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQUYsSUFBYyxLQUFLLENBQUMsaUJBQU4sQ0FBeUIsY0FBekIsQ0FBbkI7QUFDQTtBQUNELEtBcEJrRCxDQXNCbkQ7OztBQUNBLFFBQUssRUFBTCxFQUFVO0FBQ1QsV0FBTSxJQUFOLElBQWMsUUFBZCxFQUF5QjtBQUN4QixZQUFLLFFBQVEsQ0FBRSxJQUFGLENBQVIsSUFBb0IsUUFBUSxDQUFFLElBQUYsQ0FBUixDQUFpQixJQUFqQixDQUF1QixFQUF2QixDQUF6QixFQUF1RDtBQUN0RCxVQUFBLFNBQVMsQ0FBQyxPQUFWLENBQW1CLElBQW5CO0FBQ0E7QUFDQTtBQUNEO0FBQ0QsS0E5QmtELENBZ0NuRDs7O0FBQ0EsUUFBSyxTQUFTLENBQUUsQ0FBRixDQUFULElBQWtCLFNBQXZCLEVBQW1DO0FBQ2xDLE1BQUEsYUFBYSxHQUFHLFNBQVMsQ0FBRSxDQUFGLENBQXpCO0FBQ0EsS0FGRCxNQUVPO0FBQ047QUFDQSxXQUFNLElBQU4sSUFBYyxTQUFkLEVBQTBCO0FBQ3pCLFlBQUssQ0FBQyxTQUFTLENBQUUsQ0FBRixDQUFWLElBQW1CLENBQUMsQ0FBQyxVQUFGLENBQWMsSUFBSSxHQUFHLEdBQVAsR0FBYSxTQUFTLENBQUMsQ0FBRCxDQUFwQyxDQUF4QixFQUFvRTtBQUNuRSxVQUFBLGFBQWEsR0FBRyxJQUFoQjtBQUNBO0FBQ0E7O0FBQ0QsWUFBSyxDQUFDLGFBQU4sRUFBc0I7QUFDckIsVUFBQSxhQUFhLEdBQUcsSUFBaEI7QUFDQTtBQUNELE9BVkssQ0FXTjs7O0FBQ0EsTUFBQSxhQUFhLEdBQUcsYUFBYSxJQUFJLGFBQWpDO0FBQ0EsS0FoRGtELENBa0RuRDtBQUNBO0FBQ0E7OztBQUNBLFFBQUssYUFBTCxFQUFxQjtBQUNwQixVQUFLLGFBQWEsS0FBSyxTQUFTLENBQUUsQ0FBRixDQUFoQyxFQUF3QztBQUN2QyxRQUFBLFNBQVMsQ0FBQyxPQUFWLENBQW1CLGFBQW5CO0FBQ0E7O0FBQ0QsYUFBTyxTQUFTLENBQUUsYUFBRixDQUFoQjtBQUNBO0FBQ0QsR0FudVA4QixDQXF1UC9COzs7QUFDQSxXQUFTLFdBQVQsQ0FBc0IsQ0FBdEIsRUFBeUIsUUFBekIsRUFBb0M7QUFFbkMsUUFBSSxJQUFKO0FBQUEsUUFBVSxLQUFWO0FBQUEsUUFBaUIsT0FBakI7QUFBQSxRQUEwQixHQUExQjtBQUFBLFFBQ0M7QUFDQSxJQUFBLFNBQVMsR0FBRyxDQUFDLENBQUMsU0FBRixDQUFZLEtBQVosRUFGYjtBQUFBLFFBR0MsSUFBSSxHQUFHLFNBQVMsQ0FBRSxDQUFGLENBSGpCO0FBQUEsUUFJQyxVQUFVLEdBQUcsRUFKZDtBQUFBLFFBS0MsQ0FBQyxHQUFHLENBTEwsQ0FGbUMsQ0FTbkM7O0FBQ0EsUUFBSyxDQUFDLENBQUMsVUFBUCxFQUFvQjtBQUNuQixNQUFBLFFBQVEsR0FBRyxDQUFDLENBQUMsVUFBRixDQUFjLFFBQWQsRUFBd0IsQ0FBQyxDQUFDLFFBQTFCLENBQVg7QUFDQSxLQVprQyxDQWNuQzs7O0FBQ0EsUUFBSyxTQUFTLENBQUUsQ0FBRixDQUFkLEVBQXNCO0FBQ3JCLFdBQU0sSUFBTixJQUFjLENBQUMsQ0FBQyxVQUFoQixFQUE2QjtBQUM1QixRQUFBLFVBQVUsQ0FBRSxJQUFJLENBQUMsV0FBTCxFQUFGLENBQVYsR0FBbUMsQ0FBQyxDQUFDLFVBQUYsQ0FBYyxJQUFkLENBQW5DO0FBQ0E7QUFDRCxLQW5Ca0MsQ0FxQm5DOzs7QUFDQSxXQUFTLE9BQU8sR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFILENBQTVCLEdBQXNDO0FBRXJDO0FBQ0EsVUFBSyxPQUFPLEtBQUssR0FBakIsRUFBdUI7QUFFdEI7QUFDQSxZQUFLLElBQUksS0FBSyxHQUFULElBQWdCLElBQUksS0FBSyxPQUE5QixFQUF3QztBQUV2QztBQUNBLFVBQUEsSUFBSSxHQUFHLFVBQVUsQ0FBRSxJQUFJLEdBQUcsR0FBUCxHQUFhLE9BQWYsQ0FBVixJQUFzQyxVQUFVLENBQUUsT0FBTyxPQUFULENBQXZELENBSHVDLENBS3ZDOztBQUNBLGNBQUssQ0FBQyxJQUFOLEVBQWE7QUFDWixpQkFBTSxLQUFOLElBQWUsVUFBZixFQUE0QjtBQUUzQjtBQUNBLGNBQUEsR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFOLENBQVksR0FBWixDQUFOOztBQUNBLGtCQUFLLEdBQUcsQ0FBRSxDQUFGLENBQUgsS0FBYSxPQUFsQixFQUE0QjtBQUUzQjtBQUNBLGdCQUFBLElBQUksR0FBRyxVQUFVLENBQUUsSUFBSSxHQUFHLEdBQVAsR0FBYSxHQUFHLENBQUUsQ0FBRixDQUFsQixDQUFWLElBQ04sVUFBVSxDQUFFLE9BQU8sR0FBRyxDQUFFLENBQUYsQ0FBWixDQURYOztBQUVBLG9CQUFLLElBQUwsRUFBWTtBQUNYO0FBQ0Esc0JBQUssSUFBSSxLQUFLLElBQWQsRUFBcUI7QUFDcEIsb0JBQUEsSUFBSSxHQUFHLFVBQVUsQ0FBRSxLQUFGLENBQWpCLENBRG9CLENBR3JCO0FBQ0MsbUJBSkQsTUFJTyxJQUFLLFVBQVUsQ0FBRSxLQUFGLENBQVYsS0FBd0IsSUFBN0IsRUFBb0M7QUFDMUMsb0JBQUEsT0FBTyxHQUFHLEdBQUcsQ0FBRSxDQUFGLENBQWI7QUFDQSxvQkFBQSxTQUFTLENBQUMsTUFBVixDQUFrQixDQUFDLEVBQW5CLEVBQXVCLENBQXZCLEVBQTBCLE9BQTFCO0FBQ0E7O0FBRUQ7QUFDQTtBQUNEO0FBQ0Q7QUFDRCxXQS9Cc0MsQ0FpQ3ZDOzs7QUFDQSxjQUFLLElBQUksS0FBSyxJQUFkLEVBQXFCO0FBRXBCO0FBQ0EsZ0JBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxRQUFELENBQWQsRUFBMkI7QUFDMUIsY0FBQSxRQUFRLEdBQUcsSUFBSSxDQUFFLFFBQUYsQ0FBZjtBQUNBLGFBRkQsTUFFTztBQUNOLGtCQUFJO0FBQ0gsZ0JBQUEsUUFBUSxHQUFHLElBQUksQ0FBRSxRQUFGLENBQWY7QUFDQSxlQUZELENBRUUsT0FBUSxDQUFSLEVBQVk7QUFDYix1QkFBTztBQUFFLGtCQUFBLEtBQUssRUFBRSxhQUFUO0FBQXdCLGtCQUFBLEtBQUssRUFBRSxJQUFJLEdBQUcsQ0FBSCxHQUFPLHdCQUF3QixJQUF4QixHQUErQixNQUEvQixHQUF3QztBQUFsRixpQkFBUDtBQUNBO0FBQ0Q7QUFDRDtBQUNELFNBbERxQixDQW9EdEI7OztBQUNBLFFBQUEsSUFBSSxHQUFHLE9BQVA7QUFDQTtBQUNEOztBQUVELFdBQU87QUFBRSxNQUFBLEtBQUssRUFBRSxTQUFUO0FBQW9CLE1BQUEsSUFBSSxFQUFFO0FBQTFCLEtBQVA7QUFDQTs7QUFDRCxNQUFJLFlBQVksR0FBRyxFQUFuQjtBQUFBLE1BQ0MsU0FBUyxHQUFHLElBRGI7QUFBQSxNQUVDLE1BQU0sR0FBRyxtQkFGVjtBQUFBLE1BR0MsS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFQLEVBSFQsQ0ExelArQixDQSt6UC9COztBQUNBLEVBQUEsTUFBTSxDQUFDLFNBQVAsQ0FBaUI7QUFDaEIsSUFBQSxLQUFLLEVBQUUsVUFEUztBQUVoQixJQUFBLGFBQWEsRUFBRSx5QkFBVztBQUN6QixVQUFJLFFBQVEsR0FBRyxZQUFZLENBQUMsR0FBYixNQUF3QixNQUFNLENBQUMsT0FBUCxHQUFpQixHQUFqQixHQUF5QixLQUFLLEVBQXJFO0FBQ0EsV0FBTSxRQUFOLElBQW1CLElBQW5CO0FBQ0EsYUFBTyxRQUFQO0FBQ0E7QUFOZSxHQUFqQixFQWgwUCtCLENBeTBQL0I7O0FBQ0EsRUFBQSxNQUFNLENBQUMsYUFBUCxDQUFzQixZQUF0QixFQUFvQyxVQUFVLENBQVYsRUFBYSxnQkFBYixFQUErQixLQUEvQixFQUF1QztBQUUxRSxRQUFJLFlBQUo7QUFBQSxRQUFrQixXQUFsQjtBQUFBLFFBQStCLGlCQUEvQjtBQUFBLFFBQ0MsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQURWO0FBQUEsUUFFQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBRlQ7QUFBQSxRQUdDLFdBQVcsR0FBRyxDQUFDLENBQUMsS0FBRixLQUFZLEtBSDNCO0FBQUEsUUFJQyxZQUFZLEdBQUcsV0FBVyxJQUFJLE1BQU0sQ0FBQyxJQUFQLENBQWEsR0FBYixDQUovQjtBQUFBLFFBS0MsYUFBYSxHQUFHLFdBQVcsSUFBSSxDQUFDLFlBQWhCLElBQWdDLE9BQU8sSUFBUCxLQUFnQixRQUFoRCxJQUNmLENBQUMsQ0FBRSxDQUFDLENBQUMsV0FBRixJQUFpQixFQUFuQixFQUF3QixPQUF4QixDQUFnQyxtQ0FBaEMsQ0FEYyxJQUVmLE1BQU0sQ0FBQyxJQUFQLENBQWEsSUFBYixDQVBGLENBRjBFLENBVzFFOztBQUNBLFFBQUssQ0FBQyxDQUFDLFNBQUYsQ0FBYSxDQUFiLE1BQXFCLE9BQXJCLElBQWdDLFlBQWhDLElBQWdELGFBQXJELEVBQXFFO0FBRXBFO0FBQ0EsTUFBQSxZQUFZLEdBQUcsQ0FBQyxDQUFDLGFBQUYsR0FBa0IsTUFBTSxDQUFDLFVBQVAsQ0FBbUIsQ0FBQyxDQUFDLGFBQXJCLElBQ2hDLENBQUMsQ0FBQyxhQUFGLEVBRGdDLEdBRWhDLENBQUMsQ0FBQyxhQUZIO0FBR0EsTUFBQSxXQUFXLEdBQUcsTUFBTSxDQUFFLFlBQUYsQ0FBcEIsQ0FOb0UsQ0FRcEU7O0FBQ0EsVUFBSyxZQUFMLEVBQW9CO0FBQ25CLFFBQUEsQ0FBQyxDQUFDLEdBQUYsR0FBUSxHQUFHLENBQUMsT0FBSixDQUFhLE1BQWIsRUFBcUIsT0FBTyxZQUE1QixDQUFSO0FBQ0EsT0FGRCxNQUVPLElBQUssYUFBTCxFQUFxQjtBQUMzQixRQUFBLENBQUMsQ0FBQyxJQUFGLEdBQVMsSUFBSSxDQUFDLE9BQUwsQ0FBYyxNQUFkLEVBQXNCLE9BQU8sWUFBN0IsQ0FBVDtBQUNBLE9BRk0sTUFFQSxJQUFLLFdBQUwsRUFBbUI7QUFDekIsUUFBQSxDQUFDLENBQUMsR0FBRixJQUFTLENBQUUsU0FBUyxDQUFDLElBQVYsQ0FBZ0IsR0FBaEIsSUFBd0IsR0FBeEIsR0FBOEIsR0FBaEMsSUFBd0MsQ0FBQyxDQUFDLEtBQTFDLEdBQWtELEdBQWxELEdBQXdELFlBQWpFO0FBQ0EsT0FmbUUsQ0FpQnBFOzs7QUFDQSxNQUFBLENBQUMsQ0FBQyxVQUFGLENBQWEsYUFBYixJQUE4QixZQUFXO0FBQ3hDLFlBQUssQ0FBQyxpQkFBTixFQUEwQjtBQUN6QixVQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWMsWUFBWSxHQUFHLGlCQUE3QjtBQUNBOztBQUNELGVBQU8saUJBQWlCLENBQUUsQ0FBRixDQUF4QjtBQUNBLE9BTEQsQ0FsQm9FLENBeUJwRTs7O0FBQ0EsTUFBQSxDQUFDLENBQUMsU0FBRixDQUFhLENBQWIsSUFBbUIsTUFBbkIsQ0ExQm9FLENBNEJwRTs7QUFDQSxNQUFBLE1BQU0sQ0FBRSxZQUFGLENBQU4sR0FBeUIsWUFBVztBQUNuQyxRQUFBLGlCQUFpQixHQUFHLFNBQXBCO0FBQ0EsT0FGRCxDQTdCb0UsQ0FpQ3BFOzs7QUFDQSxNQUFBLEtBQUssQ0FBQyxNQUFOLENBQWEsWUFBVztBQUN2QjtBQUNBLFFBQUEsTUFBTSxDQUFFLFlBQUYsQ0FBTixHQUF5QixXQUF6QixDQUZ1QixDQUl2Qjs7QUFDQSxZQUFLLENBQUMsQ0FBRSxZQUFGLENBQU4sRUFBeUI7QUFDeEI7QUFDQSxVQUFBLENBQUMsQ0FBQyxhQUFGLEdBQWtCLGdCQUFnQixDQUFDLGFBQW5DLENBRndCLENBSXhCOztBQUNBLFVBQUEsWUFBWSxDQUFDLElBQWIsQ0FBbUIsWUFBbkI7QUFDQSxTQVhzQixDQWF2Qjs7O0FBQ0EsWUFBSyxpQkFBaUIsSUFBSSxNQUFNLENBQUMsVUFBUCxDQUFtQixXQUFuQixDQUExQixFQUE2RDtBQUM1RCxVQUFBLFdBQVcsQ0FBRSxpQkFBaUIsQ0FBRSxDQUFGLENBQW5CLENBQVg7QUFDQTs7QUFFRCxRQUFBLGlCQUFpQixHQUFHLFdBQVcsR0FBRyxTQUFsQztBQUNBLE9BbkJELEVBbENvRSxDQXVEcEU7O0FBQ0EsYUFBTyxRQUFQO0FBQ0E7QUFDRCxHQXRFRCxFQTEwUCtCLENBaTVQL0I7O0FBQ0EsRUFBQSxNQUFNLENBQUMsU0FBUCxDQUFpQjtBQUNoQixJQUFBLE9BQU8sRUFBRTtBQUNSLE1BQUEsTUFBTSxFQUFFO0FBREEsS0FETztBQUloQixJQUFBLFFBQVEsRUFBRTtBQUNULE1BQUEsTUFBTSxFQUFFO0FBREMsS0FKTTtBQU9oQixJQUFBLFVBQVUsRUFBRTtBQUNYLHFCQUFlLG9CQUFVLElBQVYsRUFBaUI7QUFDL0IsUUFBQSxNQUFNLENBQUMsVUFBUCxDQUFtQixJQUFuQjtBQUNBLGVBQU8sSUFBUDtBQUNBO0FBSlU7QUFQSSxHQUFqQixFQWw1UCtCLENBaTZQL0I7O0FBQ0EsRUFBQSxNQUFNLENBQUMsYUFBUCxDQUFzQixRQUF0QixFQUFnQyxVQUFVLENBQVYsRUFBYztBQUM3QyxRQUFLLENBQUMsQ0FBQyxLQUFGLEtBQVksU0FBakIsRUFBNkI7QUFDNUIsTUFBQSxDQUFDLENBQUMsS0FBRixHQUFVLEtBQVY7QUFDQTs7QUFDRCxRQUFLLENBQUMsQ0FBQyxXQUFQLEVBQXFCO0FBQ3BCLE1BQUEsQ0FBQyxDQUFDLElBQUYsR0FBUyxLQUFUO0FBQ0EsTUFBQSxDQUFDLENBQUMsTUFBRixHQUFXLEtBQVg7QUFDQTtBQUNELEdBUkQsRUFsNlArQixDQTQ2UC9COztBQUNBLEVBQUEsTUFBTSxDQUFDLGFBQVAsQ0FBc0IsUUFBdEIsRUFBZ0MsVUFBUyxDQUFULEVBQVk7QUFFM0M7QUFDQSxRQUFLLENBQUMsQ0FBQyxXQUFQLEVBQXFCO0FBRXBCLFVBQUksTUFBSjtBQUFBLFVBQ0MsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFULElBQWlCLFFBQVEsQ0FBQyxvQkFBVCxDQUErQixNQUEvQixFQUF3QyxDQUF4QyxDQUFqQixJQUErRCxRQUFRLENBQUMsZUFEaEY7QUFHQSxhQUFPO0FBRU4sUUFBQSxJQUFJLEVBQUUsY0FBVSxDQUFWLEVBQWEsUUFBYixFQUF3QjtBQUU3QixVQUFBLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBVCxDQUF3QixRQUF4QixDQUFUO0FBRUEsVUFBQSxNQUFNLENBQUMsS0FBUCxHQUFlLE9BQWY7O0FBRUEsY0FBSyxDQUFDLENBQUMsYUFBUCxFQUF1QjtBQUN0QixZQUFBLE1BQU0sQ0FBQyxPQUFQLEdBQWlCLENBQUMsQ0FBQyxhQUFuQjtBQUNBOztBQUVELFVBQUEsTUFBTSxDQUFDLEdBQVAsR0FBYSxDQUFDLENBQUMsR0FBZixDQVY2QixDQVk3Qjs7QUFDQSxVQUFBLE1BQU0sQ0FBQyxNQUFQLEdBQWdCLE1BQU0sQ0FBQyxrQkFBUCxHQUE0QixVQUFVLENBQVYsRUFBYSxPQUFiLEVBQXVCO0FBRWxFLGdCQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFuQixJQUFpQyxrQkFBa0IsSUFBbEIsQ0FBd0IsTUFBTSxDQUFDLFVBQS9CLENBQXRDLEVBQW9GO0FBRW5GO0FBQ0EsY0FBQSxNQUFNLENBQUMsTUFBUCxHQUFnQixNQUFNLENBQUMsa0JBQVAsR0FBNEIsSUFBNUMsQ0FIbUYsQ0FLbkY7O0FBQ0Esa0JBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxVQUFwQixFQUFpQztBQUNoQyxnQkFBQSxJQUFJLENBQUMsV0FBTCxDQUFrQixNQUFsQjtBQUNBLGVBUmtGLENBVW5GOzs7QUFDQSxjQUFBLE1BQU0sR0FBRyxTQUFULENBWG1GLENBYW5GOztBQUNBLGtCQUFLLENBQUMsT0FBTixFQUFnQjtBQUNmLGdCQUFBLFFBQVEsQ0FBRSxHQUFGLEVBQU8sU0FBUCxDQUFSO0FBQ0E7QUFDRDtBQUNELFdBcEJELENBYjZCLENBa0M3QjtBQUNBOzs7QUFDQSxVQUFBLElBQUksQ0FBQyxZQUFMLENBQW1CLE1BQW5CLEVBQTJCLElBQUksQ0FBQyxVQUFoQztBQUNBLFNBdkNLO0FBeUNOLFFBQUEsS0FBSyxFQUFFLGlCQUFXO0FBQ2pCLGNBQUssTUFBTCxFQUFjO0FBQ2IsWUFBQSxNQUFNLENBQUMsTUFBUCxDQUFlLENBQWYsRUFBa0IsQ0FBbEI7QUFDQTtBQUNEO0FBN0NLLE9BQVA7QUErQ0E7QUFDRCxHQXhERDtBQXlEQSxNQUFJLFlBQUo7QUFBQSxNQUNDO0FBQ0EsRUFBQSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsYUFBUCxHQUF1QixZQUFXO0FBQ3BEO0FBQ0EsU0FBTSxJQUFJLEdBQVYsSUFBaUIsWUFBakIsRUFBZ0M7QUFDL0IsTUFBQSxZQUFZLENBQUUsR0FBRixDQUFaLENBQXFCLENBQXJCLEVBQXdCLENBQXhCO0FBQ0E7QUFDRCxHQUxrQixHQUtmLEtBUEw7QUFBQSxNQVFDLEtBQUssR0FBRyxDQVJULENBdCtQK0IsQ0FnL1AvQjs7QUFDQSxXQUFTLGlCQUFULEdBQTZCO0FBQzVCLFFBQUk7QUFDSCxhQUFPLElBQUksTUFBTSxDQUFDLGNBQVgsRUFBUDtBQUNBLEtBRkQsQ0FFRSxPQUFPLENBQVAsRUFBVyxDQUFFO0FBQ2Y7O0FBRUQsV0FBUyxlQUFULEdBQTJCO0FBQzFCLFFBQUk7QUFDSCxhQUFPLElBQUksTUFBTSxDQUFDLGFBQVgsQ0FBMEIsbUJBQTFCLENBQVA7QUFDQSxLQUZELENBRUUsT0FBTyxDQUFQLEVBQVcsQ0FBRTtBQUNmLEdBMy9QOEIsQ0E2L1AvQjtBQUNBOzs7QUFDQSxFQUFBLE1BQU0sQ0FBQyxZQUFQLENBQW9CLEdBQXBCLEdBQTBCLE1BQU0sQ0FBQyxhQUFQO0FBQ3pCOzs7Ozs7QUFNQSxjQUFXO0FBQ1YsV0FBTyxDQUFDLEtBQUssT0FBTixJQUFpQixpQkFBaUIsRUFBbEMsSUFBd0MsZUFBZSxFQUE5RDtBQUNBLEdBVHdCLEdBVXpCO0FBQ0EsRUFBQSxpQkFYRCxDQS8vUCtCLENBNGdRL0I7O0FBQ0EsR0FBQyxVQUFVLEdBQVYsRUFBZ0I7QUFDaEIsSUFBQSxNQUFNLENBQUMsTUFBUCxDQUFlLE1BQU0sQ0FBQyxPQUF0QixFQUErQjtBQUM5QixNQUFBLElBQUksRUFBRSxDQUFDLENBQUMsR0FEc0I7QUFFOUIsTUFBQSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUYsSUFBVyxxQkFBcUI7QUFGUixLQUEvQjtBQUlBLEdBTEQsRUFLSSxNQUFNLENBQUMsWUFBUCxDQUFvQixHQUFwQixFQUxKLEVBN2dRK0IsQ0FvaFEvQjs7O0FBQ0EsTUFBSyxNQUFNLENBQUMsT0FBUCxDQUFlLElBQXBCLEVBQTJCO0FBRTFCLElBQUEsTUFBTSxDQUFDLGFBQVAsQ0FBcUIsVUFBVSxDQUFWLEVBQWM7QUFDbEM7QUFDQSxVQUFLLENBQUMsQ0FBQyxDQUFDLFdBQUgsSUFBa0IsTUFBTSxDQUFDLE9BQVAsQ0FBZSxJQUF0QyxFQUE2QztBQUU1QyxZQUFJLFNBQUo7O0FBRUEsZUFBTztBQUNOLFVBQUEsSUFBSSxFQUFFLGNBQVUsT0FBVixFQUFtQixRQUFuQixFQUE4QjtBQUVuQztBQUNBLGdCQUFJLE1BQUo7QUFBQSxnQkFBWSxDQUFaO0FBQUEsZ0JBQ0MsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFGLEVBRFAsQ0FIbUMsQ0FNbkM7QUFDQTs7QUFDQSxnQkFBSyxDQUFDLENBQUMsUUFBUCxFQUFrQjtBQUNqQixjQUFBLEdBQUcsQ0FBQyxJQUFKLENBQVUsQ0FBQyxDQUFDLElBQVosRUFBa0IsQ0FBQyxDQUFDLEdBQXBCLEVBQXlCLENBQUMsQ0FBQyxLQUEzQixFQUFrQyxDQUFDLENBQUMsUUFBcEMsRUFBOEMsQ0FBQyxDQUFDLFFBQWhEO0FBQ0EsYUFGRCxNQUVPO0FBQ04sY0FBQSxHQUFHLENBQUMsSUFBSixDQUFVLENBQUMsQ0FBQyxJQUFaLEVBQWtCLENBQUMsQ0FBQyxHQUFwQixFQUF5QixDQUFDLENBQUMsS0FBM0I7QUFDQSxhQVprQyxDQWNuQzs7O0FBQ0EsZ0JBQUssQ0FBQyxDQUFDLFNBQVAsRUFBbUI7QUFDbEIsbUJBQU0sQ0FBTixJQUFXLENBQUMsQ0FBQyxTQUFiLEVBQXlCO0FBQ3hCLGdCQUFBLEdBQUcsQ0FBRSxDQUFGLENBQUgsR0FBVyxDQUFDLENBQUMsU0FBRixDQUFhLENBQWIsQ0FBWDtBQUNBO0FBQ0QsYUFuQmtDLENBcUJuQzs7O0FBQ0EsZ0JBQUssQ0FBQyxDQUFDLFFBQUYsSUFBYyxHQUFHLENBQUMsZ0JBQXZCLEVBQTBDO0FBQ3pDLGNBQUEsR0FBRyxDQUFDLGdCQUFKLENBQXNCLENBQUMsQ0FBQyxRQUF4QjtBQUNBLGFBeEJrQyxDQTBCbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsZ0JBQUssQ0FBQyxDQUFDLENBQUMsV0FBSCxJQUFrQixDQUFDLE9BQU8sQ0FBQyxrQkFBRCxDQUEvQixFQUFzRDtBQUNyRCxjQUFBLE9BQU8sQ0FBRSxrQkFBRixDQUFQLEdBQWdDLGdCQUFoQztBQUNBLGFBakNrQyxDQW1DbkM7OztBQUNBLGdCQUFJO0FBQ0gsbUJBQU0sQ0FBTixJQUFXLE9BQVgsRUFBcUI7QUFDcEIsZ0JBQUEsR0FBRyxDQUFDLGdCQUFKLENBQXNCLENBQXRCLEVBQXlCLE9BQU8sQ0FBRSxDQUFGLENBQWhDO0FBQ0E7QUFDRCxhQUpELENBSUUsT0FBTyxDQUFQLEVBQVcsQ0FBRSxDQXhDb0IsQ0EwQ25DO0FBQ0E7QUFDQTs7O0FBQ0EsWUFBQSxHQUFHLENBQUMsSUFBSixDQUFZLENBQUMsQ0FBQyxVQUFGLElBQWdCLENBQUMsQ0FBQyxJQUFwQixJQUE4QixJQUF4QyxFQTdDbUMsQ0ErQ25DOztBQUNBLFlBQUEsU0FBUSxHQUFHLGtCQUFVLENBQVYsRUFBYSxPQUFiLEVBQXVCO0FBRWpDLGtCQUFJLE1BQUosRUFDQyxVQURELEVBRUMsZUFGRCxFQUdDLFNBSEQsRUFJQyxHQUpELENBRmlDLENBUWpDO0FBQ0E7QUFDQTs7QUFDQSxrQkFBSTtBQUVIO0FBQ0Esb0JBQUssU0FBUSxLQUFNLE9BQU8sSUFBSSxHQUFHLENBQUMsVUFBSixLQUFtQixDQUFwQyxDQUFiLEVBQXVEO0FBRXREO0FBQ0Esa0JBQUEsU0FBUSxHQUFHLFNBQVgsQ0FIc0QsQ0FLdEQ7O0FBQ0Esc0JBQUssTUFBTCxFQUFjO0FBQ2Isb0JBQUEsR0FBRyxDQUFDLGtCQUFKLEdBQXlCLE1BQU0sQ0FBQyxJQUFoQzs7QUFDQSx3QkFBSyxnQkFBTCxFQUF3QjtBQUN2Qiw2QkFBTyxZQUFZLENBQUUsTUFBRixDQUFuQjtBQUNBO0FBQ0QsbUJBWHFELENBYXREOzs7QUFDQSxzQkFBSyxPQUFMLEVBQWU7QUFDZDtBQUNBLHdCQUFLLEdBQUcsQ0FBQyxVQUFKLEtBQW1CLENBQXhCLEVBQTRCO0FBQzNCLHNCQUFBLEdBQUcsQ0FBQyxLQUFKO0FBQ0E7QUFDRCxtQkFMRCxNQUtPO0FBQ04sb0JBQUEsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFiO0FBQ0Esb0JBQUEsZUFBZSxHQUFHLEdBQUcsQ0FBQyxxQkFBSixFQUFsQjtBQUNBLG9CQUFBLFNBQVMsR0FBRyxFQUFaO0FBQ0Esb0JBQUEsR0FBRyxHQUFHLEdBQUcsQ0FBQyxXQUFWLENBSk0sQ0FNTjs7QUFDQSx3QkFBSyxHQUFHLElBQUksR0FBRyxDQUFDO0FBQWdCO0FBQWhDLHNCQUE4QztBQUM3Qyx3QkFBQSxTQUFTLENBQUMsR0FBVixHQUFnQixHQUFoQjtBQUNBLHVCQVRLLENBV047QUFDQTs7O0FBQ0Esd0JBQUk7QUFDSCxzQkFBQSxTQUFTLENBQUMsSUFBVixHQUFpQixHQUFHLENBQUMsWUFBckI7QUFDQSxxQkFGRCxDQUVFLE9BQU8sQ0FBUCxFQUFXLENBQ1osQ0FoQkssQ0FrQk47QUFDQTs7O0FBQ0Esd0JBQUk7QUFDSCxzQkFBQSxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQWpCO0FBQ0EscUJBRkQsQ0FFRSxPQUFPLENBQVAsRUFBVztBQUNaO0FBQ0Esc0JBQUEsVUFBVSxHQUFHLEVBQWI7QUFDQSxxQkF6QkssQ0EyQk47QUFFQTtBQUNBO0FBQ0E7OztBQUNBLHdCQUFLLENBQUMsTUFBRCxJQUFXLENBQUMsQ0FBQyxPQUFiLElBQXdCLENBQUMsQ0FBQyxDQUFDLFdBQWhDLEVBQThDO0FBQzdDLHNCQUFBLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBVixHQUFpQixHQUFqQixHQUF1QixHQUFoQyxDQUQ2QyxDQUU5QztBQUNDLHFCQUhELE1BR08sSUFBSyxNQUFNLEtBQUssSUFBaEIsRUFBdUI7QUFDN0Isc0JBQUEsTUFBTSxHQUFHLEdBQVQ7QUFDQTtBQUNEO0FBQ0Q7QUFDRCxlQTlERCxDQThERSxPQUFPLHNCQUFQLEVBQWdDO0FBQ2pDLG9CQUFLLENBQUMsT0FBTixFQUFnQjtBQUNmLGtCQUFBLFFBQVEsQ0FBRSxDQUFDLENBQUgsRUFBTSxzQkFBTixDQUFSO0FBQ0E7QUFDRCxlQTdFZ0MsQ0ErRWpDOzs7QUFDQSxrQkFBSyxTQUFMLEVBQWlCO0FBQ2hCLGdCQUFBLFFBQVEsQ0FBRSxNQUFGLEVBQVUsVUFBVixFQUFzQixTQUF0QixFQUFpQyxlQUFqQyxDQUFSO0FBQ0E7QUFDRCxhQW5GRDs7QUFxRkEsZ0JBQUssQ0FBQyxDQUFDLENBQUMsS0FBUixFQUFnQjtBQUNmO0FBQ0EsY0FBQSxTQUFRO0FBQ1IsYUFIRCxNQUdPLElBQUssR0FBRyxDQUFDLFVBQUosS0FBbUIsQ0FBeEIsRUFBNEI7QUFDbEM7QUFDQTtBQUNBLGNBQUEsVUFBVSxDQUFFLFNBQUYsRUFBWSxDQUFaLENBQVY7QUFDQSxhQUpNLE1BSUE7QUFDTixjQUFBLE1BQU0sR0FBRyxFQUFFLEtBQVg7O0FBQ0Esa0JBQUssZ0JBQUwsRUFBd0I7QUFDdkI7QUFDQTtBQUNBLG9CQUFLLENBQUMsWUFBTixFQUFxQjtBQUNwQixrQkFBQSxZQUFZLEdBQUcsRUFBZjtBQUNBLGtCQUFBLE1BQU0sQ0FBRSxNQUFGLENBQU4sQ0FBaUIsTUFBakIsQ0FBeUIsZ0JBQXpCO0FBQ0EsaUJBTnNCLENBT3ZCOzs7QUFDQSxnQkFBQSxZQUFZLENBQUUsTUFBRixDQUFaLEdBQXlCLFNBQXpCO0FBQ0E7O0FBQ0QsY0FBQSxHQUFHLENBQUMsa0JBQUosR0FBeUIsU0FBekI7QUFDQTtBQUNELFdBM0pLO0FBNkpOLFVBQUEsS0FBSyxFQUFFLGlCQUFXO0FBQ2pCLGdCQUFLLFNBQUwsRUFBZ0I7QUFDZixjQUFBLFNBQVEsQ0FBQyxDQUFELEVBQUcsQ0FBSCxDQUFSO0FBQ0E7QUFDRDtBQWpLSyxTQUFQO0FBbUtBO0FBQ0QsS0ExS0Q7QUEyS0E7O0FBQ0QsTUFBSSxLQUFKO0FBQUEsTUFBVyxPQUFYO0FBQUEsTUFDQyxRQUFRLEdBQUcsd0JBRFo7QUFBQSxNQUVDLE1BQU0sR0FBRyxJQUFJLE1BQUosQ0FBWSxtQkFBbUIsU0FBbkIsR0FBK0IsYUFBM0MsRUFBMEQsR0FBMUQsQ0FGVjtBQUFBLE1BR0MsSUFBSSxHQUFHLGFBSFI7QUFBQSxNQUlDLG1CQUFtQixHQUFHLENBQUUsZ0JBQUYsQ0FKdkI7QUFBQSxNQUtDLFFBQVEsR0FBRztBQUNWLFNBQUssQ0FBQyxVQUFVLElBQVYsRUFBZ0IsS0FBaEIsRUFBd0I7QUFDN0IsVUFBSSxHQUFKO0FBQUEsVUFBUyxJQUFUO0FBQUEsVUFBZSxTQUFmO0FBQUEsVUFDQyxLQUFLLEdBQUcsS0FBSyxXQUFMLENBQWtCLElBQWxCLEVBQXdCLEtBQXhCLENBRFQ7QUFBQSxVQUVDLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBUCxDQUFhLEtBQWIsQ0FGVDtBQUFBLFVBR0MsTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFOLEVBSFY7QUFBQSxVQUlDLEtBQUssR0FBRyxDQUFDLE1BQUQsSUFBVyxDQUpwQjtBQUFBLFVBS0MsS0FBSyxHQUFHLENBTFQ7O0FBT0EsVUFBSyxLQUFMLEVBQWE7QUFDWixRQUFBLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFELENBQVo7QUFDQSxRQUFBLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBRCxDQUFMLEtBQWMsTUFBTSxDQUFDLFNBQVAsQ0FBa0IsSUFBbEIsSUFBMkIsRUFBM0IsR0FBZ0MsSUFBOUMsQ0FBUCxDQUZZLENBSVo7O0FBQ0EsWUFBSyxJQUFJLEtBQUssSUFBVCxJQUFpQixLQUF0QixFQUE4QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQSxVQUFBLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBUCxDQUFZLEtBQUssQ0FBQyxJQUFsQixFQUF3QixJQUF4QixFQUE4QixJQUE5QixLQUF3QyxHQUF4QyxJQUErQyxDQUF2RDs7QUFFQSxhQUFHO0FBQ0Y7QUFDQTtBQUNBLFlBQUEsU0FBUyxHQUFHLEtBQUssR0FBRyxLQUFLLElBQUksSUFBN0IsQ0FIRSxDQUtGOztBQUNBLFlBQUEsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFoQjtBQUNBLFlBQUEsTUFBTSxDQUFDLEtBQVAsQ0FBYyxLQUFLLENBQUMsSUFBcEIsRUFBMEIsSUFBMUIsRUFBZ0MsS0FBSyxHQUFHLElBQXhDLEVBUEUsQ0FTRjs7QUFDQSxZQUFBLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBTixLQUFjLE1BQXRCLENBVkUsQ0FZSDtBQUNDLFdBYkQsUUFhVSxLQUFLLEtBQUssQ0FBVixJQUFlLEtBQUssS0FBSyxTQWJuQztBQWNBOztBQUVELFFBQUEsS0FBSyxDQUFDLElBQU4sR0FBYSxJQUFiO0FBQ0EsUUFBQSxLQUFLLENBQUMsS0FBTixHQUFjLEtBQWQsQ0E1QlksQ0E2Qlo7O0FBQ0EsUUFBQSxLQUFLLENBQUMsR0FBTixHQUFZLEtBQUssQ0FBQyxDQUFELENBQUwsR0FBVyxLQUFLLEdBQUcsQ0FBRSxLQUFLLENBQUMsQ0FBRCxDQUFMLEdBQVcsQ0FBYixJQUFtQixHQUF0QyxHQUE0QyxHQUF4RDtBQUNBOztBQUNELGFBQU8sS0FBUDtBQUNBLEtBekNJO0FBREssR0FMWixDQW5zUStCLENBcXZRL0I7O0FBQ0EsV0FBUyxXQUFULEdBQXVCO0FBQ3RCLElBQUEsVUFBVSxDQUFDLFlBQVc7QUFDckIsTUFBQSxLQUFLLEdBQUcsU0FBUjtBQUNBLEtBRlMsRUFFUCxDQUZPLENBQVY7QUFHQSxXQUFTLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBUCxFQUFqQjtBQUNBOztBQUVELFdBQVMsWUFBVCxDQUF1QixTQUF2QixFQUFrQyxLQUFsQyxFQUEwQztBQUN6QyxJQUFBLE1BQU0sQ0FBQyxJQUFQLENBQWEsS0FBYixFQUFvQixVQUFVLElBQVYsRUFBZ0IsS0FBaEIsRUFBd0I7QUFDM0MsVUFBSSxVQUFVLEdBQUcsQ0FBRSxRQUFRLENBQUUsSUFBRixDQUFSLElBQW9CLEVBQXRCLEVBQTJCLE1BQTNCLENBQW1DLFFBQVEsQ0FBRSxHQUFGLENBQTNDLENBQWpCO0FBQUEsVUFDQyxLQUFLLEdBQUcsQ0FEVDtBQUFBLFVBRUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUZyQjs7QUFHQSxhQUFRLEtBQUssR0FBRyxNQUFoQixFQUF3QixLQUFLLEVBQTdCLEVBQWtDO0FBQ2pDLFlBQUssVUFBVSxDQUFFLEtBQUYsQ0FBVixDQUFvQixJQUFwQixDQUEwQixTQUExQixFQUFxQyxJQUFyQyxFQUEyQyxLQUEzQyxDQUFMLEVBQTBEO0FBRXpEO0FBQ0E7QUFDQTtBQUNEO0FBQ0QsS0FYRDtBQVlBOztBQUVELFdBQVMsU0FBVCxDQUFvQixJQUFwQixFQUEwQixVQUExQixFQUFzQyxPQUF0QyxFQUFnRDtBQUMvQyxRQUFJLE1BQUo7QUFBQSxRQUNDLEtBQUssR0FBRyxDQURUO0FBQUEsUUFFQyxZQUFZLEdBQUcsQ0FGaEI7QUFBQSxRQUdDLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxNQUg5QjtBQUFBLFFBSUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFQLEdBQWtCLE1BQWxCLENBQTBCLFlBQVc7QUFDL0M7QUFDQSxhQUFPLElBQUksQ0FBQyxJQUFaO0FBQ0EsS0FIVSxDQUpaO0FBQUEsUUFRQyxJQUFJLEdBQUcsU0FBUCxJQUFPLEdBQVc7QUFDakIsVUFBSSxXQUFXLEdBQUcsS0FBSyxJQUFJLFdBQVcsRUFBdEM7QUFBQSxVQUNDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBTCxDQUFVLENBQVYsRUFBYSxTQUFTLENBQUMsU0FBVixHQUFzQixTQUFTLENBQUMsUUFBaEMsR0FBMkMsV0FBeEQsQ0FEYjtBQUFBLFVBRUMsT0FBTyxHQUFHLEtBQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxRQUF0QixJQUFrQyxDQUF4QyxDQUZYO0FBQUEsVUFHQyxLQUFLLEdBQUcsQ0FIVDtBQUFBLFVBSUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFWLENBQWlCLE1BSjNCOztBQU1BLGFBQVEsS0FBSyxHQUFHLE1BQWhCLEVBQXlCLEtBQUssRUFBOUIsRUFBbUM7QUFDbEMsUUFBQSxTQUFTLENBQUMsTUFBVixDQUFrQixLQUFsQixFQUEwQixHQUExQixDQUErQixPQUEvQjtBQUNBOztBQUVELE1BQUEsUUFBUSxDQUFDLFVBQVQsQ0FBcUIsSUFBckIsRUFBMkIsQ0FBRSxTQUFGLEVBQWEsT0FBYixFQUFzQixTQUF0QixDQUEzQjs7QUFFQSxVQUFLLE9BQU8sR0FBRyxDQUFWLElBQWUsTUFBcEIsRUFBNkI7QUFDNUIsZUFBTyxTQUFQO0FBQ0EsT0FGRCxNQUVPO0FBQ04sUUFBQSxRQUFRLENBQUMsV0FBVCxDQUFzQixJQUF0QixFQUE0QixDQUFFLFNBQUYsQ0FBNUI7QUFDQSxlQUFPLEtBQVA7QUFDQTtBQUNELEtBM0JGO0FBQUEsUUE0QkMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxPQUFULENBQWlCO0FBQzVCLE1BQUEsSUFBSSxFQUFFLElBRHNCO0FBRTVCLE1BQUEsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFQLENBQWUsRUFBZixFQUFtQixVQUFuQixDQUZxQjtBQUc1QixNQUFBLElBQUksRUFBRSxNQUFNLENBQUMsTUFBUCxDQUFlLElBQWYsRUFBcUI7QUFBRSxRQUFBLGFBQWEsRUFBRTtBQUFqQixPQUFyQixFQUE0QyxPQUE1QyxDQUhzQjtBQUk1QixNQUFBLGtCQUFrQixFQUFFLFVBSlE7QUFLNUIsTUFBQSxlQUFlLEVBQUUsT0FMVztBQU01QixNQUFBLFNBQVMsRUFBRSxLQUFLLElBQUksV0FBVyxFQU5IO0FBTzVCLE1BQUEsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQVBVO0FBUTVCLE1BQUEsTUFBTSxFQUFFLEVBUm9CO0FBUzVCLE1BQUEsV0FBVyxFQUFFLHFCQUFVLElBQVYsRUFBZ0IsR0FBaEIsRUFBcUIsTUFBckIsRUFBOEI7QUFDMUMsWUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQVAsQ0FBYyxJQUFkLEVBQW9CLFNBQVMsQ0FBQyxJQUE5QixFQUFvQyxJQUFwQyxFQUEwQyxHQUExQyxFQUNWLFNBQVMsQ0FBQyxJQUFWLENBQWUsYUFBZixDQUE4QixJQUE5QixLQUF3QyxTQUFTLENBQUMsSUFBVixDQUFlLE1BRDdDLENBQVo7QUFFQSxRQUFBLFNBQVMsQ0FBQyxNQUFWLENBQWlCLElBQWpCLENBQXVCLEtBQXZCO0FBQ0EsZUFBTyxLQUFQO0FBQ0EsT0FkMkI7QUFlNUIsTUFBQSxJQUFJLEVBQUUsY0FBVSxPQUFWLEVBQW9CO0FBQ3pCLFlBQUksS0FBSyxHQUFHLENBQVo7QUFBQSxZQUNDO0FBQ0E7QUFDQSxRQUFBLE1BQU0sR0FBRyxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQVYsQ0FBaUIsTUFBcEIsR0FBNkIsQ0FIOUM7O0FBS0EsZUFBUSxLQUFLLEdBQUcsTUFBaEIsRUFBeUIsS0FBSyxFQUE5QixFQUFtQztBQUNsQyxVQUFBLFNBQVMsQ0FBQyxNQUFWLENBQWtCLEtBQWxCLEVBQTBCLEdBQTFCLENBQStCLENBQS9CO0FBQ0EsU0FSd0IsQ0FVekI7QUFDQTs7O0FBQ0EsWUFBSyxPQUFMLEVBQWU7QUFDZCxVQUFBLFFBQVEsQ0FBQyxXQUFULENBQXNCLElBQXRCLEVBQTRCLENBQUUsU0FBRixFQUFhLE9BQWIsQ0FBNUI7QUFDQSxTQUZELE1BRU87QUFDTixVQUFBLFFBQVEsQ0FBQyxVQUFULENBQXFCLElBQXJCLEVBQTJCLENBQUUsU0FBRixFQUFhLE9BQWIsQ0FBM0I7QUFDQTs7QUFDRCxlQUFPLElBQVA7QUFDQTtBQWpDMkIsS0FBakIsQ0E1QmI7QUFBQSxRQStEQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBL0RuQjs7QUFpRUEsSUFBQSxVQUFVLENBQUUsS0FBRixFQUFTLFNBQVMsQ0FBQyxJQUFWLENBQWUsYUFBeEIsQ0FBVjs7QUFFQSxXQUFRLEtBQUssR0FBRyxNQUFoQixFQUF5QixLQUFLLEVBQTlCLEVBQW1DO0FBQ2xDLE1BQUEsTUFBTSxHQUFHLG1CQUFtQixDQUFFLEtBQUYsQ0FBbkIsQ0FBNkIsSUFBN0IsQ0FBbUMsU0FBbkMsRUFBOEMsSUFBOUMsRUFBb0QsS0FBcEQsRUFBMkQsU0FBUyxDQUFDLElBQXJFLENBQVQ7O0FBQ0EsVUFBSyxNQUFMLEVBQWM7QUFDYixlQUFPLE1BQVA7QUFDQTtBQUNEOztBQUVELElBQUEsWUFBWSxDQUFFLFNBQUYsRUFBYSxLQUFiLENBQVo7O0FBRUEsUUFBSyxNQUFNLENBQUMsVUFBUCxDQUFtQixTQUFTLENBQUMsSUFBVixDQUFlLEtBQWxDLENBQUwsRUFBaUQ7QUFDaEQsTUFBQSxTQUFTLENBQUMsSUFBVixDQUFlLEtBQWYsQ0FBcUIsSUFBckIsQ0FBMkIsSUFBM0IsRUFBaUMsU0FBakM7QUFDQTs7QUFFRCxJQUFBLE1BQU0sQ0FBQyxFQUFQLENBQVUsS0FBVixDQUNDLE1BQU0sQ0FBQyxNQUFQLENBQWUsSUFBZixFQUFxQjtBQUNwQixNQUFBLElBQUksRUFBRSxTQURjO0FBRXBCLE1BQUEsS0FBSyxFQUFFLFNBQVMsQ0FBQyxJQUFWLENBQWUsS0FGRjtBQUdwQixNQUFBLElBQUksRUFBRTtBQUhjLEtBQXJCLENBREQsRUFqRitDLENBeUYvQzs7QUFDQSxXQUFPLFNBQVMsQ0FBQyxRQUFWLENBQW9CLFNBQVMsQ0FBQyxJQUFWLENBQWUsUUFBbkMsRUFDTCxJQURLLENBQ0MsU0FBUyxDQUFDLElBQVYsQ0FBZSxJQURoQixFQUNzQixTQUFTLENBQUMsSUFBVixDQUFlLFFBRHJDLEVBRUwsSUFGSyxDQUVDLFNBQVMsQ0FBQyxJQUFWLENBQWUsSUFGaEIsRUFHTCxNQUhLLENBR0csU0FBUyxDQUFDLElBQVYsQ0FBZSxNQUhsQixDQUFQO0FBSUE7O0FBRUQsV0FBUyxVQUFULENBQXFCLEtBQXJCLEVBQTRCLGFBQTVCLEVBQTRDO0FBQzNDLFFBQUksS0FBSixFQUFXLElBQVgsRUFBaUIsTUFBakIsRUFBeUIsS0FBekIsRUFBZ0MsS0FBaEMsQ0FEMkMsQ0FHM0M7O0FBQ0EsU0FBTSxLQUFOLElBQWUsS0FBZixFQUF1QjtBQUN0QixNQUFBLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUCxDQUFrQixLQUFsQixDQUFQO0FBQ0EsTUFBQSxNQUFNLEdBQUcsYUFBYSxDQUFFLElBQUYsQ0FBdEI7QUFDQSxNQUFBLEtBQUssR0FBRyxLQUFLLENBQUUsS0FBRixDQUFiOztBQUNBLFVBQUssTUFBTSxDQUFDLE9BQVAsQ0FBZ0IsS0FBaEIsQ0FBTCxFQUErQjtBQUM5QixRQUFBLE1BQU0sR0FBRyxLQUFLLENBQUUsQ0FBRixDQUFkO0FBQ0EsUUFBQSxLQUFLLEdBQUcsS0FBSyxDQUFFLEtBQUYsQ0FBTCxHQUFpQixLQUFLLENBQUUsQ0FBRixDQUE5QjtBQUNBOztBQUVELFVBQUssS0FBSyxLQUFLLElBQWYsRUFBc0I7QUFDckIsUUFBQSxLQUFLLENBQUUsSUFBRixDQUFMLEdBQWdCLEtBQWhCO0FBQ0EsZUFBTyxLQUFLLENBQUUsS0FBRixDQUFaO0FBQ0E7O0FBRUQsTUFBQSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVAsQ0FBaUIsSUFBakIsQ0FBUjs7QUFDQSxVQUFLLEtBQUssSUFBSSxZQUFZLEtBQTFCLEVBQWtDO0FBQ2pDLFFBQUEsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFOLENBQWMsS0FBZCxDQUFSO0FBQ0EsZUFBTyxLQUFLLENBQUUsSUFBRixDQUFaLENBRmlDLENBSWpDO0FBQ0E7O0FBQ0EsYUFBTSxLQUFOLElBQWUsS0FBZixFQUF1QjtBQUN0QixjQUFLLEVBQUcsS0FBSyxJQUFJLEtBQVosQ0FBTCxFQUEyQjtBQUMxQixZQUFBLEtBQUssQ0FBRSxLQUFGLENBQUwsR0FBaUIsS0FBSyxDQUFFLEtBQUYsQ0FBdEI7QUFDQSxZQUFBLGFBQWEsQ0FBRSxLQUFGLENBQWIsR0FBeUIsTUFBekI7QUFDQTtBQUNEO0FBQ0QsT0FaRCxNQVlPO0FBQ04sUUFBQSxhQUFhLENBQUUsSUFBRixDQUFiLEdBQXdCLE1BQXhCO0FBQ0E7QUFDRDtBQUNEOztBQUVELEVBQUEsTUFBTSxDQUFDLFNBQVAsR0FBbUIsTUFBTSxDQUFDLE1BQVAsQ0FBZSxTQUFmLEVBQTBCO0FBRTVDLElBQUEsT0FBTyxFQUFFLGlCQUFVLEtBQVYsRUFBaUIsUUFBakIsRUFBNEI7QUFDcEMsVUFBSyxNQUFNLENBQUMsVUFBUCxDQUFtQixLQUFuQixDQUFMLEVBQWtDO0FBQ2pDLFFBQUEsUUFBUSxHQUFHLEtBQVg7QUFDQSxRQUFBLEtBQUssR0FBRyxDQUFFLEdBQUYsQ0FBUjtBQUNBLE9BSEQsTUFHTztBQUNOLFFBQUEsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFOLENBQVksR0FBWixDQUFSO0FBQ0E7O0FBRUQsVUFBSSxJQUFKO0FBQUEsVUFDQyxLQUFLLEdBQUcsQ0FEVDtBQUFBLFVBRUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUZoQjs7QUFJQSxhQUFRLEtBQUssR0FBRyxNQUFoQixFQUF5QixLQUFLLEVBQTlCLEVBQW1DO0FBQ2xDLFFBQUEsSUFBSSxHQUFHLEtBQUssQ0FBRSxLQUFGLENBQVo7QUFDQSxRQUFBLFFBQVEsQ0FBRSxJQUFGLENBQVIsR0FBbUIsUUFBUSxDQUFFLElBQUYsQ0FBUixJQUFvQixFQUF2QztBQUNBLFFBQUEsUUFBUSxDQUFFLElBQUYsQ0FBUixDQUFpQixPQUFqQixDQUEwQixRQUExQjtBQUNBO0FBQ0QsS0FuQjJDO0FBcUI1QyxJQUFBLFNBQVMsRUFBRSxtQkFBVSxRQUFWLEVBQW9CLE9BQXBCLEVBQThCO0FBQ3hDLFVBQUssT0FBTCxFQUFlO0FBQ2QsUUFBQSxtQkFBbUIsQ0FBQyxPQUFwQixDQUE2QixRQUE3QjtBQUNBLE9BRkQsTUFFTztBQUNOLFFBQUEsbUJBQW1CLENBQUMsSUFBcEIsQ0FBMEIsUUFBMUI7QUFDQTtBQUNEO0FBM0IyQyxHQUExQixDQUFuQjs7QUE4QkEsV0FBUyxnQkFBVCxDQUEyQixJQUEzQixFQUFpQyxLQUFqQyxFQUF3QyxJQUF4QyxFQUErQztBQUM5QyxRQUFJLEtBQUo7QUFBQSxRQUFXLElBQVg7QUFBQSxRQUFpQixLQUFqQjtBQUFBLFFBQXdCLE1BQXhCO0FBQUEsUUFBZ0MsUUFBaEM7QUFBQSxRQUEwQyxLQUExQztBQUFBLFFBQWlELEtBQWpEO0FBQUEsUUFBd0QsT0FBeEQ7QUFBQSxRQUNDLElBQUksR0FBRyxJQURSO0FBQUEsUUFFQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBRmQ7QUFBQSxRQUdDLElBQUksR0FBRyxFQUhSO0FBQUEsUUFJQyxPQUFPLEdBQUcsRUFKWDtBQUFBLFFBS0MsTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFMLElBQWlCLFFBQVEsQ0FBRSxJQUFGLENBTG5DLENBRDhDLENBUTlDOztBQUNBLFFBQUssQ0FBQyxJQUFJLENBQUMsS0FBWCxFQUFtQjtBQUNsQixNQUFBLEtBQUssR0FBRyxNQUFNLENBQUMsV0FBUCxDQUFvQixJQUFwQixFQUEwQixJQUExQixDQUFSOztBQUNBLFVBQUssS0FBSyxDQUFDLFFBQU4sSUFBa0IsSUFBdkIsRUFBOEI7QUFDN0IsUUFBQSxLQUFLLENBQUMsUUFBTixHQUFpQixDQUFqQjtBQUNBLFFBQUEsT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFOLENBQVksSUFBdEI7O0FBQ0EsUUFBQSxLQUFLLENBQUMsS0FBTixDQUFZLElBQVosR0FBbUIsWUFBVztBQUM3QixjQUFLLENBQUMsS0FBSyxDQUFDLFFBQVosRUFBdUI7QUFDdEIsWUFBQSxPQUFPO0FBQ1A7QUFDRCxTQUpEO0FBS0E7O0FBQ0QsTUFBQSxLQUFLLENBQUMsUUFBTjtBQUVBLE1BQUEsSUFBSSxDQUFDLE1BQUwsQ0FBWSxZQUFXO0FBQ3RCO0FBQ0E7QUFDQSxRQUFBLElBQUksQ0FBQyxNQUFMLENBQVksWUFBVztBQUN0QixVQUFBLEtBQUssQ0FBQyxRQUFOOztBQUNBLGNBQUssQ0FBQyxNQUFNLENBQUMsS0FBUCxDQUFjLElBQWQsRUFBb0IsSUFBcEIsRUFBMkIsTUFBakMsRUFBMEM7QUFDekMsWUFBQSxLQUFLLENBQUMsS0FBTixDQUFZLElBQVo7QUFDQTtBQUNELFNBTEQ7QUFNQSxPQVREO0FBVUEsS0FoQzZDLENBa0M5Qzs7O0FBQ0EsUUFBSyxJQUFJLENBQUMsUUFBTCxLQUFrQixDQUFsQixLQUF5QixZQUFZLEtBQVosSUFBcUIsV0FBVyxLQUF6RCxDQUFMLEVBQXdFO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBQSxJQUFJLENBQUMsUUFBTCxHQUFnQixDQUFFLEtBQUssQ0FBQyxRQUFSLEVBQWtCLEtBQUssQ0FBQyxTQUF4QixFQUFtQyxLQUFLLENBQUMsU0FBekMsQ0FBaEIsQ0FMdUUsQ0FPdkU7QUFDQTs7QUFDQSxVQUFLLE1BQU0sQ0FBQyxHQUFQLENBQVksSUFBWixFQUFrQixTQUFsQixNQUFrQyxRQUFsQyxJQUNILE1BQU0sQ0FBQyxHQUFQLENBQVksSUFBWixFQUFrQixPQUFsQixNQUFnQyxNQURsQyxFQUMyQztBQUUxQztBQUNBO0FBQ0EsWUFBSyxDQUFDLE1BQU0sQ0FBQyxPQUFQLENBQWUsc0JBQWhCLElBQTBDLGtCQUFrQixDQUFFLElBQUksQ0FBQyxRQUFQLENBQWxCLEtBQXdDLFFBQXZGLEVBQWtHO0FBQ2pHLFVBQUEsS0FBSyxDQUFDLE9BQU4sR0FBZ0IsY0FBaEI7QUFFQSxTQUhELE1BR087QUFDTixVQUFBLEtBQUssQ0FBQyxJQUFOLEdBQWEsQ0FBYjtBQUNBO0FBQ0Q7QUFDRDs7QUFFRCxRQUFLLElBQUksQ0FBQyxRQUFWLEVBQXFCO0FBQ3BCLE1BQUEsS0FBSyxDQUFDLFFBQU4sR0FBaUIsUUFBakI7O0FBQ0EsVUFBSyxDQUFDLE1BQU0sQ0FBQyxPQUFQLENBQWUsZ0JBQXJCLEVBQXdDO0FBQ3ZDLFFBQUEsSUFBSSxDQUFDLElBQUwsQ0FBVSxZQUFXO0FBQ3BCLFVBQUEsS0FBSyxDQUFDLFFBQU4sR0FBaUIsSUFBSSxDQUFDLFFBQUwsQ0FBZSxDQUFmLENBQWpCO0FBQ0EsVUFBQSxLQUFLLENBQUMsU0FBTixHQUFrQixJQUFJLENBQUMsUUFBTCxDQUFlLENBQWYsQ0FBbEI7QUFDQSxVQUFBLEtBQUssQ0FBQyxTQUFOLEdBQWtCLElBQUksQ0FBQyxRQUFMLENBQWUsQ0FBZixDQUFsQjtBQUNBLFNBSkQ7QUFLQTtBQUNELEtBbkU2QyxDQXNFOUM7OztBQUNBLFNBQU0sS0FBTixJQUFlLEtBQWYsRUFBdUI7QUFDdEIsTUFBQSxLQUFLLEdBQUcsS0FBSyxDQUFFLEtBQUYsQ0FBYjs7QUFDQSxVQUFLLFFBQVEsQ0FBQyxJQUFULENBQWUsS0FBZixDQUFMLEVBQThCO0FBQzdCLGVBQU8sS0FBSyxDQUFFLEtBQUYsQ0FBWjs7QUFDQSxZQUFLLEtBQUssTUFBTyxNQUFNLEdBQUcsTUFBSCxHQUFZLE1BQXpCLENBQVYsRUFBOEM7QUFDN0M7QUFDQTs7QUFDRCxRQUFBLE9BQU8sQ0FBQyxJQUFSLENBQWMsS0FBZDtBQUNBO0FBQ0Q7O0FBRUQsSUFBQSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQWpCOztBQUNBLFFBQUssTUFBTCxFQUFjO0FBQ2IsTUFBQSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQVAsQ0FBYyxJQUFkLEVBQW9CLFFBQXBCLEtBQWtDLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZCxFQUFvQixRQUFwQixFQUE4QixFQUE5QixDQUE3Qzs7QUFDQSxVQUFLLE1BQUwsRUFBYztBQUNiLFFBQUEsTUFBTSxDQUFFLElBQUYsQ0FBTixDQUFlLElBQWY7QUFDQSxPQUZELE1BRU87QUFDTixRQUFBLElBQUksQ0FBQyxJQUFMLENBQVUsWUFBVztBQUNwQixVQUFBLE1BQU0sQ0FBRSxJQUFGLENBQU4sQ0FBZSxJQUFmO0FBQ0EsU0FGRDtBQUdBOztBQUNELE1BQUEsSUFBSSxDQUFDLElBQUwsQ0FBVSxZQUFXO0FBQ3BCLFlBQUksSUFBSjtBQUNBLFFBQUEsTUFBTSxDQUFDLFVBQVAsQ0FBbUIsSUFBbkIsRUFBeUIsUUFBekIsRUFBbUMsSUFBbkM7O0FBQ0EsYUFBTSxJQUFOLElBQWMsSUFBZCxFQUFxQjtBQUNwQixVQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZCxFQUFvQixJQUFwQixFQUEwQixJQUFJLENBQUUsSUFBRixDQUE5QjtBQUNBO0FBQ0QsT0FORDs7QUFPQSxXQUFNLEtBQUssR0FBRyxDQUFkLEVBQWtCLEtBQUssR0FBRyxNQUExQixFQUFtQyxLQUFLLEVBQXhDLEVBQTZDO0FBQzVDLFFBQUEsSUFBSSxHQUFHLE9BQU8sQ0FBRSxLQUFGLENBQWQ7QUFDQSxRQUFBLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBTCxDQUFrQixJQUFsQixFQUF3QixNQUFNLEdBQUcsUUFBUSxDQUFFLElBQUYsQ0FBWCxHQUFzQixDQUFwRCxDQUFSO0FBQ0EsUUFBQSxJQUFJLENBQUUsSUFBRixDQUFKLEdBQWUsUUFBUSxDQUFFLElBQUYsQ0FBUixJQUFvQixNQUFNLENBQUMsS0FBUCxDQUFjLElBQWQsRUFBb0IsSUFBcEIsQ0FBbkM7O0FBRUEsWUFBSyxFQUFHLElBQUksSUFBSSxRQUFYLENBQUwsRUFBNkI7QUFDNUIsVUFBQSxRQUFRLENBQUUsSUFBRixDQUFSLEdBQW1CLEtBQUssQ0FBQyxLQUF6Qjs7QUFDQSxjQUFLLE1BQUwsRUFBYztBQUNiLFlBQUEsS0FBSyxDQUFDLEdBQU4sR0FBWSxLQUFLLENBQUMsS0FBbEI7QUFDQSxZQUFBLEtBQUssQ0FBQyxLQUFOLEdBQWMsSUFBSSxLQUFLLE9BQVQsSUFBb0IsSUFBSSxLQUFLLFFBQTdCLEdBQXdDLENBQXhDLEdBQTRDLENBQTFEO0FBQ0E7QUFDRDtBQUNEO0FBQ0Q7QUFDRDs7QUFFRCxXQUFTLEtBQVQsQ0FBZ0IsSUFBaEIsRUFBc0IsT0FBdEIsRUFBK0IsSUFBL0IsRUFBcUMsR0FBckMsRUFBMEMsTUFBMUMsRUFBbUQ7QUFDbEQsV0FBTyxJQUFJLEtBQUssQ0FBQyxTQUFOLENBQWdCLElBQXBCLENBQTBCLElBQTFCLEVBQWdDLE9BQWhDLEVBQXlDLElBQXpDLEVBQStDLEdBQS9DLEVBQW9ELE1BQXBELENBQVA7QUFDQTs7QUFDRCxFQUFBLE1BQU0sQ0FBQyxLQUFQLEdBQWUsS0FBZjtBQUVBLEVBQUEsS0FBSyxDQUFDLFNBQU4sR0FBa0I7QUFDakIsSUFBQSxXQUFXLEVBQUUsS0FESTtBQUVqQixJQUFBLElBQUksRUFBRSxjQUFVLElBQVYsRUFBZ0IsT0FBaEIsRUFBeUIsSUFBekIsRUFBK0IsR0FBL0IsRUFBb0MsTUFBcEMsRUFBNEMsSUFBNUMsRUFBbUQ7QUFDeEQsV0FBSyxJQUFMLEdBQVksSUFBWjtBQUNBLFdBQUssSUFBTCxHQUFZLElBQVo7QUFDQSxXQUFLLE1BQUwsR0FBYyxNQUFNLElBQUksT0FBeEI7QUFDQSxXQUFLLE9BQUwsR0FBZSxPQUFmO0FBQ0EsV0FBSyxLQUFMLEdBQWEsS0FBSyxHQUFMLEdBQVcsS0FBSyxHQUFMLEVBQXhCO0FBQ0EsV0FBSyxHQUFMLEdBQVcsR0FBWDtBQUNBLFdBQUssSUFBTCxHQUFZLElBQUksS0FBTSxNQUFNLENBQUMsU0FBUCxDQUFrQixJQUFsQixJQUEyQixFQUEzQixHQUFnQyxJQUF0QyxDQUFoQjtBQUNBLEtBVmdCO0FBV2pCLElBQUEsR0FBRyxFQUFFLGVBQVc7QUFDZixVQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBTixDQUFpQixLQUFLLElBQXRCLENBQVo7QUFFQSxhQUFPLEtBQUssSUFBSSxLQUFLLENBQUMsR0FBZixHQUNOLEtBQUssQ0FBQyxHQUFOLENBQVcsSUFBWCxDQURNLEdBRU4sS0FBSyxDQUFDLFNBQU4sQ0FBZ0IsUUFBaEIsQ0FBeUIsR0FBekIsQ0FBOEIsSUFBOUIsQ0FGRDtBQUdBLEtBakJnQjtBQWtCakIsSUFBQSxHQUFHLEVBQUUsYUFBVSxPQUFWLEVBQW9CO0FBQ3hCLFVBQUksS0FBSjtBQUFBLFVBQ0MsS0FBSyxHQUFHLEtBQUssQ0FBQyxTQUFOLENBQWlCLEtBQUssSUFBdEIsQ0FEVDs7QUFHQSxVQUFLLEtBQUssT0FBTCxDQUFhLFFBQWxCLEVBQTZCO0FBQzVCLGFBQUssR0FBTCxHQUFXLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBUCxDQUFlLEtBQUssTUFBcEIsRUFDbEIsT0FEa0IsRUFDVCxLQUFLLE9BQUwsQ0FBYSxRQUFiLEdBQXdCLE9BRGYsRUFDd0IsQ0FEeEIsRUFDMkIsQ0FEM0IsRUFDOEIsS0FBSyxPQUFMLENBQWEsUUFEM0MsQ0FBbkI7QUFHQSxPQUpELE1BSU87QUFDTixhQUFLLEdBQUwsR0FBVyxLQUFLLEdBQUcsT0FBbkI7QUFDQTs7QUFDRCxXQUFLLEdBQUwsR0FBVyxDQUFFLEtBQUssR0FBTCxHQUFXLEtBQUssS0FBbEIsSUFBNEIsS0FBNUIsR0FBb0MsS0FBSyxLQUFwRDs7QUFFQSxVQUFLLEtBQUssT0FBTCxDQUFhLElBQWxCLEVBQXlCO0FBQ3hCLGFBQUssT0FBTCxDQUFhLElBQWIsQ0FBa0IsSUFBbEIsQ0FBd0IsS0FBSyxJQUE3QixFQUFtQyxLQUFLLEdBQXhDLEVBQTZDLElBQTdDO0FBQ0E7O0FBRUQsVUFBSyxLQUFLLElBQUksS0FBSyxDQUFDLEdBQXBCLEVBQTBCO0FBQ3pCLFFBQUEsS0FBSyxDQUFDLEdBQU4sQ0FBVyxJQUFYO0FBQ0EsT0FGRCxNQUVPO0FBQ04sUUFBQSxLQUFLLENBQUMsU0FBTixDQUFnQixRQUFoQixDQUF5QixHQUF6QixDQUE4QixJQUE5QjtBQUNBOztBQUNELGFBQU8sSUFBUDtBQUNBO0FBekNnQixHQUFsQjtBQTRDQSxFQUFBLEtBQUssQ0FBQyxTQUFOLENBQWdCLElBQWhCLENBQXFCLFNBQXJCLEdBQWlDLEtBQUssQ0FBQyxTQUF2QztBQUVBLEVBQUEsS0FBSyxDQUFDLFNBQU4sR0FBa0I7QUFDakIsSUFBQSxRQUFRLEVBQUU7QUFDVCxNQUFBLEdBQUcsRUFBRSxhQUFVLEtBQVYsRUFBa0I7QUFDdEIsWUFBSSxNQUFKOztBQUVBLFlBQUssS0FBSyxDQUFDLElBQU4sQ0FBWSxLQUFLLENBQUMsSUFBbEIsS0FBNEIsSUFBNUIsS0FDSCxDQUFDLEtBQUssQ0FBQyxJQUFOLENBQVcsS0FBWixJQUFxQixLQUFLLENBQUMsSUFBTixDQUFXLEtBQVgsQ0FBa0IsS0FBSyxDQUFDLElBQXhCLEtBQWtDLElBRHBELENBQUwsRUFDaUU7QUFDaEUsaUJBQU8sS0FBSyxDQUFDLElBQU4sQ0FBWSxLQUFLLENBQUMsSUFBbEIsQ0FBUDtBQUNBLFNBTnFCLENBUXRCO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxRQUFBLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBUCxDQUFZLEtBQUssQ0FBQyxJQUFsQixFQUF3QixLQUFLLENBQUMsSUFBOUIsRUFBb0MsS0FBcEMsRUFBMkMsRUFBM0MsQ0FBVCxDQVpzQixDQWF0Qjs7QUFDQSxlQUFPLENBQUMsTUFBRCxJQUFXLE1BQU0sS0FBSyxNQUF0QixHQUErQixDQUEvQixHQUFtQyxNQUExQztBQUNBLE9BaEJRO0FBaUJULE1BQUEsR0FBRyxFQUFFLGFBQVUsS0FBVixFQUFrQjtBQUN0QjtBQUNBO0FBQ0EsWUFBSyxNQUFNLENBQUMsRUFBUCxDQUFVLElBQVYsQ0FBZ0IsS0FBSyxDQUFDLElBQXRCLENBQUwsRUFBb0M7QUFDbkMsVUFBQSxNQUFNLENBQUMsRUFBUCxDQUFVLElBQVYsQ0FBZ0IsS0FBSyxDQUFDLElBQXRCLEVBQThCLEtBQTlCO0FBQ0EsU0FGRCxNQUVPLElBQUssS0FBSyxDQUFDLElBQU4sQ0FBVyxLQUFYLEtBQXNCLEtBQUssQ0FBQyxJQUFOLENBQVcsS0FBWCxDQUFrQixNQUFNLENBQUMsUUFBUCxDQUFpQixLQUFLLENBQUMsSUFBdkIsQ0FBbEIsS0FBcUQsSUFBckQsSUFBNkQsTUFBTSxDQUFDLFFBQVAsQ0FBaUIsS0FBSyxDQUFDLElBQXZCLENBQW5GLENBQUwsRUFBMEg7QUFDaEksVUFBQSxNQUFNLENBQUMsS0FBUCxDQUFjLEtBQUssQ0FBQyxJQUFwQixFQUEwQixLQUFLLENBQUMsSUFBaEMsRUFBc0MsS0FBSyxDQUFDLEdBQU4sR0FBWSxLQUFLLENBQUMsSUFBeEQ7QUFDQSxTQUZNLE1BRUE7QUFDTixVQUFBLEtBQUssQ0FBQyxJQUFOLENBQVksS0FBSyxDQUFDLElBQWxCLElBQTJCLEtBQUssQ0FBQyxHQUFqQztBQUNBO0FBQ0Q7QUEzQlE7QUFETyxHQUFsQixDQXJsUitCLENBcW5SL0I7QUFDQTs7QUFFQSxFQUFBLEtBQUssQ0FBQyxTQUFOLENBQWdCLFNBQWhCLEdBQTRCLEtBQUssQ0FBQyxTQUFOLENBQWdCLFVBQWhCLEdBQTZCO0FBQ3hELElBQUEsR0FBRyxFQUFFLGFBQVUsS0FBVixFQUFrQjtBQUN0QixVQUFLLEtBQUssQ0FBQyxJQUFOLENBQVcsUUFBWCxJQUF1QixLQUFLLENBQUMsSUFBTixDQUFXLFVBQXZDLEVBQW9EO0FBQ25ELFFBQUEsS0FBSyxDQUFDLElBQU4sQ0FBWSxLQUFLLENBQUMsSUFBbEIsSUFBMkIsS0FBSyxDQUFDLEdBQWpDO0FBQ0E7QUFDRDtBQUx1RCxHQUF6RDtBQVFBLEVBQUEsTUFBTSxDQUFDLElBQVAsQ0FBWSxDQUFFLFFBQUYsRUFBWSxNQUFaLEVBQW9CLE1BQXBCLENBQVosRUFBMEMsVUFBVSxDQUFWLEVBQWEsSUFBYixFQUFvQjtBQUM3RCxRQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBUCxDQUFXLElBQVgsQ0FBWjs7QUFDQSxJQUFBLE1BQU0sQ0FBQyxFQUFQLENBQVcsSUFBWCxJQUFvQixVQUFVLEtBQVYsRUFBaUIsTUFBakIsRUFBeUIsUUFBekIsRUFBb0M7QUFDdkQsYUFBTyxLQUFLLElBQUksSUFBVCxJQUFpQixPQUFPLEtBQVAsS0FBaUIsU0FBbEMsSUFDTjtBQUNFLE9BQUMsQ0FBRCxJQUFNLE1BQU0sQ0FBQyxVQUFQLENBQW1CLEtBQW5CLENBQU4sSUFBb0MsTUFBTSxDQUFDLFVBQVAsQ0FBbUIsTUFBbkIsQ0FGaEMsR0FHTixLQUFLLENBQUMsS0FBTixDQUFhLElBQWIsRUFBbUIsU0FBbkIsQ0FITSxHQUlOLEtBQUssT0FBTCxDQUFjLEtBQUssQ0FBRSxJQUFGLEVBQVEsSUFBUixDQUFuQixFQUFtQyxLQUFuQyxFQUEwQyxNQUExQyxFQUFrRCxRQUFsRCxDQUpEO0FBS0EsS0FORDtBQU9BLEdBVEQ7QUFXQSxFQUFBLE1BQU0sQ0FBQyxFQUFQLENBQVUsTUFBVixDQUFpQjtBQUNoQixJQUFBLE1BQU0sRUFBRSxnQkFBVSxLQUFWLEVBQWlCLEVBQWpCLEVBQXFCLE1BQXJCLEVBQTZCLFFBQTdCLEVBQXdDO0FBRS9DO0FBQ0EsYUFBTyxLQUFLLE1BQUwsQ0FBYSxRQUFiLEVBQXdCLEdBQXhCLENBQTZCLFNBQTdCLEVBQXdDLENBQXhDLEVBQTRDLElBQTVDLEdBRU47QUFGTSxPQUdMLEdBSEssR0FHQyxPQUhELENBR1M7QUFBRSxRQUFBLE9BQU8sRUFBRTtBQUFYLE9BSFQsRUFHMEIsS0FIMUIsRUFHaUMsTUFIakMsRUFHeUMsUUFIekMsQ0FBUDtBQUlBLEtBUmU7QUFTaEIsSUFBQSxPQUFPLEVBQUUsaUJBQVUsSUFBVixFQUFnQixLQUFoQixFQUF1QixNQUF2QixFQUErQixRQUEvQixFQUEwQztBQUNsRCxVQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsYUFBUCxDQUFzQixJQUF0QixDQUFaO0FBQUEsVUFDQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQVAsQ0FBYyxLQUFkLEVBQXFCLE1BQXJCLEVBQTZCLFFBQTdCLENBRFY7QUFBQSxVQUVDLFdBQVcsR0FBRyxTQUFkLFdBQWMsR0FBVztBQUN4QjtBQUNBLFlBQUksSUFBSSxHQUFHLFNBQVMsQ0FBRSxJQUFGLEVBQVEsTUFBTSxDQUFDLE1BQVAsQ0FBZSxFQUFmLEVBQW1CLElBQW5CLENBQVIsRUFBbUMsTUFBbkMsQ0FBcEIsQ0FGd0IsQ0FJeEI7O0FBQ0EsWUFBSyxLQUFMLEVBQWE7QUFDWixVQUFBLElBQUksQ0FBQyxJQUFMLENBQVcsSUFBWDtBQUNBO0FBQ0QsT0FWRjs7QUFZQSxhQUFPLEtBQUssSUFBSSxNQUFNLENBQUMsS0FBUCxLQUFpQixLQUExQixHQUNOLEtBQUssSUFBTCxDQUFXLFdBQVgsQ0FETSxHQUVOLEtBQUssS0FBTCxDQUFZLE1BQU0sQ0FBQyxLQUFuQixFQUEwQixXQUExQixDQUZEO0FBR0EsS0F6QmU7QUEwQmhCLElBQUEsSUFBSSxFQUFFLGNBQVUsSUFBVixFQUFnQixVQUFoQixFQUE0QixPQUE1QixFQUFzQztBQUMzQyxVQUFJLFNBQVMsR0FBRyxTQUFaLFNBQVksQ0FBVSxLQUFWLEVBQWtCO0FBQ2pDLFlBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFqQjtBQUNBLGVBQU8sS0FBSyxDQUFDLElBQWI7QUFDQSxRQUFBLElBQUksQ0FBRSxPQUFGLENBQUo7QUFDQSxPQUpEOztBQU1BLFVBQUssT0FBTyxJQUFQLEtBQWdCLFFBQXJCLEVBQWdDO0FBQy9CLFFBQUEsT0FBTyxHQUFHLFVBQVY7QUFDQSxRQUFBLFVBQVUsR0FBRyxJQUFiO0FBQ0EsUUFBQSxJQUFJLEdBQUcsU0FBUDtBQUNBOztBQUNELFVBQUssVUFBVSxJQUFJLElBQUksS0FBSyxLQUE1QixFQUFvQztBQUNuQyxhQUFLLEtBQUwsQ0FBWSxJQUFJLElBQUksSUFBcEIsRUFBMEIsRUFBMUI7QUFDQTs7QUFFRCxhQUFPLEtBQUssSUFBTCxDQUFVLFlBQVc7QUFDM0IsWUFBSSxPQUFPLEdBQUcsSUFBZDtBQUFBLFlBQ0MsS0FBSyxHQUFHLElBQUksSUFBSSxJQUFSLElBQWdCLElBQUksR0FBRyxZQURoQztBQUFBLFlBRUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUZqQjtBQUFBLFlBR0MsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZCxDQUhSOztBQUtBLFlBQUssS0FBTCxFQUFhO0FBQ1osY0FBSyxJQUFJLENBQUUsS0FBRixDQUFKLElBQWlCLElBQUksQ0FBRSxLQUFGLENBQUosQ0FBYyxJQUFwQyxFQUEyQztBQUMxQyxZQUFBLFNBQVMsQ0FBRSxJQUFJLENBQUUsS0FBRixDQUFOLENBQVQ7QUFDQTtBQUNELFNBSkQsTUFJTztBQUNOLGVBQU0sS0FBTixJQUFlLElBQWYsRUFBc0I7QUFDckIsZ0JBQUssSUFBSSxDQUFFLEtBQUYsQ0FBSixJQUFpQixJQUFJLENBQUUsS0FBRixDQUFKLENBQWMsSUFBL0IsSUFBdUMsSUFBSSxDQUFDLElBQUwsQ0FBVyxLQUFYLENBQTVDLEVBQWlFO0FBQ2hFLGNBQUEsU0FBUyxDQUFFLElBQUksQ0FBRSxLQUFGLENBQU4sQ0FBVDtBQUNBO0FBQ0Q7QUFDRDs7QUFFRCxhQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBckIsRUFBNkIsS0FBSyxFQUFsQyxHQUF3QztBQUN2QyxjQUFLLE1BQU0sQ0FBRSxLQUFGLENBQU4sQ0FBZ0IsSUFBaEIsS0FBeUIsSUFBekIsS0FBa0MsSUFBSSxJQUFJLElBQVIsSUFBZ0IsTUFBTSxDQUFFLEtBQUYsQ0FBTixDQUFnQixLQUFoQixLQUEwQixJQUE1RSxDQUFMLEVBQXlGO0FBQ3hGLFlBQUEsTUFBTSxDQUFFLEtBQUYsQ0FBTixDQUFnQixJQUFoQixDQUFxQixJQUFyQixDQUEyQixPQUEzQjtBQUNBLFlBQUEsT0FBTyxHQUFHLEtBQVY7QUFDQSxZQUFBLE1BQU0sQ0FBQyxNQUFQLENBQWUsS0FBZixFQUFzQixDQUF0QjtBQUNBO0FBQ0QsU0F4QjBCLENBMEIzQjtBQUNBO0FBQ0E7OztBQUNBLFlBQUssT0FBTyxJQUFJLENBQUMsT0FBakIsRUFBMkI7QUFDMUIsVUFBQSxNQUFNLENBQUMsT0FBUCxDQUFnQixJQUFoQixFQUFzQixJQUF0QjtBQUNBO0FBQ0QsT0FoQ00sQ0FBUDtBQWlDQTtBQTNFZSxHQUFqQixFQTNvUitCLENBeXRSL0I7O0FBQ0EsV0FBUyxLQUFULENBQWdCLElBQWhCLEVBQXNCLFlBQXRCLEVBQXFDO0FBQ3BDLFFBQUksS0FBSjtBQUFBLFFBQ0MsS0FBSyxHQUFHO0FBQUUsTUFBQSxNQUFNLEVBQUU7QUFBVixLQURUO0FBQUEsUUFFQyxDQUFDLEdBQUcsQ0FGTCxDQURvQyxDQUtwQztBQUNBOztBQUNBLElBQUEsWUFBWSxHQUFHLFlBQVksR0FBRSxDQUFGLEdBQU0sQ0FBakM7O0FBQ0EsV0FBTyxDQUFDLEdBQUcsQ0FBWCxFQUFlLENBQUMsSUFBSSxJQUFJLFlBQXhCLEVBQXVDO0FBQ3RDLE1BQUEsS0FBSyxHQUFHLFNBQVMsQ0FBRSxDQUFGLENBQWpCO0FBQ0EsTUFBQSxLQUFLLENBQUUsV0FBVyxLQUFiLENBQUwsR0FBNEIsS0FBSyxDQUFFLFlBQVksS0FBZCxDQUFMLEdBQTZCLElBQXpEO0FBQ0E7O0FBRUQsUUFBSyxZQUFMLEVBQW9CO0FBQ25CLE1BQUEsS0FBSyxDQUFDLE9BQU4sR0FBZ0IsS0FBSyxDQUFDLEtBQU4sR0FBYyxJQUE5QjtBQUNBOztBQUVELFdBQU8sS0FBUDtBQUNBLEdBNXVSOEIsQ0E4dVIvQjs7O0FBQ0EsRUFBQSxNQUFNLENBQUMsSUFBUCxDQUFZO0FBQ1gsSUFBQSxTQUFTLEVBQUUsS0FBSyxDQUFDLE1BQUQsQ0FETDtBQUVYLElBQUEsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFELENBRkg7QUFHWCxJQUFBLFdBQVcsRUFBRSxLQUFLLENBQUMsUUFBRCxDQUhQO0FBSVgsSUFBQSxNQUFNLEVBQUU7QUFBRSxNQUFBLE9BQU8sRUFBRTtBQUFYLEtBSkc7QUFLWCxJQUFBLE9BQU8sRUFBRTtBQUFFLE1BQUEsT0FBTyxFQUFFO0FBQVgsS0FMRTtBQU1YLElBQUEsVUFBVSxFQUFFO0FBQUUsTUFBQSxPQUFPLEVBQUU7QUFBWDtBQU5ELEdBQVosRUFPRyxVQUFVLElBQVYsRUFBZ0IsS0FBaEIsRUFBd0I7QUFDMUIsSUFBQSxNQUFNLENBQUMsRUFBUCxDQUFXLElBQVgsSUFBb0IsVUFBVSxLQUFWLEVBQWlCLE1BQWpCLEVBQXlCLFFBQXpCLEVBQW9DO0FBQ3ZELGFBQU8sS0FBSyxPQUFMLENBQWMsS0FBZCxFQUFxQixLQUFyQixFQUE0QixNQUE1QixFQUFvQyxRQUFwQyxDQUFQO0FBQ0EsS0FGRDtBQUdBLEdBWEQ7O0FBYUEsRUFBQSxNQUFNLENBQUMsS0FBUCxHQUFlLFVBQVUsS0FBVixFQUFpQixNQUFqQixFQUF5QixFQUF6QixFQUE4QjtBQUM1QyxRQUFJLEdBQUcsR0FBRyxLQUFLLElBQUksUUFBTyxLQUFQLE1BQWlCLFFBQTFCLEdBQXFDLE1BQU0sQ0FBQyxNQUFQLENBQWUsRUFBZixFQUFtQixLQUFuQixDQUFyQyxHQUFrRTtBQUMzRSxNQUFBLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFELElBQU8sTUFBYixJQUNULE1BQU0sQ0FBQyxVQUFQLENBQW1CLEtBQW5CLEtBQThCLEtBRjRDO0FBRzNFLE1BQUEsUUFBUSxFQUFFLEtBSGlFO0FBSTNFLE1BQUEsTUFBTSxFQUFFLEVBQUUsSUFBSSxNQUFOLElBQWdCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFQLENBQW1CLE1BQW5CLENBQVgsSUFBMEM7QUFKUyxLQUE1RTtBQU9BLElBQUEsR0FBRyxDQUFDLFFBQUosR0FBZSxNQUFNLENBQUMsRUFBUCxDQUFVLEdBQVYsR0FBZ0IsQ0FBaEIsR0FBb0IsT0FBTyxHQUFHLENBQUMsUUFBWCxLQUF3QixRQUF4QixHQUFtQyxHQUFHLENBQUMsUUFBdkMsR0FDbEMsR0FBRyxDQUFDLFFBQUosSUFBZ0IsTUFBTSxDQUFDLEVBQVAsQ0FBVSxNQUExQixHQUFtQyxNQUFNLENBQUMsRUFBUCxDQUFVLE1BQVYsQ0FBa0IsR0FBRyxDQUFDLFFBQXRCLENBQW5DLEdBQXNFLE1BQU0sQ0FBQyxFQUFQLENBQVUsTUFBVixDQUFpQixRQUR4RixDQVI0QyxDQVc1Qzs7QUFDQSxRQUFLLEdBQUcsQ0FBQyxLQUFKLElBQWEsSUFBYixJQUFxQixHQUFHLENBQUMsS0FBSixLQUFjLElBQXhDLEVBQStDO0FBQzlDLE1BQUEsR0FBRyxDQUFDLEtBQUosR0FBWSxJQUFaO0FBQ0EsS0FkMkMsQ0FnQjVDOzs7QUFDQSxJQUFBLEdBQUcsQ0FBQyxHQUFKLEdBQVUsR0FBRyxDQUFDLFFBQWQ7O0FBRUEsSUFBQSxHQUFHLENBQUMsUUFBSixHQUFlLFlBQVc7QUFDekIsVUFBSyxNQUFNLENBQUMsVUFBUCxDQUFtQixHQUFHLENBQUMsR0FBdkIsQ0FBTCxFQUFvQztBQUNuQyxRQUFBLEdBQUcsQ0FBQyxHQUFKLENBQVEsSUFBUixDQUFjLElBQWQ7QUFDQTs7QUFFRCxVQUFLLEdBQUcsQ0FBQyxLQUFULEVBQWlCO0FBQ2hCLFFBQUEsTUFBTSxDQUFDLE9BQVAsQ0FBZ0IsSUFBaEIsRUFBc0IsR0FBRyxDQUFDLEtBQTFCO0FBQ0E7QUFDRCxLQVJEOztBQVVBLFdBQU8sR0FBUDtBQUNBLEdBOUJEOztBQWdDQSxFQUFBLE1BQU0sQ0FBQyxNQUFQLEdBQWdCO0FBQ2YsSUFBQSxNQUFNLEVBQUUsZ0JBQVUsQ0FBVixFQUFjO0FBQ3JCLGFBQU8sQ0FBUDtBQUNBLEtBSGM7QUFJZixJQUFBLEtBQUssRUFBRSxlQUFVLENBQVYsRUFBYztBQUNwQixhQUFPLE1BQU0sSUFBSSxDQUFDLEdBQUwsQ0FBVSxDQUFDLEdBQUMsSUFBSSxDQUFDLEVBQWpCLElBQXdCLENBQXJDO0FBQ0E7QUFOYyxHQUFoQjtBQVNBLEVBQUEsTUFBTSxDQUFDLE1BQVAsR0FBZ0IsRUFBaEI7QUFDQSxFQUFBLE1BQU0sQ0FBQyxFQUFQLEdBQVksS0FBSyxDQUFDLFNBQU4sQ0FBZ0IsSUFBNUI7O0FBQ0EsRUFBQSxNQUFNLENBQUMsRUFBUCxDQUFVLElBQVYsR0FBaUIsWUFBVztBQUMzQixRQUFJLEtBQUo7QUFBQSxRQUNDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFEakI7QUFBQSxRQUVDLENBQUMsR0FBRyxDQUZMOztBQUlBLFdBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFuQixFQUEyQixDQUFDLEVBQTVCLEVBQWlDO0FBQ2hDLE1BQUEsS0FBSyxHQUFHLE1BQU0sQ0FBRSxDQUFGLENBQWQsQ0FEZ0MsQ0FFaEM7O0FBQ0EsVUFBSyxDQUFDLEtBQUssRUFBTixJQUFZLE1BQU0sQ0FBRSxDQUFGLENBQU4sS0FBZ0IsS0FBakMsRUFBeUM7QUFDeEMsUUFBQSxNQUFNLENBQUMsTUFBUCxDQUFlLENBQUMsRUFBaEIsRUFBb0IsQ0FBcEI7QUFDQTtBQUNEOztBQUVELFFBQUssQ0FBQyxNQUFNLENBQUMsTUFBYixFQUFzQjtBQUNyQixNQUFBLE1BQU0sQ0FBQyxFQUFQLENBQVUsSUFBVjtBQUNBO0FBQ0QsR0FoQkQ7O0FBa0JBLEVBQUEsTUFBTSxDQUFDLEVBQVAsQ0FBVSxLQUFWLEdBQWtCLFVBQVUsS0FBVixFQUFrQjtBQUNuQyxRQUFLLEtBQUssTUFBTSxNQUFNLENBQUMsTUFBUCxDQUFjLElBQWQsQ0FBb0IsS0FBcEIsQ0FBWCxJQUEwQyxDQUFDLE9BQWhELEVBQTBEO0FBQ3pELE1BQUEsT0FBTyxHQUFHLFdBQVcsQ0FBRSxNQUFNLENBQUMsRUFBUCxDQUFVLElBQVosRUFBa0IsTUFBTSxDQUFDLEVBQVAsQ0FBVSxRQUE1QixDQUFyQjtBQUNBO0FBQ0QsR0FKRDs7QUFNQSxFQUFBLE1BQU0sQ0FBQyxFQUFQLENBQVUsUUFBVixHQUFxQixFQUFyQjs7QUFFQSxFQUFBLE1BQU0sQ0FBQyxFQUFQLENBQVUsSUFBVixHQUFpQixZQUFXO0FBQzNCLElBQUEsYUFBYSxDQUFFLE9BQUYsQ0FBYjtBQUNBLElBQUEsT0FBTyxHQUFHLElBQVY7QUFDQSxHQUhEOztBQUtBLEVBQUEsTUFBTSxDQUFDLEVBQVAsQ0FBVSxNQUFWLEdBQW1CO0FBQ2xCLElBQUEsSUFBSSxFQUFFLEdBRFk7QUFFbEIsSUFBQSxJQUFJLEVBQUUsR0FGWTtBQUdsQjtBQUNBLElBQUEsUUFBUSxFQUFFO0FBSlEsR0FBbkIsQ0F0MFIrQixDQTYwUi9COztBQUNBLEVBQUEsTUFBTSxDQUFDLEVBQVAsQ0FBVSxJQUFWLEdBQWlCLEVBQWpCOztBQUVBLE1BQUssTUFBTSxDQUFDLElBQVAsSUFBZSxNQUFNLENBQUMsSUFBUCxDQUFZLE9BQWhDLEVBQTBDO0FBQ3pDLElBQUEsTUFBTSxDQUFDLElBQVAsQ0FBWSxPQUFaLENBQW9CLFFBQXBCLEdBQStCLFVBQVUsSUFBVixFQUFpQjtBQUMvQyxhQUFPLE1BQU0sQ0FBQyxJQUFQLENBQVksTUFBTSxDQUFDLE1BQW5CLEVBQTJCLFVBQVUsRUFBVixFQUFlO0FBQ2hELGVBQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQyxJQUFuQjtBQUNBLE9BRk0sRUFFSixNQUZIO0FBR0EsS0FKRDtBQUtBOztBQUNELE1BQUksS0FBSyxHQUFHLGtCQUFaOztBQUVBLEVBQUEsTUFBTSxDQUFDLEVBQVAsQ0FBVSxNQUFWLEdBQW1CLFVBQVUsT0FBVixFQUFvQjtBQUN0QyxRQUFLLFNBQVMsQ0FBQyxNQUFmLEVBQXdCO0FBQ3ZCLGFBQU8sT0FBTyxLQUFLLFNBQVosR0FDTixJQURNLEdBRU4sS0FBSyxJQUFMLENBQVUsVUFBVSxDQUFWLEVBQWM7QUFDdkIsUUFBQSxNQUFNLENBQUMsTUFBUCxDQUFjLFNBQWQsQ0FBeUIsSUFBekIsRUFBK0IsT0FBL0IsRUFBd0MsQ0FBeEM7QUFDQSxPQUZELENBRkQ7QUFLQTs7QUFFRCxRQUFJLEdBQUo7QUFBQSxRQUFTLE9BQVQ7QUFBQSxRQUFrQixJQUFsQjtBQUFBLFFBQXdCLEdBQXhCO0FBQUEsUUFBNkIsU0FBN0I7QUFBQSxRQUF3QyxVQUF4QztBQUFBLFFBQW9ELFNBQXBEO0FBQUEsUUFBK0QsVUFBL0Q7QUFBQSxRQUEyRSxHQUEzRTtBQUFBLFFBQWdGLElBQWhGO0FBQUEsUUFDQyxJQUFJLEdBQUcsS0FBTSxDQUFOLENBRFI7QUFBQSxRQUVDLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLGFBRnBCOztBQUlBLFFBQUssQ0FBQyxHQUFOLEVBQVk7QUFDWDtBQUNBOztBQUVELFFBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQVosTUFBc0IsSUFBM0IsRUFBa0M7QUFDakMsYUFBTyxNQUFNLENBQUMsTUFBUCxDQUFjLFVBQWQsQ0FBMEIsSUFBMUIsQ0FBUDtBQUNBOztBQUVELElBQUEsT0FBTyxHQUFHLEdBQUcsQ0FBQyxlQUFkLENBckJzQyxDQXVCdEM7O0FBQ0EsUUFBSyxDQUFDLE1BQU0sQ0FBQyxRQUFQLENBQWlCLE9BQWpCLEVBQTBCLElBQTFCLENBQU4sRUFBeUM7QUFDeEMsYUFBTztBQUFFLFFBQUEsR0FBRyxFQUFFLENBQVA7QUFBVSxRQUFBLElBQUksRUFBRTtBQUFoQixPQUFQO0FBQ0E7O0FBRUQsSUFBQSxHQUFHLEdBQUcsSUFBSSxDQUFDLHFCQUFMLEVBQU47QUFDQSxJQUFBLEdBQUcsR0FBRyxTQUFTLENBQUUsR0FBRixDQUFmO0FBQ0EsSUFBQSxTQUFTLEdBQUksT0FBTyxDQUFDLFNBQVIsSUFBc0IsSUFBSSxDQUFDLFNBQTNCLElBQXlDLENBQXREO0FBQ0EsSUFBQSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVIsSUFBc0IsSUFBSSxDQUFDLFVBQTNCLElBQXlDLENBQXREO0FBQ0EsSUFBQSxTQUFTLEdBQUksR0FBRyxDQUFDLFdBQUosSUFBbUIsT0FBTyxDQUFDLFNBQXhDO0FBQ0EsSUFBQSxVQUFVLEdBQUcsR0FBRyxDQUFDLFdBQUosSUFBbUIsT0FBTyxDQUFDLFVBQXhDO0FBQ0EsSUFBQSxHQUFHLEdBQUksR0FBRyxDQUFDLEdBQUosR0FBVyxTQUFYLEdBQXdCLFNBQS9CO0FBQ0EsSUFBQSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUosR0FBVyxVQUFYLEdBQXdCLFVBQS9CO0FBRUEsV0FBTztBQUFFLE1BQUEsR0FBRyxFQUFFLEdBQVA7QUFBWSxNQUFBLElBQUksRUFBRTtBQUFsQixLQUFQO0FBQ0EsR0F0Q0Q7O0FBd0NBLEVBQUEsTUFBTSxDQUFDLE1BQVAsR0FBZ0I7QUFFZixJQUFBLFVBQVUsRUFBRSxvQkFBVSxJQUFWLEVBQWlCO0FBQzVCLFVBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFmO0FBQUEsVUFDQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBRGI7O0FBR0EsVUFBSyxNQUFNLENBQUMsT0FBUCxDQUFlLGdDQUFwQixFQUF1RDtBQUN0RCxRQUFBLEdBQUcsSUFBSyxVQUFVLENBQUUsTUFBTSxDQUFDLEdBQVAsQ0FBVyxJQUFYLEVBQWlCLFdBQWpCLENBQUYsQ0FBVixJQUErQyxDQUF2RDtBQUNBLFFBQUEsSUFBSSxJQUFJLFVBQVUsQ0FBRSxNQUFNLENBQUMsR0FBUCxDQUFXLElBQVgsRUFBaUIsWUFBakIsQ0FBRixDQUFWLElBQWdELENBQXhEO0FBQ0E7O0FBRUQsYUFBTztBQUFFLFFBQUEsR0FBRyxFQUFFLEdBQVA7QUFBWSxRQUFBLElBQUksRUFBRTtBQUFsQixPQUFQO0FBQ0EsS0FaYztBQWNmLElBQUEsU0FBUyxFQUFFLG1CQUFVLElBQVYsRUFBZ0IsT0FBaEIsRUFBeUIsQ0FBekIsRUFBNkI7QUFDdkMsVUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQVAsQ0FBWSxJQUFaLEVBQWtCLFVBQWxCLENBQWYsQ0FEdUMsQ0FHdkM7O0FBQ0EsVUFBSyxRQUFRLEtBQUssUUFBbEIsRUFBNkI7QUFDNUIsUUFBQSxJQUFJLENBQUMsS0FBTCxDQUFXLFFBQVgsR0FBc0IsVUFBdEI7QUFDQTs7QUFFRCxVQUFJLE9BQU8sR0FBRyxNQUFNLENBQUUsSUFBRixDQUFwQjtBQUFBLFVBQ0MsU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFSLEVBRGI7QUFBQSxVQUVDLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBUCxDQUFZLElBQVosRUFBa0IsS0FBbEIsQ0FGYjtBQUFBLFVBR0MsVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFQLENBQVksSUFBWixFQUFrQixNQUFsQixDQUhkO0FBQUEsVUFJQyxpQkFBaUIsR0FBRyxDQUFFLFFBQVEsS0FBSyxVQUFiLElBQTJCLFFBQVEsS0FBSyxPQUExQyxLQUF1RCxNQUFNLENBQUMsT0FBUCxDQUFlLE1BQWYsRUFBdUIsQ0FBQyxTQUFELEVBQVksVUFBWixDQUF2QixJQUFrRCxDQUFDLENBSi9IO0FBQUEsVUFLQyxLQUFLLEdBQUcsRUFMVDtBQUFBLFVBS2EsV0FBVyxHQUFHLEVBTDNCO0FBQUEsVUFLK0IsTUFML0I7QUFBQSxVQUt1QyxPQUx2QyxDQVJ1QyxDQWV2Qzs7QUFDQSxVQUFLLGlCQUFMLEVBQXlCO0FBQ3hCLFFBQUEsV0FBVyxHQUFHLE9BQU8sQ0FBQyxRQUFSLEVBQWQ7QUFDQSxRQUFBLE1BQU0sR0FBRyxXQUFXLENBQUMsR0FBckI7QUFDQSxRQUFBLE9BQU8sR0FBRyxXQUFXLENBQUMsSUFBdEI7QUFDQSxPQUpELE1BSU87QUFDTixRQUFBLE1BQU0sR0FBRyxVQUFVLENBQUUsU0FBRixDQUFWLElBQTJCLENBQXBDO0FBQ0EsUUFBQSxPQUFPLEdBQUcsVUFBVSxDQUFFLFVBQUYsQ0FBVixJQUE0QixDQUF0QztBQUNBOztBQUVELFVBQUssTUFBTSxDQUFDLFVBQVAsQ0FBbUIsT0FBbkIsQ0FBTCxFQUFvQztBQUNuQyxRQUFBLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBUixDQUFjLElBQWQsRUFBb0IsQ0FBcEIsRUFBdUIsU0FBdkIsQ0FBVjtBQUNBOztBQUVELFVBQUssT0FBTyxDQUFDLEdBQVIsSUFBZSxJQUFwQixFQUEyQjtBQUMxQixRQUFBLEtBQUssQ0FBQyxHQUFOLEdBQWMsT0FBTyxDQUFDLEdBQVIsR0FBYyxTQUFTLENBQUMsR0FBMUIsR0FBa0MsTUFBOUM7QUFDQTs7QUFDRCxVQUFLLE9BQU8sQ0FBQyxJQUFSLElBQWdCLElBQXJCLEVBQTRCO0FBQzNCLFFBQUEsS0FBSyxDQUFDLElBQU4sR0FBZSxPQUFPLENBQUMsSUFBUixHQUFlLFNBQVMsQ0FBQyxJQUEzQixHQUFvQyxPQUFqRDtBQUNBOztBQUVELFVBQUssV0FBVyxPQUFoQixFQUEwQjtBQUN6QixRQUFBLE9BQU8sQ0FBQyxLQUFSLENBQWMsSUFBZCxDQUFvQixJQUFwQixFQUEwQixLQUExQjtBQUNBLE9BRkQsTUFFTztBQUNOLFFBQUEsT0FBTyxDQUFDLEdBQVIsQ0FBYSxLQUFiO0FBQ0E7QUFDRDtBQXZEYyxHQUFoQjtBQTJEQSxFQUFBLE1BQU0sQ0FBQyxFQUFQLENBQVUsTUFBVixDQUFpQjtBQUVoQixJQUFBLFFBQVEsRUFBRSxvQkFBVztBQUNwQixVQUFLLENBQUMsS0FBSyxDQUFMLENBQU4sRUFBZ0I7QUFDZjtBQUNBOztBQUVELFVBQUksSUFBSSxHQUFHLEtBQUssQ0FBTCxDQUFYO0FBQUEsVUFFQTtBQUNBLE1BQUEsWUFBWSxHQUFHLEtBQUssWUFBTCxFQUhmO0FBQUEsVUFLQTtBQUNBLE1BQUEsTUFBTSxHQUFTLEtBQUssTUFBTCxFQU5mO0FBQUEsVUFPQSxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQU4sQ0FBVyxZQUFZLENBQUMsQ0FBRCxDQUFaLENBQWdCLFFBQTNCLElBQXVDO0FBQUUsUUFBQSxHQUFHLEVBQUUsQ0FBUDtBQUFVLFFBQUEsSUFBSSxFQUFFO0FBQWhCLE9BQXZDLEdBQTZELFlBQVksQ0FBQyxNQUFiLEVBUDVFLENBTG9CLENBY3BCO0FBQ0E7QUFDQTs7QUFDQSxNQUFBLE1BQU0sQ0FBQyxHQUFQLElBQWUsVUFBVSxDQUFFLE1BQU0sQ0FBQyxHQUFQLENBQVcsSUFBWCxFQUFpQixXQUFqQixDQUFGLENBQVYsSUFBK0MsQ0FBOUQ7QUFDQSxNQUFBLE1BQU0sQ0FBQyxJQUFQLElBQWUsVUFBVSxDQUFFLE1BQU0sQ0FBQyxHQUFQLENBQVcsSUFBWCxFQUFpQixZQUFqQixDQUFGLENBQVYsSUFBZ0QsQ0FBL0QsQ0FsQm9CLENBb0JwQjs7QUFDQSxNQUFBLFlBQVksQ0FBQyxHQUFiLElBQXFCLFVBQVUsQ0FBRSxNQUFNLENBQUMsR0FBUCxDQUFXLFlBQVksQ0FBQyxDQUFELENBQXZCLEVBQTRCLGdCQUE1QixDQUFGLENBQVYsSUFBK0QsQ0FBcEY7QUFDQSxNQUFBLFlBQVksQ0FBQyxJQUFiLElBQXFCLFVBQVUsQ0FBRSxNQUFNLENBQUMsR0FBUCxDQUFXLFlBQVksQ0FBQyxDQUFELENBQXZCLEVBQTRCLGlCQUE1QixDQUFGLENBQVYsSUFBZ0UsQ0FBckYsQ0F0Qm9CLENBd0JwQjs7QUFDQSxhQUFPO0FBQ04sUUFBQSxHQUFHLEVBQUcsTUFBTSxDQUFDLEdBQVAsR0FBYyxZQUFZLENBQUMsR0FEM0I7QUFFTixRQUFBLElBQUksRUFBRSxNQUFNLENBQUMsSUFBUCxHQUFjLFlBQVksQ0FBQztBQUYzQixPQUFQO0FBSUEsS0EvQmU7QUFpQ2hCLElBQUEsWUFBWSxFQUFFLHdCQUFXO0FBQ3hCLGFBQU8sS0FBSyxHQUFMLENBQVMsWUFBVztBQUMxQixZQUFJLFlBQVksR0FBRyxLQUFLLFlBQUwsSUFBcUIsUUFBUSxDQUFDLElBQWpEOztBQUNBLGVBQVEsWUFBWSxJQUFLLENBQUMsS0FBSyxDQUFDLElBQU4sQ0FBVyxZQUFZLENBQUMsUUFBeEIsQ0FBRCxJQUFzQyxNQUFNLENBQUMsR0FBUCxDQUFXLFlBQVgsRUFBeUIsVUFBekIsTUFBeUMsUUFBeEcsRUFBb0g7QUFDbkgsVUFBQSxZQUFZLEdBQUcsWUFBWSxDQUFDLFlBQTVCO0FBQ0E7O0FBQ0QsZUFBTyxZQUFZLElBQUksUUFBUSxDQUFDLElBQWhDO0FBQ0EsT0FOTSxDQUFQO0FBT0E7QUF6Q2UsR0FBakIsRUE1N1IrQixDQXkrUi9COztBQUNBLEVBQUEsTUFBTSxDQUFDLElBQVAsQ0FBYTtBQUFDLElBQUEsVUFBVSxFQUFFLGFBQWI7QUFBNEIsSUFBQSxTQUFTLEVBQUU7QUFBdkMsR0FBYixFQUFvRSxVQUFVLE1BQVYsRUFBa0IsSUFBbEIsRUFBeUI7QUFDNUYsUUFBSSxHQUFHLEdBQUcsSUFBSSxJQUFKLENBQVUsSUFBVixDQUFWOztBQUVBLElBQUEsTUFBTSxDQUFDLEVBQVAsQ0FBVyxNQUFYLElBQXNCLFVBQVUsR0FBVixFQUFnQjtBQUNyQyxhQUFPLE1BQU0sQ0FBQyxNQUFQLENBQWUsSUFBZixFQUFxQixVQUFVLElBQVYsRUFBZ0IsTUFBaEIsRUFBd0IsR0FBeEIsRUFBOEI7QUFDekQsWUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFFLElBQUYsQ0FBbkI7O0FBRUEsWUFBSyxHQUFHLEtBQUssU0FBYixFQUF5QjtBQUN4QixpQkFBTyxHQUFHLEdBQUksSUFBSSxJQUFJLEdBQVQsR0FBZ0IsR0FBRyxDQUFFLElBQUYsQ0FBbkIsR0FDWixHQUFHLENBQUMsUUFBSixDQUFhLGVBQWIsQ0FBOEIsTUFBOUIsQ0FEUyxHQUVULElBQUksQ0FBRSxNQUFGLENBRkw7QUFHQTs7QUFFRCxZQUFLLEdBQUwsRUFBVztBQUNWLFVBQUEsR0FBRyxDQUFDLFFBQUosQ0FDQyxDQUFDLEdBQUQsR0FBTyxHQUFQLEdBQWEsTUFBTSxDQUFFLEdBQUYsQ0FBTixDQUFjLFVBQWQsRUFEZCxFQUVFLEdBQUcsR0FBRyxHQUFILEdBQVMsTUFBTSxDQUFFLEdBQUYsQ0FBTixDQUFjLFNBQWQsRUFGZDtBQUtBLFNBTkQsTUFNTztBQUNOLFVBQUEsSUFBSSxDQUFFLE1BQUYsQ0FBSixHQUFpQixHQUFqQjtBQUNBO0FBQ0QsT0FsQk0sRUFrQkosTUFsQkksRUFrQkksR0FsQkosRUFrQlMsU0FBUyxDQUFDLE1BbEJuQixFQWtCMkIsSUFsQjNCLENBQVA7QUFtQkEsS0FwQkQ7QUFxQkEsR0F4QkQ7O0FBMEJBLFdBQVMsU0FBVCxDQUFvQixJQUFwQixFQUEyQjtBQUMxQixXQUFPLE1BQU0sQ0FBQyxRQUFQLENBQWlCLElBQWpCLElBQ04sSUFETSxHQUVOLElBQUksQ0FBQyxRQUFMLEtBQWtCLENBQWxCLEdBQ0MsSUFBSSxDQUFDLFdBQUwsSUFBb0IsSUFBSSxDQUFDLFlBRDFCLEdBRUMsS0FKRjtBQUtBLEdBMWdTOEIsQ0EyZ1MvQjs7O0FBQ0EsRUFBQSxNQUFNLENBQUMsSUFBUCxDQUFhO0FBQUUsSUFBQSxNQUFNLEVBQUUsUUFBVjtBQUFvQixJQUFBLEtBQUssRUFBRTtBQUEzQixHQUFiLEVBQW1ELFVBQVUsSUFBVixFQUFnQixJQUFoQixFQUF1QjtBQUN6RSxJQUFBLE1BQU0sQ0FBQyxJQUFQLENBQWE7QUFBRSxNQUFBLE9BQU8sRUFBRSxVQUFVLElBQXJCO0FBQTJCLE1BQUEsT0FBTyxFQUFFLElBQXBDO0FBQTBDLFVBQUksVUFBVTtBQUF4RCxLQUFiLEVBQTZFLFVBQVUsWUFBVixFQUF3QixRQUF4QixFQUFtQztBQUMvRztBQUNBLE1BQUEsTUFBTSxDQUFDLEVBQVAsQ0FBVyxRQUFYLElBQXdCLFVBQVUsTUFBVixFQUFrQixLQUFsQixFQUEwQjtBQUNqRCxZQUFJLFNBQVMsR0FBRyxTQUFTLENBQUMsTUFBVixLQUFzQixZQUFZLElBQUksT0FBTyxNQUFQLEtBQWtCLFNBQXhELENBQWhCO0FBQUEsWUFDQyxLQUFLLEdBQUcsWUFBWSxLQUFNLE1BQU0sS0FBSyxJQUFYLElBQW1CLEtBQUssS0FBSyxJQUE3QixHQUFvQyxRQUFwQyxHQUErQyxRQUFyRCxDQURyQjtBQUdBLGVBQU8sTUFBTSxDQUFDLE1BQVAsQ0FBZSxJQUFmLEVBQXFCLFVBQVUsSUFBVixFQUFnQixJQUFoQixFQUFzQixLQUF0QixFQUE4QjtBQUN6RCxjQUFJLEdBQUo7O0FBRUEsY0FBSyxNQUFNLENBQUMsUUFBUCxDQUFpQixJQUFqQixDQUFMLEVBQStCO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLG1CQUFPLElBQUksQ0FBQyxRQUFMLENBQWMsZUFBZCxDQUErQixXQUFXLElBQTFDLENBQVA7QUFDQSxXQVJ3RCxDQVV6RDs7O0FBQ0EsY0FBSyxJQUFJLENBQUMsUUFBTCxLQUFrQixDQUF2QixFQUEyQjtBQUMxQixZQUFBLEdBQUcsR0FBRyxJQUFJLENBQUMsZUFBWCxDQUQwQixDQUcxQjtBQUNBOztBQUNBLG1CQUFPLElBQUksQ0FBQyxHQUFMLENBQ04sSUFBSSxDQUFDLElBQUwsQ0FBVyxXQUFXLElBQXRCLENBRE0sRUFDd0IsR0FBRyxDQUFFLFdBQVcsSUFBYixDQUQzQixFQUVOLElBQUksQ0FBQyxJQUFMLENBQVcsV0FBVyxJQUF0QixDQUZNLEVBRXdCLEdBQUcsQ0FBRSxXQUFXLElBQWIsQ0FGM0IsRUFHTixHQUFHLENBQUUsV0FBVyxJQUFiLENBSEcsQ0FBUDtBQUtBOztBQUVELGlCQUFPLEtBQUssS0FBSyxTQUFWLEdBQ047QUFDQSxVQUFBLE1BQU0sQ0FBQyxHQUFQLENBQVksSUFBWixFQUFrQixJQUFsQixFQUF3QixLQUF4QixFQUErQixLQUEvQixDQUZNLEdBSU47QUFDQSxVQUFBLE1BQU0sQ0FBQyxLQUFQLENBQWMsSUFBZCxFQUFvQixJQUFwQixFQUEwQixLQUExQixFQUFpQyxLQUFqQyxDQUxEO0FBTUEsU0E3Qk0sRUE2QkosSUE3QkksRUE2QkUsU0FBUyxHQUFHLE1BQUgsR0FBWSxTQTdCdkIsRUE2QmtDLFNBN0JsQyxFQTZCNkMsSUE3QjdDLENBQVA7QUE4QkEsT0FsQ0Q7QUFtQ0EsS0FyQ0Q7QUFzQ0EsR0F2Q0QsRUE1Z1MrQixDQW9qUy9COztBQUNBLEVBQUEsTUFBTSxDQUFDLE1BQVAsR0FBZ0IsTUFBTSxDQUFDLENBQVAsR0FBVyxNQUEzQixDQXJqUytCLENBdWpTL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQUssT0FBTyxNQUFQLEtBQWtCLFVBQWxCLElBQWdDLE1BQU0sQ0FBQyxHQUF2QyxJQUE4QyxNQUFNLENBQUMsR0FBUCxDQUFXLE1BQTlELEVBQXVFO0FBQ3RFLElBQUEsTUFBTSxDQUFFLFFBQUYsRUFBWSxFQUFaLEVBQWdCLFlBQVk7QUFBRSxhQUFPLE1BQVA7QUFBZ0IsS0FBOUMsQ0FBTjtBQUNBO0FBRUEsQ0F2a1NELEVBdWtTSSxNQXZrU0oiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCIkKGRvY3VtZW50KS5yZWFkeSgoKSA9PiB7XHJcbiAgJCh3aW5kb3cpLmtleWRvd24oKGV2ZW50KSA9PiB7XHJcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAxMykge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gICQoJyNwYXNzd29yZCcpLmtleWRvd24oKGV2ZW50KSA9PiB7XHJcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSAxMykge1xyXG4gICAgICBzdWJtaXRMb2dpbigpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn0pO1xyXG5cclxud2luZG93LnNob3dGb3Jnb3RQYXNzd29yZCA9ICgpID0+IHtcclxuICAkKCcjbG9naW5Gb3JtJykuaGlkZSgpO1xyXG4gICQoJyNyZXF1ZXN0UGFzc3dvcmRDaGFuZ2VGb3JtJykuc2hvdygpO1xyXG59O1xyXG5cclxud2luZG93LnJlcXVlc3RQYXNzd29yZENoYW5nZSA9ICgpID0+IHtcclxuICAkKCcjcmVxdWVzdFBhc3N3b3JkQ2hhbmdlRm9ybUFsZXJ0JykuaGlkZSgpO1xyXG4gIGNvbnN0IGlkID0gJCgnI3VzZXJuYW1lQ2hhbmdlJykudmFsKCk7XHJcbiAgaWYgKGlkID09PSAnJykge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICAkLnBvc3QoJ3NlcnZpY2UucGhwJywgeyBhOiAncnBjJywgaWQgfSwgKGRhdGEpID0+IHtcclxuICAgIGlmIChkYXRhLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgJCgnI3JlcXVlc3RQYXNzd29yZENoYW5nZUZvcm1BbGVydCcpLnNob3coKTtcclxuICAgICAgJCgnI3JlcXVlc3RQYXNzd29yZENoYW5nZUZvcm1BbGVydCcpLmh0bWwoZGF0YS5tZXNzYWdlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICQoJyNyZXF1ZXN0UGFzc3dvcmRDaGFuZ2VGb3JtQWxlcnQnKS5zaG93KCk7XHJcbiAgICAgICQoJyNyZXF1ZXN0UGFzc3dvcmRDaGFuZ2VGb3JtQWxlcnQnKS5odG1sKGRhdGEubWVzc2FnZSk7XHJcbiAgICB9XHJcbiAgfSwgJ2pzb24nKTtcclxufTtcclxuXHJcbndpbmRvdy5jaGFuZ2VQYXNzd29yZCA9IChrZXkpID0+IHtcclxuICAkKCcjbmV3UGFzc3dvcmRGb3JtQWxlcnQnKS5oaWRlKCk7XHJcbiAgY29uc3QgcGFzc3dvcmQgPSAkKCcjcGFzc3dvcmQnKS52YWwoKTtcclxuXHJcbiAgY29uc3QgcGFzc3dvcmRWYWxpZGF0aW9uID0gZnVuY3Rpb24gKHN0cikge1xyXG4gICAgcmV0dXJuIHN0ci5sZW5ndGggPiA3O1xyXG4gIH07XHJcblxyXG5cclxuICBpZiAoIXBhc3N3b3JkVmFsaWRhdGlvbihwYXNzd29yZCkpIHtcclxuICAgICQoJyNuZXdQYXNzd29yZEZvcm1BbGVydCcpLnNob3coKTtcclxuICAgICQoJyNuZXdQYXNzd29yZEZvcm1BbGVydCcpLmh0bWwoJ1Bhc3N3b3JkIHNob3VsZCBiZSBsb25nZXIgdGhhbiA3IGNoYXJhY3RlcnMnKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG5cclxuICAkLnBvc3QoJ3NlcnZpY2UucGhwJywge1xyXG4gICAgYTogJ3JzcCcsIGtleSwgcHdkOiBwYXNzd29yZCwgbm93OiAnMScsXHJcbiAgfSwgKGRhdGEpID0+IHtcclxuICAgIGlmIChkYXRhLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgdG9wLmxvY2F0aW9uLmhyZWYgPSAnbG9naW4ucGhwP2M9MSc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAkKCcjbmV3UGFzc3dvcmRGb3JtQWxlcnQnKS5zaG93KCk7XHJcbiAgICAgICQoJyNuZXdQYXNzd29yZEZvcm1BbGVydCcpLmh0bWwoZGF0YS5tZXNzYWdlKTtcclxuICAgIH1cclxuICB9LCAnanNvbicpO1xyXG59O1xyXG5cclxud2luZG93LnN1Ym1pdExvZ2luID0gKCkgPT4ge1xyXG4gIGNvbnN0IHVzZXJuYW1lID0gJCgnI3VzZXJuYW1lJykudmFsKCk7XHJcbiAgY29uc3QgcGFzc3dvcmQgPSAkKCcjcGFzc3dvcmQnKS52YWwoKTtcclxuICBpZiAodXNlcm5hbWUgPT09ICcnIHx8IHBhc3N3b3JkID09PSAnJykge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICB0cnkge1xyXG4gICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XHJcbiAgfSBjYXRjaCAoZSkge31cclxuICAkKCcjbG9naW5Gb3JtJykuc3VibWl0KCk7XHJcbn07XHJcblxyXG53aW5kb3cuYXV0aEdvb2dsZSA9ICgpID0+IHtcclxuICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGAke3dpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCdsb2dpbi5waHAnKVswXX1sb2dpbi5waHA/Z29vZ2xlPTFgO1xyXG59O1xyXG4iLCIvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogYm9vdHN0cmFwLXRyYW5zaXRpb24uanMgdjIuMS4xXHJcbiAqIGh0dHA6Ly90d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0cmFwL2phdmFzY3JpcHQuaHRtbCN0cmFuc2l0aW9uc1xyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG5cclxuIWZ1bmN0aW9uICgkKSB7XHJcblxyXG4gICQoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgIFwidXNlIHN0cmljdFwiOyAvLyBqc2hpbnQgO187XHJcblxyXG5cclxuICAgIC8qIENTUyBUUkFOU0lUSU9OIFNVUFBPUlQgKGh0dHA6Ly93d3cubW9kZXJuaXpyLmNvbS8pXHJcbiAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gPSAoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgdmFyIHRyYW5zaXRpb25FbmQgPSAoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib290c3RyYXAnKVxyXG4gICAgICAgICAgLCB0cmFuc0VuZEV2ZW50TmFtZXMgPSB7XHJcbiAgICAgICAgICAgICAgICdXZWJraXRUcmFuc2l0aW9uJyA6ICd3ZWJraXRUcmFuc2l0aW9uRW5kJ1xyXG4gICAgICAgICAgICAsICAnTW96VHJhbnNpdGlvbicgICAgOiAndHJhbnNpdGlvbmVuZCdcclxuICAgICAgICAgICAgLCAgJ09UcmFuc2l0aW9uJyAgICAgIDogJ29UcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kJ1xyXG4gICAgICAgICAgICAsICAndHJhbnNpdGlvbicgICAgICAgOiAndHJhbnNpdGlvbmVuZCdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgLCBuYW1lXHJcblxyXG4gICAgICAgIGZvciAobmFtZSBpbiB0cmFuc0VuZEV2ZW50TmFtZXMpe1xyXG4gICAgICAgICAgaWYgKGVsLnN0eWxlW25hbWVdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRyYW5zRW5kRXZlbnROYW1lc1tuYW1lXVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0oKSlcclxuXHJcbiAgICAgIHJldHVybiB0cmFuc2l0aW9uRW5kICYmIHtcclxuICAgICAgICBlbmQ6IHRyYW5zaXRpb25FbmRcclxuICAgICAgfVxyXG5cclxuICAgIH0pKClcclxuXHJcbiAgfSlcclxuXHJcbn0od2luZG93LmpRdWVyeSk7LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBib290c3RyYXAtYWxlcnQuanMgdjIuMS4xXHJcbiAqIGh0dHA6Ly90d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0cmFwL2phdmFzY3JpcHQuaHRtbCNhbGVydHNcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDb3B5cmlnaHQgMjAxMiBUd2l0dGVyLCBJbmMuXHJcbiAqXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbiAqXHJcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKlxyXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcblxyXG4hZnVuY3Rpb24gKCQpIHtcclxuXHJcbiAgXCJ1c2Ugc3RyaWN0XCI7IC8vIGpzaGludCA7XztcclxuXHJcblxyXG4gLyogQUxFUlQgQ0xBU1MgREVGSU5JVElPTlxyXG4gICogPT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuICB2YXIgZGlzbWlzcyA9ICdbZGF0YS1kaXNtaXNzPVwiYWxlcnRcIl0nXHJcbiAgICAsIEFsZXJ0ID0gZnVuY3Rpb24gKGVsKSB7XHJcbiAgICAgICAgJChlbCkub24oJ2NsaWNrJywgZGlzbWlzcywgdGhpcy5jbG9zZSlcclxuICAgICAgfVxyXG5cclxuICBBbGVydC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgdmFyICR0aGlzID0gJCh0aGlzKVxyXG4gICAgICAsIHNlbGVjdG9yID0gJHRoaXMuYXR0cignZGF0YS10YXJnZXQnKVxyXG4gICAgICAsICRwYXJlbnRcclxuXHJcbiAgICBpZiAoIXNlbGVjdG9yKSB7XHJcbiAgICAgIHNlbGVjdG9yID0gJHRoaXMuYXR0cignaHJlZicpXHJcbiAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3IgJiYgc2VsZWN0b3IucmVwbGFjZSgvLiooPz0jW15cXHNdKiQpLywgJycpIC8vc3RyaXAgZm9yIGllN1xyXG4gICAgfVxyXG5cclxuICAgICRwYXJlbnQgPSAkKHNlbGVjdG9yKVxyXG5cclxuICAgIGUgJiYgZS5wcmV2ZW50RGVmYXVsdCgpXHJcblxyXG4gICAgJHBhcmVudC5sZW5ndGggfHwgKCRwYXJlbnQgPSAkdGhpcy5oYXNDbGFzcygnYWxlcnQnKSA/ICR0aGlzIDogJHRoaXMucGFyZW50KCkpXHJcblxyXG4gICAgJHBhcmVudC50cmlnZ2VyKGUgPSAkLkV2ZW50KCdjbG9zZScpKVxyXG5cclxuICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm5cclxuXHJcbiAgICAkcGFyZW50LnJlbW92ZUNsYXNzKCdpbicpXHJcblxyXG4gICAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudCgpIHtcclxuICAgICAgJHBhcmVudFxyXG4gICAgICAgIC50cmlnZ2VyKCdjbG9zZWQnKVxyXG4gICAgICAgIC5yZW1vdmUoKVxyXG4gICAgfVxyXG5cclxuICAgICQuc3VwcG9ydC50cmFuc2l0aW9uICYmICRwYXJlbnQuaGFzQ2xhc3MoJ2ZhZGUnKSA/XHJcbiAgICAgICRwYXJlbnQub24oJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLCByZW1vdmVFbGVtZW50KSA6XHJcbiAgICAgIHJlbW92ZUVsZW1lbnQoKVxyXG4gIH1cclxuXHJcblxyXG4gLyogQUxFUlQgUExVR0lOIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICQuZm4uYWxlcnQgPSBmdW5jdGlvbiAob3B0aW9uKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICR0aGlzID0gJCh0aGlzKVxyXG4gICAgICAgICwgZGF0YSA9ICR0aGlzLmRhdGEoJ2FsZXJ0JylcclxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdhbGVydCcsIChkYXRhID0gbmV3IEFsZXJ0KHRoaXMpKSlcclxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXS5jYWxsKCR0aGlzKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gICQuZm4uYWxlcnQuQ29uc3RydWN0b3IgPSBBbGVydFxyXG5cclxuXHJcbiAvKiBBTEVSVCBEQVRBLUFQSVxyXG4gICogPT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgJChmdW5jdGlvbiAoKSB7XHJcbiAgICAkKCdib2R5Jykub24oJ2NsaWNrLmFsZXJ0LmRhdGEtYXBpJywgZGlzbWlzcywgQWxlcnQucHJvdG90eXBlLmNsb3NlKVxyXG4gIH0pXHJcblxyXG59KHdpbmRvdy5qUXVlcnkpOy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBib290c3RyYXAtYnV0dG9uLmpzIHYyLjEuMVxyXG4gKiBodHRwOi8vdHdpdHRlci5naXRodWIuY29tL2Jvb3RzdHJhcC9qYXZhc2NyaXB0Lmh0bWwjYnV0dG9uc1xyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcblxyXG4hZnVuY3Rpb24gKCQpIHtcclxuXHJcbiAgXCJ1c2Ugc3RyaWN0XCI7IC8vIGpzaGludCA7XztcclxuXHJcblxyXG4gLyogQlVUVE9OIFBVQkxJQyBDTEFTUyBERUZJTklUSU9OXHJcbiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgdmFyIEJ1dHRvbiA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICB0aGlzLiRlbGVtZW50ID0gJChlbGVtZW50KVxyXG4gICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sICQuZm4uYnV0dG9uLmRlZmF1bHRzLCBvcHRpb25zKVxyXG4gIH1cclxuXHJcbiAgQnV0dG9uLnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xyXG4gICAgdmFyIGQgPSAnZGlzYWJsZWQnXHJcbiAgICAgICwgJGVsID0gdGhpcy4kZWxlbWVudFxyXG4gICAgICAsIGRhdGEgPSAkZWwuZGF0YSgpXHJcbiAgICAgICwgdmFsID0gJGVsLmlzKCdpbnB1dCcpID8gJ3ZhbCcgOiAnaHRtbCdcclxuXHJcbiAgICBzdGF0ZSA9IHN0YXRlICsgJ1RleHQnXHJcbiAgICBkYXRhLnJlc2V0VGV4dCB8fCAkZWwuZGF0YSgncmVzZXRUZXh0JywgJGVsW3ZhbF0oKSlcclxuXHJcbiAgICAkZWxbdmFsXShkYXRhW3N0YXRlXSB8fCB0aGlzLm9wdGlvbnNbc3RhdGVdKVxyXG5cclxuICAgIC8vIHB1c2ggdG8gZXZlbnQgbG9vcCB0byBhbGxvdyBmb3JtcyB0byBzdWJtaXRcclxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICBzdGF0ZSA9PSAnbG9hZGluZ1RleHQnID9cclxuICAgICAgICAkZWwuYWRkQ2xhc3MoZCkuYXR0cihkLCBkKSA6XHJcbiAgICAgICAgJGVsLnJlbW92ZUNsYXNzKGQpLnJlbW92ZUF0dHIoZClcclxuICAgIH0sIDApXHJcbiAgfVxyXG5cclxuICBCdXR0b24ucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciAkcGFyZW50ID0gdGhpcy4kZWxlbWVudC5jbG9zZXN0KCdbZGF0YS10b2dnbGU9XCJidXR0b25zLXJhZGlvXCJdJylcclxuXHJcbiAgICAkcGFyZW50ICYmICRwYXJlbnRcclxuICAgICAgLmZpbmQoJy5hY3RpdmUnKVxyXG4gICAgICAucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXHJcblxyXG4gICAgdGhpcy4kZWxlbWVudC50b2dnbGVDbGFzcygnYWN0aXZlJylcclxuICB9XHJcblxyXG5cclxuIC8qIEJVVFRPTiBQTFVHSU4gREVGSU5JVElPTlxyXG4gICogPT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICQuZm4uYnV0dG9uID0gZnVuY3Rpb24gKG9wdGlvbikge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgICAsIGRhdGEgPSAkdGhpcy5kYXRhKCdidXR0b24nKVxyXG4gICAgICAgICwgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uXHJcbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnV0dG9uJywgKGRhdGEgPSBuZXcgQnV0dG9uKHRoaXMsIG9wdGlvbnMpKSlcclxuICAgICAgaWYgKG9wdGlvbiA9PSAndG9nZ2xlJykgZGF0YS50b2dnbGUoKVxyXG4gICAgICBlbHNlIGlmIChvcHRpb24pIGRhdGEuc2V0U3RhdGUob3B0aW9uKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gICQuZm4uYnV0dG9uLmRlZmF1bHRzID0ge1xyXG4gICAgbG9hZGluZ1RleHQ6ICdsb2FkaW5nLi4uJ1xyXG4gIH1cclxuXHJcbiAgJC5mbi5idXR0b24uQ29uc3RydWN0b3IgPSBCdXR0b25cclxuXHJcblxyXG4gLyogQlVUVE9OIERBVEEtQVBJXHJcbiAgKiA9PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgJChmdW5jdGlvbiAoKSB7XHJcbiAgICAkKCdib2R5Jykub24oJ2NsaWNrLmJ1dHRvbi5kYXRhLWFwaScsICdbZGF0YS10b2dnbGVePWJ1dHRvbl0nLCBmdW5jdGlvbiAoIGUgKSB7XHJcbiAgICAgIHZhciAkYnRuID0gJChlLnRhcmdldClcclxuICAgICAgaWYgKCEkYnRuLmhhc0NsYXNzKCdidG4nKSkgJGJ0biA9ICRidG4uY2xvc2VzdCgnLmJ0bicpXHJcbiAgICAgICRidG4uYnV0dG9uKCd0b2dnbGUnKVxyXG4gICAgfSlcclxuICB9KVxyXG5cclxufSh3aW5kb3cualF1ZXJ5KTsvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIGJvb3RzdHJhcC1jYXJvdXNlbC5qcyB2Mi4xLjFcclxuICogaHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNvbS9ib290c3RyYXAvamF2YXNjcmlwdC5odG1sI2Nhcm91c2VsXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG5cclxuIWZ1bmN0aW9uICgkKSB7XHJcblxyXG4gIFwidXNlIHN0cmljdFwiOyAvLyBqc2hpbnQgO187XHJcblxyXG5cclxuIC8qIENBUk9VU0VMIENMQVNTIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgdmFyIENhcm91c2VsID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGVsZW1lbnQgPSAkKGVsZW1lbnQpXHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXHJcbiAgICB0aGlzLm9wdGlvbnMuc2xpZGUgJiYgdGhpcy5zbGlkZSh0aGlzLm9wdGlvbnMuc2xpZGUpXHJcbiAgICB0aGlzLm9wdGlvbnMucGF1c2UgPT0gJ2hvdmVyJyAmJiB0aGlzLiRlbGVtZW50XHJcbiAgICAgIC5vbignbW91c2VlbnRlcicsICQucHJveHkodGhpcy5wYXVzZSwgdGhpcykpXHJcbiAgICAgIC5vbignbW91c2VsZWF2ZScsICQucHJveHkodGhpcy5jeWNsZSwgdGhpcykpXHJcbiAgfVxyXG5cclxuICBDYXJvdXNlbC5wcm90b3R5cGUgPSB7XHJcblxyXG4gICAgY3ljbGU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIGlmICghZSkgdGhpcy5wYXVzZWQgPSBmYWxzZVxyXG4gICAgICB0aGlzLm9wdGlvbnMuaW50ZXJ2YWxcclxuICAgICAgICAmJiAhdGhpcy5wYXVzZWRcclxuICAgICAgICAmJiAodGhpcy5pbnRlcnZhbCA9IHNldEludGVydmFsKCQucHJveHkodGhpcy5uZXh0LCB0aGlzKSwgdGhpcy5vcHRpb25zLmludGVydmFsKSlcclxuICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgLCB0bzogZnVuY3Rpb24gKHBvcykge1xyXG4gICAgICB2YXIgJGFjdGl2ZSA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLml0ZW0uYWN0aXZlJylcclxuICAgICAgICAsIGNoaWxkcmVuID0gJGFjdGl2ZS5wYXJlbnQoKS5jaGlsZHJlbigpXHJcbiAgICAgICAgLCBhY3RpdmVQb3MgPSBjaGlsZHJlbi5pbmRleCgkYWN0aXZlKVxyXG4gICAgICAgICwgdGhhdCA9IHRoaXNcclxuXHJcbiAgICAgIGlmIChwb3MgPiAoY2hpbGRyZW4ubGVuZ3RoIC0gMSkgfHwgcG9zIDwgMCkgcmV0dXJuXHJcblxyXG4gICAgICBpZiAodGhpcy5zbGlkaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuJGVsZW1lbnQub25lKCdzbGlkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgdGhhdC50byhwb3MpXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGFjdGl2ZVBvcyA9PSBwb3MpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wYXVzZSgpLmN5Y2xlKClcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuc2xpZGUocG9zID4gYWN0aXZlUG9zID8gJ25leHQnIDogJ3ByZXYnLCAkKGNoaWxkcmVuW3Bvc10pKVxyXG4gICAgfVxyXG5cclxuICAsIHBhdXNlOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICBpZiAoIWUpIHRoaXMucGF1c2VkID0gdHJ1ZVxyXG4gICAgICBpZiAodGhpcy4kZWxlbWVudC5maW5kKCcubmV4dCwgLnByZXYnKS5sZW5ndGggJiYgJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kKSB7XHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZClcclxuICAgICAgICB0aGlzLmN5Y2xlKClcclxuICAgICAgfVxyXG4gICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpXHJcbiAgICAgIHRoaXMuaW50ZXJ2YWwgPSBudWxsXHJcbiAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICwgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICBpZiAodGhpcy5zbGlkaW5nKSByZXR1cm5cclxuICAgICAgcmV0dXJuIHRoaXMuc2xpZGUoJ25leHQnKVxyXG4gICAgfVxyXG5cclxuICAsIHByZXY6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgaWYgKHRoaXMuc2xpZGluZykgcmV0dXJuXHJcbiAgICAgIHJldHVybiB0aGlzLnNsaWRlKCdwcmV2JylcclxuICAgIH1cclxuXHJcbiAgLCBzbGlkZTogZnVuY3Rpb24gKHR5cGUsIG5leHQpIHtcclxuICAgICAgdmFyICRhY3RpdmUgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5pdGVtLmFjdGl2ZScpXHJcbiAgICAgICAgLCAkbmV4dCA9IG5leHQgfHwgJGFjdGl2ZVt0eXBlXSgpXHJcbiAgICAgICAgLCBpc0N5Y2xpbmcgPSB0aGlzLmludGVydmFsXHJcbiAgICAgICAgLCBkaXJlY3Rpb24gPSB0eXBlID09ICduZXh0JyA/ICdsZWZ0JyA6ICdyaWdodCdcclxuICAgICAgICAsIGZhbGxiYWNrICA9IHR5cGUgPT0gJ25leHQnID8gJ2ZpcnN0JyA6ICdsYXN0J1xyXG4gICAgICAgICwgdGhhdCA9IHRoaXNcclxuICAgICAgICAsIGUgPSAkLkV2ZW50KCdzbGlkZScsIHtcclxuICAgICAgICAgICAgcmVsYXRlZFRhcmdldDogJG5leHRbMF1cclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLnNsaWRpbmcgPSB0cnVlXHJcblxyXG4gICAgICBpc0N5Y2xpbmcgJiYgdGhpcy5wYXVzZSgpXHJcblxyXG4gICAgICAkbmV4dCA9ICRuZXh0Lmxlbmd0aCA/ICRuZXh0IDogdGhpcy4kZWxlbWVudC5maW5kKCcuaXRlbScpW2ZhbGxiYWNrXSgpXHJcblxyXG4gICAgICBpZiAoJG5leHQuaGFzQ2xhc3MoJ2FjdGl2ZScpKSByZXR1cm5cclxuXHJcbiAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdzbGlkZScpKSB7XHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKGUpXHJcbiAgICAgICAgaWYgKGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxyXG4gICAgICAgICRuZXh0LmFkZENsYXNzKHR5cGUpXHJcbiAgICAgICAgJG5leHRbMF0ub2Zmc2V0V2lkdGggLy8gZm9yY2UgcmVmbG93XHJcbiAgICAgICAgJGFjdGl2ZS5hZGRDbGFzcyhkaXJlY3Rpb24pXHJcbiAgICAgICAgJG5leHQuYWRkQ2xhc3MoZGlyZWN0aW9uKVxyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQub25lKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgJG5leHQucmVtb3ZlQ2xhc3MoW3R5cGUsIGRpcmVjdGlvbl0uam9pbignICcpKS5hZGRDbGFzcygnYWN0aXZlJylcclxuICAgICAgICAgICRhY3RpdmUucmVtb3ZlQ2xhc3MoWydhY3RpdmUnLCBkaXJlY3Rpb25dLmpvaW4oJyAnKSlcclxuICAgICAgICAgIHRoYXQuc2xpZGluZyA9IGZhbHNlXHJcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgdGhhdC4kZWxlbWVudC50cmlnZ2VyKCdzbGlkJykgfSwgMClcclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihlKVxyXG4gICAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm5cclxuICAgICAgICAkYWN0aXZlLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxyXG4gICAgICAgICRuZXh0LmFkZENsYXNzKCdhY3RpdmUnKVxyXG4gICAgICAgIHRoaXMuc2xpZGluZyA9IGZhbHNlXHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdzbGlkJylcclxuICAgICAgfVxyXG5cclxuICAgICAgaXNDeWNsaW5nICYmIHRoaXMuY3ljbGUoKVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAvKiBDQVJPVVNFTCBQTFVHSU4gREVGSU5JVElPTlxyXG4gICogPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgJC5mbi5jYXJvdXNlbCA9IGZ1bmN0aW9uIChvcHRpb24pIHtcclxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpXHJcbiAgICAgICAgLCBkYXRhID0gJHRoaXMuZGF0YSgnY2Fyb3VzZWwnKVxyXG4gICAgICAgICwgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLmZuLmNhcm91c2VsLmRlZmF1bHRzLCB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvbilcclxuICAgICAgICAsIGFjdGlvbiA9IHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycgPyBvcHRpb24gOiBvcHRpb25zLnNsaWRlXHJcbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnY2Fyb3VzZWwnLCAoZGF0YSA9IG5ldyBDYXJvdXNlbCh0aGlzLCBvcHRpb25zKSkpXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdudW1iZXInKSBkYXRhLnRvKG9wdGlvbilcclxuICAgICAgZWxzZSBpZiAoYWN0aW9uKSBkYXRhW2FjdGlvbl0oKVxyXG4gICAgICBlbHNlIGlmIChvcHRpb25zLmludGVydmFsKSBkYXRhLmN5Y2xlKClcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAkLmZuLmNhcm91c2VsLmRlZmF1bHRzID0ge1xyXG4gICAgaW50ZXJ2YWw6IDUwMDBcclxuICAsIHBhdXNlOiAnaG92ZXInXHJcbiAgfVxyXG5cclxuICAkLmZuLmNhcm91c2VsLkNvbnN0cnVjdG9yID0gQ2Fyb3VzZWxcclxuXHJcblxyXG4gLyogQ0FST1VTRUwgREFUQS1BUElcclxuICAqID09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICQoZnVuY3Rpb24gKCkge1xyXG4gICAgJCgnYm9keScpLm9uKCdjbGljay5jYXJvdXNlbC5kYXRhLWFwaScsICdbZGF0YS1zbGlkZV0nLCBmdW5jdGlvbiAoIGUgKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksIGhyZWZcclxuICAgICAgICAsICR0YXJnZXQgPSAkKCR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JykgfHwgKGhyZWYgPSAkdGhpcy5hdHRyKCdocmVmJykpICYmIGhyZWYucmVwbGFjZSgvLiooPz0jW15cXHNdKyQpLywgJycpKSAvL3N0cmlwIGZvciBpZTdcclxuICAgICAgICAsIG9wdGlvbnMgPSAhJHRhcmdldC5kYXRhKCdtb2RhbCcpICYmICQuZXh0ZW5kKHt9LCAkdGFyZ2V0LmRhdGEoKSwgJHRoaXMuZGF0YSgpKVxyXG4gICAgICAkdGFyZ2V0LmNhcm91c2VsKG9wdGlvbnMpXHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgfSlcclxuICB9KVxyXG5cclxufSh3aW5kb3cualF1ZXJ5KTsvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIGJvb3RzdHJhcC1jb2xsYXBzZS5qcyB2Mi4xLjFcclxuICogaHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNvbS9ib290c3RyYXAvamF2YXNjcmlwdC5odG1sI2NvbGxhcHNlXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcblxyXG4hZnVuY3Rpb24gKCQpIHtcclxuXHJcbiAgXCJ1c2Ugc3RyaWN0XCI7IC8vIGpzaGludCA7XztcclxuXHJcblxyXG4gLyogQ09MTEFQU0UgUFVCTElDIENMQVNTIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gIHZhciBDb2xsYXBzZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICB0aGlzLiRlbGVtZW50ID0gJChlbGVtZW50KVxyXG4gICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQoe30sICQuZm4uY29sbGFwc2UuZGVmYXVsdHMsIG9wdGlvbnMpXHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5wYXJlbnQpIHtcclxuICAgICAgdGhpcy4kcGFyZW50ID0gJCh0aGlzLm9wdGlvbnMucGFyZW50KVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3B0aW9ucy50b2dnbGUgJiYgdGhpcy50b2dnbGUoKVxyXG4gIH1cclxuXHJcbiAgQ29sbGFwc2UucHJvdG90eXBlID0ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yOiBDb2xsYXBzZVxyXG5cclxuICAsIGRpbWVuc2lvbjogZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgaGFzV2lkdGggPSB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCd3aWR0aCcpXHJcbiAgICAgIHJldHVybiBoYXNXaWR0aCA/ICd3aWR0aCcgOiAnaGVpZ2h0J1xyXG4gICAgfVxyXG5cclxuICAsIHNob3c6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIGRpbWVuc2lvblxyXG4gICAgICAgICwgc2Nyb2xsXHJcbiAgICAgICAgLCBhY3RpdmVzXHJcbiAgICAgICAgLCBoYXNEYXRhXHJcblxyXG4gICAgICBpZiAodGhpcy50cmFuc2l0aW9uaW5nKSByZXR1cm5cclxuXHJcbiAgICAgIGRpbWVuc2lvbiA9IHRoaXMuZGltZW5zaW9uKClcclxuICAgICAgc2Nyb2xsID0gJC5jYW1lbENhc2UoWydzY3JvbGwnLCBkaW1lbnNpb25dLmpvaW4oJy0nKSlcclxuICAgICAgYWN0aXZlcyA9IHRoaXMuJHBhcmVudCAmJiB0aGlzLiRwYXJlbnQuZmluZCgnPiAuYWNjb3JkaW9uLWdyb3VwID4gLmluJylcclxuXHJcbiAgICAgIGlmIChhY3RpdmVzICYmIGFjdGl2ZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgaGFzRGF0YSA9IGFjdGl2ZXMuZGF0YSgnY29sbGFwc2UnKVxyXG4gICAgICAgIGlmIChoYXNEYXRhICYmIGhhc0RhdGEudHJhbnNpdGlvbmluZykgcmV0dXJuXHJcbiAgICAgICAgYWN0aXZlcy5jb2xsYXBzZSgnaGlkZScpXHJcbiAgICAgICAgaGFzRGF0YSB8fCBhY3RpdmVzLmRhdGEoJ2NvbGxhcHNlJywgbnVsbClcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy4kZWxlbWVudFtkaW1lbnNpb25dKDApXHJcbiAgICAgIHRoaXMudHJhbnNpdGlvbignYWRkQ2xhc3MnLCAkLkV2ZW50KCdzaG93JyksICdzaG93bicpXHJcbiAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uICYmIHRoaXMuJGVsZW1lbnRbZGltZW5zaW9uXSh0aGlzLiRlbGVtZW50WzBdW3Njcm9sbF0pXHJcbiAgICB9XHJcblxyXG4gICwgaGlkZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgZGltZW5zaW9uXHJcbiAgICAgIGlmICh0aGlzLnRyYW5zaXRpb25pbmcpIHJldHVyblxyXG4gICAgICBkaW1lbnNpb24gPSB0aGlzLmRpbWVuc2lvbigpXHJcbiAgICAgIHRoaXMucmVzZXQodGhpcy4kZWxlbWVudFtkaW1lbnNpb25dKCkpXHJcbiAgICAgIHRoaXMudHJhbnNpdGlvbigncmVtb3ZlQ2xhc3MnLCAkLkV2ZW50KCdoaWRlJyksICdoaWRkZW4nKVxyXG4gICAgICB0aGlzLiRlbGVtZW50W2RpbWVuc2lvbl0oMClcclxuICAgIH1cclxuXHJcbiAgLCByZXNldDogZnVuY3Rpb24gKHNpemUpIHtcclxuICAgICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuZGltZW5zaW9uKClcclxuXHJcbiAgICAgIHRoaXMuJGVsZW1lbnRcclxuICAgICAgICAucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNlJylcclxuICAgICAgICBbZGltZW5zaW9uXShzaXplIHx8ICdhdXRvJylcclxuICAgICAgICBbMF0ub2Zmc2V0V2lkdGhcclxuXHJcbiAgICAgIHRoaXMuJGVsZW1lbnRbc2l6ZSAhPT0gbnVsbCA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnXSgnY29sbGFwc2UnKVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgLCB0cmFuc2l0aW9uOiBmdW5jdGlvbiAobWV0aG9kLCBzdGFydEV2ZW50LCBjb21wbGV0ZUV2ZW50KSB7XHJcbiAgICAgIHZhciB0aGF0ID0gdGhpc1xyXG4gICAgICAgICwgY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChzdGFydEV2ZW50LnR5cGUgPT0gJ3Nob3cnKSB0aGF0LnJlc2V0KClcclxuICAgICAgICAgICAgdGhhdC50cmFuc2l0aW9uaW5nID0gMFxyXG4gICAgICAgICAgICB0aGF0LiRlbGVtZW50LnRyaWdnZXIoY29tcGxldGVFdmVudClcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihzdGFydEV2ZW50KVxyXG5cclxuICAgICAgaWYgKHN0YXJ0RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxyXG5cclxuICAgICAgdGhpcy50cmFuc2l0aW9uaW5nID0gMVxyXG5cclxuICAgICAgdGhpcy4kZWxlbWVudFttZXRob2RdKCdpbicpXHJcblxyXG4gICAgICAkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdjb2xsYXBzZScpID9cclxuICAgICAgICB0aGlzLiRlbGVtZW50Lm9uZSgkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsIGNvbXBsZXRlKSA6XHJcbiAgICAgICAgY29tcGxldGUoKVxyXG4gICAgfVxyXG5cclxuICAsIHRvZ2dsZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzW3RoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2luJykgPyAnaGlkZScgOiAnc2hvdyddKClcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAvKiBDT0xMQVBTSUJMRSBQTFVHSU4gREVGSU5JVElPTlxyXG4gICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICQuZm4uY29sbGFwc2UgPSBmdW5jdGlvbiAob3B0aW9uKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICR0aGlzID0gJCh0aGlzKVxyXG4gICAgICAgICwgZGF0YSA9ICR0aGlzLmRhdGEoJ2NvbGxhcHNlJylcclxuICAgICAgICAsIG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvblxyXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2NvbGxhcHNlJywgKGRhdGEgPSBuZXcgQ29sbGFwc2UodGhpcywgb3B0aW9ucykpKVxyXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dKClcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAkLmZuLmNvbGxhcHNlLmRlZmF1bHRzID0ge1xyXG4gICAgdG9nZ2xlOiB0cnVlXHJcbiAgfVxyXG5cclxuICAkLmZuLmNvbGxhcHNlLkNvbnN0cnVjdG9yID0gQ29sbGFwc2VcclxuXHJcblxyXG4gLyogQ09MTEFQU0lCTEUgREFUQS1BUElcclxuICAqID09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICQoZnVuY3Rpb24gKCkge1xyXG4gICAgJCgnYm9keScpLm9uKCdjbGljay5jb2xsYXBzZS5kYXRhLWFwaScsICdbZGF0YS10b2dnbGU9Y29sbGFwc2VdJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgdmFyICR0aGlzID0gJCh0aGlzKSwgaHJlZlxyXG4gICAgICAgICwgdGFyZ2V0ID0gJHRoaXMuYXR0cignZGF0YS10YXJnZXQnKVxyXG4gICAgICAgICAgfHwgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICB8fCAoaHJlZiA9ICR0aGlzLmF0dHIoJ2hyZWYnKSkgJiYgaHJlZi5yZXBsYWNlKC8uKig/PSNbXlxcc10rJCkvLCAnJykgLy9zdHJpcCBmb3IgaWU3XHJcbiAgICAgICAgLCBvcHRpb24gPSAkKHRhcmdldCkuZGF0YSgnY29sbGFwc2UnKSA/ICd0b2dnbGUnIDogJHRoaXMuZGF0YSgpXHJcbiAgICAgICR0aGlzWyQodGFyZ2V0KS5oYXNDbGFzcygnaW4nKSA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnXSgnY29sbGFwc2VkJylcclxuICAgICAgJCh0YXJnZXQpLmNvbGxhcHNlKG9wdGlvbilcclxuICAgIH0pXHJcbiAgfSlcclxuXHJcbn0od2luZG93LmpRdWVyeSk7LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIGJvb3RzdHJhcC1kcm9wZG93bi5qcyB2Mi4xLjFcclxuICogaHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNvbS9ib290c3RyYXAvamF2YXNjcmlwdC5odG1sI2Ryb3Bkb3duc1xyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcblxyXG4hZnVuY3Rpb24gKCQpIHtcclxuXHJcbiAgXCJ1c2Ugc3RyaWN0XCI7IC8vIGpzaGludCA7XztcclxuXHJcblxyXG4gLyogRFJPUERPV04gQ0xBU1MgREVGSU5JVElPTlxyXG4gICogPT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuICB2YXIgdG9nZ2xlID0gJ1tkYXRhLXRvZ2dsZT1kcm9wZG93bl0nXHJcbiAgICAsIERyb3Bkb3duID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcclxuICAgICAgICB2YXIgJGVsID0gJChlbGVtZW50KS5vbignY2xpY2suZHJvcGRvd24uZGF0YS1hcGknLCB0aGlzLnRvZ2dsZSlcclxuICAgICAgICAkKCdodG1sJykub24oJ2NsaWNrLmRyb3Bkb3duLmRhdGEtYXBpJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgJGVsLnBhcmVudCgpLnJlbW92ZUNsYXNzKCdvcGVuJylcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcblxyXG4gIERyb3Bkb3duLnByb3RvdHlwZSA9IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcjogRHJvcGRvd25cclxuXHJcbiAgLCB0b2dnbGU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgICAsICRwYXJlbnRcclxuICAgICAgICAsIGlzQWN0aXZlXHJcblxyXG4gICAgICBpZiAoJHRoaXMuaXMoJy5kaXNhYmxlZCwgOmRpc2FibGVkJykpIHJldHVyblxyXG5cclxuICAgICAgJHBhcmVudCA9IGdldFBhcmVudCgkdGhpcylcclxuXHJcbiAgICAgIGlzQWN0aXZlID0gJHBhcmVudC5oYXNDbGFzcygnb3BlbicpXHJcblxyXG4gICAgICBjbGVhck1lbnVzKClcclxuXHJcbiAgICAgIGlmICghaXNBY3RpdmUpIHtcclxuICAgICAgICAkcGFyZW50LnRvZ2dsZUNsYXNzKCdvcGVuJylcclxuICAgICAgICAkdGhpcy5mb2N1cygpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfVxyXG5cclxuICAsIGtleWRvd246IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIHZhciAkdGhpc1xyXG4gICAgICAgICwgJGl0ZW1zXHJcbiAgICAgICAgLCAkYWN0aXZlXHJcbiAgICAgICAgLCAkcGFyZW50XHJcbiAgICAgICAgLCBpc0FjdGl2ZVxyXG4gICAgICAgICwgaW5kZXhcclxuXHJcbiAgICAgIGlmICghLygzOHw0MHwyNykvLnRlc3QoZS5rZXlDb2RlKSkgcmV0dXJuXHJcblxyXG4gICAgICAkdGhpcyA9ICQodGhpcylcclxuXHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcblxyXG4gICAgICBpZiAoJHRoaXMuaXMoJy5kaXNhYmxlZCwgOmRpc2FibGVkJykpIHJldHVyblxyXG5cclxuICAgICAgJHBhcmVudCA9IGdldFBhcmVudCgkdGhpcylcclxuXHJcbiAgICAgIGlzQWN0aXZlID0gJHBhcmVudC5oYXNDbGFzcygnb3BlbicpXHJcblxyXG4gICAgICBpZiAoIWlzQWN0aXZlIHx8IChpc0FjdGl2ZSAmJiBlLmtleUNvZGUgPT0gMjcpKSByZXR1cm4gJHRoaXMuY2xpY2soKVxyXG5cclxuICAgICAgJGl0ZW1zID0gJCgnW3JvbGU9bWVudV0gbGk6bm90KC5kaXZpZGVyKSBhJywgJHBhcmVudClcclxuXHJcbiAgICAgIGlmICghJGl0ZW1zLmxlbmd0aCkgcmV0dXJuXHJcblxyXG4gICAgICBpbmRleCA9ICRpdGVtcy5pbmRleCgkaXRlbXMuZmlsdGVyKCc6Zm9jdXMnKSlcclxuXHJcbiAgICAgIGlmIChlLmtleUNvZGUgPT0gMzggJiYgaW5kZXggPiAwKSBpbmRleC0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwXHJcbiAgICAgIGlmIChlLmtleUNvZGUgPT0gNDAgJiYgaW5kZXggPCAkaXRlbXMubGVuZ3RoIC0gMSkgaW5kZXgrKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvd25cclxuICAgICAgaWYgKCF+aW5kZXgpIGluZGV4ID0gMFxyXG5cclxuICAgICAgJGl0ZW1zXHJcbiAgICAgICAgLmVxKGluZGV4KVxyXG4gICAgICAgIC5mb2N1cygpXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gY2xlYXJNZW51cygpIHtcclxuICAgIGdldFBhcmVudCgkKHRvZ2dsZSkpXHJcbiAgICAgIC5yZW1vdmVDbGFzcygnb3BlbicpXHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnZXRQYXJlbnQoJHRoaXMpIHtcclxuICAgIHZhciBzZWxlY3RvciA9ICR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JylcclxuICAgICAgLCAkcGFyZW50XHJcblxyXG4gICAgaWYgKCFzZWxlY3Rvcikge1xyXG4gICAgICBzZWxlY3RvciA9ICR0aGlzLmF0dHIoJ2hyZWYnKVxyXG4gICAgICBzZWxlY3RvciA9IHNlbGVjdG9yICYmIC8jLy50ZXN0KHNlbGVjdG9yKSAmJiBzZWxlY3Rvci5yZXBsYWNlKC8uKig/PSNbXlxcc10qJCkvLCAnJykgLy9zdHJpcCBmb3IgaWU3XHJcbiAgICB9XHJcblxyXG4gICAgJHBhcmVudCA9ICQoc2VsZWN0b3IpXHJcbiAgICAkcGFyZW50Lmxlbmd0aCB8fCAoJHBhcmVudCA9ICR0aGlzLnBhcmVudCgpKVxyXG5cclxuICAgIHJldHVybiAkcGFyZW50XHJcbiAgfVxyXG5cclxuXHJcbiAgLyogRFJPUERPV04gUExVR0lOIERFRklOSVRJT05cclxuICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuICAkLmZuLmRyb3Bkb3duID0gZnVuY3Rpb24gKG9wdGlvbikge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgICAsIGRhdGEgPSAkdGhpcy5kYXRhKCdkcm9wZG93bicpXHJcbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnZHJvcGRvd24nLCAoZGF0YSA9IG5ldyBEcm9wZG93bih0aGlzKSkpXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0uY2FsbCgkdGhpcylcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICAkLmZuLmRyb3Bkb3duLkNvbnN0cnVjdG9yID0gRHJvcGRvd25cclxuXHJcblxyXG4gIC8qIEFQUExZIFRPIFNUQU5EQVJEIERST1BET1dOIEVMRU1FTlRTXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgJChmdW5jdGlvbiAoKSB7XHJcbiAgICAkKCdodG1sJylcclxuICAgICAgLm9uKCdjbGljay5kcm9wZG93bi5kYXRhLUFwaSB0b3VjaHN0YXJ0LmRyb3Bkb3duLmRhdGEtQXBpJywgY2xlYXJNZW51cylcclxuICAgICQoJ2JvZHknKVxyXG4gICAgICAub24oJ2NsaWNrLmRyb3Bkb3duIHRvdWNoc3RhcnQuZHJvcGRvd24uZGF0YS1hcGknLCAnLmRyb3Bkb3duIGZvcm0nLCBmdW5jdGlvbiAoZSkgeyBlLnN0b3BQcm9wYWdhdGlvbigpIH0pXHJcbiAgICAgIC5vbignY2xpY2suZHJvcGRvd24uZGF0YS1BcGkgdG91Y2hzdGFydC5kcm9wZG93bi5kYXRhLUFwaScgICwgdG9nZ2xlLCBEcm9wZG93bi5wcm90b3R5cGUudG9nZ2xlKVxyXG4gICAgICAub24oJ2tleWRvd24uZHJvcGRvd24uZGF0YS1BcGkgdG91Y2hzdGFydC5kcm9wZG93bi5kYXRhLUFwaScsIHRvZ2dsZSArICcsIFtyb2xlPW1lbnVdJyAsIERyb3Bkb3duLnByb3RvdHlwZS5rZXlkb3duKVxyXG4gIH0pXHJcblxyXG59KHdpbmRvdy5qUXVlcnkpOy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBib290c3RyYXAtbW9kYWwuanMgdjIuMS4xXHJcbiAqIGh0dHA6Ly90d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0cmFwL2phdmFzY3JpcHQuaHRtbCNtb2RhbHNcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIENvcHlyaWdodCAyMDEyIFR3aXR0ZXIsIEluYy5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG5cclxuIWZ1bmN0aW9uICgkKSB7XHJcblxyXG4gIFwidXNlIHN0cmljdFwiOyAvLyBqc2hpbnQgO187XHJcblxyXG5cclxuIC8qIE1PREFMIENMQVNTIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgdmFyIE1vZGFsID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcclxuICAgIHRoaXMuJGVsZW1lbnQgPSAkKGVsZW1lbnQpXHJcbiAgICAgIC5kZWxlZ2F0ZSgnW2RhdGEtZGlzbWlzcz1cIm1vZGFsXCJdJywgJ2NsaWNrLmRpc21pc3MubW9kYWwnLCAkLnByb3h5KHRoaXMuaGlkZSwgdGhpcykpXHJcbiAgICB0aGlzLm9wdGlvbnMucmVtb3RlICYmIHRoaXMuJGVsZW1lbnQuZmluZCgnLm1vZGFsLWJvZHknKS5sb2FkKHRoaXMub3B0aW9ucy5yZW1vdGUpXHJcbiAgfVxyXG5cclxuICBNb2RhbC5wcm90b3R5cGUgPSB7XHJcblxyXG4gICAgICBjb25zdHJ1Y3RvcjogTW9kYWxcclxuXHJcbiAgICAsIHRvZ2dsZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzWyF0aGlzLmlzU2hvd24gPyAnc2hvdycgOiAnaGlkZSddKClcclxuICAgICAgfVxyXG5cclxuICAgICwgc2hvdzogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciB0aGF0ID0gdGhpc1xyXG4gICAgICAgICAgLCBlID0gJC5FdmVudCgnc2hvdycpXHJcblxyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihlKVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pc1Nob3duIHx8IGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxyXG5cclxuICAgICAgICAkKCdib2R5JykuYWRkQ2xhc3MoJ21vZGFsLW9wZW4nKVxyXG5cclxuICAgICAgICB0aGlzLmlzU2hvd24gPSB0cnVlXHJcblxyXG4gICAgICAgIHRoaXMuZXNjYXBlKClcclxuXHJcbiAgICAgICAgdGhpcy5iYWNrZHJvcChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICB2YXIgdHJhbnNpdGlvbiA9ICQuc3VwcG9ydC50cmFuc2l0aW9uICYmIHRoYXQuJGVsZW1lbnQuaGFzQ2xhc3MoJ2ZhZGUnKVxyXG5cclxuICAgICAgICAgIGlmICghdGhhdC4kZWxlbWVudC5wYXJlbnQoKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhhdC4kZWxlbWVudC5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KSAvL2Rvbid0IG1vdmUgbW9kYWxzIGRvbSBwb3NpdGlvblxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoYXQuJGVsZW1lbnRcclxuICAgICAgICAgICAgLnNob3coKVxyXG5cclxuICAgICAgICAgIGlmICh0cmFuc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoYXQuJGVsZW1lbnRbMF0ub2Zmc2V0V2lkdGggLy8gZm9yY2UgcmVmbG93XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhhdC4kZWxlbWVudFxyXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ2luJylcclxuICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgZmFsc2UpXHJcbiAgICAgICAgICAgIC5mb2N1cygpXHJcblxyXG4gICAgICAgICAgdGhhdC5lbmZvcmNlRm9jdXMoKVxyXG5cclxuICAgICAgICAgIHRyYW5zaXRpb24gP1xyXG4gICAgICAgICAgICB0aGF0LiRlbGVtZW50Lm9uZSgkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsIGZ1bmN0aW9uICgpIHsgdGhhdC4kZWxlbWVudC50cmlnZ2VyKCdzaG93bicpIH0pIDpcclxuICAgICAgICAgICAgdGhhdC4kZWxlbWVudC50cmlnZ2VyKCdzaG93bicpXHJcblxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuXHJcbiAgICAsIGhpZGU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgZSAmJiBlLnByZXZlbnREZWZhdWx0KClcclxuXHJcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzXHJcblxyXG4gICAgICAgIGUgPSAkLkV2ZW50KCdoaWRlJylcclxuXHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKGUpXHJcblxyXG4gICAgICAgIGlmICghdGhpcy5pc1Nob3duIHx8IGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxyXG5cclxuICAgICAgICB0aGlzLmlzU2hvd24gPSBmYWxzZVxyXG5cclxuICAgICAgICAkKCdib2R5JykucmVtb3ZlQ2xhc3MoJ21vZGFsLW9wZW4nKVxyXG5cclxuICAgICAgICB0aGlzLmVzY2FwZSgpXHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9mZignZm9jdXNpbi5tb2RhbCcpXHJcblxyXG4gICAgICAgIHRoaXMuJGVsZW1lbnRcclxuICAgICAgICAgIC5yZW1vdmVDbGFzcygnaW4nKVxyXG4gICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgdHJ1ZSlcclxuXHJcbiAgICAgICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnZmFkZScpID9cclxuICAgICAgICAgIHRoaXMuaGlkZVdpdGhUcmFuc2l0aW9uKCkgOlxyXG4gICAgICAgICAgdGhpcy5oaWRlTW9kYWwoKVxyXG4gICAgICB9XHJcblxyXG4gICAgLCBlbmZvcmNlRm9jdXM6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgdGhhdCA9IHRoaXNcclxuICAgICAgICAkKGRvY3VtZW50KS5vbignZm9jdXNpbi5tb2RhbCcsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICBpZiAodGhhdC4kZWxlbWVudFswXSAhPT0gZS50YXJnZXQgJiYgIXRoYXQuJGVsZW1lbnQuaGFzKGUudGFyZ2V0KS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhhdC4kZWxlbWVudC5mb2N1cygpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgICwgZXNjYXBlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzXHJcbiAgICAgICAgaWYgKHRoaXMuaXNTaG93biAmJiB0aGlzLm9wdGlvbnMua2V5Ym9hcmQpIHtcclxuICAgICAgICAgIHRoaXMuJGVsZW1lbnQub24oJ2tleXVwLmRpc21pc3MubW9kYWwnLCBmdW5jdGlvbiAoIGUgKSB7XHJcbiAgICAgICAgICAgIGUud2hpY2ggPT0gMjcgJiYgdGhhdC5oaWRlKClcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pc1Nob3duKSB7XHJcbiAgICAgICAgICB0aGlzLiRlbGVtZW50Lm9mZigna2V5dXAuZGlzbWlzcy5tb2RhbCcpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgLCBoaWRlV2l0aFRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgdGhhdCA9IHRoaXNcclxuICAgICAgICAgICwgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgIHRoYXQuJGVsZW1lbnQub2ZmKCQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZClcclxuICAgICAgICAgICAgICB0aGF0LmhpZGVNb2RhbCgpXHJcbiAgICAgICAgICAgIH0sIDUwMClcclxuXHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC5vbmUoJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcclxuICAgICAgICAgIHRoYXQuaGlkZU1vZGFsKClcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcblxyXG4gICAgLCBoaWRlTW9kYWw6IGZ1bmN0aW9uICh0aGF0KSB7XHJcbiAgICAgICAgdGhpcy4kZWxlbWVudFxyXG4gICAgICAgICAgLmhpZGUoKVxyXG4gICAgICAgICAgLnRyaWdnZXIoJ2hpZGRlbicpXHJcblxyXG4gICAgICAgIHRoaXMuYmFja2Ryb3AoKVxyXG4gICAgICB9XHJcblxyXG4gICAgLCByZW1vdmVCYWNrZHJvcDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuJGJhY2tkcm9wLnJlbW92ZSgpXHJcbiAgICAgICAgdGhpcy4kYmFja2Ryb3AgPSBudWxsXHJcbiAgICAgIH1cclxuXHJcbiAgICAsIGJhY2tkcm9wOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcclxuICAgICAgICB2YXIgdGhhdCA9IHRoaXNcclxuICAgICAgICAgICwgYW5pbWF0ZSA9IHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2ZhZGUnKSA/ICdmYWRlJyA6ICcnXHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzU2hvd24gJiYgdGhpcy5vcHRpb25zLmJhY2tkcm9wKSB7XHJcbiAgICAgICAgICB2YXIgZG9BbmltYXRlID0gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgYW5pbWF0ZVxyXG5cclxuICAgICAgICAgIHRoaXMuJGJhY2tkcm9wID0gJCgnPGRpdiBjbGFzcz1cIm1vZGFsLWJhY2tkcm9wICcgKyBhbmltYXRlICsgJ1wiIC8+JylcclxuICAgICAgICAgICAgLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpXHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5iYWNrZHJvcCAhPSAnc3RhdGljJykge1xyXG4gICAgICAgICAgICB0aGlzLiRiYWNrZHJvcC5jbGljaygkLnByb3h5KHRoaXMuaGlkZSwgdGhpcykpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKGRvQW5pbWF0ZSkgdGhpcy4kYmFja2Ryb3BbMF0ub2Zmc2V0V2lkdGggLy8gZm9yY2UgcmVmbG93XHJcblxyXG4gICAgICAgICAgdGhpcy4kYmFja2Ryb3AuYWRkQ2xhc3MoJ2luJylcclxuXHJcbiAgICAgICAgICBkb0FuaW1hdGUgP1xyXG4gICAgICAgICAgICB0aGlzLiRiYWNrZHJvcC5vbmUoJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLCBjYWxsYmFjaykgOlxyXG4gICAgICAgICAgICBjYWxsYmFjaygpXHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNTaG93biAmJiB0aGlzLiRiYWNrZHJvcCkge1xyXG4gICAgICAgICAgdGhpcy4kYmFja2Ryb3AucmVtb3ZlQ2xhc3MoJ2luJylcclxuXHJcbiAgICAgICAgICAkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdmYWRlJyk/XHJcbiAgICAgICAgICAgIHRoaXMuJGJhY2tkcm9wLm9uZSgkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsICQucHJveHkodGhpcy5yZW1vdmVCYWNrZHJvcCwgdGhpcykpIDpcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVCYWNrZHJvcCgpXHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgIGNhbGxiYWNrKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICB9XHJcblxyXG5cclxuIC8qIE1PREFMIFBMVUdJTiBERUZJTklUSU9OXHJcbiAgKiA9PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuICAkLmZuLm1vZGFsID0gZnVuY3Rpb24gKG9wdGlvbikge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgICAsIGRhdGEgPSAkdGhpcy5kYXRhKCdtb2RhbCcpXHJcbiAgICAgICAgLCBvcHRpb25zID0gJC5leHRlbmQoe30sICQuZm4ubW9kYWwuZGVmYXVsdHMsICR0aGlzLmRhdGEoKSwgdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb24pXHJcbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnbW9kYWwnLCAoZGF0YSA9IG5ldyBNb2RhbCh0aGlzLCBvcHRpb25zKSkpXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0oKVxyXG4gICAgICBlbHNlIGlmIChvcHRpb25zLnNob3cpIGRhdGEuc2hvdygpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgJC5mbi5tb2RhbC5kZWZhdWx0cyA9IHtcclxuICAgICAgYmFja2Ryb3A6IHRydWVcclxuICAgICwga2V5Ym9hcmQ6IHRydWVcclxuICAgICwgc2hvdzogdHJ1ZVxyXG4gIH1cclxuXHJcbiAgJC5mbi5tb2RhbC5Db25zdHJ1Y3RvciA9IE1vZGFsXHJcblxyXG5cclxuIC8qIE1PREFMIERBVEEtQVBJXHJcbiAgKiA9PT09PT09PT09PT09PSAqL1xyXG5cclxuICAkKGZ1bmN0aW9uICgpIHtcclxuICAgICQoJ2JvZHknKS5vbignY2xpY2subW9kYWwuZGF0YS1hcGknLCAnW2RhdGEtdG9nZ2xlPVwibW9kYWxcIl0nLCBmdW5jdGlvbiAoIGUgKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgICAsIGhyZWYgPSAkdGhpcy5hdHRyKCdocmVmJylcclxuICAgICAgICAsICR0YXJnZXQgPSAkKCR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JykgfHwgKGhyZWYgJiYgaHJlZi5yZXBsYWNlKC8uKig/PSNbXlxcc10rJCkvLCAnJykpKSAvL3N0cmlwIGZvciBpZTdcclxuICAgICAgICAsIG9wdGlvbiA9ICR0YXJnZXQuZGF0YSgnbW9kYWwnKSA/ICd0b2dnbGUnIDogJC5leHRlbmQoeyByZW1vdGU6ICEvIy8udGVzdChocmVmKSAmJiBocmVmIH0sICR0YXJnZXQuZGF0YSgpLCAkdGhpcy5kYXRhKCkpXHJcblxyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcclxuXHJcbiAgICAgICR0YXJnZXRcclxuICAgICAgICAubW9kYWwob3B0aW9uKVxyXG4gICAgICAgIC5vbmUoJ2hpZGUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAkdGhpcy5mb2N1cygpXHJcbiAgICAgICAgfSlcclxuICAgIH0pXHJcbiAgfSlcclxuXHJcbn0od2luZG93LmpRdWVyeSk7LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogYm9vdHN0cmFwLXRvb2x0aXAuanMgdjIuMS4xXHJcbiAqIGh0dHA6Ly90d2l0dGVyLmdpdGh1Yi5jb20vYm9vdHN0cmFwL2phdmFzY3JpcHQuaHRtbCN0b29sdGlwc1xyXG4gKiBJbnNwaXJlZCBieSB0aGUgb3JpZ2luYWwgalF1ZXJ5LnRpcHN5IGJ5IEphc29uIEZyYW1lXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIENvcHlyaWdodCAyMDEyIFR3aXR0ZXIsIEluYy5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuXHJcbiFmdW5jdGlvbiAoJCkge1xyXG5cclxuICBcInVzZSBzdHJpY3RcIjsgLy8ganNoaW50IDtfO1xyXG5cclxuXHJcbiAvKiBUT09MVElQIFBVQkxJQyBDTEFTUyBERUZJTklUSU9OXHJcbiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gIHZhciBUb29sdGlwID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMuaW5pdCgndG9vbHRpcCcsIGVsZW1lbnQsIG9wdGlvbnMpXHJcbiAgfVxyXG5cclxuICBUb29sdGlwLnByb3RvdHlwZSA9IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcjogVG9vbHRpcFxyXG5cclxuICAsIGluaXQ6IGZ1bmN0aW9uICh0eXBlLCBlbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICAgIHZhciBldmVudEluXHJcbiAgICAgICAgLCBldmVudE91dFxyXG5cclxuICAgICAgdGhpcy50eXBlID0gdHlwZVxyXG4gICAgICB0aGlzLiRlbGVtZW50ID0gJChlbGVtZW50KVxyXG4gICAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMob3B0aW9ucylcclxuICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG5cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy50cmlnZ2VyID09ICdjbGljaycpIHtcclxuICAgICAgICB0aGlzLiRlbGVtZW50Lm9uKCdjbGljay4nICsgdGhpcy50eXBlLCB0aGlzLm9wdGlvbnMuc2VsZWN0b3IsICQucHJveHkodGhpcy50b2dnbGUsIHRoaXMpKVxyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy50cmlnZ2VyICE9ICdtYW51YWwnKSB7XHJcbiAgICAgICAgZXZlbnRJbiA9IHRoaXMub3B0aW9ucy50cmlnZ2VyID09ICdob3ZlcicgPyAnbW91c2VlbnRlcicgOiAnZm9jdXMnXHJcbiAgICAgICAgZXZlbnRPdXQgPSB0aGlzLm9wdGlvbnMudHJpZ2dlciA9PSAnaG92ZXInID8gJ21vdXNlbGVhdmUnIDogJ2JsdXInXHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC5vbihldmVudEluICsgJy4nICsgdGhpcy50eXBlLCB0aGlzLm9wdGlvbnMuc2VsZWN0b3IsICQucHJveHkodGhpcy5lbnRlciwgdGhpcykpXHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC5vbihldmVudE91dCArICcuJyArIHRoaXMudHlwZSwgdGhpcy5vcHRpb25zLnNlbGVjdG9yLCAkLnByb3h5KHRoaXMubGVhdmUsIHRoaXMpKVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLm9wdGlvbnMuc2VsZWN0b3IgP1xyXG4gICAgICAgICh0aGlzLl9vcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgeyB0cmlnZ2VyOiAnbWFudWFsJywgc2VsZWN0b3I6ICcnIH0pKSA6XHJcbiAgICAgICAgdGhpcy5maXhUaXRsZSgpXHJcbiAgICB9XHJcblxyXG4gICwgZ2V0T3B0aW9uczogZnVuY3Rpb24gKG9wdGlvbnMpIHtcclxuICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLmZuW3RoaXMudHlwZV0uZGVmYXVsdHMsIG9wdGlvbnMsIHRoaXMuJGVsZW1lbnQuZGF0YSgpKVxyXG5cclxuICAgICAgaWYgKG9wdGlvbnMuZGVsYXkgJiYgdHlwZW9mIG9wdGlvbnMuZGVsYXkgPT0gJ251bWJlcicpIHtcclxuICAgICAgICBvcHRpb25zLmRlbGF5ID0ge1xyXG4gICAgICAgICAgc2hvdzogb3B0aW9ucy5kZWxheVxyXG4gICAgICAgICwgaGlkZTogb3B0aW9ucy5kZWxheVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG9wdGlvbnNcclxuICAgIH1cclxuXHJcbiAgLCBlbnRlcjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgdmFyIHNlbGYgPSAkKGUuY3VycmVudFRhcmdldClbdGhpcy50eXBlXSh0aGlzLl9vcHRpb25zKS5kYXRhKHRoaXMudHlwZSlcclxuXHJcbiAgICAgIGlmICghc2VsZi5vcHRpb25zLmRlbGF5IHx8ICFzZWxmLm9wdGlvbnMuZGVsYXkuc2hvdykgcmV0dXJuIHNlbGYuc2hvdygpXHJcblxyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KVxyXG4gICAgICBzZWxmLmhvdmVyU3RhdGUgPSAnaW4nXHJcbiAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKHNlbGYuaG92ZXJTdGF0ZSA9PSAnaW4nKSBzZWxmLnNob3coKVxyXG4gICAgICB9LCBzZWxmLm9wdGlvbnMuZGVsYXkuc2hvdylcclxuICAgIH1cclxuXHJcbiAgLCBsZWF2ZTogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgdmFyIHNlbGYgPSAkKGUuY3VycmVudFRhcmdldClbdGhpcy50eXBlXSh0aGlzLl9vcHRpb25zKS5kYXRhKHRoaXMudHlwZSlcclxuXHJcbiAgICAgIGlmICh0aGlzLnRpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpXHJcbiAgICAgIGlmICghc2VsZi5vcHRpb25zLmRlbGF5IHx8ICFzZWxmLm9wdGlvbnMuZGVsYXkuaGlkZSkgcmV0dXJuIHNlbGYuaGlkZSgpXHJcblxyXG4gICAgICBzZWxmLmhvdmVyU3RhdGUgPSAnb3V0J1xyXG4gICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChzZWxmLmhvdmVyU3RhdGUgPT0gJ291dCcpIHNlbGYuaGlkZSgpXHJcbiAgICAgIH0sIHNlbGYub3B0aW9ucy5kZWxheS5oaWRlKVxyXG4gICAgfVxyXG5cclxuICAsIHNob3c6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICR0aXBcclxuICAgICAgICAsIGluc2lkZVxyXG4gICAgICAgICwgcG9zXHJcbiAgICAgICAgLCBhY3R1YWxXaWR0aFxyXG4gICAgICAgICwgYWN0dWFsSGVpZ2h0XHJcbiAgICAgICAgLCBwbGFjZW1lbnRcclxuICAgICAgICAsIHRwXHJcblxyXG4gICAgICBpZiAodGhpcy5oYXNDb250ZW50KCkgJiYgdGhpcy5lbmFibGVkKSB7XHJcbiAgICAgICAgJHRpcCA9IHRoaXMudGlwKClcclxuICAgICAgICB0aGlzLnNldENvbnRlbnQoKVxyXG5cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFuaW1hdGlvbikge1xyXG4gICAgICAgICAgJHRpcC5hZGRDbGFzcygnZmFkZScpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwbGFjZW1lbnQgPSB0eXBlb2YgdGhpcy5vcHRpb25zLnBsYWNlbWVudCA9PSAnZnVuY3Rpb24nID9cclxuICAgICAgICAgIHRoaXMub3B0aW9ucy5wbGFjZW1lbnQuY2FsbCh0aGlzLCAkdGlwWzBdLCB0aGlzLiRlbGVtZW50WzBdKSA6XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnMucGxhY2VtZW50XHJcblxyXG4gICAgICAgIGluc2lkZSA9IC9pbi8udGVzdChwbGFjZW1lbnQpXHJcblxyXG4gICAgICAgICR0aXBcclxuICAgICAgICAgIC5yZW1vdmUoKVxyXG4gICAgICAgICAgLmNzcyh7IHRvcDogMCwgbGVmdDogMCwgZGlzcGxheTogJ2Jsb2NrJyB9KVxyXG4gICAgICAgICAgLmFwcGVuZFRvKGluc2lkZSA/IHRoaXMuJGVsZW1lbnQgOiBkb2N1bWVudC5ib2R5KVxyXG5cclxuICAgICAgICBwb3MgPSB0aGlzLmdldFBvc2l0aW9uKGluc2lkZSlcclxuXHJcbiAgICAgICAgYWN0dWFsV2lkdGggPSAkdGlwWzBdLm9mZnNldFdpZHRoXHJcbiAgICAgICAgYWN0dWFsSGVpZ2h0ID0gJHRpcFswXS5vZmZzZXRIZWlnaHRcclxuXHJcbiAgICAgICAgc3dpdGNoIChpbnNpZGUgPyBwbGFjZW1lbnQuc3BsaXQoJyAnKVsxXSA6IHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgY2FzZSAnYm90dG9tJzpcclxuICAgICAgICAgICAgdHAgPSB7dG9wOiBwb3MudG9wICsgcG9zLmhlaWdodCwgbGVmdDogcG9zLmxlZnQgKyBwb3Mud2lkdGggLyAyIC0gYWN0dWFsV2lkdGggLyAyfVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgY2FzZSAndG9wJzpcclxuICAgICAgICAgICAgdHAgPSB7dG9wOiBwb3MudG9wIC0gYWN0dWFsSGVpZ2h0LCBsZWZ0OiBwb3MubGVmdCArIHBvcy53aWR0aCAvIDIgLSBhY3R1YWxXaWR0aCAvIDJ9XHJcbiAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICBjYXNlICdsZWZ0JzpcclxuICAgICAgICAgICAgdHAgPSB7dG9wOiBwb3MudG9wICsgcG9zLmhlaWdodCAvIDIgLSBhY3R1YWxIZWlnaHQgLyAyLCBsZWZ0OiBwb3MubGVmdCAtIGFjdHVhbFdpZHRofVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICAgICAgICB0cCA9IHt0b3A6IHBvcy50b3AgKyBwb3MuaGVpZ2h0IC8gMiAtIGFjdHVhbEhlaWdodCAvIDIsIGxlZnQ6IHBvcy5sZWZ0ICsgcG9zLndpZHRofVxyXG4gICAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJHRpcFxyXG4gICAgICAgICAgLmNzcyh0cClcclxuICAgICAgICAgIC5hZGRDbGFzcyhwbGFjZW1lbnQpXHJcbiAgICAgICAgICAuYWRkQ2xhc3MoJ2luJylcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAsIHNldENvbnRlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICR0aXAgPSB0aGlzLnRpcCgpXHJcbiAgICAgICAgLCB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoKVxyXG5cclxuICAgICAgJHRpcC5maW5kKCcudG9vbHRpcC1pbm5lcicpW3RoaXMub3B0aW9ucy5odG1sID8gJ2h0bWwnIDogJ3RleHQnXSh0aXRsZSlcclxuICAgICAgJHRpcC5yZW1vdmVDbGFzcygnZmFkZSBpbiB0b3AgYm90dG9tIGxlZnQgcmlnaHQnKVxyXG4gICAgfVxyXG5cclxuICAsIGhpZGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIHRoYXQgPSB0aGlzXHJcbiAgICAgICAgLCAkdGlwID0gdGhpcy50aXAoKVxyXG5cclxuICAgICAgJHRpcC5yZW1vdmVDbGFzcygnaW4nKVxyXG5cclxuICAgICAgZnVuY3Rpb24gcmVtb3ZlV2l0aEFuaW1hdGlvbigpIHtcclxuICAgICAgICB2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgJHRpcC5vZmYoJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kKS5yZW1vdmUoKVxyXG4gICAgICAgIH0sIDUwMClcclxuXHJcbiAgICAgICAgJHRpcC5vbmUoJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcclxuICAgICAgICAgICR0aXAucmVtb3ZlKClcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcblxyXG4gICAgICAkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLiR0aXAuaGFzQ2xhc3MoJ2ZhZGUnKSA/XHJcbiAgICAgICAgcmVtb3ZlV2l0aEFuaW1hdGlvbigpIDpcclxuICAgICAgICAkdGlwLnJlbW92ZSgpXHJcblxyXG4gICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAsIGZpeFRpdGxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkZSA9IHRoaXMuJGVsZW1lbnRcclxuICAgICAgaWYgKCRlLmF0dHIoJ3RpdGxlJykgfHwgdHlwZW9mKCRlLmF0dHIoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnKSkgIT0gJ3N0cmluZycpIHtcclxuICAgICAgICAkZS5hdHRyKCdkYXRhLW9yaWdpbmFsLXRpdGxlJywgJGUuYXR0cigndGl0bGUnKSB8fCAnJykucmVtb3ZlQXR0cigndGl0bGUnKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICwgaGFzQ29udGVudDogZnVuY3Rpb24gKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRUaXRsZSgpXHJcbiAgICB9XHJcblxyXG4gICwgZ2V0UG9zaXRpb246IGZ1bmN0aW9uIChpbnNpZGUpIHtcclxuICAgICAgcmV0dXJuICQuZXh0ZW5kKHt9LCAoaW5zaWRlID8ge3RvcDogMCwgbGVmdDogMH0gOiB0aGlzLiRlbGVtZW50Lm9mZnNldCgpKSwge1xyXG4gICAgICAgIHdpZHRoOiB0aGlzLiRlbGVtZW50WzBdLm9mZnNldFdpZHRoXHJcbiAgICAgICwgaGVpZ2h0OiB0aGlzLiRlbGVtZW50WzBdLm9mZnNldEhlaWdodFxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAsIGdldFRpdGxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciB0aXRsZVxyXG4gICAgICAgICwgJGUgPSB0aGlzLiRlbGVtZW50XHJcbiAgICAgICAgLCBvID0gdGhpcy5vcHRpb25zXHJcblxyXG4gICAgICB0aXRsZSA9ICRlLmF0dHIoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnKVxyXG4gICAgICAgIHx8ICh0eXBlb2Ygby50aXRsZSA9PSAnZnVuY3Rpb24nID8gby50aXRsZS5jYWxsKCRlWzBdKSA6ICBvLnRpdGxlKVxyXG5cclxuICAgICAgcmV0dXJuIHRpdGxlXHJcbiAgICB9XHJcblxyXG4gICwgdGlwOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLiR0aXAgPSB0aGlzLiR0aXAgfHwgJCh0aGlzLm9wdGlvbnMudGVtcGxhdGUpXHJcbiAgICB9XHJcblxyXG4gICwgdmFsaWRhdGU6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgaWYgKCF0aGlzLiRlbGVtZW50WzBdLnBhcmVudE5vZGUpIHtcclxuICAgICAgICB0aGlzLmhpZGUoKVxyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQgPSBudWxsXHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gbnVsbFxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICwgZW5hYmxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuICAgIH1cclxuXHJcbiAgLCBkaXNhYmxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICwgdG9nZ2xlRW5hYmxlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzLmVuYWJsZWQgPSAhdGhpcy5lbmFibGVkXHJcbiAgICB9XHJcblxyXG4gICwgdG9nZ2xlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHRoaXNbdGhpcy50aXAoKS5oYXNDbGFzcygnaW4nKSA/ICdoaWRlJyA6ICdzaG93J10oKVxyXG4gICAgfVxyXG5cclxuICAsIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdGhpcy5oaWRlKCkuJGVsZW1lbnQub2ZmKCcuJyArIHRoaXMudHlwZSkucmVtb3ZlRGF0YSh0aGlzLnR5cGUpXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gLyogVE9PTFRJUCBQTFVHSU4gREVGSU5JVElPTlxyXG4gICogPT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuICAkLmZuLnRvb2x0aXAgPSBmdW5jdGlvbiAoIG9wdGlvbiApIHtcclxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpXHJcbiAgICAgICAgLCBkYXRhID0gJHRoaXMuZGF0YSgndG9vbHRpcCcpXHJcbiAgICAgICAgLCBvcHRpb25zID0gdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb25cclxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCd0b29sdGlwJywgKGRhdGEgPSBuZXcgVG9vbHRpcCh0aGlzLCBvcHRpb25zKSkpXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0oKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gICQuZm4udG9vbHRpcC5Db25zdHJ1Y3RvciA9IFRvb2x0aXBcclxuXHJcbiAgJC5mbi50b29sdGlwLmRlZmF1bHRzID0ge1xyXG4gICAgYW5pbWF0aW9uOiB0cnVlXHJcbiAgLCBwbGFjZW1lbnQ6ICd0b3AnXHJcbiAgLCBzZWxlY3RvcjogZmFsc2VcclxuICAsIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInRvb2x0aXBcIj48ZGl2IGNsYXNzPVwidG9vbHRpcC1hcnJvd1wiPjwvZGl2PjxkaXYgY2xhc3M9XCJ0b29sdGlwLWlubmVyXCI+PC9kaXY+PC9kaXY+J1xyXG4gICwgdHJpZ2dlcjogJ2hvdmVyJ1xyXG4gICwgdGl0bGU6ICcnXHJcbiAgLCBkZWxheTogMFxyXG4gICwgaHRtbDogdHJ1ZVxyXG4gIH1cclxuXHJcbn0od2luZG93LmpRdWVyeSk7XHJcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIGJvb3RzdHJhcC1wb3BvdmVyLmpzIHYyLjEuMVxyXG4gKiBodHRwOi8vdHdpdHRlci5naXRodWIuY29tL2Jvb3RzdHJhcC9qYXZhc2NyaXB0Lmh0bWwjcG9wb3ZlcnNcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuXHJcbiFmdW5jdGlvbiAoJCkge1xyXG5cclxuICBcInVzZSBzdHJpY3RcIjsgLy8ganNoaW50IDtfO1xyXG5cclxuXHJcbiAvKiBQT1BPVkVSIFBVQkxJQyBDTEFTUyBERUZJTklUSU9OXHJcbiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gIHZhciBQb3BvdmVyID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMuaW5pdCgncG9wb3ZlcicsIGVsZW1lbnQsIG9wdGlvbnMpXHJcbiAgfVxyXG5cclxuXHJcbiAgLyogTk9URTogUE9QT1ZFUiBFWFRFTkRTIEJPT1RTVFJBUC1UT09MVElQLmpzXHJcbiAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gIFBvcG92ZXIucHJvdG90eXBlID0gJC5leHRlbmQoe30sICQuZm4udG9vbHRpcC5Db25zdHJ1Y3Rvci5wcm90b3R5cGUsIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcjogUG9wb3ZlclxyXG5cclxuICAsIHNldENvbnRlbnQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICR0aXAgPSB0aGlzLnRpcCgpXHJcbiAgICAgICAgLCB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoKVxyXG4gICAgICAgICwgY29udGVudCA9IHRoaXMuZ2V0Q29udGVudCgpXHJcblxyXG4gICAgICAkdGlwLmZpbmQoJy5wb3BvdmVyLXRpdGxlJylbdGhpcy5vcHRpb25zLmh0bWwgPyAnaHRtbCcgOiAndGV4dCddKHRpdGxlKVxyXG4gICAgICAkdGlwLmZpbmQoJy5wb3BvdmVyLWNvbnRlbnQgPiAqJylbdGhpcy5vcHRpb25zLmh0bWwgPyAnaHRtbCcgOiAndGV4dCddKGNvbnRlbnQpXHJcblxyXG4gICAgICAkdGlwLnJlbW92ZUNsYXNzKCdmYWRlIHRvcCBib3R0b20gbGVmdCByaWdodCBpbicpXHJcbiAgICB9XHJcblxyXG4gICwgaGFzQ29udGVudDogZnVuY3Rpb24gKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRUaXRsZSgpIHx8IHRoaXMuZ2V0Q29udGVudCgpXHJcbiAgICB9XHJcblxyXG4gICwgZ2V0Q29udGVudDogZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgY29udGVudFxyXG4gICAgICAgICwgJGUgPSB0aGlzLiRlbGVtZW50XHJcbiAgICAgICAgLCBvID0gdGhpcy5vcHRpb25zXHJcblxyXG4gICAgICBjb250ZW50ID0gJGUuYXR0cignZGF0YS1jb250ZW50JylcclxuICAgICAgICB8fCAodHlwZW9mIG8uY29udGVudCA9PSAnZnVuY3Rpb24nID8gby5jb250ZW50LmNhbGwoJGVbMF0pIDogIG8uY29udGVudClcclxuXHJcbiAgICAgIHJldHVybiBjb250ZW50XHJcbiAgICB9XHJcblxyXG4gICwgdGlwOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGlmICghdGhpcy4kdGlwKSB7XHJcbiAgICAgICAgdGhpcy4kdGlwID0gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGUpXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuJHRpcFxyXG4gICAgfVxyXG5cclxuICAsIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdGhpcy5oaWRlKCkuJGVsZW1lbnQub2ZmKCcuJyArIHRoaXMudHlwZSkucmVtb3ZlRGF0YSh0aGlzLnR5cGUpXHJcbiAgICB9XHJcblxyXG4gIH0pXHJcblxyXG5cclxuIC8qIFBPUE9WRVIgUExVR0lOIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICQuZm4ucG9wb3ZlciA9IGZ1bmN0aW9uIChvcHRpb24pIHtcclxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpXHJcbiAgICAgICAgLCBkYXRhID0gJHRoaXMuZGF0YSgncG9wb3ZlcicpXHJcbiAgICAgICAgLCBvcHRpb25zID0gdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb25cclxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdwb3BvdmVyJywgKGRhdGEgPSBuZXcgUG9wb3Zlcih0aGlzLCBvcHRpb25zKSkpXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0oKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gICQuZm4ucG9wb3Zlci5Db25zdHJ1Y3RvciA9IFBvcG92ZXJcclxuXHJcbiAgJC5mbi5wb3BvdmVyLmRlZmF1bHRzID0gJC5leHRlbmQoe30gLCAkLmZuLnRvb2x0aXAuZGVmYXVsdHMsIHtcclxuICAgIHBsYWNlbWVudDogJ3JpZ2h0J1xyXG4gICwgdHJpZ2dlcjogJ2NsaWNrJ1xyXG4gICwgY29udGVudDogJydcclxuICAsIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInBvcG92ZXJcIj48ZGl2IGNsYXNzPVwiYXJyb3dcIj48L2Rpdj48ZGl2IGNsYXNzPVwicG9wb3Zlci1pbm5lclwiPjxoMyBjbGFzcz1cInBvcG92ZXItdGl0bGVcIj48L2gzPjxkaXYgY2xhc3M9XCJwb3BvdmVyLWNvbnRlbnRcIj48cD48L3A+PC9kaXY+PC9kaXY+PC9kaXY+J1xyXG4gIH0pXHJcblxyXG59KHdpbmRvdy5qUXVlcnkpOy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogYm9vdHN0cmFwLXNjcm9sbHNweS5qcyB2Mi4xLjFcclxuICogaHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNvbS9ib290c3RyYXAvamF2YXNjcmlwdC5odG1sI3Njcm9sbHNweVxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIENvcHlyaWdodCAyMDEyIFR3aXR0ZXIsIEluYy5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqXHJcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcblxyXG4hZnVuY3Rpb24gKCQpIHtcclxuXHJcbiAgXCJ1c2Ugc3RyaWN0XCI7IC8vIGpzaGludCA7XztcclxuXHJcblxyXG4gLyogU0NST0xMU1BZIENMQVNTIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gIGZ1bmN0aW9uIFNjcm9sbFNweShlbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICB2YXIgcHJvY2VzcyA9ICQucHJveHkodGhpcy5wcm9jZXNzLCB0aGlzKVxyXG4gICAgICAsICRlbGVtZW50ID0gJChlbGVtZW50KS5pcygnYm9keScpID8gJCh3aW5kb3cpIDogJChlbGVtZW50KVxyXG4gICAgICAsIGhyZWZcclxuICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLmZuLnNjcm9sbHNweS5kZWZhdWx0cywgb3B0aW9ucylcclxuICAgIHRoaXMuJHNjcm9sbEVsZW1lbnQgPSAkZWxlbWVudC5vbignc2Nyb2xsLnNjcm9sbC1zcHkuZGF0YS1hcGknLCBwcm9jZXNzKVxyXG4gICAgdGhpcy5zZWxlY3RvciA9ICh0aGlzLm9wdGlvbnMudGFyZ2V0XHJcbiAgICAgIHx8ICgoaHJlZiA9ICQoZWxlbWVudCkuYXR0cignaHJlZicpKSAmJiBocmVmLnJlcGxhY2UoLy4qKD89I1teXFxzXSskKS8sICcnKSkgLy9zdHJpcCBmb3IgaWU3XHJcbiAgICAgIHx8ICcnKSArICcgLm5hdiBsaSA+IGEnXHJcbiAgICB0aGlzLiRib2R5ID0gJCgnYm9keScpXHJcbiAgICB0aGlzLnJlZnJlc2goKVxyXG4gICAgdGhpcy5wcm9jZXNzKClcclxuICB9XHJcblxyXG4gIFNjcm9sbFNweS5wcm90b3R5cGUgPSB7XHJcblxyXG4gICAgICBjb25zdHJ1Y3RvcjogU2Nyb2xsU3B5XHJcblxyXG4gICAgLCByZWZyZXNoOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzXHJcbiAgICAgICAgICAsICR0YXJnZXRzXHJcblxyXG4gICAgICAgIHRoaXMub2Zmc2V0cyA9ICQoW10pXHJcbiAgICAgICAgdGhpcy50YXJnZXRzID0gJChbXSlcclxuXHJcbiAgICAgICAgJHRhcmdldHMgPSB0aGlzLiRib2R5XHJcbiAgICAgICAgICAuZmluZCh0aGlzLnNlbGVjdG9yKVxyXG4gICAgICAgICAgLm1hcChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciAkZWwgPSAkKHRoaXMpXHJcbiAgICAgICAgICAgICAgLCBocmVmID0gJGVsLmRhdGEoJ3RhcmdldCcpIHx8ICRlbC5hdHRyKCdocmVmJylcclxuICAgICAgICAgICAgICAsICRocmVmID0gL14jXFx3Ly50ZXN0KGhyZWYpICYmICQoaHJlZilcclxuICAgICAgICAgICAgcmV0dXJuICggJGhyZWZcclxuICAgICAgICAgICAgICAmJiAkaHJlZi5sZW5ndGhcclxuICAgICAgICAgICAgICAmJiBbWyAkaHJlZi5wb3NpdGlvbigpLnRvcCwgaHJlZiBdXSApIHx8IG51bGxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYVswXSAtIGJbMF0gfSlcclxuICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgc2VsZi5vZmZzZXRzLnB1c2godGhpc1swXSlcclxuICAgICAgICAgICAgc2VsZi50YXJnZXRzLnB1c2godGhpc1sxXSlcclxuICAgICAgICAgIH0pXHJcbiAgICAgIH1cclxuXHJcbiAgICAsIHByb2Nlc3M6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy4kc2Nyb2xsRWxlbWVudC5zY3JvbGxUb3AoKSArIHRoaXMub3B0aW9ucy5vZmZzZXRcclxuICAgICAgICAgICwgc2Nyb2xsSGVpZ2h0ID0gdGhpcy4kc2Nyb2xsRWxlbWVudFswXS5zY3JvbGxIZWlnaHQgfHwgdGhpcy4kYm9keVswXS5zY3JvbGxIZWlnaHRcclxuICAgICAgICAgICwgbWF4U2Nyb2xsID0gc2Nyb2xsSGVpZ2h0IC0gdGhpcy4kc2Nyb2xsRWxlbWVudC5oZWlnaHQoKVxyXG4gICAgICAgICAgLCBvZmZzZXRzID0gdGhpcy5vZmZzZXRzXHJcbiAgICAgICAgICAsIHRhcmdldHMgPSB0aGlzLnRhcmdldHNcclxuICAgICAgICAgICwgYWN0aXZlVGFyZ2V0ID0gdGhpcy5hY3RpdmVUYXJnZXRcclxuICAgICAgICAgICwgaVxyXG5cclxuICAgICAgICBpZiAoc2Nyb2xsVG9wID49IG1heFNjcm9sbCkge1xyXG4gICAgICAgICAgcmV0dXJuIGFjdGl2ZVRhcmdldCAhPSAoaSA9IHRhcmdldHMubGFzdCgpWzBdKVxyXG4gICAgICAgICAgICAmJiB0aGlzLmFjdGl2YXRlICggaSApXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSBvZmZzZXRzLmxlbmd0aDsgaS0tOykge1xyXG4gICAgICAgICAgYWN0aXZlVGFyZ2V0ICE9IHRhcmdldHNbaV1cclxuICAgICAgICAgICAgJiYgc2Nyb2xsVG9wID49IG9mZnNldHNbaV1cclxuICAgICAgICAgICAgJiYgKCFvZmZzZXRzW2kgKyAxXSB8fCBzY3JvbGxUb3AgPD0gb2Zmc2V0c1tpICsgMV0pXHJcbiAgICAgICAgICAgICYmIHRoaXMuYWN0aXZhdGUoIHRhcmdldHNbaV0gKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICwgYWN0aXZhdGU6IGZ1bmN0aW9uICh0YXJnZXQpIHtcclxuICAgICAgICB2YXIgYWN0aXZlXHJcbiAgICAgICAgICAsIHNlbGVjdG9yXHJcblxyXG4gICAgICAgIHRoaXMuYWN0aXZlVGFyZ2V0ID0gdGFyZ2V0XHJcblxyXG4gICAgICAgICQodGhpcy5zZWxlY3RvcilcclxuICAgICAgICAgIC5wYXJlbnQoJy5hY3RpdmUnKVxyXG4gICAgICAgICAgLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxyXG5cclxuICAgICAgICBzZWxlY3RvciA9IHRoaXMuc2VsZWN0b3JcclxuICAgICAgICAgICsgJ1tkYXRhLXRhcmdldD1cIicgKyB0YXJnZXQgKyAnXCJdLCdcclxuICAgICAgICAgICsgdGhpcy5zZWxlY3RvciArICdbaHJlZj1cIicgKyB0YXJnZXQgKyAnXCJdJ1xyXG5cclxuICAgICAgICBhY3RpdmUgPSAkKHNlbGVjdG9yKVxyXG4gICAgICAgICAgLnBhcmVudCgnbGknKVxyXG4gICAgICAgICAgLmFkZENsYXNzKCdhY3RpdmUnKVxyXG5cclxuICAgICAgICBpZiAoYWN0aXZlLnBhcmVudCgnLmRyb3Bkb3duLW1lbnUnKS5sZW5ndGgpICB7XHJcbiAgICAgICAgICBhY3RpdmUgPSBhY3RpdmUuY2xvc2VzdCgnbGkuZHJvcGRvd24nKS5hZGRDbGFzcygnYWN0aXZlJylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFjdGl2ZS50cmlnZ2VyKCdhY3RpdmF0ZScpXHJcbiAgICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAvKiBTQ1JPTExTUFkgUExVR0lOIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuICAkLmZuLnNjcm9sbHNweSA9IGZ1bmN0aW9uIChvcHRpb24pIHtcclxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpXHJcbiAgICAgICAgLCBkYXRhID0gJHRoaXMuZGF0YSgnc2Nyb2xsc3B5JylcclxuICAgICAgICAsIG9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvblxyXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ3Njcm9sbHNweScsIChkYXRhID0gbmV3IFNjcm9sbFNweSh0aGlzLCBvcHRpb25zKSkpXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0oKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gICQuZm4uc2Nyb2xsc3B5LkNvbnN0cnVjdG9yID0gU2Nyb2xsU3B5XHJcblxyXG4gICQuZm4uc2Nyb2xsc3B5LmRlZmF1bHRzID0ge1xyXG4gICAgb2Zmc2V0OiAxMFxyXG4gIH1cclxuXHJcblxyXG4gLyogU0NST0xMU1BZIERBVEEtQVBJXHJcbiAgKiA9PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgJCh3aW5kb3cpLm9uKCdsb2FkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgJCgnW2RhdGEtc3B5PVwic2Nyb2xsXCJdJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkc3B5ID0gJCh0aGlzKVxyXG4gICAgICAkc3B5LnNjcm9sbHNweSgkc3B5LmRhdGEoKSlcclxuICAgIH0pXHJcbiAgfSlcclxuXHJcbn0od2luZG93LmpRdWVyeSk7LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogYm9vdHN0cmFwLXRhYi5qcyB2Mi4xLjFcclxuICogaHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNvbS9ib290c3RyYXAvamF2YXNjcmlwdC5odG1sI3RhYnNcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuXHJcbiFmdW5jdGlvbiAoJCkge1xyXG5cclxuICBcInVzZSBzdHJpY3RcIjsgLy8ganNoaW50IDtfO1xyXG5cclxuXHJcbiAvKiBUQUIgQ0xBU1MgREVGSU5JVElPTlxyXG4gICogPT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgdmFyIFRhYiA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICB0aGlzLmVsZW1lbnQgPSAkKGVsZW1lbnQpXHJcbiAgfVxyXG5cclxuICBUYWIucHJvdG90eXBlID0ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yOiBUYWJcclxuXHJcbiAgLCBzaG93OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9IHRoaXMuZWxlbWVudFxyXG4gICAgICAgICwgJHVsID0gJHRoaXMuY2xvc2VzdCgndWw6bm90KC5kcm9wZG93bi1tZW51KScpXHJcbiAgICAgICAgLCBzZWxlY3RvciA9ICR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JylcclxuICAgICAgICAsIHByZXZpb3VzXHJcbiAgICAgICAgLCAkdGFyZ2V0XHJcbiAgICAgICAgLCBlXHJcblxyXG4gICAgICBpZiAoIXNlbGVjdG9yKSB7XHJcbiAgICAgICAgc2VsZWN0b3IgPSAkdGhpcy5hdHRyKCdocmVmJylcclxuICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yICYmIHNlbGVjdG9yLnJlcGxhY2UoLy4qKD89I1teXFxzXSokKS8sICcnKSAvL3N0cmlwIGZvciBpZTdcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCAkdGhpcy5wYXJlbnQoJ2xpJykuaGFzQ2xhc3MoJ2FjdGl2ZScpICkgcmV0dXJuXHJcblxyXG4gICAgICBwcmV2aW91cyA9ICR1bC5maW5kKCcuYWN0aXZlIGEnKS5sYXN0KClbMF1cclxuXHJcbiAgICAgIGUgPSAkLkV2ZW50KCdzaG93Jywge1xyXG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHByZXZpb3VzXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICAkdGhpcy50cmlnZ2VyKGUpXHJcblxyXG4gICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXHJcblxyXG4gICAgICAkdGFyZ2V0ID0gJChzZWxlY3RvcilcclxuXHJcbiAgICAgIHRoaXMuYWN0aXZhdGUoJHRoaXMucGFyZW50KCdsaScpLCAkdWwpXHJcbiAgICAgIHRoaXMuYWN0aXZhdGUoJHRhcmdldCwgJHRhcmdldC5wYXJlbnQoKSwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICR0aGlzLnRyaWdnZXIoe1xyXG4gICAgICAgICAgdHlwZTogJ3Nob3duJ1xyXG4gICAgICAgICwgcmVsYXRlZFRhcmdldDogcHJldmlvdXNcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAsIGFjdGl2YXRlOiBmdW5jdGlvbiAoIGVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcclxuICAgICAgdmFyICRhY3RpdmUgPSBjb250YWluZXIuZmluZCgnPiAuYWN0aXZlJylcclxuICAgICAgICAsIHRyYW5zaXRpb24gPSBjYWxsYmFja1xyXG4gICAgICAgICAgICAmJiAkLnN1cHBvcnQudHJhbnNpdGlvblxyXG4gICAgICAgICAgICAmJiAkYWN0aXZlLmhhc0NsYXNzKCdmYWRlJylcclxuXHJcbiAgICAgIGZ1bmN0aW9uIG5leHQoKSB7XHJcbiAgICAgICAgJGFjdGl2ZVxyXG4gICAgICAgICAgLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxyXG4gICAgICAgICAgLmZpbmQoJz4gLmRyb3Bkb3duLW1lbnUgPiAuYWN0aXZlJylcclxuICAgICAgICAgIC5yZW1vdmVDbGFzcygnYWN0aXZlJylcclxuXHJcbiAgICAgICAgZWxlbWVudC5hZGRDbGFzcygnYWN0aXZlJylcclxuXHJcbiAgICAgICAgaWYgKHRyYW5zaXRpb24pIHtcclxuICAgICAgICAgIGVsZW1lbnRbMF0ub2Zmc2V0V2lkdGggLy8gcmVmbG93IGZvciB0cmFuc2l0aW9uXHJcbiAgICAgICAgICBlbGVtZW50LmFkZENsYXNzKCdpbicpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2ZhZGUnKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCBlbGVtZW50LnBhcmVudCgnLmRyb3Bkb3duLW1lbnUnKSApIHtcclxuICAgICAgICAgIGVsZW1lbnQuY2xvc2VzdCgnbGkuZHJvcGRvd24nKS5hZGRDbGFzcygnYWN0aXZlJylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcclxuICAgICAgfVxyXG5cclxuICAgICAgdHJhbnNpdGlvbiA/XHJcbiAgICAgICAgJGFjdGl2ZS5vbmUoJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLCBuZXh0KSA6XHJcbiAgICAgICAgbmV4dCgpXHJcblxyXG4gICAgICAkYWN0aXZlLnJlbW92ZUNsYXNzKCdpbicpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAvKiBUQUIgUExVR0lOIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuICAkLmZuLnRhYiA9IGZ1bmN0aW9uICggb3B0aW9uICkge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgICAsIGRhdGEgPSAkdGhpcy5kYXRhKCd0YWInKVxyXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ3RhYicsIChkYXRhID0gbmV3IFRhYih0aGlzKSkpXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0oKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gICQuZm4udGFiLkNvbnN0cnVjdG9yID0gVGFiXHJcblxyXG5cclxuIC8qIFRBQiBEQVRBLUFQSVxyXG4gICogPT09PT09PT09PT09ICovXHJcblxyXG4gICQoZnVuY3Rpb24gKCkge1xyXG4gICAgJCgnYm9keScpLm9uKCdjbGljay50YWIuZGF0YS1hcGknLCAnW2RhdGEtdG9nZ2xlPVwidGFiXCJdLCBbZGF0YS10b2dnbGU9XCJwaWxsXCJdJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICQodGhpcykudGFiKCdzaG93JylcclxuICAgIH0pXHJcbiAgfSlcclxuXHJcbn0od2luZG93LmpRdWVyeSk7LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBib290c3RyYXAtdHlwZWFoZWFkLmpzIHYyLjEuMVxyXG4gKiBodHRwOi8vdHdpdHRlci5naXRodWIuY29tL2Jvb3RzdHJhcC9qYXZhc2NyaXB0Lmh0bWwjdHlwZWFoZWFkXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcblxyXG4hZnVuY3Rpb24oJCl7XHJcblxyXG4gIFwidXNlIHN0cmljdFwiOyAvLyBqc2hpbnQgO187XHJcblxyXG5cclxuIC8qIFRZUEVBSEVBRCBQVUJMSUMgQ0xBU1MgREVGSU5JVElPTlxyXG4gICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gIHZhciBUeXBlYWhlYWQgPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xyXG4gICAgdGhpcy4kZWxlbWVudCA9ICQoZWxlbWVudClcclxuICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLmZuLnR5cGVhaGVhZC5kZWZhdWx0cywgb3B0aW9ucylcclxuICAgIHRoaXMubWF0Y2hlciA9IHRoaXMub3B0aW9ucy5tYXRjaGVyIHx8IHRoaXMubWF0Y2hlclxyXG4gICAgdGhpcy5zb3J0ZXIgPSB0aGlzLm9wdGlvbnMuc29ydGVyIHx8IHRoaXMuc29ydGVyXHJcbiAgICB0aGlzLmhpZ2hsaWdodGVyID0gdGhpcy5vcHRpb25zLmhpZ2hsaWdodGVyIHx8IHRoaXMuaGlnaGxpZ2h0ZXJcclxuICAgIHRoaXMudXBkYXRlciA9IHRoaXMub3B0aW9ucy51cGRhdGVyIHx8IHRoaXMudXBkYXRlclxyXG4gICAgdGhpcy4kbWVudSA9ICQodGhpcy5vcHRpb25zLm1lbnUpLmFwcGVuZFRvKCdib2R5JylcclxuICAgIHRoaXMuc291cmNlID0gdGhpcy5vcHRpb25zLnNvdXJjZVxyXG4gICAgdGhpcy5zaG93biA9IGZhbHNlXHJcbiAgICB0aGlzLmxpc3RlbigpXHJcbiAgfVxyXG5cclxuICBUeXBlYWhlYWQucHJvdG90eXBlID0ge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yOiBUeXBlYWhlYWRcclxuXHJcbiAgLCBzZWxlY3Q6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIHZhbCA9IHRoaXMuJG1lbnUuZmluZCgnLmFjdGl2ZScpLmF0dHIoJ2RhdGEtdmFsdWUnKVxyXG4gICAgICB0aGlzLiRlbGVtZW50XHJcbiAgICAgICAgLnZhbCh0aGlzLnVwZGF0ZXIodmFsKSlcclxuICAgICAgICAuY2hhbmdlKClcclxuICAgICAgcmV0dXJuIHRoaXMuaGlkZSgpXHJcbiAgICB9XHJcblxyXG4gICwgdXBkYXRlcjogZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGl0ZW1cclxuICAgIH1cclxuXHJcbiAgLCBzaG93OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciBwb3MgPSAkLmV4dGVuZCh7fSwgdGhpcy4kZWxlbWVudC5vZmZzZXQoKSwge1xyXG4gICAgICAgIGhlaWdodDogdGhpcy4kZWxlbWVudFswXS5vZmZzZXRIZWlnaHRcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuJG1lbnUuY3NzKHtcclxuICAgICAgICB0b3A6IHBvcy50b3AgKyBwb3MuaGVpZ2h0XHJcbiAgICAgICwgbGVmdDogcG9zLmxlZnRcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHRoaXMuJG1lbnUuc2hvdygpXHJcbiAgICAgIHRoaXMuc2hvd24gPSB0cnVlXHJcbiAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICwgaGlkZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzLiRtZW51LmhpZGUoKVxyXG4gICAgICB0aGlzLnNob3duID0gZmFsc2VcclxuICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgLCBsb29rdXA6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICB2YXIgaXRlbXNcclxuXHJcbiAgICAgIHRoaXMucXVlcnkgPSB0aGlzLiRlbGVtZW50LnZhbCgpXHJcblxyXG4gICAgICBpZiAoIXRoaXMucXVlcnkgfHwgdGhpcy5xdWVyeS5sZW5ndGggPCB0aGlzLm9wdGlvbnMubWluTGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXNcclxuICAgICAgfVxyXG5cclxuICAgICAgaXRlbXMgPSAkLmlzRnVuY3Rpb24odGhpcy5zb3VyY2UpID8gdGhpcy5zb3VyY2UodGhpcy5xdWVyeSwgJC5wcm94eSh0aGlzLnByb2Nlc3MsIHRoaXMpKSA6IHRoaXMuc291cmNlXHJcblxyXG4gICAgICByZXR1cm4gaXRlbXMgPyB0aGlzLnByb2Nlc3MoaXRlbXMpIDogdGhpc1xyXG4gICAgfVxyXG5cclxuICAsIHByb2Nlc3M6IGZ1bmN0aW9uIChpdGVtcykge1xyXG4gICAgICB2YXIgdGhhdCA9IHRoaXNcclxuXHJcbiAgICAgIGl0ZW1zID0gJC5ncmVwKGl0ZW1zLCBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICAgIHJldHVybiB0aGF0Lm1hdGNoZXIoaXRlbSlcclxuICAgICAgfSlcclxuXHJcbiAgICAgIGl0ZW1zID0gdGhpcy5zb3J0ZXIoaXRlbXMpXHJcblxyXG4gICAgICBpZiAoIWl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlcihpdGVtcy5zbGljZSgwLCB0aGlzLm9wdGlvbnMuaXRlbXMpKS5zaG93KClcclxuICAgIH1cclxuXHJcbiAgLCBtYXRjaGVyOiBmdW5jdGlvbiAoaXRlbSkge1xyXG4gICAgICByZXR1cm4gfml0ZW0udG9Mb3dlckNhc2UoKS5pbmRleE9mKHRoaXMucXVlcnkudG9Mb3dlckNhc2UoKSlcclxuICAgIH1cclxuXHJcbiAgLCBzb3J0ZXI6IGZ1bmN0aW9uIChpdGVtcykge1xyXG4gICAgICB2YXIgYmVnaW5zd2l0aCA9IFtdXHJcbiAgICAgICAgLCBjYXNlU2Vuc2l0aXZlID0gW11cclxuICAgICAgICAsIGNhc2VJbnNlbnNpdGl2ZSA9IFtdXHJcbiAgICAgICAgLCBpdGVtXHJcblxyXG4gICAgICB3aGlsZSAoaXRlbSA9IGl0ZW1zLnNoaWZ0KCkpIHtcclxuICAgICAgICBpZiAoIWl0ZW0udG9Mb3dlckNhc2UoKS5pbmRleE9mKHRoaXMucXVlcnkudG9Mb3dlckNhc2UoKSkpIGJlZ2luc3dpdGgucHVzaChpdGVtKVxyXG4gICAgICAgIGVsc2UgaWYgKH5pdGVtLmluZGV4T2YodGhpcy5xdWVyeSkpIGNhc2VTZW5zaXRpdmUucHVzaChpdGVtKVxyXG4gICAgICAgIGVsc2UgY2FzZUluc2Vuc2l0aXZlLnB1c2goaXRlbSlcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGJlZ2luc3dpdGguY29uY2F0KGNhc2VTZW5zaXRpdmUsIGNhc2VJbnNlbnNpdGl2ZSlcclxuICAgIH1cclxuXHJcbiAgLCBoaWdobGlnaHRlcjogZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgdmFyIHF1ZXJ5ID0gdGhpcy5xdWVyeS5yZXBsYWNlKC9bXFwtXFxbXFxde30oKSorPy4sXFxcXFxcXiR8I1xcc10vZywgJ1xcXFwkJicpXHJcbiAgICAgIHJldHVybiBpdGVtLnJlcGxhY2UobmV3IFJlZ0V4cCgnKCcgKyBxdWVyeSArICcpJywgJ2lnJyksIGZ1bmN0aW9uICgkMSwgbWF0Y2gpIHtcclxuICAgICAgICByZXR1cm4gJzxzdHJvbmc+JyArIG1hdGNoICsgJzwvc3Ryb25nPidcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgLCByZW5kZXI6IGZ1bmN0aW9uIChpdGVtcykge1xyXG4gICAgICB2YXIgdGhhdCA9IHRoaXNcclxuXHJcbiAgICAgIGl0ZW1zID0gJChpdGVtcykubWFwKGZ1bmN0aW9uIChpLCBpdGVtKSB7XHJcbiAgICAgICAgaSA9ICQodGhhdC5vcHRpb25zLml0ZW0pLmF0dHIoJ2RhdGEtdmFsdWUnLCBpdGVtKVxyXG4gICAgICAgIGkuZmluZCgnYScpLmh0bWwodGhhdC5oaWdobGlnaHRlcihpdGVtKSlcclxuICAgICAgICByZXR1cm4gaVswXVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgaXRlbXMuZmlyc3QoKS5hZGRDbGFzcygnYWN0aXZlJylcclxuICAgICAgdGhpcy4kbWVudS5odG1sKGl0ZW1zKVxyXG4gICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAsIG5leHQ6IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICB2YXIgYWN0aXZlID0gdGhpcy4kbWVudS5maW5kKCcuYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXHJcbiAgICAgICAgLCBuZXh0ID0gYWN0aXZlLm5leHQoKVxyXG5cclxuICAgICAgaWYgKCFuZXh0Lmxlbmd0aCkge1xyXG4gICAgICAgIG5leHQgPSAkKHRoaXMuJG1lbnUuZmluZCgnbGknKVswXSlcclxuICAgICAgfVxyXG5cclxuICAgICAgbmV4dC5hZGRDbGFzcygnYWN0aXZlJylcclxuICAgIH1cclxuXHJcbiAgLCBwcmV2OiBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgdmFyIGFjdGl2ZSA9IHRoaXMuJG1lbnUuZmluZCgnLmFjdGl2ZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxyXG4gICAgICAgICwgcHJldiA9IGFjdGl2ZS5wcmV2KClcclxuXHJcbiAgICAgIGlmICghcHJldi5sZW5ndGgpIHtcclxuICAgICAgICBwcmV2ID0gdGhpcy4kbWVudS5maW5kKCdsaScpLmxhc3QoKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBwcmV2LmFkZENsYXNzKCdhY3RpdmUnKVxyXG4gICAgfVxyXG5cclxuICAsIGxpc3RlbjogZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzLiRlbGVtZW50XHJcbiAgICAgICAgLm9uKCdibHVyJywgICAgICQucHJveHkodGhpcy5ibHVyLCB0aGlzKSlcclxuICAgICAgICAub24oJ2tleXByZXNzJywgJC5wcm94eSh0aGlzLmtleXByZXNzLCB0aGlzKSlcclxuICAgICAgICAub24oJ2tleXVwJywgICAgJC5wcm94eSh0aGlzLmtleXVwLCB0aGlzKSlcclxuXHJcbiAgICAgIGlmICgkLmJyb3dzZXIuY2hyb21lIHx8ICQuYnJvd3Nlci53ZWJraXQgfHwgJC5icm93c2VyLm1zaWUpIHtcclxuICAgICAgICB0aGlzLiRlbGVtZW50Lm9uKCdrZXlkb3duJywgJC5wcm94eSh0aGlzLmtleWRvd24sIHRoaXMpKVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLiRtZW51XHJcbiAgICAgICAgLm9uKCdjbGljaycsICQucHJveHkodGhpcy5jbGljaywgdGhpcykpXHJcbiAgICAgICAgLm9uKCdtb3VzZWVudGVyJywgJ2xpJywgJC5wcm94eSh0aGlzLm1vdXNlZW50ZXIsIHRoaXMpKVxyXG4gICAgfVxyXG5cclxuICAsIG1vdmU6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIGlmICghdGhpcy5zaG93bikgcmV0dXJuXHJcblxyXG4gICAgICBzd2l0Y2goZS5rZXlDb2RlKSB7XHJcbiAgICAgICAgY2FzZSA5OiAvLyB0YWJcclxuICAgICAgICBjYXNlIDEzOiAvLyBlbnRlclxyXG4gICAgICAgIGNhc2UgMjc6IC8vIGVzY2FwZVxyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICBjYXNlIDM4OiAvLyB1cCBhcnJvd1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICB0aGlzLnByZXYoKVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgY2FzZSA0MDogLy8gZG93biBhcnJvd1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICB0aGlzLm5leHQoKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgfVxyXG5cclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgfVxyXG5cclxuICAsIGtleWRvd246IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIHRoaXMuc3VwcHJlc3NLZXlQcmVzc1JlcGVhdCA9ICF+JC5pbkFycmF5KGUua2V5Q29kZSwgWzQwLDM4LDksMTMsMjddKVxyXG4gICAgICB0aGlzLm1vdmUoZSlcclxuICAgIH1cclxuXHJcbiAgLCBrZXlwcmVzczogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgaWYgKHRoaXMuc3VwcHJlc3NLZXlQcmVzc1JlcGVhdCkgcmV0dXJuXHJcbiAgICAgIHRoaXMubW92ZShlKVxyXG4gICAgfVxyXG5cclxuICAsIGtleXVwOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICBzd2l0Y2goZS5rZXlDb2RlKSB7XHJcbiAgICAgICAgY2FzZSA0MDogLy8gZG93biBhcnJvd1xyXG4gICAgICAgIGNhc2UgMzg6IC8vIHVwIGFycm93XHJcbiAgICAgICAgICBicmVha1xyXG5cclxuICAgICAgICBjYXNlIDk6IC8vIHRhYlxyXG4gICAgICAgIGNhc2UgMTM6IC8vIGVudGVyXHJcbiAgICAgICAgICBpZiAoIXRoaXMuc2hvd24pIHJldHVyblxyXG4gICAgICAgICAgdGhpcy5zZWxlY3QoKVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgY2FzZSAyNzogLy8gZXNjYXBlXHJcbiAgICAgICAgICBpZiAoIXRoaXMuc2hvd24pIHJldHVyblxyXG4gICAgICAgICAgdGhpcy5oaWRlKClcclxuICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aGlzLmxvb2t1cCgpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgfVxyXG5cclxuICAsIGJsdXI6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIHZhciB0aGF0ID0gdGhpc1xyXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgdGhhdC5oaWRlKCkgfSwgMTUwKVxyXG4gICAgfVxyXG5cclxuICAsIGNsaWNrOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgICB0aGlzLnNlbGVjdCgpXHJcbiAgICB9XHJcblxyXG4gICwgbW91c2VlbnRlcjogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgdGhpcy4kbWVudS5maW5kKCcuYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXHJcbiAgICAgICQoZS5jdXJyZW50VGFyZ2V0KS5hZGRDbGFzcygnYWN0aXZlJylcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLyogVFlQRUFIRUFEIFBMVUdJTiBERUZJTklUSU9OXHJcbiAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICQuZm4udHlwZWFoZWFkID0gZnVuY3Rpb24gKG9wdGlvbikge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgICAsIGRhdGEgPSAkdGhpcy5kYXRhKCd0eXBlYWhlYWQnKVxyXG4gICAgICAgICwgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uXHJcbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgndHlwZWFoZWFkJywgKGRhdGEgPSBuZXcgVHlwZWFoZWFkKHRoaXMsIG9wdGlvbnMpKSlcclxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgJC5mbi50eXBlYWhlYWQuZGVmYXVsdHMgPSB7XHJcbiAgICBzb3VyY2U6IFtdXHJcbiAgLCBpdGVtczogOFxyXG4gICwgbWVudTogJzx1bCBjbGFzcz1cInR5cGVhaGVhZCBkcm9wZG93bi1tZW51XCI+PC91bD4nXHJcbiAgLCBpdGVtOiAnPGxpPjxhIGhyZWY9XCIjXCI+PC9hPjwvbGk+J1xyXG4gICwgbWluTGVuZ3RoOiAxXHJcbiAgfVxyXG5cclxuICAkLmZuLnR5cGVhaGVhZC5Db25zdHJ1Y3RvciA9IFR5cGVhaGVhZFxyXG5cclxuXHJcbiAvKiAgIFRZUEVBSEVBRCBEQVRBLUFQSVxyXG4gICogPT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4gICQoZnVuY3Rpb24gKCkge1xyXG4gICAgJCgnYm9keScpLm9uKCdmb2N1cy50eXBlYWhlYWQuZGF0YS1hcGknLCAnW2RhdGEtcHJvdmlkZT1cInR5cGVhaGVhZFwiXScsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgaWYgKCR0aGlzLmRhdGEoJ3R5cGVhaGVhZCcpKSByZXR1cm5cclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICR0aGlzLnR5cGVhaGVhZCgkdGhpcy5kYXRhKCkpXHJcbiAgICB9KVxyXG4gIH0pXHJcblxyXG59KHdpbmRvdy5qUXVlcnkpO1xyXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIGJvb3RzdHJhcC1hZmZpeC5qcyB2Mi4xLjFcclxuICogaHR0cDovL3R3aXR0ZXIuZ2l0aHViLmNvbS9ib290c3RyYXAvamF2YXNjcmlwdC5odG1sI2FmZml4XHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTIgVHdpdHRlciwgSW5jLlxyXG4gKlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4gKlxyXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG5cclxuIWZ1bmN0aW9uICgkKSB7XHJcblxyXG4gIFwidXNlIHN0cmljdFwiOyAvLyBqc2hpbnQgO187XHJcblxyXG5cclxuIC8qIEFGRklYIENMQVNTIERFRklOSVRJT05cclxuICAqID09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbiAgdmFyIEFmZml4ID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCAkLmZuLmFmZml4LmRlZmF1bHRzLCBvcHRpb25zKVxyXG4gICAgdGhpcy4kd2luZG93ID0gJCh3aW5kb3cpLm9uKCdzY3JvbGwuYWZmaXguZGF0YS1hcGknLCAkLnByb3h5KHRoaXMuY2hlY2tQb3NpdGlvbiwgdGhpcykpXHJcbiAgICB0aGlzLiRlbGVtZW50ID0gJChlbGVtZW50KVxyXG4gICAgdGhpcy5jaGVja1Bvc2l0aW9uKClcclxuICB9XHJcblxyXG4gIEFmZml4LnByb3RvdHlwZS5jaGVja1Bvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKCF0aGlzLiRlbGVtZW50LmlzKCc6dmlzaWJsZScpKSByZXR1cm5cclxuXHJcbiAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gJChkb2N1bWVudCkuaGVpZ2h0KClcclxuICAgICAgLCBzY3JvbGxUb3AgPSB0aGlzLiR3aW5kb3cuc2Nyb2xsVG9wKClcclxuICAgICAgLCBwb3NpdGlvbiA9IHRoaXMuJGVsZW1lbnQub2Zmc2V0KClcclxuICAgICAgLCBvZmZzZXQgPSB0aGlzLm9wdGlvbnMub2Zmc2V0XHJcbiAgICAgICwgb2Zmc2V0Qm90dG9tID0gb2Zmc2V0LmJvdHRvbVxyXG4gICAgICAsIG9mZnNldFRvcCA9IG9mZnNldC50b3BcclxuICAgICAgLCByZXNldCA9ICdhZmZpeCBhZmZpeC10b3AgYWZmaXgtYm90dG9tJ1xyXG4gICAgICAsIGFmZml4XHJcblxyXG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgIT0gJ29iamVjdCcpIG9mZnNldEJvdHRvbSA9IG9mZnNldFRvcCA9IG9mZnNldFxyXG4gICAgaWYgKHR5cGVvZiBvZmZzZXRUb3AgPT0gJ2Z1bmN0aW9uJykgb2Zmc2V0VG9wID0gb2Zmc2V0LnRvcCgpXHJcbiAgICBpZiAodHlwZW9mIG9mZnNldEJvdHRvbSA9PSAnZnVuY3Rpb24nKSBvZmZzZXRCb3R0b20gPSBvZmZzZXQuYm90dG9tKClcclxuXHJcbiAgICBhZmZpeCA9IHRoaXMudW5waW4gIT0gbnVsbCAmJiAoc2Nyb2xsVG9wICsgdGhpcy51bnBpbiA8PSBwb3NpdGlvbi50b3ApID9cclxuICAgICAgZmFsc2UgICAgOiBvZmZzZXRCb3R0b20gIT0gbnVsbCAmJiAocG9zaXRpb24udG9wICsgdGhpcy4kZWxlbWVudC5oZWlnaHQoKSA+PSBzY3JvbGxIZWlnaHQgLSBvZmZzZXRCb3R0b20pID9cclxuICAgICAgJ2JvdHRvbScgOiBvZmZzZXRUb3AgIT0gbnVsbCAmJiBzY3JvbGxUb3AgPD0gb2Zmc2V0VG9wID9cclxuICAgICAgJ3RvcCcgICAgOiBmYWxzZVxyXG5cclxuICAgIGlmICh0aGlzLmFmZml4ZWQgPT09IGFmZml4KSByZXR1cm5cclxuXHJcbiAgICB0aGlzLmFmZml4ZWQgPSBhZmZpeFxyXG4gICAgdGhpcy51bnBpbiA9IGFmZml4ID09ICdib3R0b20nID8gcG9zaXRpb24udG9wIC0gc2Nyb2xsVG9wIDogbnVsbFxyXG5cclxuICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MocmVzZXQpLmFkZENsYXNzKCdhZmZpeCcgKyAoYWZmaXggPyAnLScgKyBhZmZpeCA6ICcnKSlcclxuICB9XHJcblxyXG5cclxuIC8qIEFGRklYIFBMVUdJTiBERUZJTklUSU9OXHJcbiAgKiA9PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuICAkLmZuLmFmZml4ID0gZnVuY3Rpb24gKG9wdGlvbikge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgICAsIGRhdGEgPSAkdGhpcy5kYXRhKCdhZmZpeCcpXHJcbiAgICAgICAgLCBvcHRpb25zID0gdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb25cclxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdhZmZpeCcsIChkYXRhID0gbmV3IEFmZml4KHRoaXMsIG9wdGlvbnMpKSlcclxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgJC5mbi5hZmZpeC5Db25zdHJ1Y3RvciA9IEFmZml4XHJcblxyXG4gICQuZm4uYWZmaXguZGVmYXVsdHMgPSB7XHJcbiAgICBvZmZzZXQ6IDBcclxuICB9XHJcblxyXG5cclxuIC8qIEFGRklYIERBVEEtQVBJXHJcbiAgKiA9PT09PT09PT09PT09PSAqL1xyXG5cclxuICAkKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAkKCdbZGF0YS1zcHk9XCJhZmZpeFwiXScpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgJHNweSA9ICQodGhpcylcclxuICAgICAgICAsIGRhdGEgPSAkc3B5LmRhdGEoKVxyXG5cclxuICAgICAgZGF0YS5vZmZzZXQgPSBkYXRhLm9mZnNldCB8fCB7fVxyXG5cclxuICAgICAgZGF0YS5vZmZzZXRCb3R0b20gJiYgKGRhdGEub2Zmc2V0LmJvdHRvbSA9IGRhdGEub2Zmc2V0Qm90dG9tKVxyXG4gICAgICBkYXRhLm9mZnNldFRvcCAmJiAoZGF0YS5vZmZzZXQudG9wID0gZGF0YS5vZmZzZXRUb3ApXHJcblxyXG4gICAgICAkc3B5LmFmZml4KGRhdGEpXHJcbiAgICB9KVxyXG4gIH0pXHJcblxyXG5cclxufSh3aW5kb3cualF1ZXJ5KTtcclxuIiwiLyohXHJcbiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuOC4xXHJcbiAqIGh0dHA6Ly9qcXVlcnkuY29tL1xyXG4gKlxyXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcclxuICogaHR0cDovL3NpenpsZWpzLmNvbS9cclxuICpcclxuICogQ29weXJpZ2h0IDIwMTIgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xyXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcclxuICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZVxyXG4gKlxyXG4gKiBEYXRlOiBUaHUgQXVnIDMwIDIwMTIgMTc6MTc6MjIgR01ULTA0MDAgKEVhc3Rlcm4gRGF5bGlnaHQgVGltZSlcclxuICovXHJcbihmdW5jdGlvbiggd2luZG93LCB1bmRlZmluZWQgKSB7XHJcbnZhclxyXG5cdC8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KVxyXG5cdHJvb3RqUXVlcnksXHJcblxyXG5cdC8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeVxyXG5cdHJlYWR5TGlzdCxcclxuXHJcblx0Ly8gVXNlIHRoZSBjb3JyZWN0IGRvY3VtZW50IGFjY29yZGluZ2x5IHdpdGggd2luZG93IGFyZ3VtZW50IChzYW5kYm94KVxyXG5cdGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50LFxyXG5cdGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLFxyXG5cdG5hdmlnYXRvciA9IHdpbmRvdy5uYXZpZ2F0b3IsXHJcblxyXG5cdC8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxyXG5cdF9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LFxyXG5cclxuXHQvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxyXG5cdF8kID0gd2luZG93LiQsXHJcblxyXG5cdC8vIFNhdmUgYSByZWZlcmVuY2UgdG8gc29tZSBjb3JlIG1ldGhvZHNcclxuXHRjb3JlX3B1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaCxcclxuXHRjb3JlX3NsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLFxyXG5cdGNvcmVfaW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLFxyXG5cdGNvcmVfdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLFxyXG5cdGNvcmVfaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcclxuXHRjb3JlX3RyaW0gPSBTdHJpbmcucHJvdG90eXBlLnRyaW0sXHJcblxyXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XHJcblx0alF1ZXJ5ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xyXG5cdFx0Ly8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnXHJcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KCBzZWxlY3RvciwgY29udGV4dCwgcm9vdGpRdWVyeSApO1xyXG5cdH0sXHJcblxyXG5cdC8vIFVzZWQgZm9yIG1hdGNoaW5nIG51bWJlcnNcclxuXHRjb3JlX3BudW0gPSAvW1xcLStdPyg/OlxcZCpcXC58KVxcZCsoPzpbZUVdW1xcLStdP1xcZCt8KS8uc291cmNlLFxyXG5cclxuXHQvLyBVc2VkIGZvciBkZXRlY3RpbmcgYW5kIHRyaW1taW5nIHdoaXRlc3BhY2VcclxuXHRjb3JlX3Jub3R3aGl0ZSA9IC9cXFMvLFxyXG5cdGNvcmVfcnNwYWNlID0gL1xccysvLFxyXG5cclxuXHQvLyBNYWtlIHN1cmUgd2UgdHJpbSBCT00gYW5kIE5CU1AgKGhlcmUncyBsb29raW5nIGF0IHlvdSwgU2FmYXJpIDUuMCBhbmQgSUUpXHJcblx0cnRyaW0gPSAvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2csXHJcblxyXG5cdC8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzXHJcblx0Ly8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKVxyXG5cdHJxdWlja0V4cHIgPSAvXig/OlteIzxdKig8W1xcd1xcV10rPilbXj5dKiR8IyhbXFx3XFwtXSopJCkvLFxyXG5cclxuXHQvLyBNYXRjaCBhIHN0YW5kYWxvbmUgdGFnXHJcblx0cnNpbmdsZVRhZyA9IC9ePChcXHcrKVxccypcXC8/Pig/OjxcXC9cXDE+fCkkLyxcclxuXHJcblx0Ly8gSlNPTiBSZWdFeHBcclxuXHRydmFsaWRjaGFycyA9IC9eW1xcXSw6e31cXHNdKiQvLFxyXG5cdHJ2YWxpZGJyYWNlcyA9IC8oPzpefDp8LCkoPzpcXHMqXFxbKSsvZyxcclxuXHRydmFsaWRlc2NhcGUgPSAvXFxcXCg/OltcIlxcXFxcXC9iZm5ydF18dVtcXGRhLWZBLUZdezR9KS9nLFxyXG5cdHJ2YWxpZHRva2VucyA9IC9cIlteXCJcXFxcXFxyXFxuXSpcInx0cnVlfGZhbHNlfG51bGx8LT8oPzpcXGRcXGQqXFwufClcXGQrKD86W2VFXVtcXC0rXT9cXGQrfCkvZyxcclxuXHJcblx0Ly8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nXHJcblx0cm1zUHJlZml4ID0gL14tbXMtLyxcclxuXHRyZGFzaEFscGhhID0gLy0oW1xcZGEtel0pL2dpLFxyXG5cclxuXHQvLyBVc2VkIGJ5IGpRdWVyeS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXHJcblx0ZmNhbWVsQ2FzZSA9IGZ1bmN0aW9uKCBhbGwsIGxldHRlciApIHtcclxuXHRcdHJldHVybiAoIGxldHRlciArIFwiXCIgKS50b1VwcGVyQ2FzZSgpO1xyXG5cdH0sXHJcblxyXG5cdC8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kXHJcblx0RE9NQ29udGVudExvYWRlZCA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0aWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkge1xyXG5cdFx0XHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgRE9NQ29udGVudExvYWRlZCwgZmFsc2UgKTtcclxuXHRcdFx0alF1ZXJ5LnJlYWR5KCk7XHJcblx0XHR9IGVsc2UgaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIgKSB7XHJcblx0XHRcdC8vIHdlJ3JlIGhlcmUgYmVjYXVzZSByZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIgaW4gb2xkSUVcclxuXHRcdFx0Ly8gd2hpY2ggaXMgZ29vZCBlbm91Z2ggZm9yIHVzIHRvIGNhbGwgdGhlIGRvbSByZWFkeSFcclxuXHRcdFx0ZG9jdW1lbnQuZGV0YWNoRXZlbnQoIFwib25yZWFkeXN0YXRlY2hhbmdlXCIsIERPTUNvbnRlbnRMb2FkZWQgKTtcclxuXHRcdFx0alF1ZXJ5LnJlYWR5KCk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly8gW1tDbGFzc11dIC0+IHR5cGUgcGFpcnNcclxuXHRjbGFzczJ0eXBlID0ge307XHJcblxyXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xyXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXHJcblx0aW5pdDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByb290alF1ZXJ5ICkge1xyXG5cdFx0dmFyIG1hdGNoLCBlbGVtLCByZXQsIGRvYztcclxuXHJcblx0XHQvLyBIYW5kbGUgJChcIlwiKSwgJChudWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKVxyXG5cdFx0aWYgKCAhc2VsZWN0b3IgKSB7XHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEhhbmRsZSAkKERPTUVsZW1lbnQpXHJcblx0XHRpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xyXG5cdFx0XHR0aGlzLmNvbnRleHQgPSB0aGlzWzBdID0gc2VsZWN0b3I7XHJcblx0XHRcdHRoaXMubGVuZ3RoID0gMTtcclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gSGFuZGxlIEhUTUwgc3RyaW5nc1xyXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XHJcblx0XHRcdGlmICggc2VsZWN0b3IuY2hhckF0KDApID09PSBcIjxcIiAmJiBzZWxlY3Rvci5jaGFyQXQoIHNlbGVjdG9yLmxlbmd0aCAtIDEgKSA9PT0gXCI+XCIgJiYgc2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XHJcblx0XHRcdFx0Ly8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2tcclxuXHRcdFx0XHRtYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0bWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE1hdGNoIGh0bWwgb3IgbWFrZSBzdXJlIG5vIGNvbnRleHQgaXMgc3BlY2lmaWVkIGZvciAjaWRcclxuXHRcdFx0aWYgKCBtYXRjaCAmJiAobWF0Y2hbMV0gfHwgIWNvbnRleHQpICkge1xyXG5cclxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSlcclxuXHRcdFx0XHRpZiAoIG1hdGNoWzFdICkge1xyXG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WzBdIDogY29udGV4dDtcclxuXHRcdFx0XHRcdGRvYyA9ICggY29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCApO1xyXG5cclxuXHRcdFx0XHRcdC8vIHNjcmlwdHMgaXMgdHJ1ZSBmb3IgYmFjay1jb21wYXRcclxuXHRcdFx0XHRcdHNlbGVjdG9yID0galF1ZXJ5LnBhcnNlSFRNTCggbWF0Y2hbMV0sIGRvYywgdHJ1ZSApO1xyXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWzFdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5hdHRyLmNhbGwoIHNlbGVjdG9yLCBjb250ZXh0LCB0cnVlICk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5tZXJnZSggdGhpcywgc2VsZWN0b3IgKTtcclxuXHJcblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsyXSApO1xyXG5cclxuXHRcdFx0XHRcdC8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zXHJcblx0XHRcdFx0XHQvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzXHJcblx0XHRcdFx0XHRpZiAoIGVsZW0gJiYgZWxlbS5wYXJlbnROb2RlICkge1xyXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgSUUgYW5kIE9wZXJhIHJldHVybiBpdGVtc1xyXG5cdFx0XHRcdFx0XHQvLyBieSBuYW1lIGluc3RlYWQgb2YgSURcclxuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLmlkICE9PSBtYXRjaFsyXSApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcm9vdGpRdWVyeS5maW5kKCBzZWxlY3RvciApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0XHJcblx0XHRcdFx0XHRcdHRoaXMubGVuZ3RoID0gMTtcclxuXHRcdFx0XHRcdFx0dGhpc1swXSA9IGVsZW07XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5jb250ZXh0ID0gZG9jdW1lbnQ7XHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7XHJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKVxyXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcclxuXHRcdFx0XHRyZXR1cm4gKCBjb250ZXh0IHx8IHJvb3RqUXVlcnkgKS5maW5kKCBzZWxlY3RvciApO1xyXG5cclxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXHJcblx0XHRcdC8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcclxuXHRcdC8vIFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeVxyXG5cdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHNlbGVjdG9yICkgKSB7XHJcblx0XHRcdHJldHVybiByb290alF1ZXJ5LnJlYWR5KCBzZWxlY3RvciApO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggc2VsZWN0b3Iuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0dGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yLnNlbGVjdG9yO1xyXG5cdFx0XHR0aGlzLmNvbnRleHQgPSBzZWxlY3Rvci5jb250ZXh0O1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xyXG5cdH0sXHJcblxyXG5cdC8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3JcclxuXHRzZWxlY3RvcjogXCJcIixcclxuXHJcblx0Ly8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBqUXVlcnkgYmVpbmcgdXNlZFxyXG5cdGpxdWVyeTogXCIxLjguMVwiLFxyXG5cclxuXHQvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDBcclxuXHRsZW5ndGg6IDAsXHJcblxyXG5cdC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0XHJcblx0c2l6ZTogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5sZW5ndGg7XHJcblx0fSxcclxuXHJcblx0dG9BcnJheTogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gY29yZV9zbGljZS5jYWxsKCB0aGlzICk7XHJcblx0fSxcclxuXHJcblx0Ly8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUlxyXG5cdC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5XHJcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xyXG5cdFx0cmV0dXJuIG51bSA9PSBudWxsID9cclxuXHJcblx0XHRcdC8vIFJldHVybiBhICdjbGVhbicgYXJyYXlcclxuXHRcdFx0dGhpcy50b0FycmF5KCkgOlxyXG5cclxuXHRcdFx0Ly8gUmV0dXJuIGp1c3QgdGhlIG9iamVjdFxyXG5cdFx0XHQoIG51bSA8IDAgPyB0aGlzWyB0aGlzLmxlbmd0aCArIG51bSBdIDogdGhpc1sgbnVtIF0gKTtcclxuXHR9LFxyXG5cclxuXHQvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrXHJcblx0Ly8gKHJldHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpXHJcblx0cHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkge1xyXG5cclxuXHRcdC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0XHJcblx0XHR2YXIgcmV0ID0galF1ZXJ5Lm1lcmdlKCB0aGlzLmNvbnN0cnVjdG9yKCksIGVsZW1zICk7XHJcblxyXG5cdFx0Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSlcclxuXHRcdHJldC5wcmV2T2JqZWN0ID0gdGhpcztcclxuXHJcblx0XHRyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDtcclxuXHJcblx0XHRpZiAoIG5hbWUgPT09IFwiZmluZFwiICkge1xyXG5cdFx0XHRyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICsgKCB0aGlzLnNlbGVjdG9yID8gXCIgXCIgOiBcIlwiICkgKyBzZWxlY3RvcjtcclxuXHRcdH0gZWxzZSBpZiAoIG5hbWUgKSB7XHJcblx0XHRcdHJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyBcIi5cIiArIG5hbWUgKyBcIihcIiArIHNlbGVjdG9yICsgXCIpXCI7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXRcclxuXHRcdHJldHVybiByZXQ7XHJcblx0fSxcclxuXHJcblx0Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC5cclxuXHQvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpc1xyXG5cdC8vIG9ubHkgdXNlZCBpbnRlcm5hbGx5LilcclxuXHRlYWNoOiBmdW5jdGlvbiggY2FsbGJhY2ssIGFyZ3MgKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrLCBhcmdzICk7XHJcblx0fSxcclxuXHJcblx0cmVhZHk6IGZ1bmN0aW9uKCBmbiApIHtcclxuXHRcdC8vIEFkZCB0aGUgY2FsbGJhY2tcclxuXHRcdGpRdWVyeS5yZWFkeS5wcm9taXNlKCkuZG9uZSggZm4gKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cclxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XHJcblx0XHRpID0gK2k7XHJcblx0XHRyZXR1cm4gaSA9PT0gLTEgP1xyXG5cdFx0XHR0aGlzLnNsaWNlKCBpICkgOlxyXG5cdFx0XHR0aGlzLnNsaWNlKCBpLCBpICsgMSApO1xyXG5cdH0sXHJcblxyXG5cdGZpcnN0OiBmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiB0aGlzLmVxKCAwICk7XHJcblx0fSxcclxuXHJcblx0bGFzdDogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcclxuXHR9LFxyXG5cclxuXHRzbGljZTogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGNvcmVfc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApLFxyXG5cdFx0XHRcInNsaWNlXCIsIGNvcmVfc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oXCIsXCIpICk7XHJcblx0fSxcclxuXHJcblx0bWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAodGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XHJcblx0XHRcdHJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7XHJcblx0XHR9KSk7XHJcblx0fSxcclxuXHJcblx0ZW5kOiBmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcihudWxsKTtcclxuXHR9LFxyXG5cclxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXHJcblx0Ly8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuXHJcblx0cHVzaDogY29yZV9wdXNoLFxyXG5cdHNvcnQ6IFtdLnNvcnQsXHJcblx0c3BsaWNlOiBbXS5zcGxpY2VcclxufTtcclxuXHJcbi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb25cclxualF1ZXJ5LmZuLmluaXQucHJvdG90eXBlID0galF1ZXJ5LmZuO1xyXG5cclxualF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHtcclxuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXHJcblx0XHR0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sXHJcblx0XHRpID0gMSxcclxuXHRcdGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXHJcblx0XHRkZWVwID0gZmFsc2U7XHJcblxyXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cclxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xyXG5cdFx0ZGVlcCA9IHRhcmdldDtcclxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sxXSB8fCB7fTtcclxuXHRcdC8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXRcclxuXHRcdGkgPSAyO1xyXG5cdH1cclxuXHJcblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXHJcblx0aWYgKCB0eXBlb2YgdGFyZ2V0ICE9PSBcIm9iamVjdFwiICYmICFqUXVlcnkuaXNGdW5jdGlvbih0YXJnZXQpICkge1xyXG5cdFx0dGFyZ2V0ID0ge307XHJcblx0fVxyXG5cclxuXHQvLyBleHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWRcclxuXHRpZiAoIGxlbmd0aCA9PT0gaSApIHtcclxuXHRcdHRhcmdldCA9IHRoaXM7XHJcblx0XHQtLWk7XHJcblx0fVxyXG5cclxuXHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcclxuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcclxuXHRcdGlmICggKG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSkgIT0gbnVsbCApIHtcclxuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxyXG5cdFx0XHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XHJcblx0XHRcdFx0c3JjID0gdGFyZ2V0WyBuYW1lIF07XHJcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcclxuXHJcblx0XHRcdFx0Ly8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcFxyXG5cdFx0XHRcdGlmICggdGFyZ2V0ID09PSBjb3B5ICkge1xyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXNcclxuXHRcdFx0XHRpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KGNvcHkpIHx8IChjb3B5SXNBcnJheSA9IGpRdWVyeS5pc0FycmF5KGNvcHkpKSApICkge1xyXG5cdFx0XHRcdFx0aWYgKCBjb3B5SXNBcnJheSApIHtcclxuXHRcdFx0XHRcdFx0Y29weUlzQXJyYXkgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KHNyYykgPyBzcmMgOiB7fTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW1cclxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcclxuXHJcblx0XHRcdFx0Ly8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlc1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0gY29weTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0XHJcblx0cmV0dXJuIHRhcmdldDtcclxufTtcclxuXHJcbmpRdWVyeS5leHRlbmQoe1xyXG5cdG5vQ29uZmxpY3Q6IGZ1bmN0aW9uKCBkZWVwICkge1xyXG5cdFx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xyXG5cdFx0XHR3aW5kb3cuJCA9IF8kO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZGVlcCAmJiB3aW5kb3cualF1ZXJ5ID09PSBqUXVlcnkgKSB7XHJcblx0XHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBqUXVlcnk7XHJcblx0fSxcclxuXHJcblx0Ly8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy5cclxuXHRpc1JlYWR5OiBmYWxzZSxcclxuXHJcblx0Ly8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZVxyXG5cdC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxXHJcblx0cmVhZHlXYWl0OiAxLFxyXG5cclxuXHQvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnRcclxuXHRob2xkUmVhZHk6IGZ1bmN0aW9uKCBob2xkICkge1xyXG5cdFx0aWYgKCBob2xkICkge1xyXG5cdFx0XHRqUXVlcnkucmVhZHlXYWl0Kys7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRqUXVlcnkucmVhZHkoIHRydWUgKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XHJcblx0cmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkge1xyXG5cclxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcclxuXHRcdGlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gTWFrZSBzdXJlIGJvZHkgZXhpc3RzLCBhdCBsZWFzdCwgaW4gY2FzZSBJRSBnZXRzIGEgbGl0dGxlIG92ZXJ6ZWFsb3VzICh0aWNrZXQgIzU0NDMpLlxyXG5cdFx0aWYgKCAhZG9jdW1lbnQuYm9keSApIHtcclxuXHRcdFx0cmV0dXJuIHNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSwgMSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeVxyXG5cdFx0alF1ZXJ5LmlzUmVhZHkgPSB0cnVlO1xyXG5cclxuXHRcdC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBmaXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlXHJcblx0XHRpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcclxuXHRcdHJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTtcclxuXHJcblx0XHQvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHNcclxuXHRcdGlmICggalF1ZXJ5LmZuLnRyaWdnZXIgKSB7XHJcblx0XHRcdGpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VyKFwicmVhZHlcIikub2ZmKFwicmVhZHlcIik7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly8gU2VlIHRlc3QvdW5pdC9jb3JlLmpzIGZvciBkZXRhaWxzIGNvbmNlcm5pbmcgaXNGdW5jdGlvbi5cclxuXHQvLyBTaW5jZSB2ZXJzaW9uIDEuMywgRE9NIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyBsaWtlIGFsZXJ0XHJcblx0Ly8gYXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4KS5cclxuXHRpc0Z1bmN0aW9uOiBmdW5jdGlvbiggb2JqICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09IFwiZnVuY3Rpb25cIjtcclxuXHR9LFxyXG5cclxuXHRpc0FycmF5OiBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uKCBvYmogKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gXCJhcnJheVwiO1xyXG5cdH0sXHJcblxyXG5cdGlzV2luZG93OiBmdW5jdGlvbiggb2JqICkge1xyXG5cdFx0cmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PSBvYmoud2luZG93O1xyXG5cdH0sXHJcblxyXG5cdGlzTnVtZXJpYzogZnVuY3Rpb24oIG9iaiApIHtcclxuXHRcdHJldHVybiAhaXNOYU4oIHBhcnNlRmxvYXQob2JqKSApICYmIGlzRmluaXRlKCBvYmogKTtcclxuXHR9LFxyXG5cclxuXHR0eXBlOiBmdW5jdGlvbiggb2JqICkge1xyXG5cdFx0cmV0dXJuIG9iaiA9PSBudWxsID9cclxuXHRcdFx0U3RyaW5nKCBvYmogKSA6XHJcblx0XHRcdGNsYXNzMnR5cGVbIGNvcmVfdG9TdHJpbmcuY2FsbChvYmopIF0gfHwgXCJvYmplY3RcIjtcclxuXHR9LFxyXG5cclxuXHRpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xyXG5cdFx0Ly8gTXVzdCBiZSBhbiBPYmplY3QuXHJcblx0XHQvLyBCZWNhdXNlIG9mIElFLCB3ZSBhbHNvIGhhdmUgdG8gY2hlY2sgdGhlIHByZXNlbmNlIG9mIHRoZSBjb25zdHJ1Y3RvciBwcm9wZXJ0eS5cclxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IERPTSBub2RlcyBhbmQgd2luZG93IG9iamVjdHMgZG9uJ3QgcGFzcyB0aHJvdWdoLCBhcyB3ZWxsXHJcblx0XHRpZiAoICFvYmogfHwgalF1ZXJ5LnR5cGUob2JqKSAhPT0gXCJvYmplY3RcIiB8fCBvYmoubm9kZVR5cGUgfHwgalF1ZXJ5LmlzV2luZG93KCBvYmogKSApIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRyeSB7XHJcblx0XHRcdC8vIE5vdCBvd24gY29uc3RydWN0b3IgcHJvcGVydHkgbXVzdCBiZSBPYmplY3RcclxuXHRcdFx0aWYgKCBvYmouY29uc3RydWN0b3IgJiZcclxuXHRcdFx0XHQhY29yZV9oYXNPd24uY2FsbChvYmosIFwiY29uc3RydWN0b3JcIikgJiZcclxuXHRcdFx0XHQhY29yZV9oYXNPd24uY2FsbChvYmouY29uc3RydWN0b3IucHJvdG90eXBlLCBcImlzUHJvdG90eXBlT2ZcIikgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0Ly8gSUU4LDkgV2lsbCB0aHJvdyBleGNlcHRpb25zIG9uIGNlcnRhaW4gaG9zdCBvYmplY3RzICM5ODk3XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBPd24gcHJvcGVydGllcyBhcmUgZW51bWVyYXRlZCBmaXJzdGx5LCBzbyB0byBzcGVlZCB1cCxcclxuXHRcdC8vIGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLlxyXG5cclxuXHRcdHZhciBrZXk7XHJcblx0XHRmb3IgKCBrZXkgaW4gb2JqICkge31cclxuXHJcblx0XHRyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgfHwgY29yZV9oYXNPd24uY2FsbCggb2JqLCBrZXkgKTtcclxuXHR9LFxyXG5cclxuXHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xyXG5cdFx0dmFyIG5hbWU7XHJcblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fSxcclxuXHJcblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xyXG5cdH0sXHJcblxyXG5cdC8vIGRhdGE6IHN0cmluZyBvZiBodG1sXHJcblx0Ly8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LCBkZWZhdWx0cyB0byBkb2N1bWVudFxyXG5cdC8vIHNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZ1xyXG5cdHBhcnNlSFRNTDogZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIHNjcmlwdHMgKSB7XHJcblx0XHR2YXIgcGFyc2VkO1xyXG5cdFx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcImJvb2xlYW5cIiApIHtcclxuXHRcdFx0c2NyaXB0cyA9IGNvbnRleHQ7XHJcblx0XHRcdGNvbnRleHQgPSAwO1xyXG5cdFx0fVxyXG5cdFx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XHJcblxyXG5cdFx0Ly8gU2luZ2xlIHRhZ1xyXG5cdFx0aWYgKCAocGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICkpICkge1xyXG5cdFx0XHRyZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNlZFsxXSApIF07XHJcblx0XHR9XHJcblxyXG5cdFx0cGFyc2VkID0galF1ZXJ5LmJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzID8gbnVsbCA6IFtdICk7XHJcblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSxcclxuXHRcdFx0KHBhcnNlZC5jYWNoZWFibGUgPyBqUXVlcnkuY2xvbmUoIHBhcnNlZC5mcmFnbWVudCApIDogcGFyc2VkLmZyYWdtZW50KS5jaGlsZE5vZGVzICk7XHJcblx0fSxcclxuXHJcblx0cGFyc2VKU09OOiBmdW5jdGlvbiggZGF0YSApIHtcclxuXHRcdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gTWFrZSBzdXJlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyByZW1vdmVkIChJRSBjYW4ndCBoYW5kbGUgaXQpXHJcblx0XHRkYXRhID0galF1ZXJ5LnRyaW0oIGRhdGEgKTtcclxuXHJcblx0XHQvLyBBdHRlbXB0IHRvIHBhcnNlIHVzaW5nIHRoZSBuYXRpdmUgSlNPTiBwYXJzZXIgZmlyc3RcclxuXHRcdGlmICggd2luZG93LkpTT04gJiYgd2luZG93LkpTT04ucGFyc2UgKSB7XHJcblx0XHRcdHJldHVybiB3aW5kb3cuSlNPTi5wYXJzZSggZGF0YSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE1ha2Ugc3VyZSB0aGUgaW5jb21pbmcgZGF0YSBpcyBhY3R1YWwgSlNPTlxyXG5cdFx0Ly8gTG9naWMgYm9ycm93ZWQgZnJvbSBodHRwOi8vanNvbi5vcmcvanNvbjIuanNcclxuXHRcdGlmICggcnZhbGlkY2hhcnMudGVzdCggZGF0YS5yZXBsYWNlKCBydmFsaWRlc2NhcGUsIFwiQFwiIClcclxuXHRcdFx0LnJlcGxhY2UoIHJ2YWxpZHRva2VucywgXCJdXCIgKVxyXG5cdFx0XHQucmVwbGFjZSggcnZhbGlkYnJhY2VzLCBcIlwiKSkgKSB7XHJcblxyXG5cdFx0XHRyZXR1cm4gKCBuZXcgRnVuY3Rpb24oIFwicmV0dXJuIFwiICsgZGF0YSApICkoKTtcclxuXHJcblx0XHR9XHJcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBKU09OOiBcIiArIGRhdGEgKTtcclxuXHR9LFxyXG5cclxuXHQvLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXHJcblx0cGFyc2VYTUw6IGZ1bmN0aW9uKCBkYXRhICkge1xyXG5cdFx0dmFyIHhtbCwgdG1wO1xyXG5cdFx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0XHR0cnkge1xyXG5cdFx0XHRpZiAoIHdpbmRvdy5ET01QYXJzZXIgKSB7IC8vIFN0YW5kYXJkXHJcblx0XHRcdFx0dG1wID0gbmV3IERPTVBhcnNlcigpO1xyXG5cdFx0XHRcdHhtbCA9IHRtcC5wYXJzZUZyb21TdHJpbmcoIGRhdGEgLCBcInRleHQveG1sXCIgKTtcclxuXHRcdFx0fSBlbHNlIHsgLy8gSUVcclxuXHRcdFx0XHR4bWwgPSBuZXcgQWN0aXZlWE9iamVjdCggXCJNaWNyb3NvZnQuWE1MRE9NXCIgKTtcclxuXHRcdFx0XHR4bWwuYXN5bmMgPSBcImZhbHNlXCI7XHJcblx0XHRcdFx0eG1sLmxvYWRYTUwoIGRhdGEgKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBjYXRjaCggZSApIHtcclxuXHRcdFx0eG1sID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCAheG1sIHx8ICF4bWwuZG9jdW1lbnRFbGVtZW50IHx8IHhtbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJwYXJzZXJlcnJvclwiICkubGVuZ3RoICkge1xyXG5cdFx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgZGF0YSApO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHhtbDtcclxuXHR9LFxyXG5cclxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxyXG5cclxuXHQvLyBFdmFsdWF0ZXMgYSBzY3JpcHQgaW4gYSBnbG9iYWwgY29udGV4dFxyXG5cdC8vIFdvcmthcm91bmRzIGJhc2VkIG9uIGZpbmRpbmdzIGJ5IEppbSBEcmlzY29sbFxyXG5cdC8vIGh0dHA6Ly93ZWJsb2dzLmphdmEubmV0L2Jsb2cvZHJpc2NvbGwvYXJjaGl2ZS8yMDA5LzA5LzA4L2V2YWwtamF2YXNjcmlwdC1nbG9iYWwtY29udGV4dFxyXG5cdGdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBkYXRhICkge1xyXG5cdFx0aWYgKCBkYXRhICYmIGNvcmVfcm5vdHdoaXRlLnRlc3QoIGRhdGEgKSApIHtcclxuXHRcdFx0Ly8gV2UgdXNlIGV4ZWNTY3JpcHQgb24gSW50ZXJuZXQgRXhwbG9yZXJcclxuXHRcdFx0Ly8gV2UgdXNlIGFuIGFub255bW91cyBmdW5jdGlvbiBzbyB0aGF0IGNvbnRleHQgaXMgd2luZG93XHJcblx0XHRcdC8vIHJhdGhlciB0aGFuIGpRdWVyeSBpbiBGaXJlZm94XHJcblx0XHRcdCggd2luZG93LmV4ZWNTY3JpcHQgfHwgZnVuY3Rpb24oIGRhdGEgKSB7XHJcblx0XHRcdFx0d2luZG93WyBcImV2YWxcIiBdLmNhbGwoIHdpbmRvdywgZGF0YSApO1xyXG5cdFx0XHR9ICkoIGRhdGEgKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHQvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzXHJcblx0Ly8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKCM5NTcyKVxyXG5cdGNhbWVsQ2FzZTogZnVuY3Rpb24oIHN0cmluZyApIHtcclxuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCBcIm1zLVwiICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApO1xyXG5cdH0sXHJcblxyXG5cdG5vZGVOYW1lOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcclxuXHRcdHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gbmFtZS50b1VwcGVyQ2FzZSgpO1xyXG5cdH0sXHJcblxyXG5cdC8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcclxuXHRlYWNoOiBmdW5jdGlvbiggb2JqLCBjYWxsYmFjaywgYXJncyApIHtcclxuXHRcdHZhciBuYW1lLFxyXG5cdFx0XHRpID0gMCxcclxuXHRcdFx0bGVuZ3RoID0gb2JqLmxlbmd0aCxcclxuXHRcdFx0aXNPYmogPSBsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNGdW5jdGlvbiggb2JqICk7XHJcblxyXG5cdFx0aWYgKCBhcmdzICkge1xyXG5cdFx0XHRpZiAoIGlzT2JqICkge1xyXG5cdFx0XHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xyXG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5hcHBseSggb2JqWyBuYW1lIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKSB7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7ICkge1xyXG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5hcHBseSggb2JqWyBpKysgXSwgYXJncyApID09PSBmYWxzZSApIHtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0Ly8gQSBzcGVjaWFsLCBmYXN0LCBjYXNlIGZvciB0aGUgbW9zdCBjb21tb24gdXNlIG9mIGVhY2hcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmICggaXNPYmogKSB7XHJcblx0XHRcdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XHJcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgbmFtZSBdLCBuYW1lLCBvYmpbIG5hbWUgXSApID09PSBmYWxzZSApIHtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgKSB7XHJcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkrKyBdICkgPT09IGZhbHNlICkge1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gb2JqO1xyXG5cdH0sXHJcblxyXG5cdC8vIFVzZSBuYXRpdmUgU3RyaW5nLnRyaW0gZnVuY3Rpb24gd2hlcmV2ZXIgcG9zc2libGVcclxuXHR0cmltOiBjb3JlX3RyaW0gJiYgIWNvcmVfdHJpbS5jYWxsKFwiXFx1RkVGRlxceEEwXCIpID9cclxuXHRcdGZ1bmN0aW9uKCB0ZXh0ICkge1xyXG5cdFx0XHRyZXR1cm4gdGV4dCA9PSBudWxsID9cclxuXHRcdFx0XHRcIlwiIDpcclxuXHRcdFx0XHRjb3JlX3RyaW0uY2FsbCggdGV4dCApO1xyXG5cdFx0fSA6XHJcblxyXG5cdFx0Ly8gT3RoZXJ3aXNlIHVzZSBvdXIgb3duIHRyaW1taW5nIGZ1bmN0aW9uYWxpdHlcclxuXHRcdGZ1bmN0aW9uKCB0ZXh0ICkge1xyXG5cdFx0XHRyZXR1cm4gdGV4dCA9PSBudWxsID9cclxuXHRcdFx0XHRcIlwiIDpcclxuXHRcdFx0XHR0ZXh0LnRvU3RyaW5nKCkucmVwbGFjZSggcnRyaW0sIFwiXCIgKTtcclxuXHRcdH0sXHJcblxyXG5cdC8vIHJlc3VsdHMgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcclxuXHRtYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnIsIHJlc3VsdHMgKSB7XHJcblx0XHR2YXIgdHlwZSxcclxuXHRcdFx0cmV0ID0gcmVzdWx0cyB8fCBbXTtcclxuXHJcblx0XHRpZiAoIGFyciAhPSBudWxsICkge1xyXG5cdFx0XHQvLyBUaGUgd2luZG93LCBzdHJpbmdzIChhbmQgZnVuY3Rpb25zKSBhbHNvIGhhdmUgJ2xlbmd0aCdcclxuXHRcdFx0Ly8gVHdlYWtlZCBsb2dpYyBzbGlnaHRseSB0byBoYW5kbGUgQmxhY2tiZXJyeSA0LjcgUmVnRXhwIGlzc3VlcyAjNjkzMFxyXG5cdFx0XHR0eXBlID0galF1ZXJ5LnR5cGUoIGFyciApO1xyXG5cclxuXHRcdFx0aWYgKCBhcnIubGVuZ3RoID09IG51bGwgfHwgdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlID09PSBcImZ1bmN0aW9uXCIgfHwgdHlwZSA9PT0gXCJyZWdleHBcIiB8fCBqUXVlcnkuaXNXaW5kb3coIGFyciApICkge1xyXG5cdFx0XHRcdGNvcmVfcHVzaC5jYWxsKCByZXQsIGFyciApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LCBhcnIgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXQ7XHJcblx0fSxcclxuXHJcblx0aW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHtcclxuXHRcdHZhciBsZW47XHJcblxyXG5cdFx0aWYgKCBhcnIgKSB7XHJcblx0XHRcdGlmICggY29yZV9pbmRleE9mICkge1xyXG5cdFx0XHRcdHJldHVybiBjb3JlX2luZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxlbiA9IGFyci5sZW5ndGg7XHJcblx0XHRcdGkgPSBpID8gaSA8IDAgPyBNYXRoLm1heCggMCwgbGVuICsgaSApIDogaSA6IDA7XHJcblxyXG5cdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcclxuXHRcdFx0XHQvLyBTa2lwIGFjY2Vzc2luZyBpbiBzcGFyc2UgYXJyYXlzXHJcblx0XHRcdFx0aWYgKCBpIGluIGFyciAmJiBhcnJbIGkgXSA9PT0gZWxlbSApIHtcclxuXHRcdFx0XHRcdHJldHVybiBpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAtMTtcclxuXHR9LFxyXG5cclxuXHRtZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7XHJcblx0XHR2YXIgbCA9IHNlY29uZC5sZW5ndGgsXHJcblx0XHRcdGkgPSBmaXJzdC5sZW5ndGgsXHJcblx0XHRcdGogPSAwO1xyXG5cclxuXHRcdGlmICggdHlwZW9mIGwgPT09IFwibnVtYmVyXCIgKSB7XHJcblx0XHRcdGZvciAoIDsgaiA8IGw7IGorKyApIHtcclxuXHRcdFx0XHRmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHdoaWxlICggc2Vjb25kW2pdICE9PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0Zmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqKysgXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGZpcnN0Lmxlbmd0aCA9IGk7XHJcblxyXG5cdFx0cmV0dXJuIGZpcnN0O1xyXG5cdH0sXHJcblxyXG5cdGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludiApIHtcclxuXHRcdHZhciByZXRWYWwsXHJcblx0XHRcdHJldCA9IFtdLFxyXG5cdFx0XHRpID0gMCxcclxuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoO1xyXG5cdFx0aW52ID0gISFpbnY7XHJcblxyXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtc1xyXG5cdFx0Ly8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cclxuXHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xyXG5cdFx0XHRyZXRWYWwgPSAhIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7XHJcblx0XHRcdGlmICggaW52ICE9PSByZXRWYWwgKSB7XHJcblx0XHRcdFx0cmV0LnB1c2goIGVsZW1zWyBpIF0gKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXQ7XHJcblx0fSxcclxuXHJcblx0Ly8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XHJcblx0bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7XHJcblx0XHR2YXIgdmFsdWUsIGtleSxcclxuXHRcdFx0cmV0ID0gW10sXHJcblx0XHRcdGkgPSAwLFxyXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXHJcblx0XHRcdC8vIGpxdWVyeSBvYmplY3RzIGFyZSB0cmVhdGVkIGFzIGFycmF5c1xyXG5cdFx0XHRpc0FycmF5ID0gZWxlbXMgaW5zdGFuY2VvZiBqUXVlcnkgfHwgbGVuZ3RoICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiAoICggbGVuZ3RoID4gMCAmJiBlbGVtc1sgMCBdICYmIGVsZW1zWyBsZW5ndGggLTEgXSApIHx8IGxlbmd0aCA9PT0gMCB8fCBqUXVlcnkuaXNBcnJheSggZWxlbXMgKSApIDtcclxuXHJcblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXJcclxuXHRcdGlmICggaXNBcnJheSApIHtcclxuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XHJcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XHJcblxyXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcclxuXHRcdFx0XHRcdHJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0Ly8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCxcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGZvciAoIGtleSBpbiBlbGVtcyApIHtcclxuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sga2V5IF0sIGtleSwgYXJnICk7XHJcblxyXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcclxuXHRcdFx0XHRcdHJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xyXG5cdFx0cmV0dXJuIHJldC5jb25jYXQuYXBwbHkoIFtdLCByZXQgKTtcclxuXHR9LFxyXG5cclxuXHQvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHNcclxuXHRndWlkOiAxLFxyXG5cclxuXHQvLyBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0LCBvcHRpb25hbGx5IHBhcnRpYWxseSBhcHBseWluZyBhbnlcclxuXHQvLyBhcmd1bWVudHMuXHJcblx0cHJveHk6IGZ1bmN0aW9uKCBmbiwgY29udGV4dCApIHtcclxuXHRcdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xyXG5cclxuXHRcdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XHJcblx0XHRcdHRtcCA9IGZuWyBjb250ZXh0IF07XHJcblx0XHRcdGNvbnRleHQgPSBmbjtcclxuXHRcdFx0Zm4gPSB0bXA7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWNcclxuXHRcdC8vIHRoaXMgdGhyb3dzIGEgVHlwZUVycm9yLCBidXQgd2Ugd2lsbCBqdXN0IHJldHVybiB1bmRlZmluZWQuXHJcblx0XHRpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBTaW11bGF0ZWQgYmluZFxyXG5cdFx0YXJncyA9IGNvcmVfc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XHJcblx0XHRwcm94eSA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRyZXR1cm4gZm4uYXBwbHkoIGNvbnRleHQsIGFyZ3MuY29uY2F0KCBjb3JlX3NsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTtcclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXHJcblx0XHRwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgcHJveHkuZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xyXG5cclxuXHRcdHJldHVybiBwcm94eTtcclxuXHR9LFxyXG5cclxuXHQvLyBNdWx0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZhbHVlcyBvZiBhIGNvbGxlY3Rpb25cclxuXHQvLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb25cclxuXHRhY2Nlc3M6IGZ1bmN0aW9uKCBlbGVtcywgZm4sIGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHBhc3MgKSB7XHJcblx0XHR2YXIgZXhlYyxcclxuXHRcdFx0YnVsayA9IGtleSA9PSBudWxsLFxyXG5cdFx0XHRpID0gMCxcclxuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoO1xyXG5cclxuXHRcdC8vIFNldHMgbWFueSB2YWx1ZXNcclxuXHRcdGlmICgga2V5ICYmIHR5cGVvZiBrZXkgPT09IFwib2JqZWN0XCIgKSB7XHJcblx0XHRcdGZvciAoIGkgaW4ga2V5ICkge1xyXG5cdFx0XHRcdGpRdWVyeS5hY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5W2ldLCAxLCBlbXB0eUdldCwgdmFsdWUgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjaGFpbmFibGUgPSAxO1xyXG5cclxuXHRcdC8vIFNldHMgb25lIHZhbHVlXHJcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHQvLyBPcHRpb25hbGx5LCBmdW5jdGlvbiB2YWx1ZXMgZ2V0IGV4ZWN1dGVkIGlmIGV4ZWMgaXMgdHJ1ZVxyXG5cdFx0XHRleGVjID0gcGFzcyA9PT0gdW5kZWZpbmVkICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApO1xyXG5cclxuXHRcdFx0aWYgKCBidWxrICkge1xyXG5cdFx0XHRcdC8vIEJ1bGsgb3BlcmF0aW9ucyBvbmx5IGl0ZXJhdGUgd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gdmFsdWVzXHJcblx0XHRcdFx0aWYgKCBleGVjICkge1xyXG5cdFx0XHRcdFx0ZXhlYyA9IGZuO1xyXG5cdFx0XHRcdFx0Zm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGV4ZWMuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7XHJcblx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHQvLyBPdGhlcndpc2UgdGhleSBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldFxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTtcclxuXHRcdFx0XHRcdGZuID0gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggZm4gKSB7XHJcblx0XHRcdFx0Zm9yICg7IGkgPCBsZW5ndGg7IGkrKyApIHtcclxuXHRcdFx0XHRcdGZuKCBlbGVtc1tpXSwga2V5LCBleGVjID8gdmFsdWUuY2FsbCggZWxlbXNbaV0sIGksIGZuKCBlbGVtc1tpXSwga2V5ICkgKSA6IHZhbHVlLCBwYXNzICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjaGFpbmFibGUgPSAxO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBjaGFpbmFibGUgP1xyXG5cdFx0XHRlbGVtcyA6XHJcblxyXG5cdFx0XHQvLyBHZXRzXHJcblx0XHRcdGJ1bGsgP1xyXG5cdFx0XHRcdGZuLmNhbGwoIGVsZW1zICkgOlxyXG5cdFx0XHRcdGxlbmd0aCA/IGZuKCBlbGVtc1swXSwga2V5ICkgOiBlbXB0eUdldDtcclxuXHR9LFxyXG5cclxuXHRub3c6IGZ1bmN0aW9uKCkge1xyXG5cdFx0cmV0dXJuICggbmV3IERhdGUoKSApLmdldFRpbWUoKTtcclxuXHR9XHJcbn0pO1xyXG5cclxualF1ZXJ5LnJlYWR5LnByb21pc2UgPSBmdW5jdGlvbiggb2JqICkge1xyXG5cdGlmICggIXJlYWR5TGlzdCApIHtcclxuXHJcblx0XHRyZWFkeUxpc3QgPSBqUXVlcnkuRGVmZXJyZWQoKTtcclxuXHJcblx0XHQvLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZCBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC5cclxuXHRcdC8vIHdlIG9uY2UgdHJpZWQgdG8gdXNlIHJlYWR5U3RhdGUgXCJpbnRlcmFjdGl2ZVwiIGhlcmUsIGJ1dCBpdCBjYXVzZWQgaXNzdWVzIGxpa2UgdGhlIG9uZVxyXG5cdFx0Ly8gZGlzY292ZXJlZCBieSBDaHJpc1MgaGVyZTogaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIyODIjY29tbWVudDoxNVxyXG5cdFx0aWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIgKSB7XHJcblx0XHRcdC8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeVxyXG5cdFx0XHRzZXRUaW1lb3V0KCBqUXVlcnkucmVhZHksIDEgKTtcclxuXHJcblx0XHQvLyBTdGFuZGFyZHMtYmFzZWQgYnJvd3NlcnMgc3VwcG9ydCBET01Db250ZW50TG9hZGVkXHJcblx0XHR9IGVsc2UgaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkge1xyXG5cdFx0XHQvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrXHJcblx0XHRcdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwiRE9NQ29udGVudExvYWRlZFwiLCBET01Db250ZW50TG9hZGVkLCBmYWxzZSApO1xyXG5cclxuXHRcdFx0Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcclxuXHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwibG9hZFwiLCBqUXVlcnkucmVhZHksIGZhbHNlICk7XHJcblxyXG5cdFx0Ly8gSWYgSUUgZXZlbnQgbW9kZWwgaXMgdXNlZFxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gRW5zdXJlIGZpcmluZyBiZWZvcmUgb25sb2FkLCBtYXliZSBsYXRlIGJ1dCBzYWZlIGFsc28gZm9yIGlmcmFtZXNcclxuXHRcdFx0ZG9jdW1lbnQuYXR0YWNoRXZlbnQoIFwib25yZWFkeXN0YXRlY2hhbmdlXCIsIERPTUNvbnRlbnRMb2FkZWQgKTtcclxuXHJcblx0XHRcdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXHJcblx0XHRcdHdpbmRvdy5hdHRhY2hFdmVudCggXCJvbmxvYWRcIiwgalF1ZXJ5LnJlYWR5ICk7XHJcblxyXG5cdFx0XHQvLyBJZiBJRSBhbmQgbm90IGEgZnJhbWVcclxuXHRcdFx0Ly8gY29udGludWFsbHkgY2hlY2sgdG8gc2VlIGlmIHRoZSBkb2N1bWVudCBpcyByZWFkeVxyXG5cdFx0XHR2YXIgdG9wID0gZmFsc2U7XHJcblxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdHRvcCA9IHdpbmRvdy5mcmFtZUVsZW1lbnQgPT0gbnVsbCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XHJcblx0XHRcdH0gY2F0Y2goZSkge31cclxuXHJcblx0XHRcdGlmICggdG9wICYmIHRvcC5kb1Njcm9sbCApIHtcclxuXHRcdFx0XHQoZnVuY3Rpb24gZG9TY3JvbGxDaGVjaygpIHtcclxuXHRcdFx0XHRcdGlmICggIWpRdWVyeS5pc1JlYWR5ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0XHQvLyBVc2UgdGhlIHRyaWNrIGJ5IERpZWdvIFBlcmluaVxyXG5cdFx0XHRcdFx0XHRcdC8vIGh0dHA6Ly9qYXZhc2NyaXB0Lm53Ym94LmNvbS9JRUNvbnRlbnRMb2FkZWQvXHJcblx0XHRcdFx0XHRcdFx0dG9wLmRvU2Nyb2xsKFwibGVmdFwiKTtcclxuXHRcdFx0XHRcdFx0fSBjYXRjaChlKSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHNldFRpbWVvdXQoIGRvU2Nyb2xsQ2hlY2ssIDUwICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8vIGFuZCBleGVjdXRlIGFueSB3YWl0aW5nIGZ1bmN0aW9uc1xyXG5cdFx0XHRcdFx0XHRqUXVlcnkucmVhZHkoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiByZWFkeUxpc3QucHJvbWlzZSggb2JqICk7XHJcbn07XHJcblxyXG4vLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXBcclxualF1ZXJ5LmVhY2goXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0XCIuc3BsaXQoXCIgXCIpLCBmdW5jdGlvbihpLCBuYW1lKSB7XHJcblx0Y2xhc3MydHlwZVsgXCJbb2JqZWN0IFwiICsgbmFtZSArIFwiXVwiIF0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XHJcbn0pO1xyXG5cclxuLy8gQWxsIGpRdWVyeSBvYmplY3RzIHNob3VsZCBwb2ludCBiYWNrIHRvIHRoZXNlXHJcbnJvb3RqUXVlcnkgPSBqUXVlcnkoZG9jdW1lbnQpO1xyXG4vLyBTdHJpbmcgdG8gT2JqZWN0IG9wdGlvbnMgZm9ybWF0IGNhY2hlXHJcbnZhciBvcHRpb25zQ2FjaGUgPSB7fTtcclxuXHJcbi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzIGFuZCBzdG9yZSBpbiBjYWNoZVxyXG5mdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkge1xyXG5cdHZhciBvYmplY3QgPSBvcHRpb25zQ2FjaGVbIG9wdGlvbnMgXSA9IHt9O1xyXG5cdGpRdWVyeS5lYWNoKCBvcHRpb25zLnNwbGl0KCBjb3JlX3JzcGFjZSApLCBmdW5jdGlvbiggXywgZmxhZyApIHtcclxuXHRcdG9iamVjdFsgZmxhZyBdID0gdHJ1ZTtcclxuXHR9KTtcclxuXHRyZXR1cm4gb2JqZWN0O1xyXG59XHJcblxyXG4vKlxyXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBsaXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczpcclxuICpcclxuICpcdG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3dcclxuICpcdFx0XHR0aGUgY2FsbGJhY2sgbGlzdCBiZWhhdmVzIG9yIGEgbW9yZSB0cmFkaXRpb25hbCBvcHRpb24gb2JqZWN0XHJcbiAqXHJcbiAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJlXHJcbiAqIFwiZmlyZWRcIiBtdWx0aXBsZSB0aW1lcy5cclxuICpcclxuICogUG9zc2libGUgb3B0aW9uczpcclxuICpcclxuICpcdG9uY2U6XHRcdFx0d2lsbCBlbnN1cmUgdGhlIGNhbGxiYWNrIGxpc3QgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSAobGlrZSBhIERlZmVycmVkKVxyXG4gKlxyXG4gKlx0bWVtb3J5Olx0XHRcdHdpbGwga2VlcCB0cmFjayBvZiBwcmV2aW91cyB2YWx1ZXMgYW5kIHdpbGwgY2FsbCBhbnkgY2FsbGJhY2sgYWRkZWRcclxuICpcdFx0XHRcdFx0YWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgXCJtZW1vcml6ZWRcIlxyXG4gKlx0XHRcdFx0XHR2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZClcclxuICpcclxuICpcdHVuaXF1ZTpcdFx0XHR3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdClcclxuICpcclxuICpcdHN0b3BPbkZhbHNlOlx0aW50ZXJydXB0IGNhbGxpbmdzIHdoZW4gYSBjYWxsYmFjayByZXR1cm5zIGZhbHNlXHJcbiAqXHJcbiAqL1xyXG5qUXVlcnkuQ2FsbGJhY2tzID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XHJcblxyXG5cdC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWRcclxuXHQvLyAod2UgY2hlY2sgaW4gY2FjaGUgZmlyc3QpXHJcblx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiID9cclxuXHRcdCggb3B0aW9uc0NhY2hlWyBvcHRpb25zIF0gfHwgY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApICkgOlxyXG5cdFx0alF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTtcclxuXHJcblx0dmFyIC8vIExhc3QgZmlyZSB2YWx1ZSAoZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0cylcclxuXHRcdG1lbW9yeSxcclxuXHRcdC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkXHJcblx0XHRmaXJlZCxcclxuXHRcdC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IGlzIGN1cnJlbnRseSBmaXJpbmdcclxuXHRcdGZpcmluZyxcclxuXHRcdC8vIEZpcnN0IGNhbGxiYWNrIHRvIGZpcmUgKHVzZWQgaW50ZXJuYWxseSBieSBhZGQgYW5kIGZpcmVXaXRoKVxyXG5cdFx0ZmlyaW5nU3RhcnQsXHJcblx0XHQvLyBFbmQgb2YgdGhlIGxvb3Agd2hlbiBmaXJpbmdcclxuXHRcdGZpcmluZ0xlbmd0aCxcclxuXHRcdC8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IHJlbW92ZSBpZiBuZWVkZWQpXHJcblx0XHRmaXJpbmdJbmRleCxcclxuXHRcdC8vIEFjdHVhbCBjYWxsYmFjayBsaXN0XHJcblx0XHRsaXN0ID0gW10sXHJcblx0XHQvLyBTdGFjayBvZiBmaXJlIGNhbGxzIGZvciByZXBlYXRhYmxlIGxpc3RzXHJcblx0XHRzdGFjayA9ICFvcHRpb25zLm9uY2UgJiYgW10sXHJcblx0XHQvLyBGaXJlIGNhbGxiYWNrc1xyXG5cdFx0ZmlyZSA9IGZ1bmN0aW9uKCBkYXRhICkge1xyXG5cdFx0XHRtZW1vcnkgPSBvcHRpb25zLm1lbW9yeSAmJiBkYXRhO1xyXG5cdFx0XHRmaXJlZCA9IHRydWU7XHJcblx0XHRcdGZpcmluZ0luZGV4ID0gZmlyaW5nU3RhcnQgfHwgMDtcclxuXHRcdFx0ZmlyaW5nU3RhcnQgPSAwO1xyXG5cdFx0XHRmaXJpbmdMZW5ndGggPSBsaXN0Lmxlbmd0aDtcclxuXHRcdFx0ZmlyaW5nID0gdHJ1ZTtcclxuXHRcdFx0Zm9yICggOyBsaXN0ICYmIGZpcmluZ0luZGV4IDwgZmlyaW5nTGVuZ3RoOyBmaXJpbmdJbmRleCsrICkge1xyXG5cdFx0XHRcdGlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggZGF0YVsgMCBdLCBkYXRhWyAxIF0gKSA9PT0gZmFsc2UgJiYgb3B0aW9ucy5zdG9wT25GYWxzZSApIHtcclxuXHRcdFx0XHRcdG1lbW9yeSA9IGZhbHNlOyAvLyBUbyBwcmV2ZW50IGZ1cnRoZXIgY2FsbHMgdXNpbmcgYWRkXHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0ZmlyaW5nID0gZmFsc2U7XHJcblx0XHRcdGlmICggbGlzdCApIHtcclxuXHRcdFx0XHRpZiAoIHN0YWNrICkge1xyXG5cdFx0XHRcdFx0aWYgKCBzdGFjay5sZW5ndGggKSB7XHJcblx0XHRcdFx0XHRcdGZpcmUoIHN0YWNrLnNoaWZ0KCkgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtZW1vcnkgKSB7XHJcblx0XHRcdFx0XHRsaXN0ID0gW107XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHNlbGYuZGlzYWJsZSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdC8vIEFjdHVhbCBDYWxsYmFja3Mgb2JqZWN0XHJcblx0XHRzZWxmID0ge1xyXG5cdFx0XHQvLyBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0XHJcblx0XHRcdGFkZDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xyXG5cdFx0XHRcdFx0Ly8gRmlyc3QsIHdlIHNhdmUgdGhlIGN1cnJlbnQgbGVuZ3RoXHJcblx0XHRcdFx0XHR2YXIgc3RhcnQgPSBsaXN0Lmxlbmd0aDtcclxuXHRcdFx0XHRcdChmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XHJcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmdzLCBmdW5jdGlvbiggXywgYXJnICkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIGFyZyApO1xyXG5cdFx0XHRcdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmdW5jdGlvblwiICYmICggIW9wdGlvbnMudW5pcXVlIHx8ICFzZWxmLmhhcyggYXJnICkgKSApIHtcclxuXHRcdFx0XHRcdFx0XHRcdGxpc3QucHVzaCggYXJnICk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggYXJnICYmIGFyZy5sZW5ndGggJiYgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8vIEluc3BlY3QgcmVjdXJzaXZlbHlcclxuXHRcdFx0XHRcdFx0XHRcdGFkZCggYXJnICk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH0pKCBhcmd1bWVudHMgKTtcclxuXHRcdFx0XHRcdC8vIERvIHdlIG5lZWQgdG8gYWRkIHRoZSBjYWxsYmFja3MgdG8gdGhlXHJcblx0XHRcdFx0XHQvLyBjdXJyZW50IGZpcmluZyBiYXRjaD9cclxuXHRcdFx0XHRcdGlmICggZmlyaW5nICkge1xyXG5cdFx0XHRcdFx0XHRmaXJpbmdMZW5ndGggPSBsaXN0Lmxlbmd0aDtcclxuXHRcdFx0XHRcdC8vIFdpdGggbWVtb3J5LCBpZiB3ZSdyZSBub3QgZmlyaW5nIHRoZW5cclxuXHRcdFx0XHRcdC8vIHdlIHNob3VsZCBjYWxsIHJpZ2h0IGF3YXlcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIG1lbW9yeSApIHtcclxuXHRcdFx0XHRcdFx0ZmlyaW5nU3RhcnQgPSBzdGFydDtcclxuXHRcdFx0XHRcdFx0ZmlyZSggbWVtb3J5ICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHQvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0XHJcblx0XHRcdHJlbW92ZTogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0aWYgKCBsaXN0ICkge1xyXG5cdFx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oIF8sIGFyZyApIHtcclxuXHRcdFx0XHRcdFx0dmFyIGluZGV4O1xyXG5cdFx0XHRcdFx0XHR3aGlsZSggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xyXG5cdFx0XHRcdFx0XHRcdGxpc3Quc3BsaWNlKCBpbmRleCwgMSApO1xyXG5cdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xyXG5cdFx0XHRcdFx0XHRcdGlmICggZmlyaW5nICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBpbmRleCA8PSBmaXJpbmdMZW5ndGggKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGZpcmluZ0xlbmd0aC0tO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdFx0fSxcclxuXHRcdFx0Ly8gQ29udHJvbCBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0XHJcblx0XHRcdGhhczogZnVuY3Rpb24oIGZuICkge1xyXG5cdFx0XHRcdHJldHVybiBqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XHJcblx0XHRcdGVtcHR5OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRsaXN0ID0gW107XHJcblx0XHRcdFx0cmV0dXJuIHRoaXM7XHJcblx0XHRcdH0sXHJcblx0XHRcdC8vIEhhdmUgdGhlIGxpc3QgZG8gbm90aGluZyBhbnltb3JlXHJcblx0XHRcdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGxpc3QgPSBzdGFjayA9IG1lbW9yeSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdFx0fSxcclxuXHRcdFx0Ly8gSXMgaXQgZGlzYWJsZWQ/XHJcblx0XHRcdGRpc2FibGVkOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRyZXR1cm4gIWxpc3Q7XHJcblx0XHRcdH0sXHJcblx0XHRcdC8vIExvY2sgdGhlIGxpc3QgaW4gaXRzIGN1cnJlbnQgc3RhdGVcclxuXHRcdFx0bG9jazogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0c3RhY2sgPSB1bmRlZmluZWQ7XHJcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICkge1xyXG5cdFx0XHRcdFx0c2VsZi5kaXNhYmxlKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHQvLyBJcyBpdCBsb2NrZWQ/XHJcblx0XHRcdGxvY2tlZDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0cmV0dXJuICFzdGFjaztcclxuXHRcdFx0fSxcclxuXHRcdFx0Ly8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xyXG5cdFx0XHRmaXJlV2l0aDogZnVuY3Rpb24oIGNvbnRleHQsIGFyZ3MgKSB7XHJcblx0XHRcdFx0YXJncyA9IGFyZ3MgfHwgW107XHJcblx0XHRcdFx0YXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTtcclxuXHRcdFx0XHRpZiAoIGxpc3QgJiYgKCAhZmlyZWQgfHwgc3RhY2sgKSApIHtcclxuXHRcdFx0XHRcdGlmICggZmlyaW5nICkge1xyXG5cdFx0XHRcdFx0XHRzdGFjay5wdXNoKCBhcmdzICk7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRmaXJlKCBhcmdzICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHQvLyBDYWxsIGFsbCB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50c1xyXG5cdFx0XHRmaXJlOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRzZWxmLmZpcmVXaXRoKCB0aGlzLCBhcmd1bWVudHMgKTtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdFx0fSxcclxuXHRcdFx0Ly8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlXHJcblx0XHRcdGZpcmVkOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRyZXR1cm4gISFmaXJlZDtcclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHJcblx0cmV0dXJuIHNlbGY7XHJcbn07XHJcbmpRdWVyeS5leHRlbmQoe1xyXG5cclxuXHREZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7XHJcblx0XHR2YXIgdHVwbGVzID0gW1xyXG5cdFx0XHRcdC8vIGFjdGlvbiwgYWRkIGxpc3RlbmVyLCBsaXN0ZW5lciBsaXN0LCBmaW5hbCBzdGF0ZVxyXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksIFwicmVzb2x2ZWRcIiBdLFxyXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSwgXCJyZWplY3RlZFwiIF0sXHJcblx0XHRcdFx0WyBcIm5vdGlmeVwiLCBcInByb2dyZXNzXCIsIGpRdWVyeS5DYWxsYmFja3MoXCJtZW1vcnlcIikgXVxyXG5cdFx0XHRdLFxyXG5cdFx0XHRzdGF0ZSA9IFwicGVuZGluZ1wiLFxyXG5cdFx0XHRwcm9taXNlID0ge1xyXG5cdFx0XHRcdHN0YXRlOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdHJldHVybiBzdGF0ZTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGFsd2F5czogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHRkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTtcclxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkge1xyXG5cdFx0XHRcdFx0dmFyIGZucyA9IGFyZ3VtZW50cztcclxuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoZnVuY3Rpb24oIG5ld0RlZmVyICkge1xyXG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIGFjdGlvbiA9IHR1cGxlWyAwIF0sXHJcblx0XHRcdFx0XHRcdFx0XHRmbiA9IGZuc1sgaSBdO1xyXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkWyBkb25lIHwgZmFpbCB8IHByb2dyZXNzIF0gZm9yIGZvcndhcmRpbmcgYWN0aW9ucyB0byBuZXdEZWZlclxyXG5cdFx0XHRcdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsxXSBdKCBqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSA/XHJcblx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkID0gZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQucHJvbWlzZSgpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQuZmFpbCggbmV3RGVmZXIucmVqZWN0IClcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5ICk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIGFjdGlvbiArIFwiV2l0aFwiIF0oIHRoaXMgPT09IGRlZmVycmVkID8gbmV3RGVmZXIgOiB0aGlzLCBbIHJldHVybmVkIF0gKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fSA6XHJcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlclsgYWN0aW9uIF1cclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0Zm5zID0gbnVsbDtcclxuXHRcdFx0XHRcdH0pLnByb21pc2UoKTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8vIEdldCBhIHByb21pc2UgZm9yIHRoaXMgZGVmZXJyZWRcclxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XHJcblx0XHRcdFx0cHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHtcclxuXHRcdFx0XHRcdHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcclxuXHJcblx0XHQvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0XHJcblx0XHRwcm9taXNlLnBpcGUgPSBwcm9taXNlLnRoZW47XHJcblxyXG5cdFx0Ly8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kc1xyXG5cdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xyXG5cdFx0XHR2YXIgbGlzdCA9IHR1cGxlWyAyIF0sXHJcblx0XHRcdFx0c3RhdGVTdHJpbmcgPSB0dXBsZVsgMyBdO1xyXG5cclxuXHRcdFx0Ly8gcHJvbWlzZVsgZG9uZSB8IGZhaWwgfCBwcm9ncmVzcyBdID0gbGlzdC5hZGRcclxuXHRcdFx0cHJvbWlzZVsgdHVwbGVbMV0gXSA9IGxpc3QuYWRkO1xyXG5cclxuXHRcdFx0Ly8gSGFuZGxlIHN0YXRlXHJcblx0XHRcdGlmICggc3RhdGVTdHJpbmcgKSB7XHJcblx0XHRcdFx0bGlzdC5hZGQoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHQvLyBzdGF0ZSA9IFsgcmVzb2x2ZWQgfCByZWplY3RlZCBdXHJcblx0XHRcdFx0XHRzdGF0ZSA9IHN0YXRlU3RyaW5nO1xyXG5cclxuXHRcdFx0XHQvLyBbIHJlamVjdF9saXN0IHwgcmVzb2x2ZV9saXN0IF0uZGlzYWJsZTsgcHJvZ3Jlc3NfbGlzdC5sb2NrXHJcblx0XHRcdFx0fSwgdHVwbGVzWyBpIF4gMSBdWyAyIF0uZGlzYWJsZSwgdHVwbGVzWyAyIF1bIDIgXS5sb2NrICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGRlZmVycmVkWyByZXNvbHZlIHwgcmVqZWN0IHwgbm90aWZ5IF0gPSBsaXN0LmZpcmVcclxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWzBdIF0gPSBsaXN0LmZpcmU7XHJcblx0XHRcdGRlZmVycmVkWyB0dXBsZVswXSArIFwiV2l0aFwiIF0gPSBsaXN0LmZpcmVXaXRoO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gTWFrZSB0aGUgZGVmZXJyZWQgYSBwcm9taXNlXHJcblx0XHRwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7XHJcblxyXG5cdFx0Ly8gQ2FsbCBnaXZlbiBmdW5jIGlmIGFueVxyXG5cdFx0aWYgKCBmdW5jICkge1xyXG5cdFx0XHRmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJlZCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEFsbCBkb25lIVxyXG5cdFx0cmV0dXJuIGRlZmVycmVkO1xyXG5cdH0sXHJcblxyXG5cdC8vIERlZmVycmVkIGhlbHBlclxyXG5cdHdoZW46IGZ1bmN0aW9uKCBzdWJvcmRpbmF0ZSAvKiAsIC4uLiwgc3Vib3JkaW5hdGVOICovICkge1xyXG5cdFx0dmFyIGkgPSAwLFxyXG5cdFx0XHRyZXNvbHZlVmFsdWVzID0gY29yZV9zbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcclxuXHRcdFx0bGVuZ3RoID0gcmVzb2x2ZVZhbHVlcy5sZW5ndGgsXHJcblxyXG5cdFx0XHQvLyB0aGUgY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzXHJcblx0XHRcdHJlbWFpbmluZyA9IGxlbmd0aCAhPT0gMSB8fCAoIHN1Ym9yZGluYXRlICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBzdWJvcmRpbmF0ZS5wcm9taXNlICkgKSA/IGxlbmd0aCA6IDAsXHJcblxyXG5cdFx0XHQvLyB0aGUgbWFzdGVyIERlZmVycmVkLiBJZiByZXNvbHZlVmFsdWVzIGNvbnNpc3Qgb2Ygb25seSBhIHNpbmdsZSBEZWZlcnJlZCwganVzdCB1c2UgdGhhdC5cclxuXHRcdFx0ZGVmZXJyZWQgPSByZW1haW5pbmcgPT09IDEgPyBzdWJvcmRpbmF0ZSA6IGpRdWVyeS5EZWZlcnJlZCgpLFxyXG5cclxuXHRcdFx0Ly8gVXBkYXRlIGZ1bmN0aW9uIGZvciBib3RoIHJlc29sdmUgYW5kIHByb2dyZXNzIHZhbHVlc1xyXG5cdFx0XHR1cGRhdGVGdW5jID0gZnVuY3Rpb24oIGksIGNvbnRleHRzLCB2YWx1ZXMgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcclxuXHRcdFx0XHRcdGNvbnRleHRzWyBpIF0gPSB0aGlzO1xyXG5cdFx0XHRcdFx0dmFsdWVzWyBpIF0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGNvcmVfc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTtcclxuXHRcdFx0XHRcdGlmKCB2YWx1ZXMgPT09IHByb2dyZXNzVmFsdWVzICkge1xyXG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBjb250ZXh0cywgdmFsdWVzICk7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAhKCAtLXJlbWFpbmluZyApICkge1xyXG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggY29udGV4dHMsIHZhbHVlcyApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH07XHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRwcm9ncmVzc1ZhbHVlcywgcHJvZ3Jlc3NDb250ZXh0cywgcmVzb2x2ZUNvbnRleHRzO1xyXG5cclxuXHRcdC8vIGFkZCBsaXN0ZW5lcnMgdG8gRGVmZXJyZWQgc3Vib3JkaW5hdGVzOyB0cmVhdCBvdGhlcnMgYXMgcmVzb2x2ZWRcclxuXHRcdGlmICggbGVuZ3RoID4gMSApIHtcclxuXHRcdFx0cHJvZ3Jlc3NWYWx1ZXMgPSBuZXcgQXJyYXkoIGxlbmd0aCApO1xyXG5cdFx0XHRwcm9ncmVzc0NvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcclxuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gbmV3IEFycmF5KCBsZW5ndGggKTtcclxuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XHJcblx0XHRcdFx0aWYgKCByZXNvbHZlVmFsdWVzWyBpIF0gJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlICkgKSB7XHJcblx0XHRcdFx0XHRyZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSgpXHJcblx0XHRcdFx0XHRcdC5kb25lKCB1cGRhdGVGdW5jKCBpLCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKSApXHJcblx0XHRcdFx0XHRcdC5mYWlsKCBkZWZlcnJlZC5yZWplY3QgKVxyXG5cdFx0XHRcdFx0XHQucHJvZ3Jlc3MoIHVwZGF0ZUZ1bmMoIGksIHByb2dyZXNzQ29udGV4dHMsIHByb2dyZXNzVmFsdWVzICkgKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0LS1yZW1haW5pbmc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gaWYgd2UncmUgbm90IHdhaXRpbmcgb24gYW55dGhpbmcsIHJlc29sdmUgdGhlIG1hc3RlclxyXG5cdFx0aWYgKCAhcmVtYWluaW5nICkge1xyXG5cdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGRlZmVycmVkLnByb21pc2UoKTtcclxuXHR9XHJcbn0pO1xyXG5qUXVlcnkuc3VwcG9ydCA9IChmdW5jdGlvbigpIHtcclxuXHJcblx0dmFyIHN1cHBvcnQsXHJcblx0XHRhbGwsXHJcblx0XHRhLFxyXG5cdFx0c2VsZWN0LFxyXG5cdFx0b3B0LFxyXG5cdFx0aW5wdXQsXHJcblx0XHRmcmFnbWVudCxcclxuXHRcdGV2ZW50TmFtZSxcclxuXHRcdGksXHJcblx0XHRpc1N1cHBvcnRlZCxcclxuXHRcdGNsaWNrRm4sXHJcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cclxuXHQvLyBQcmVsaW1pbmFyeSB0ZXN0c1xyXG5cdGRpdi5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NOYW1lXCIsIFwidFwiICk7XHJcblx0ZGl2LmlubmVySFRNTCA9IFwiICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+XCI7XHJcblxyXG5cdGFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIik7XHJcblx0YSA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcImFcIilbIDAgXTtcclxuXHRhLnN0eWxlLmNzc1RleHQgPSBcInRvcDoxcHg7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41XCI7XHJcblxyXG5cdC8vIENhbid0IGdldCBiYXNpYyB0ZXN0IHN1cHBvcnRcclxuXHRpZiAoICFhbGwgfHwgIWFsbC5sZW5ndGggfHwgIWEgKSB7XHJcblx0XHRyZXR1cm4ge307XHJcblx0fVxyXG5cclxuXHQvLyBGaXJzdCBiYXRjaCBvZiBzdXBwb3J0cyB0ZXN0c1xyXG5cdHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIik7XHJcblx0b3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpICk7XHJcblx0aW5wdXQgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJpbnB1dFwiKVsgMCBdO1xyXG5cclxuXHRzdXBwb3J0ID0ge1xyXG5cdFx0Ly8gSUUgc3RyaXBzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIC5pbm5lckhUTUwgaXMgdXNlZFxyXG5cdFx0bGVhZGluZ1doaXRlc3BhY2U6ICggZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDMgKSxcclxuXHJcblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0Ym9keSBlbGVtZW50cyBhcmVuJ3QgYXV0b21hdGljYWxseSBpbnNlcnRlZFxyXG5cdFx0Ly8gSUUgd2lsbCBpbnNlcnQgdGhlbSBpbnRvIGVtcHR5IHRhYmxlc1xyXG5cdFx0dGJvZHk6ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0Ym9keVwiKS5sZW5ndGgsXHJcblxyXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbGluayBlbGVtZW50cyBnZXQgc2VyaWFsaXplZCBjb3JyZWN0bHkgYnkgaW5uZXJIVE1MXHJcblx0XHQvLyBUaGlzIHJlcXVpcmVzIGEgd3JhcHBlciBlbGVtZW50IGluIElFXHJcblx0XHRodG1sU2VyaWFsaXplOiAhIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcImxpbmtcIikubGVuZ3RoLFxyXG5cclxuXHRcdC8vIEdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZnJvbSBnZXRBdHRyaWJ1dGVcclxuXHRcdC8vIChJRSB1c2VzIC5jc3NUZXh0IGluc3RlYWQpXHJcblx0XHRzdHlsZTogL3RvcC8udGVzdCggYS5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKSApLFxyXG5cclxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IFVSTHMgYXJlbid0IG1hbmlwdWxhdGVkXHJcblx0XHQvLyAoSUUgbm9ybWFsaXplcyBpdCBieSBkZWZhdWx0KVxyXG5cdFx0aHJlZk5vcm1hbGl6ZWQ6ICggYS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpID09PSBcIi9hXCIgKSxcclxuXHJcblx0XHQvLyBNYWtlIHN1cmUgdGhhdCBlbGVtZW50IG9wYWNpdHkgZXhpc3RzXHJcblx0XHQvLyAoSUUgdXNlcyBmaWx0ZXIgaW5zdGVhZClcclxuXHRcdC8vIFVzZSBhIHJlZ2V4IHRvIHdvcmsgYXJvdW5kIGEgV2ViS2l0IGlzc3VlLiBTZWUgIzUxNDVcclxuXHRcdG9wYWNpdHk6IC9eMC41Ly50ZXN0KCBhLnN0eWxlLm9wYWNpdHkgKSxcclxuXHJcblx0XHQvLyBWZXJpZnkgc3R5bGUgZmxvYXQgZXhpc3RlbmNlXHJcblx0XHQvLyAoSUUgdXNlcyBzdHlsZUZsb2F0IGluc3RlYWQgb2YgY3NzRmxvYXQpXHJcblx0XHRjc3NGbG9hdDogISFhLnN0eWxlLmNzc0Zsb2F0LFxyXG5cclxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCBmb3IgYSBjaGVja2JveFxyXG5cdFx0Ly8gdGhhdCBpdCBkZWZhdWx0cyB0byBcIm9uXCIuXHJcblx0XHQvLyAoV2ViS2l0IGRlZmF1bHRzIHRvIFwiXCIgaW5zdGVhZClcclxuXHRcdGNoZWNrT246ICggaW5wdXQudmFsdWUgPT09IFwib25cIiApLFxyXG5cclxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IGEgc2VsZWN0ZWQtYnktZGVmYXVsdCBvcHRpb24gaGFzIGEgd29ya2luZyBzZWxlY3RlZCBwcm9wZXJ0eS5cclxuXHRcdC8vIChXZWJLaXQgZGVmYXVsdHMgdG8gZmFsc2UgaW5zdGVhZCBvZiB0cnVlLCBJRSB0b28sIGlmIGl0J3MgaW4gYW4gb3B0Z3JvdXApXHJcblx0XHRvcHRTZWxlY3RlZDogb3B0LnNlbGVjdGVkLFxyXG5cclxuXHRcdC8vIFRlc3Qgc2V0QXR0cmlidXRlIG9uIGNhbWVsQ2FzZSBjbGFzcy4gSWYgaXQgd29ya3MsIHdlIG5lZWQgYXR0ckZpeGVzIHdoZW4gZG9pbmcgZ2V0L3NldEF0dHJpYnV0ZSAoaWU2LzcpXHJcblx0XHRnZXRTZXRBdHRyaWJ1dGU6IGRpdi5jbGFzc05hbWUgIT09IFwidFwiLFxyXG5cclxuXHRcdC8vIFRlc3RzIGZvciBlbmN0eXBlIHN1cHBvcnQgb24gYSBmb3JtKCM2NzQzKVxyXG5cdFx0ZW5jdHlwZTogISFkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKS5lbmN0eXBlLFxyXG5cclxuXHRcdC8vIE1ha2VzIHN1cmUgY2xvbmluZyBhbiBodG1sNSBlbGVtZW50IGRvZXMgbm90IGNhdXNlIHByb2JsZW1zXHJcblx0XHQvLyBXaGVyZSBvdXRlckhUTUwgaXMgdW5kZWZpbmVkLCB0aGlzIHN0aWxsIHdvcmtzXHJcblx0XHRodG1sNUNsb25lOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibmF2XCIpLmNsb25lTm9kZSggdHJ1ZSApLm91dGVySFRNTCAhPT0gXCI8Om5hdj48LzpuYXY+XCIsXHJcblxyXG5cdFx0Ly8galF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgREVQUkVDQVRFRCBpbiAxLjggc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBRdWlya3MgTW9kZVxyXG5cdFx0Ym94TW9kZWw6ICggZG9jdW1lbnQuY29tcGF0TW9kZSA9PT0gXCJDU1MxQ29tcGF0XCIgKSxcclxuXHJcblx0XHQvLyBXaWxsIGJlIGRlZmluZWQgbGF0ZXJcclxuXHRcdHN1Ym1pdEJ1YmJsZXM6IHRydWUsXHJcblx0XHRjaGFuZ2VCdWJibGVzOiB0cnVlLFxyXG5cdFx0Zm9jdXNpbkJ1YmJsZXM6IGZhbHNlLFxyXG5cdFx0ZGVsZXRlRXhwYW5kbzogdHJ1ZSxcclxuXHRcdG5vQ2xvbmVFdmVudDogdHJ1ZSxcclxuXHRcdGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6IGZhbHNlLFxyXG5cdFx0c2hyaW5rV3JhcEJsb2NrczogZmFsc2UsXHJcblx0XHRyZWxpYWJsZU1hcmdpblJpZ2h0OiB0cnVlLFxyXG5cdFx0Ym94U2l6aW5nUmVsaWFibGU6IHRydWUsXHJcblx0XHRwaXhlbFBvc2l0aW9uOiBmYWxzZVxyXG5cdH07XHJcblxyXG5cdC8vIE1ha2Ugc3VyZSBjaGVja2VkIHN0YXR1cyBpcyBwcm9wZXJseSBjbG9uZWRcclxuXHRpbnB1dC5jaGVja2VkID0gdHJ1ZTtcclxuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gaW5wdXQuY2xvbmVOb2RlKCB0cnVlICkuY2hlY2tlZDtcclxuXHJcblx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIG9wdGlvbnMgaW5zaWRlIGRpc2FibGVkIHNlbGVjdHMgYXJlbid0IG1hcmtlZCBhcyBkaXNhYmxlZFxyXG5cdC8vIChXZWJLaXQgbWFya3MgdGhlbSBhcyBkaXNhYmxlZClcclxuXHRzZWxlY3QuZGlzYWJsZWQgPSB0cnVlO1xyXG5cdHN1cHBvcnQub3B0RGlzYWJsZWQgPSAhb3B0LmRpc2FibGVkO1xyXG5cclxuXHQvLyBUZXN0IHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRlbGV0ZSBhbiBleHBhbmRvIGZyb20gYW4gZWxlbWVudFxyXG5cdC8vIEZhaWxzIGluIEludGVybmV0IEV4cGxvcmVyXHJcblx0dHJ5IHtcclxuXHRcdGRlbGV0ZSBkaXYudGVzdDtcclxuXHR9IGNhdGNoKCBlICkge1xyXG5cdFx0c3VwcG9ydC5kZWxldGVFeHBhbmRvID0gZmFsc2U7XHJcblx0fVxyXG5cclxuXHRpZiAoICFkaXYuYWRkRXZlbnRMaXN0ZW5lciAmJiBkaXYuYXR0YWNoRXZlbnQgJiYgZGl2LmZpcmVFdmVudCApIHtcclxuXHRcdGRpdi5hdHRhY2hFdmVudCggXCJvbmNsaWNrXCIsIGNsaWNrRm4gPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0Ly8gQ2xvbmluZyBhIG5vZGUgc2hvdWxkbid0IGNvcHkgb3ZlciBhbnlcclxuXHRcdFx0Ly8gYm91bmQgZXZlbnQgaGFuZGxlcnMgKElFIGRvZXMgdGhpcylcclxuXHRcdFx0c3VwcG9ydC5ub0Nsb25lRXZlbnQgPSBmYWxzZTtcclxuXHRcdH0pO1xyXG5cdFx0ZGl2LmNsb25lTm9kZSggdHJ1ZSApLmZpcmVFdmVudChcIm9uY2xpY2tcIik7XHJcblx0XHRkaXYuZGV0YWNoRXZlbnQoIFwib25jbGlja1wiLCBjbGlja0ZuICk7XHJcblx0fVxyXG5cclxuXHQvLyBDaGVjayBpZiBhIHJhZGlvIG1haW50YWlucyBpdHMgdmFsdWVcclxuXHQvLyBhZnRlciBiZWluZyBhcHBlbmRlZCB0byB0aGUgRE9NXHJcblx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XHJcblx0aW5wdXQudmFsdWUgPSBcInRcIjtcclxuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcInJhZGlvXCIgKTtcclxuXHRzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gXCJ0XCI7XHJcblxyXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJjaGVja2VkXCIsIFwiY2hlY2tlZFwiICk7XHJcblxyXG5cdC8vICMxMTIxNyAtIFdlYktpdCBsb3NlcyBjaGVjayB3aGVuIHRoZSBuYW1lIGlzIGFmdGVyIHRoZSBjaGVja2VkIGF0dHJpYnV0ZVxyXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwidFwiICk7XHJcblxyXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcclxuXHRmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuXHRmcmFnbWVudC5hcHBlbmRDaGlsZCggZGl2Lmxhc3RDaGlsZCApO1xyXG5cclxuXHQvLyBXZWJLaXQgZG9lc24ndCBjbG9uZSBjaGVja2VkIHN0YXRlIGNvcnJlY3RseSBpbiBmcmFnbWVudHNcclxuXHRzdXBwb3J0LmNoZWNrQ2xvbmUgPSBmcmFnbWVudC5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcclxuXHJcblx0Ly8gQ2hlY2sgaWYgYSBkaXNjb25uZWN0ZWQgY2hlY2tib3ggd2lsbCByZXRhaW4gaXRzIGNoZWNrZWRcclxuXHQvLyB2YWx1ZSBvZiB0cnVlIGFmdGVyIGFwcGVuZGVkIHRvIHRoZSBET00gKElFNi83KVxyXG5cdHN1cHBvcnQuYXBwZW5kQ2hlY2tlZCA9IGlucHV0LmNoZWNrZWQ7XHJcblxyXG5cdGZyYWdtZW50LnJlbW92ZUNoaWxkKCBpbnB1dCApO1xyXG5cdGZyYWdtZW50LmFwcGVuZENoaWxkKCBkaXYgKTtcclxuXHJcblx0Ly8gVGVjaG5pcXVlIGZyb20gSnVyaXkgWmF5dHNldlxyXG5cdC8vIGh0dHA6Ly9wZXJmZWN0aW9ua2lsbHMuY29tL2RldGVjdGluZy1ldmVudC1zdXBwb3J0LXdpdGhvdXQtYnJvd3Nlci1zbmlmZmluZy9cclxuXHQvLyBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGNhc2Ugd2hlcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHN5c3RlbXNcclxuXHQvLyBhcmUgdXNlZCwgbmFtZWx5IGluIElFLiBTaG9ydC1jaXJjdWl0aW5nIGhlcmUgaGVscHMgdXMgdG9cclxuXHQvLyBhdm9pZCBhbiBldmFsIGNhbGwgKGluIHNldEF0dHJpYnV0ZSkgd2hpY2ggY2FuIGNhdXNlIENTUFxyXG5cdC8vIHRvIGdvIGhheXdpcmUuIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vU2VjdXJpdHkvQ1NQXHJcblx0aWYgKCBkaXYuYXR0YWNoRXZlbnQgKSB7XHJcblx0XHRmb3IgKCBpIGluIHtcclxuXHRcdFx0c3VibWl0OiB0cnVlLFxyXG5cdFx0XHRjaGFuZ2U6IHRydWUsXHJcblx0XHRcdGZvY3VzaW46IHRydWVcclxuXHRcdH0pIHtcclxuXHRcdFx0ZXZlbnROYW1lID0gXCJvblwiICsgaTtcclxuXHRcdFx0aXNTdXBwb3J0ZWQgPSAoIGV2ZW50TmFtZSBpbiBkaXYgKTtcclxuXHRcdFx0aWYgKCAhaXNTdXBwb3J0ZWQgKSB7XHJcblx0XHRcdFx0ZGl2LnNldEF0dHJpYnV0ZSggZXZlbnROYW1lLCBcInJldHVybjtcIiApO1xyXG5cdFx0XHRcdGlzU3VwcG9ydGVkID0gKCB0eXBlb2YgZGl2WyBldmVudE5hbWUgXSA9PT0gXCJmdW5jdGlvblwiICk7XHJcblx0XHRcdH1cclxuXHRcdFx0c3VwcG9ydFsgaSArIFwiQnViYmxlc1wiIF0gPSBpc1N1cHBvcnRlZDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIFJ1biB0ZXN0cyB0aGF0IG5lZWQgYSBib2R5IGF0IGRvYyByZWFkeVxyXG5cdGpRdWVyeShmdW5jdGlvbigpIHtcclxuXHRcdHZhciBjb250YWluZXIsIGRpdiwgdGRzLCBtYXJnaW5EaXYsXHJcblx0XHRcdGRpdlJlc2V0ID0gXCJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47XCIsXHJcblx0XHRcdGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJvZHlcIilbMF07XHJcblxyXG5cdFx0aWYgKCAhYm9keSApIHtcclxuXHRcdFx0Ly8gUmV0dXJuIGZvciBmcmFtZXNldCBkb2NzIHRoYXQgZG9uJ3QgaGF2ZSBhIGJvZHlcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHRjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFwidmlzaWJpbGl0eTpoaWRkZW47Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjpzdGF0aWM7dG9wOjA7bWFyZ2luLXRvcDoxcHhcIjtcclxuXHRcdGJvZHkuaW5zZXJ0QmVmb3JlKCBjb250YWluZXIsIGJvZHkuZmlyc3RDaGlsZCApO1xyXG5cclxuXHRcdC8vIENvbnN0cnVjdCB0aGUgdGVzdCBlbGVtZW50XHJcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0Y29udGFpbmVyLmFwcGVuZENoaWxkKCBkaXYgKTtcclxuXHJcblx0XHQvLyBDaGVjayBpZiB0YWJsZSBjZWxscyBzdGlsbCBoYXZlIG9mZnNldFdpZHRoL0hlaWdodCB3aGVuIHRoZXkgYXJlIHNldFxyXG5cdFx0Ly8gdG8gZGlzcGxheTpub25lIGFuZCB0aGVyZSBhcmUgc3RpbGwgb3RoZXIgdmlzaWJsZSB0YWJsZSBjZWxscyBpbiBhXHJcblx0XHQvLyB0YWJsZSByb3c7IGlmIHNvLCBvZmZzZXRXaWR0aC9IZWlnaHQgYXJlIG5vdCByZWxpYWJsZSBmb3IgdXNlIHdoZW5cclxuXHRcdC8vIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQgaGFzIGJlZW4gaGlkZGVuIGRpcmVjdGx5IHVzaW5nXHJcblx0XHQvLyBkaXNwbGF5Om5vbmUgKGl0IGlzIHN0aWxsIHNhZmUgdG8gdXNlIG9mZnNldHMgaWYgYSBwYXJlbnQgZWxlbWVudCBpc1xyXG5cdFx0Ly8gaGlkZGVuOyBkb24gc2FmZXR5IGdvZ2dsZXMgYW5kIHNlZSBidWcgIzQ1MTIgZm9yIG1vcmUgaW5mb3JtYXRpb24pLlxyXG5cdFx0Ly8gKG9ubHkgSUUgOCBmYWlscyB0aGlzIHRlc3QpXHJcblx0XHRkaXYuaW5uZXJIVE1MID0gXCI8dGFibGU+PHRyPjx0ZD48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+XCI7XHJcblx0XHR0ZHMgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0ZFwiKTtcclxuXHRcdHRkc1sgMCBdLnN0eWxlLmNzc1RleHQgPSBcInBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5Om5vbmVcIjtcclxuXHRcdGlzU3VwcG9ydGVkID0gKCB0ZHNbIDAgXS5vZmZzZXRIZWlnaHQgPT09IDAgKTtcclxuXHJcblx0XHR0ZHNbIDAgXS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcclxuXHRcdHRkc1sgMSBdLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuXHJcblx0XHQvLyBDaGVjayBpZiBlbXB0eSB0YWJsZSBjZWxscyBzdGlsbCBoYXZlIG9mZnNldFdpZHRoL0hlaWdodFxyXG5cdFx0Ly8gKElFIDw9IDggZmFpbCB0aGlzIHRlc3QpXHJcblx0XHRzdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyA9IGlzU3VwcG9ydGVkICYmICggdGRzWyAwIF0ub2Zmc2V0SGVpZ2h0ID09PSAwICk7XHJcblxyXG5cdFx0Ly8gQ2hlY2sgYm94LXNpemluZyBhbmQgbWFyZ2luIGJlaGF2aW9yXHJcblx0XHRkaXYuaW5uZXJIVE1MID0gXCJcIjtcclxuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID0gXCJib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzoxcHg7Ym9yZGVyOjFweDtkaXNwbGF5OmJsb2NrO3dpZHRoOjRweDttYXJnaW4tdG9wOjElO3Bvc2l0aW9uOmFic29sdXRlO3RvcDoxJTtcIjtcclxuXHRcdHN1cHBvcnQuYm94U2l6aW5nID0gKCBkaXYub2Zmc2V0V2lkdGggPT09IDQgKTtcclxuXHRcdHN1cHBvcnQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgPSAoIGJvZHkub2Zmc2V0VG9wICE9PSAxICk7XHJcblxyXG5cdFx0Ly8gTk9URTogVG8gYW55IGZ1dHVyZSBtYWludGFpbmVyLCB3ZSd2ZSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZVxyXG5cdFx0Ly8gYmVjYXVzZSBqc2RvbSBvbiBub2RlLmpzIHdpbGwgYnJlYWsgd2l0aG91dCBpdC5cclxuXHRcdGlmICggd2luZG93LmdldENvbXB1dGVkU3R5bGUgKSB7XHJcblx0XHRcdHN1cHBvcnQucGl4ZWxQb3NpdGlvbiA9ICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiwgbnVsbCApIHx8IHt9ICkudG9wICE9PSBcIjElXCI7XHJcblx0XHRcdHN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGUgPSAoIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYsIG51bGwgKSB8fCB7IHdpZHRoOiBcIjRweFwiIH0gKS53aWR0aCA9PT0gXCI0cHhcIjtcclxuXHJcblx0XHRcdC8vIENoZWNrIGlmIGRpdiB3aXRoIGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHlcclxuXHRcdFx0Ly8gZ2V0cyBjb21wdXRlZCBtYXJnaW4tcmlnaHQgYmFzZWQgb24gd2lkdGggb2YgY29udGFpbmVyLiBGb3IgbW9yZVxyXG5cdFx0XHQvLyBpbmZvIHNlZSBidWcgIzMzMzNcclxuXHRcdFx0Ly8gRmFpbHMgaW4gV2ViS2l0IGJlZm9yZSBGZWIgMjAxMSBuaWdodGxpZXNcclxuXHRcdFx0Ly8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0XHJcblx0XHRcdG1hcmdpbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHRcdG1hcmdpbkRpdi5zdHlsZS5jc3NUZXh0ID0gZGl2LnN0eWxlLmNzc1RleHQgPSBkaXZSZXNldDtcclxuXHRcdFx0bWFyZ2luRGl2LnN0eWxlLm1hcmdpblJpZ2h0ID0gbWFyZ2luRGl2LnN0eWxlLndpZHRoID0gXCIwXCI7XHJcblx0XHRcdGRpdi5zdHlsZS53aWR0aCA9IFwiMXB4XCI7XHJcblx0XHRcdGRpdi5hcHBlbmRDaGlsZCggbWFyZ2luRGl2ICk7XHJcblx0XHRcdHN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCA9XHJcblx0XHRcdFx0IXBhcnNlRmxvYXQoICggd2luZG93LmdldENvbXB1dGVkU3R5bGUoIG1hcmdpbkRpdiwgbnVsbCApIHx8IHt9ICkubWFyZ2luUmlnaHQgKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHR5cGVvZiBkaXYuc3R5bGUuem9vbSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcclxuXHRcdFx0Ly8gQ2hlY2sgaWYgbmF0aXZlbHkgYmxvY2stbGV2ZWwgZWxlbWVudHMgYWN0IGxpa2UgaW5saW5lLWJsb2NrXHJcblx0XHRcdC8vIGVsZW1lbnRzIHdoZW4gc2V0dGluZyB0aGVpciBkaXNwbGF5IHRvICdpbmxpbmUnIGFuZCBnaXZpbmdcclxuXHRcdFx0Ly8gdGhlbSBsYXlvdXRcclxuXHRcdFx0Ly8gKElFIDwgOCBkb2VzIHRoaXMpXHJcblx0XHRcdGRpdi5pbm5lckhUTUwgPSBcIlwiO1xyXG5cdFx0XHRkaXYuc3R5bGUuY3NzVGV4dCA9IGRpdlJlc2V0ICsgXCJ3aWR0aDoxcHg7cGFkZGluZzoxcHg7ZGlzcGxheTppbmxpbmU7em9vbToxXCI7XHJcblx0XHRcdHN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dCA9ICggZGl2Lm9mZnNldFdpZHRoID09PSAzICk7XHJcblxyXG5cdFx0XHQvLyBDaGVjayBpZiBlbGVtZW50cyB3aXRoIGxheW91dCBzaHJpbmstd3JhcCB0aGVpciBjaGlsZHJlblxyXG5cdFx0XHQvLyAoSUUgNiBkb2VzIHRoaXMpXHJcblx0XHRcdGRpdi5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xyXG5cdFx0XHRkaXYuc3R5bGUub3ZlcmZsb3cgPSBcInZpc2libGVcIjtcclxuXHRcdFx0ZGl2LmlubmVySFRNTCA9IFwiPGRpdj48L2Rpdj5cIjtcclxuXHRcdFx0ZGl2LmZpcnN0Q2hpbGQuc3R5bGUud2lkdGggPSBcIjVweFwiO1xyXG5cdFx0XHRzdXBwb3J0LnNocmlua1dyYXBCbG9ja3MgPSAoIGRpdi5vZmZzZXRXaWR0aCAhPT0gMyApO1xyXG5cclxuXHRcdFx0Y29udGFpbmVyLnN0eWxlLnpvb20gPSAxO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE51bGwgZWxlbWVudHMgdG8gYXZvaWQgbGVha3MgaW4gSUVcclxuXHRcdGJvZHkucmVtb3ZlQ2hpbGQoIGNvbnRhaW5lciApO1xyXG5cdFx0Y29udGFpbmVyID0gZGl2ID0gdGRzID0gbWFyZ2luRGl2ID0gbnVsbDtcclxuXHR9KTtcclxuXHJcblx0Ly8gTnVsbCBlbGVtZW50cyB0byBhdm9pZCBsZWFrcyBpbiBJRVxyXG5cdGZyYWdtZW50LnJlbW92ZUNoaWxkKCBkaXYgKTtcclxuXHRhbGwgPSBhID0gc2VsZWN0ID0gb3B0ID0gaW5wdXQgPSBmcmFnbWVudCA9IGRpdiA9IG51bGw7XHJcblxyXG5cdHJldHVybiBzdXBwb3J0O1xyXG59KSgpO1xyXG52YXIgcmJyYWNlID0gLyg/Olxce1tcXHNcXFNdKlxcfXxcXFtbXFxzXFxTXSpcXF0pJC8sXHJcblx0cm11bHRpRGFzaCA9IC8oW0EtWl0pL2c7XHJcblxyXG5qUXVlcnkuZXh0ZW5kKHtcclxuXHRjYWNoZToge30sXHJcblxyXG5cdGRlbGV0ZWRJZHM6IFtdLFxyXG5cclxuXHQvLyBQbGVhc2UgdXNlIHdpdGggY2F1dGlvblxyXG5cdHV1aWQ6IDAsXHJcblxyXG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxyXG5cdC8vIE5vbi1kaWdpdHMgcmVtb3ZlZCB0byBtYXRjaCByaW5saW5lalF1ZXJ5XHJcblx0ZXhwYW5kbzogXCJqUXVlcnlcIiArICggalF1ZXJ5LmZuLmpxdWVyeSArIE1hdGgucmFuZG9tKCkgKS5yZXBsYWNlKCAvXFxEL2csIFwiXCIgKSxcclxuXHJcblx0Ly8gVGhlIGZvbGxvd2luZyBlbGVtZW50cyB0aHJvdyB1bmNhdGNoYWJsZSBleGNlcHRpb25zIGlmIHlvdVxyXG5cdC8vIGF0dGVtcHQgdG8gYWRkIGV4cGFuZG8gcHJvcGVydGllcyB0byB0aGVtLlxyXG5cdG5vRGF0YToge1xyXG5cdFx0XCJlbWJlZFwiOiB0cnVlLFxyXG5cdFx0Ly8gQmFuIGFsbCBvYmplY3RzIGV4Y2VwdCBmb3IgRmxhc2ggKHdoaWNoIGhhbmRsZSBleHBhbmRvcylcclxuXHRcdFwib2JqZWN0XCI6IFwiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwXCIsXHJcblx0XHRcImFwcGxldFwiOiB0cnVlXHJcblx0fSxcclxuXHJcblx0aGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRlbGVtID0gZWxlbS5ub2RlVHlwZSA/IGpRdWVyeS5jYWNoZVsgZWxlbVtqUXVlcnkuZXhwYW5kb10gXSA6IGVsZW1bIGpRdWVyeS5leHBhbmRvIF07XHJcblx0XHRyZXR1cm4gISFlbGVtICYmICFpc0VtcHR5RGF0YU9iamVjdCggZWxlbSApO1xyXG5cdH0sXHJcblxyXG5cdGRhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhLCBwdnQgLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7XHJcblx0XHRpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIHRoaXNDYWNoZSwgcmV0LFxyXG5cdFx0XHRpbnRlcm5hbEtleSA9IGpRdWVyeS5leHBhbmRvLFxyXG5cdFx0XHRnZXRCeU5hbWUgPSB0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIixcclxuXHJcblx0XHRcdC8vIFdlIGhhdmUgdG8gaGFuZGxlIERPTSBub2RlcyBhbmQgSlMgb2JqZWN0cyBkaWZmZXJlbnRseSBiZWNhdXNlIElFNi03XHJcblx0XHRcdC8vIGNhbid0IEdDIG9iamVjdCByZWZlcmVuY2VzIHByb3Blcmx5IGFjcm9zcyB0aGUgRE9NLUpTIGJvdW5kYXJ5XHJcblx0XHRcdGlzTm9kZSA9IGVsZW0ubm9kZVR5cGUsXHJcblxyXG5cdFx0XHQvLyBPbmx5IERPTSBub2RlcyBuZWVkIHRoZSBnbG9iYWwgalF1ZXJ5IGNhY2hlOyBKUyBvYmplY3QgZGF0YSBpc1xyXG5cdFx0XHQvLyBhdHRhY2hlZCBkaXJlY3RseSB0byB0aGUgb2JqZWN0IHNvIEdDIGNhbiBvY2N1ciBhdXRvbWF0aWNhbGx5XHJcblx0XHRcdGNhY2hlID0gaXNOb2RlID8galF1ZXJ5LmNhY2hlIDogZWxlbSxcclxuXHJcblx0XHRcdC8vIE9ubHkgZGVmaW5pbmcgYW4gSUQgZm9yIEpTIG9iamVjdHMgaWYgaXRzIGNhY2hlIGFscmVhZHkgZXhpc3RzIGFsbG93c1xyXG5cdFx0XHQvLyB0aGUgY29kZSB0byBzaG9ydGN1dCBvbiB0aGUgc2FtZSBwYXRoIGFzIGEgRE9NIG5vZGUgd2l0aCBubyBjYWNoZVxyXG5cdFx0XHRpZCA9IGlzTm9kZSA/IGVsZW1bIGludGVybmFsS2V5IF0gOiBlbGVtWyBpbnRlcm5hbEtleSBdICYmIGludGVybmFsS2V5O1xyXG5cclxuXHRcdC8vIEF2b2lkIGRvaW5nIGFueSBtb3JlIHdvcmsgdGhhbiB3ZSBuZWVkIHRvIHdoZW4gdHJ5aW5nIHRvIGdldCBkYXRhIG9uIGFuXHJcblx0XHQvLyBvYmplY3QgdGhhdCBoYXMgbm8gZGF0YSBhdCBhbGxcclxuXHRcdGlmICggKCFpZCB8fCAhY2FjaGVbaWRdIHx8ICghcHZ0ICYmICFjYWNoZVtpZF0uZGF0YSkpICYmIGdldEJ5TmFtZSAmJiBkYXRhID09PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoICFpZCApIHtcclxuXHRcdFx0Ly8gT25seSBET00gbm9kZXMgbmVlZCBhIG5ldyB1bmlxdWUgSUQgZm9yIGVhY2ggZWxlbWVudCBzaW5jZSB0aGVpciBkYXRhXHJcblx0XHRcdC8vIGVuZHMgdXAgaW4gdGhlIGdsb2JhbCBjYWNoZVxyXG5cdFx0XHRpZiAoIGlzTm9kZSApIHtcclxuXHRcdFx0XHRlbGVtWyBpbnRlcm5hbEtleSBdID0gaWQgPSBqUXVlcnkuZGVsZXRlZElkcy5wb3AoKSB8fCArK2pRdWVyeS51dWlkO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlkID0gaW50ZXJuYWxLZXk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRpZiAoICFjYWNoZVsgaWQgXSApIHtcclxuXHRcdFx0Y2FjaGVbIGlkIF0gPSB7fTtcclxuXHJcblx0XHRcdC8vIEF2b2lkcyBleHBvc2luZyBqUXVlcnkgbWV0YWRhdGEgb24gcGxhaW4gSlMgb2JqZWN0cyB3aGVuIHRoZSBvYmplY3RcclxuXHRcdFx0Ly8gaXMgc2VyaWFsaXplZCB1c2luZyBKU09OLnN0cmluZ2lmeVxyXG5cdFx0XHRpZiAoICFpc05vZGUgKSB7XHJcblx0XHRcdFx0Y2FjaGVbIGlkIF0udG9KU09OID0galF1ZXJ5Lm5vb3A7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBBbiBvYmplY3QgY2FuIGJlIHBhc3NlZCB0byBqUXVlcnkuZGF0YSBpbnN0ZWFkIG9mIGEga2V5L3ZhbHVlIHBhaXI7IHRoaXMgZ2V0c1xyXG5cdFx0Ly8gc2hhbGxvdyBjb3BpZWQgb3ZlciBvbnRvIHRoZSBleGlzdGluZyBjYWNoZVxyXG5cdFx0aWYgKCB0eXBlb2YgbmFtZSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiICkge1xyXG5cdFx0XHRpZiAoIHB2dCApIHtcclxuXHRcdFx0XHRjYWNoZVsgaWQgXSA9IGpRdWVyeS5leHRlbmQoIGNhY2hlWyBpZCBdLCBuYW1lICk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Y2FjaGVbIGlkIF0uZGF0YSA9IGpRdWVyeS5leHRlbmQoIGNhY2hlWyBpZCBdLmRhdGEsIG5hbWUgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXNDYWNoZSA9IGNhY2hlWyBpZCBdO1xyXG5cclxuXHRcdC8vIGpRdWVyeSBkYXRhKCkgaXMgc3RvcmVkIGluIGEgc2VwYXJhdGUgb2JqZWN0IGluc2lkZSB0aGUgb2JqZWN0J3MgaW50ZXJuYWwgZGF0YVxyXG5cdFx0Ly8gY2FjaGUgaW4gb3JkZXIgdG8gYXZvaWQga2V5IGNvbGxpc2lvbnMgYmV0d2VlbiBpbnRlcm5hbCBkYXRhIGFuZCB1c2VyLWRlZmluZWRcclxuXHRcdC8vIGRhdGEuXHJcblx0XHRpZiAoICFwdnQgKSB7XHJcblx0XHRcdGlmICggIXRoaXNDYWNoZS5kYXRhICkge1xyXG5cdFx0XHRcdHRoaXNDYWNoZS5kYXRhID0ge307XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXNDYWNoZSA9IHRoaXNDYWNoZS5kYXRhO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHR0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdID0gZGF0YTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDaGVjayBmb3IgYm90aCBjb252ZXJ0ZWQtdG8tY2FtZWwgYW5kIG5vbi1jb252ZXJ0ZWQgZGF0YSBwcm9wZXJ0eSBuYW1lc1xyXG5cdFx0Ly8gSWYgYSBkYXRhIHByb3BlcnR5IHdhcyBzcGVjaWZpZWRcclxuXHRcdGlmICggZ2V0QnlOYW1lICkge1xyXG5cclxuXHRcdFx0Ly8gRmlyc3QgVHJ5IHRvIGZpbmQgYXMtaXMgcHJvcGVydHkgZGF0YVxyXG5cdFx0XHRyZXQgPSB0aGlzQ2FjaGVbIG5hbWUgXTtcclxuXHJcblx0XHRcdC8vIFRlc3QgZm9yIG51bGx8dW5kZWZpbmVkIHByb3BlcnR5IGRhdGFcclxuXHRcdFx0aWYgKCByZXQgPT0gbnVsbCApIHtcclxuXHJcblx0XHRcdFx0Ly8gVHJ5IHRvIGZpbmQgdGhlIGNhbWVsQ2FzZWQgcHJvcGVydHlcclxuXHRcdFx0XHRyZXQgPSB0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXQgPSB0aGlzQ2FjaGU7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJldDtcclxuXHR9LFxyXG5cclxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgcHZ0IC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xyXG5cdFx0aWYgKCAhalF1ZXJ5LmFjY2VwdERhdGEoIGVsZW0gKSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciB0aGlzQ2FjaGUsIGksIGwsXHJcblxyXG5cdFx0XHRpc05vZGUgPSBlbGVtLm5vZGVUeXBlLFxyXG5cclxuXHRcdFx0Ly8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uXHJcblx0XHRcdGNhY2hlID0gaXNOb2RlID8galF1ZXJ5LmNhY2hlIDogZWxlbSxcclxuXHRcdFx0aWQgPSBpc05vZGUgPyBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdIDogalF1ZXJ5LmV4cGFuZG87XHJcblxyXG5cdFx0Ly8gSWYgdGhlcmUgaXMgYWxyZWFkeSBubyBjYWNoZSBlbnRyeSBmb3IgdGhpcyBvYmplY3QsIHRoZXJlIGlzIG5vXHJcblx0XHQvLyBwdXJwb3NlIGluIGNvbnRpbnVpbmdcclxuXHRcdGlmICggIWNhY2hlWyBpZCBdICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBuYW1lICkge1xyXG5cclxuXHRcdFx0dGhpc0NhY2hlID0gcHZ0ID8gY2FjaGVbIGlkIF0gOiBjYWNoZVsgaWQgXS5kYXRhO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzQ2FjaGUgKSB7XHJcblxyXG5cdFx0XHRcdC8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBuYW1lcyBmb3IgZGF0YSBrZXlzXHJcblx0XHRcdFx0aWYgKCAhalF1ZXJ5LmlzQXJyYXkoIG5hbWUgKSApIHtcclxuXHJcblx0XHRcdFx0XHQvLyB0cnkgdGhlIHN0cmluZyBhcyBhIGtleSBiZWZvcmUgYW55IG1hbmlwdWxhdGlvblxyXG5cdFx0XHRcdFx0aWYgKCBuYW1lIGluIHRoaXNDYWNoZSApIHtcclxuXHRcdFx0XHRcdFx0bmFtZSA9IFsgbmFtZSBdO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdFx0XHRcdC8vIHNwbGl0IHRoZSBjYW1lbCBjYXNlZCB2ZXJzaW9uIGJ5IHNwYWNlcyB1bmxlc3MgYSBrZXkgd2l0aCB0aGUgc3BhY2VzIGV4aXN0c1xyXG5cdFx0XHRcdFx0XHRuYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApO1xyXG5cdFx0XHRcdFx0XHRpZiAoIG5hbWUgaW4gdGhpc0NhY2hlICkge1xyXG5cdFx0XHRcdFx0XHRcdG5hbWUgPSBbIG5hbWUgXTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRuYW1lID0gbmFtZS5zcGxpdChcIiBcIik7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gbmFtZS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XHJcblx0XHRcdFx0XHRkZWxldGUgdGhpc0NhY2hlWyBuYW1lW2ldIF07XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBubyBkYXRhIGxlZnQgaW4gdGhlIGNhY2hlLCB3ZSB3YW50IHRvIGNvbnRpbnVlXHJcblx0XHRcdFx0Ly8gYW5kIGxldCB0aGUgY2FjaGUgb2JqZWN0IGl0c2VsZiBnZXQgZGVzdHJveWVkXHJcblx0XHRcdFx0aWYgKCAhKCBwdnQgPyBpc0VtcHR5RGF0YU9iamVjdCA6IGpRdWVyeS5pc0VtcHR5T2JqZWN0ICkoIHRoaXNDYWNoZSApICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFNlZSBqUXVlcnkuZGF0YSBmb3IgbW9yZSBpbmZvcm1hdGlvblxyXG5cdFx0aWYgKCAhcHZ0ICkge1xyXG5cdFx0XHRkZWxldGUgY2FjaGVbIGlkIF0uZGF0YTtcclxuXHJcblx0XHRcdC8vIERvbid0IGRlc3Ryb3kgdGhlIHBhcmVudCBjYWNoZSB1bmxlc3MgdGhlIGludGVybmFsIGRhdGEgb2JqZWN0XHJcblx0XHRcdC8vIGhhZCBiZWVuIHRoZSBvbmx5IHRoaW5nIGxlZnQgaW4gaXRcclxuXHRcdFx0aWYgKCAhaXNFbXB0eURhdGFPYmplY3QoIGNhY2hlWyBpZCBdICkgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRGVzdHJveSB0aGUgY2FjaGVcclxuXHRcdGlmICggaXNOb2RlICkge1xyXG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBbIGVsZW0gXSwgdHJ1ZSApO1xyXG5cclxuXHRcdC8vIFVzZSBkZWxldGUgd2hlbiBzdXBwb3J0ZWQgZm9yIGV4cGFuZG9zIG9yIGBjYWNoZWAgaXMgbm90IGEgd2luZG93IHBlciBpc1dpbmRvdyAoIzEwMDgwKVxyXG5cdFx0fSBlbHNlIGlmICggalF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyB8fCBjYWNoZSAhPSBjYWNoZS53aW5kb3cgKSB7XHJcblx0XHRcdGRlbGV0ZSBjYWNoZVsgaWQgXTtcclxuXHJcblx0XHQvLyBXaGVuIGFsbCBlbHNlIGZhaWxzLCBudWxsXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjYWNoZVsgaWQgXSA9IG51bGw7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly8gRm9yIGludGVybmFsIHVzZSBvbmx5LlxyXG5cdF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcclxuXHRcdHJldHVybiBqUXVlcnkuZGF0YSggZWxlbSwgbmFtZSwgZGF0YSwgdHJ1ZSApO1xyXG5cdH0sXHJcblxyXG5cdC8vIEEgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBpZiBhIERPTSBub2RlIGNhbiBoYW5kbGUgdGhlIGRhdGEgZXhwYW5kb1xyXG5cdGFjY2VwdERhdGE6IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0dmFyIG5vRGF0YSA9IGVsZW0ubm9kZU5hbWUgJiYgalF1ZXJ5Lm5vRGF0YVsgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XHJcblxyXG5cdFx0Ly8gbm9kZXMgYWNjZXB0IGRhdGEgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQ7IHJlamVjdGlvbiBjYW4gYmUgY29uZGl0aW9uYWxcclxuXHRcdHJldHVybiAhbm9EYXRhIHx8IG5vRGF0YSAhPT0gdHJ1ZSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzaWRcIikgPT09IG5vRGF0YTtcclxuXHR9XHJcbn0pO1xyXG5cclxualF1ZXJ5LmZuLmV4dGVuZCh7XHJcblx0ZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XHJcblx0XHR2YXIgcGFydHMsIHBhcnQsIGF0dHIsIG5hbWUsIGwsXHJcblx0XHRcdGVsZW0gPSB0aGlzWzBdLFxyXG5cdFx0XHRpID0gMCxcclxuXHRcdFx0ZGF0YSA9IG51bGw7XHJcblxyXG5cdFx0Ly8gR2V0cyBhbGwgdmFsdWVzXHJcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRpZiAoIHRoaXMubGVuZ3RoICkge1xyXG5cdFx0XHRcdGRhdGEgPSBqUXVlcnkuZGF0YSggZWxlbSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWpRdWVyeS5fZGF0YSggZWxlbSwgXCJwYXJzZWRBdHRyc1wiICkgKSB7XHJcblx0XHRcdFx0XHRhdHRyID0gZWxlbS5hdHRyaWJ1dGVzO1xyXG5cdFx0XHRcdFx0Zm9yICggbCA9IGF0dHIubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xyXG5cdFx0XHRcdFx0XHRuYW1lID0gYXR0cltpXS5uYW1lO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCBuYW1lLmluZGV4T2YoIFwiZGF0YS1cIiApID09PSAwICkge1xyXG5cdFx0XHRcdFx0XHRcdG5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lLnN1YnN0cmluZyg1KSApO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGpRdWVyeS5fZGF0YSggZWxlbSwgXCJwYXJzZWRBdHRyc1wiLCB0cnVlICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZGF0YTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBTZXRzIG11bHRpcGxlIHZhbHVlc1xyXG5cdFx0aWYgKCB0eXBlb2Yga2V5ID09PSBcIm9iamVjdFwiICkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGpRdWVyeS5kYXRhKCB0aGlzLCBrZXkgKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cGFydHMgPSBrZXkuc3BsaXQoIFwiLlwiLCAyICk7XHJcblx0XHRwYXJ0c1sxXSA9IHBhcnRzWzFdID8gXCIuXCIgKyBwYXJ0c1sxXSA6IFwiXCI7XHJcblx0XHRwYXJ0ID0gcGFydHNbMV0gKyBcIiFcIjtcclxuXHJcblx0XHRyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xyXG5cclxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRcdGRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCBcImdldERhdGFcIiArIHBhcnQsIFsgcGFydHNbMF0gXSApO1xyXG5cclxuXHRcdFx0XHQvLyBUcnkgdG8gZmV0Y2ggYW55IGludGVybmFsbHkgc3RvcmVkIGRhdGEgZmlyc3RcclxuXHRcdFx0XHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtICkge1xyXG5cdFx0XHRcdFx0ZGF0YSA9IGpRdWVyeS5kYXRhKCBlbGVtLCBrZXkgKTtcclxuXHRcdFx0XHRcdGRhdGEgPSBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID9cclxuXHRcdFx0XHRcdHRoaXMuZGF0YSggcGFydHNbMF0gKSA6XHJcblx0XHRcdFx0XHRkYXRhO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRwYXJ0c1sxXSA9IHZhbHVlO1xyXG5cdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0dmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKTtcclxuXHJcblx0XHRcdFx0c2VsZi50cmlnZ2VySGFuZGxlciggXCJzZXREYXRhXCIgKyBwYXJ0LCBwYXJ0cyApO1xyXG5cdFx0XHRcdGpRdWVyeS5kYXRhKCB0aGlzLCBrZXksIHZhbHVlICk7XHJcblx0XHRcdFx0c2VsZi50cmlnZ2VySGFuZGxlciggXCJjaGFuZ2VEYXRhXCIgKyBwYXJ0LCBwYXJ0cyApO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgZmFsc2UgKTtcclxuXHR9LFxyXG5cclxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkge1xyXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcclxuXHRcdFx0alF1ZXJ5LnJlbW92ZURhdGEoIHRoaXMsIGtleSApO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59KTtcclxuXHJcbmZ1bmN0aW9uIGRhdGFBdHRyKCBlbGVtLCBrZXksIGRhdGEgKSB7XHJcblx0Ly8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueVxyXG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxyXG5cdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XHJcblxyXG5cdFx0dmFyIG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJDFcIiApLnRvTG93ZXJDYXNlKCk7XHJcblxyXG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRkYXRhID0gZGF0YSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDpcclxuXHRcdFx0XHRkYXRhID09PSBcImZhbHNlXCIgPyBmYWxzZSA6XHJcblx0XHRcdFx0ZGF0YSA9PT0gXCJudWxsXCIgPyBudWxsIDpcclxuXHRcdFx0XHQvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xyXG5cdFx0XHRcdCtkYXRhICsgXCJcIiA9PT0gZGF0YSA/ICtkYXRhIDpcclxuXHRcdFx0XHRyYnJhY2UudGVzdCggZGF0YSApID8galF1ZXJ5LnBhcnNlSlNPTiggZGF0YSApIDpcclxuXHRcdFx0XHRcdGRhdGE7XHJcblx0XHRcdH0gY2F0Y2goIGUgKSB7fVxyXG5cclxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXHJcblx0XHRcdGpRdWVyeS5kYXRhKCBlbGVtLCBrZXksIGRhdGEgKTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGRhdGE7XHJcbn1cclxuXHJcbi8vIGNoZWNrcyBhIGNhY2hlIG9iamVjdCBmb3IgZW1wdGluZXNzXHJcbmZ1bmN0aW9uIGlzRW1wdHlEYXRhT2JqZWN0KCBvYmogKSB7XHJcblx0dmFyIG5hbWU7XHJcblx0Zm9yICggbmFtZSBpbiBvYmogKSB7XHJcblxyXG5cdFx0Ly8gaWYgdGhlIHB1YmxpYyBkYXRhIG9iamVjdCBpcyBlbXB0eSwgdGhlIHByaXZhdGUgaXMgc3RpbGwgZW1wdHlcclxuXHRcdGlmICggbmFtZSA9PT0gXCJkYXRhXCIgJiYgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIG9ialtuYW1lXSApICkge1xyXG5cdFx0XHRjb250aW51ZTtcclxuXHRcdH1cclxuXHRcdGlmICggbmFtZSAhPT0gXCJ0b0pTT05cIiApIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRydWU7XHJcbn1cclxualF1ZXJ5LmV4dGVuZCh7XHJcblx0cXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkge1xyXG5cdFx0dmFyIHF1ZXVlO1xyXG5cclxuXHRcdGlmICggZWxlbSApIHtcclxuXHRcdFx0dHlwZSA9ICggdHlwZSB8fCBcImZ4XCIgKSArIFwicXVldWVcIjtcclxuXHRcdFx0cXVldWUgPSBqUXVlcnkuX2RhdGEoIGVsZW0sIHR5cGUgKTtcclxuXHJcblx0XHRcdC8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3QgYSBsb29rdXBcclxuXHRcdFx0aWYgKCBkYXRhICkge1xyXG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IGpRdWVyeS5pc0FycmF5KGRhdGEpICkge1xyXG5cdFx0XHRcdFx0cXVldWUgPSBqUXVlcnkuX2RhdGEoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoZGF0YSkgKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0cXVldWUucHVzaCggZGF0YSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gcXVldWUgfHwgW107XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XHJcblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XHJcblxyXG5cdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksXHJcblx0XHRcdHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLFxyXG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCksXHJcblx0XHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksXHJcblx0XHRcdG5leHQgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdC8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWxcclxuXHRcdGlmICggZm4gPT09IFwiaW5wcm9ncmVzc1wiICkge1xyXG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XHJcblx0XHRcdHN0YXJ0TGVuZ3RoLS07XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBmbiApIHtcclxuXHJcblx0XHRcdC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmdcclxuXHRcdFx0Ly8gYXV0b21hdGljYWxseSBkZXF1ZXVlZFxyXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiApIHtcclxuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KCBcImlucHJvZ3Jlc3NcIiApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBjbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uXHJcblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xyXG5cdFx0XHRmbi5jYWxsKCBlbGVtLCBuZXh0LCBob29rcyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkge1xyXG5cdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly8gbm90IGludGVuZGVkIGZvciBwdWJsaWMgY29uc3VtcHRpb24gLSBnZW5lcmF0ZXMgYSBxdWV1ZUhvb2tzIG9iamVjdCwgb3IgcmV0dXJucyB0aGUgY3VycmVudCBvbmVcclxuXHRfcXVldWVIb29rczogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XHJcblx0XHR2YXIga2V5ID0gdHlwZSArIFwicXVldWVIb29rc1wiO1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5fZGF0YSggZWxlbSwga2V5ICkgfHwgalF1ZXJ5Ll9kYXRhKCBlbGVtLCBrZXksIHtcclxuXHRcdFx0ZW1wdHk6IGpRdWVyeS5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKS5hZGQoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0alF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIHR5cGUgKyBcInF1ZXVlXCIsIHRydWUgKTtcclxuXHRcdFx0XHRqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwga2V5LCB0cnVlICk7XHJcblx0XHRcdH0pXHJcblx0XHR9KTtcclxuXHR9XHJcbn0pO1xyXG5cclxualF1ZXJ5LmZuLmV4dGVuZCh7XHJcblx0cXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xyXG5cdFx0dmFyIHNldHRlciA9IDI7XHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0ZGF0YSA9IHR5cGU7XHJcblx0XHRcdHR5cGUgPSBcImZ4XCI7XHJcblx0XHRcdHNldHRlci0tO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHtcclxuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBkYXRhID09PSB1bmRlZmluZWQgP1xyXG5cdFx0XHR0aGlzIDpcclxuXHRcdFx0dGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xyXG5cclxuXHRcdFx0XHQvLyBlbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZVxyXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xyXG5cclxuXHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiAmJiBxdWV1ZVswXSAhPT0gXCJpbnByb2dyZXNzXCIgKSB7XHJcblx0XHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0fSxcclxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcclxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XHJcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cdC8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cclxuXHQvLyBodHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvXHJcblx0ZGVsYXk6IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkge1xyXG5cdFx0dGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTtcclxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkge1xyXG5cdFx0XHR2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoIG5leHQsIHRpbWUgKTtcclxuXHRcdFx0aG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGNsZWFyVGltZW91dCggdGltZW91dCApO1xyXG5cdFx0XHR9O1xyXG5cdFx0fSk7XHJcblx0fSxcclxuXHRjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcclxuXHRcdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcclxuXHR9LFxyXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcclxuXHQvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdClcclxuXHRwcm9taXNlOiBmdW5jdGlvbiggdHlwZSwgb2JqICkge1xyXG5cdFx0dmFyIHRtcCxcclxuXHRcdFx0Y291bnQgPSAxLFxyXG5cdFx0XHRkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLFxyXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXHJcblx0XHRcdGkgPSB0aGlzLmxlbmd0aCxcclxuXHRcdFx0cmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xyXG5cdFx0XHRcdFx0ZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH07XHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0b2JqID0gdHlwZTtcclxuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcclxuXHJcblx0XHR3aGlsZSggaS0tICkge1xyXG5cdFx0XHR0bXAgPSBqUXVlcnkuX2RhdGEoIGVsZW1lbnRzWyBpIF0sIHR5cGUgKyBcInF1ZXVlSG9va3NcIiApO1xyXG5cdFx0XHRpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7XHJcblx0XHRcdFx0Y291bnQrKztcclxuXHRcdFx0XHR0bXAuZW1wdHkuYWRkKCByZXNvbHZlICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJlc29sdmUoKTtcclxuXHRcdHJldHVybiBkZWZlci5wcm9taXNlKCBvYmogKTtcclxuXHR9XHJcbn0pO1xyXG52YXIgbm9kZUhvb2ssIGJvb2xIb29rLCBmaXhTcGVjaWZpZWQsXHJcblx0cmNsYXNzID0gL1tcXHRcXHJcXG5dL2csXHJcblx0cnJldHVybiA9IC9cXHIvZyxcclxuXHRydHlwZSA9IC9eKD86YnV0dG9ufGlucHV0KSQvaSxcclxuXHRyZm9jdXNhYmxlID0gL14oPzpidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksXHJcblx0cmNsaWNrYWJsZSA9IC9eYSg/OnJlYXwpJC9pLFxyXG5cdHJib29sZWFuID0gL14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksXHJcblx0Z2V0U2V0QXR0cmlidXRlID0galF1ZXJ5LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlO1xyXG5cclxualF1ZXJ5LmZuLmV4dGVuZCh7XHJcblx0YXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGpRdWVyeS5hdHRyLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcclxuXHR9LFxyXG5cclxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHtcclxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XHJcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cclxuXHRwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xyXG5cdH0sXHJcblxyXG5cdHJlbW92ZVByb3A6IGZ1bmN0aW9uKCBuYW1lICkge1xyXG5cdFx0bmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcclxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XHJcblx0XHRcdC8vIHRyeS9jYXRjaCBoYW5kbGVzIGNhc2VzIHdoZXJlIElFIGJhbGtzIChzdWNoIGFzIHJlbW92aW5nIGEgcHJvcGVydHkgb24gd2luZG93KVxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdHRoaXNbIG5hbWUgXSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRkZWxldGUgdGhpc1sgbmFtZSBdO1xyXG5cdFx0XHR9IGNhdGNoKCBlICkge31cclxuXHRcdH0pO1xyXG5cdH0sXHJcblxyXG5cdGFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XHJcblx0XHR2YXIgY2xhc3NOYW1lcywgaSwgbCwgZWxlbSxcclxuXHRcdFx0c2V0Q2xhc3MsIGMsIGNsO1xyXG5cclxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7XHJcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwodGhpcywgaiwgdGhpcy5jbGFzc05hbWUpICk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICkge1xyXG5cdFx0XHRjbGFzc05hbWVzID0gdmFsdWUuc3BsaXQoIGNvcmVfcnNwYWNlICk7XHJcblxyXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xyXG5cdFx0XHRcdGVsZW0gPSB0aGlzWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcclxuXHRcdFx0XHRcdGlmICggIWVsZW0uY2xhc3NOYW1lICYmIGNsYXNzTmFtZXMubGVuZ3RoID09PSAxICkge1xyXG5cdFx0XHRcdFx0XHRlbGVtLmNsYXNzTmFtZSA9IHZhbHVlO1xyXG5cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHNldENsYXNzID0gXCIgXCIgKyBlbGVtLmNsYXNzTmFtZSArIFwiIFwiO1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggYyA9IDAsIGNsID0gY2xhc3NOYW1lcy5sZW5ndGg7IGMgPCBjbDsgYysrICkge1xyXG5cdFx0XHRcdFx0XHRcdGlmICggIX5zZXRDbGFzcy5pbmRleE9mKCBcIiBcIiArIGNsYXNzTmFtZXNbIGMgXSArIFwiIFwiICkgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRzZXRDbGFzcyArPSBjbGFzc05hbWVzWyBjIF0gKyBcIiBcIjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0ZWxlbS5jbGFzc05hbWUgPSBqUXVlcnkudHJpbSggc2V0Q2xhc3MgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cclxuXHRyZW1vdmVDbGFzczogZnVuY3Rpb24oIHZhbHVlICkge1xyXG5cdFx0dmFyIHJlbW92ZXMsIGNsYXNzTmFtZSwgZWxlbSwgYywgY2wsIGksIGw7XHJcblxyXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaiApIHtcclxuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSkgKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHRpZiAoICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHx8IHZhbHVlID09PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdHJlbW92ZXMgPSAoIHZhbHVlIHx8IFwiXCIgKS5zcGxpdCggY29yZV9yc3BhY2UgKTtcclxuXHJcblx0XHRcdGZvciAoIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XHJcblx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXTtcclxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5jbGFzc05hbWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Y2xhc3NOYW1lID0gKFwiIFwiICsgZWxlbS5jbGFzc05hbWUgKyBcIiBcIikucmVwbGFjZSggcmNsYXNzLCBcIiBcIiApO1xyXG5cclxuXHRcdFx0XHRcdC8vIGxvb3Agb3ZlciBlYWNoIGl0ZW0gaW4gdGhlIHJlbW92YWwgbGlzdFxyXG5cdFx0XHRcdFx0Zm9yICggYyA9IDAsIGNsID0gcmVtb3Zlcy5sZW5ndGg7IGMgPCBjbDsgYysrICkge1xyXG5cdFx0XHRcdFx0XHQvLyBSZW1vdmUgdW50aWwgdGhlcmUgaXMgbm90aGluZyB0byByZW1vdmUsXHJcblx0XHRcdFx0XHRcdHdoaWxlICggY2xhc3NOYW1lLmluZGV4T2YoXCIgXCIgKyByZW1vdmVzWyBjIF0gKyBcIiBcIikgPiAtMSApIHtcclxuXHRcdFx0XHRcdFx0XHRjbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSggXCIgXCIgKyByZW1vdmVzWyBjIF0gKyBcIiBcIiAsIFwiIFwiICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGVsZW0uY2xhc3NOYW1lID0gdmFsdWUgPyBqUXVlcnkudHJpbSggY2xhc3NOYW1lICkgOiBcIlwiO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH0sXHJcblxyXG5cdHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkge1xyXG5cdFx0dmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsXHJcblx0XHRcdGlzQm9vbCA9IHR5cGVvZiBzdGF0ZVZhbCA9PT0gXCJib29sZWFuXCI7XHJcblxyXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHtcclxuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBpLCB0aGlzLmNsYXNzTmFtZSwgc3RhdGVWYWwpLCBzdGF0ZVZhbCApO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwic3RyaW5nXCIgKSB7XHJcblx0XHRcdFx0Ly8gdG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXNcclxuXHRcdFx0XHR2YXIgY2xhc3NOYW1lLFxyXG5cdFx0XHRcdFx0aSA9IDAsXHJcblx0XHRcdFx0XHRzZWxmID0galF1ZXJ5KCB0aGlzICksXHJcblx0XHRcdFx0XHRzdGF0ZSA9IHN0YXRlVmFsLFxyXG5cdFx0XHRcdFx0Y2xhc3NOYW1lcyA9IHZhbHVlLnNwbGl0KCBjb3JlX3JzcGFjZSApO1xyXG5cclxuXHRcdFx0XHR3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSkgKSB7XHJcblx0XHRcdFx0XHQvLyBjaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3RcclxuXHRcdFx0XHRcdHN0YXRlID0gaXNCb29sID8gc3RhdGUgOiAhc2VsZi5oYXNDbGFzcyggY2xhc3NOYW1lICk7XHJcblx0XHRcdFx0XHRzZWxmWyBzdGF0ZSA/IFwiYWRkQ2xhc3NcIiA6IFwicmVtb3ZlQ2xhc3NcIiBdKCBjbGFzc05hbWUgKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGUgPT09IFwiYm9vbGVhblwiICkge1xyXG5cdFx0XHRcdGlmICggdGhpcy5jbGFzc05hbWUgKSB7XHJcblx0XHRcdFx0XHQvLyBzdG9yZSBjbGFzc05hbWUgaWYgc2V0XHJcblx0XHRcdFx0XHRqUXVlcnkuX2RhdGEoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiLCB0aGlzLmNsYXNzTmFtZSApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gdG9nZ2xlIHdob2xlIGNsYXNzTmFtZVxyXG5cdFx0XHRcdHRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID8gXCJcIiA6IGpRdWVyeS5fZGF0YSggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIgKSB8fCBcIlwiO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cclxuXHRoYXNDbGFzczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xyXG5cdFx0dmFyIGNsYXNzTmFtZSA9IFwiIFwiICsgc2VsZWN0b3IgKyBcIiBcIixcclxuXHRcdFx0aSA9IDAsXHJcblx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcclxuXHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcclxuXHRcdFx0aWYgKCB0aGlzW2ldLm5vZGVUeXBlID09PSAxICYmIChcIiBcIiArIHRoaXNbaV0uY2xhc3NOYW1lICsgXCIgXCIpLnJlcGxhY2UocmNsYXNzLCBcIiBcIikuaW5kZXhPZiggY2xhc3NOYW1lICkgPiAtMSApIHtcclxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9LFxyXG5cclxuXHR2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcclxuXHRcdHZhciBob29rcywgcmV0LCBpc0Z1bmN0aW9uLFxyXG5cdFx0XHRlbGVtID0gdGhpc1swXTtcclxuXHJcblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xyXG5cdFx0XHRpZiAoIGVsZW0gKSB7XHJcblx0XHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XHJcblxyXG5cdFx0XHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSkgIT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0XHRcdHJldHVybiByZXQ7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXQgPSBlbGVtLnZhbHVlO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIHJldCA9PT0gXCJzdHJpbmdcIiA/XHJcblx0XHRcdFx0XHQvLyBoYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzXHJcblx0XHRcdFx0XHRyZXQucmVwbGFjZShycmV0dXJuLCBcIlwiKSA6XHJcblx0XHRcdFx0XHQvLyBoYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcclxuXHRcdFx0XHRcdHJldCA9PSBudWxsID8gXCJcIiA6IHJldDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkge1xyXG5cdFx0XHR2YXIgdmFsLFxyXG5cdFx0XHRcdHNlbGYgPSBqUXVlcnkodGhpcyk7XHJcblxyXG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgIT09IDEgKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24gKSB7XHJcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgc2VsZi52YWwoKSApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXHJcblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XHJcblx0XHRcdFx0dmFsID0gXCJcIjtcclxuXHRcdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIiApIHtcclxuXHRcdFx0XHR2YWwgKz0gXCJcIjtcclxuXHRcdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkge1xyXG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAodmFsLCBmdW5jdGlvbiAoIHZhbHVlICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcclxuXHJcblx0XHRcdC8vIElmIHNldCByZXR1cm5zIHVuZGVmaW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5nXHJcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoXCJzZXRcIiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsIFwidmFsdWVcIiApID09PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG59KTtcclxuXHJcbmpRdWVyeS5leHRlbmQoe1xyXG5cdHZhbEhvb2tzOiB7XHJcblx0XHRvcHRpb246IHtcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHQvLyBhdHRyaWJ1dGVzLnZhbHVlIGlzIHVuZGVmaW5lZCBpbiBCbGFja2JlcnJ5IDQuNyBidXRcclxuXHRcdFx0XHQvLyB1c2VzIC52YWx1ZS4gU2VlICM2OTMyXHJcblx0XHRcdFx0dmFyIHZhbCA9IGVsZW0uYXR0cmlidXRlcy52YWx1ZTtcclxuXHRcdFx0XHRyZXR1cm4gIXZhbCB8fCB2YWwuc3BlY2lmaWVkID8gZWxlbS52YWx1ZSA6IGVsZW0udGV4dDtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdHNlbGVjdDoge1xyXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRcdHZhciB2YWx1ZSwgaSwgbWF4LCBvcHRpb24sXHJcblx0XHRcdFx0XHRpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCxcclxuXHRcdFx0XHRcdHZhbHVlcyA9IFtdLFxyXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcclxuXHRcdFx0XHRcdG9uZSA9IGVsZW0udHlwZSA9PT0gXCJzZWxlY3Qtb25lXCI7XHJcblxyXG5cdFx0XHRcdC8vIE5vdGhpbmcgd2FzIHNlbGVjdGVkXHJcblx0XHRcdFx0aWYgKCBpbmRleCA8IDAgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnNcclxuXHRcdFx0XHRpID0gb25lID8gaW5kZXggOiAwO1xyXG5cdFx0XHRcdG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoO1xyXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xyXG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xyXG5cclxuXHRcdFx0XHRcdC8vIERvbid0IHJldHVybiBvcHRpb25zIHRoYXQgYXJlIGRpc2FibGVkIG9yIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXBcclxuXHRcdFx0XHRcdGlmICggb3B0aW9uLnNlbGVjdGVkICYmIChqUXVlcnkuc3VwcG9ydC5vcHREaXNhYmxlZCA/ICFvcHRpb24uZGlzYWJsZWQgOiBvcHRpb24uZ2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPT09IG51bGwpICYmXHJcblx0XHRcdFx0XHRcdFx0KCFvcHRpb24ucGFyZW50Tm9kZS5kaXNhYmxlZCB8fCAhalF1ZXJ5Lm5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkpICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxyXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xyXG5cdFx0XHRcdFx0XHRpZiAoIG9uZSApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5XHJcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gRml4ZXMgQnVnICMyNTUxIC0tIHNlbGVjdC52YWwoKSBicm9rZW4gaW4gSUUgYWZ0ZXIgZm9ybS5yZXNldCgpXHJcblx0XHRcdFx0aWYgKCBvbmUgJiYgIXZhbHVlcy5sZW5ndGggJiYgb3B0aW9ucy5sZW5ndGggKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5KCBvcHRpb25zWyBpbmRleCBdICkudmFsKCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XHJcblx0XHRcdFx0dmFyIHZhbHVlcyA9IGpRdWVyeS5tYWtlQXJyYXkoIHZhbHVlICk7XHJcblxyXG5cdFx0XHRcdGpRdWVyeShlbGVtKS5maW5kKFwib3B0aW9uXCIpLmVhY2goZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeSh0aGlzKS52YWwoKSwgdmFsdWVzICkgPj0gMDtcclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0aWYgKCAhdmFsdWVzLmxlbmd0aCApIHtcclxuXHRcdFx0XHRcdGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly8gVW51c2VkIGluIDEuOCwgbGVmdCBpbiBzbyBhdHRyRm4tc3RhYmJlcnMgd29uJ3QgZGllOyByZW1vdmUgaW4gMS45XHJcblx0YXR0ckZuOiB7fSxcclxuXHJcblx0YXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBwYXNzICkge1xyXG5cdFx0dmFyIHJldCwgaG9va3MsIG5vdHhtbCxcclxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xyXG5cclxuXHRcdC8vIGRvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcclxuXHRcdGlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHBhc3MgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIGpRdWVyeS5mblsgbmFtZSBdICkgKSB7XHJcblx0XHRcdHJldHVybiBqUXVlcnkoIGVsZW0gKVsgbmFtZSBdKCB2YWx1ZSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkXHJcblx0XHRpZiAoIHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSA9PT0gXCJ1bmRlZmluZWRcIiApIHtcclxuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdG5vdHhtbCA9IG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKTtcclxuXHJcblx0XHQvLyBBbGwgYXR0cmlidXRlcyBhcmUgbG93ZXJjYXNlXHJcblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXHJcblx0XHRpZiAoIG5vdHhtbCApIHtcclxuXHRcdFx0bmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0aG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gfHwgKCByYm9vbGVhbi50ZXN0KCBuYW1lICkgPyBib29sSG9vayA6IG5vZGVIb29rICk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cclxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gbnVsbCApIHtcclxuXHRcdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdH0gZWxzZSBpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiYgbm90eG1sICYmIChyZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkpICE9PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHJldDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIFwiXCIgKyB2YWx1ZSApO1xyXG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSBpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgbm90eG1sICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7XHJcblx0XHRcdHJldHVybiByZXQ7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHJldCA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XHJcblxyXG5cdFx0XHQvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZFxyXG5cdFx0XHRyZXR1cm4gcmV0ID09PSBudWxsID9cclxuXHRcdFx0XHR1bmRlZmluZWQgOlxyXG5cdFx0XHRcdHJldDtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XHJcblx0XHR2YXIgcHJvcE5hbWUsIGF0dHJOYW1lcywgbmFtZSwgaXNCb29sLFxyXG5cdFx0XHRpID0gMDtcclxuXHJcblx0XHRpZiAoIHZhbHVlICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XHJcblxyXG5cdFx0XHRhdHRyTmFtZXMgPSB2YWx1ZS5zcGxpdCggY29yZV9yc3BhY2UgKTtcclxuXHJcblx0XHRcdGZvciAoIDsgaSA8IGF0dHJOYW1lcy5sZW5ndGg7IGkrKyApIHtcclxuXHRcdFx0XHRuYW1lID0gYXR0ck5hbWVzWyBpIF07XHJcblxyXG5cdFx0XHRcdGlmICggbmFtZSApIHtcclxuXHRcdFx0XHRcdHByb3BOYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lO1xyXG5cdFx0XHRcdFx0aXNCb29sID0gcmJvb2xlYW4udGVzdCggbmFtZSApO1xyXG5cclxuXHRcdFx0XHRcdC8vIFNlZSAjOTY5OSBmb3IgZXhwbGFuYXRpb24gb2YgdGhpcyBhcHByb2FjaCAoc2V0dGluZyBmaXJzdCwgdGhlbiByZW1vdmFsKVxyXG5cdFx0XHRcdFx0Ly8gRG8gbm90IGRvIHRoaXMgZm9yIGJvb2xlYW4gYXR0cmlidXRlcyAoc2VlICMxMDg3MClcclxuXHRcdFx0XHRcdGlmICggIWlzQm9vbCApIHtcclxuXHRcdFx0XHRcdFx0alF1ZXJ5LmF0dHIoIGVsZW0sIG5hbWUsIFwiXCIgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBnZXRTZXRBdHRyaWJ1dGUgPyBuYW1lIDogcHJvcE5hbWUgKTtcclxuXHJcblx0XHRcdFx0XHQvLyBTZXQgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB0byBmYWxzZSBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzXHJcblx0XHRcdFx0XHRpZiAoIGlzQm9vbCAmJiBwcm9wTmFtZSBpbiBlbGVtICkge1xyXG5cdFx0XHRcdFx0XHRlbGVtWyBwcm9wTmFtZSBdID0gZmFsc2U7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0YXR0ckhvb2tzOiB7XHJcblx0XHR0eXBlOiB7XHJcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xyXG5cdFx0XHRcdC8vIFdlIGNhbid0IGFsbG93IHRoZSB0eXBlIHByb3BlcnR5IHRvIGJlIGNoYW5nZWQgKHNpbmNlIGl0IGNhdXNlcyBwcm9ibGVtcyBpbiBJRSlcclxuXHRcdFx0XHRpZiAoIHJ0eXBlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7XHJcblx0XHRcdFx0XHRqUXVlcnkuZXJyb3IoIFwidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkXCIgKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKCAhalF1ZXJ5LnN1cHBvcnQucmFkaW9WYWx1ZSAmJiB2YWx1ZSA9PT0gXCJyYWRpb1wiICYmIGpRdWVyeS5ub2RlTmFtZShlbGVtLCBcImlucHV0XCIpICkge1xyXG5cdFx0XHRcdFx0Ly8gU2V0dGluZyB0aGUgdHlwZSBvbiBhIHJhZGlvIGJ1dHRvbiBhZnRlciB0aGUgdmFsdWUgcmVzZXRzIHRoZSB2YWx1ZSBpbiBJRTYtOVxyXG5cdFx0XHRcdFx0Ly8gUmVzZXQgdmFsdWUgdG8gaXQncyBkZWZhdWx0IGluIGNhc2UgdHlwZSBpcyBzZXQgYWZ0ZXIgdmFsdWVcclxuXHRcdFx0XHRcdC8vIFRoaXMgaXMgZm9yIGVsZW1lbnQgY3JlYXRpb25cclxuXHRcdFx0XHRcdHZhciB2YWwgPSBlbGVtLnZhbHVlO1xyXG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCB2YWx1ZSApO1xyXG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XHJcblx0XHRcdFx0XHRcdGVsZW0udmFsdWUgPSB2YWw7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0Ly8gVXNlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBmb3IgYmFjayBjb21wYXRcclxuXHRcdC8vIFVzZSB0aGUgbm9kZUhvb2sgZm9yIGJ1dHRvbiBlbGVtZW50cyBpbiBJRTYvNyAoIzE5NTQpXHJcblx0XHR2YWx1ZToge1xyXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xyXG5cdFx0XHRcdGlmICggbm9kZUhvb2sgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCBcImJ1dHRvblwiICkgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gbm9kZUhvb2suZ2V0KCBlbGVtLCBuYW1lICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiBuYW1lIGluIGVsZW0gP1xyXG5cdFx0XHRcdFx0ZWxlbS52YWx1ZSA6XHJcblx0XHRcdFx0XHRudWxsO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHtcclxuXHRcdFx0XHRpZiAoIG5vZGVIb29rICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJidXR0b25cIiApICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIG5vZGVIb29rLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gRG9lcyBub3QgcmV0dXJuIHNvIHRoYXQgc2V0QXR0cmlidXRlIGlzIGFsc28gdXNlZFxyXG5cdFx0XHRcdGVsZW0udmFsdWUgPSB2YWx1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHByb3BGaXg6IHtcclxuXHRcdHRhYmluZGV4OiBcInRhYkluZGV4XCIsXHJcblx0XHRyZWFkb25seTogXCJyZWFkT25seVwiLFxyXG5cdFx0XCJmb3JcIjogXCJodG1sRm9yXCIsXHJcblx0XHRcImNsYXNzXCI6IFwiY2xhc3NOYW1lXCIsXHJcblx0XHRtYXhsZW5ndGg6IFwibWF4TGVuZ3RoXCIsXHJcblx0XHRjZWxsc3BhY2luZzogXCJjZWxsU3BhY2luZ1wiLFxyXG5cdFx0Y2VsbHBhZGRpbmc6IFwiY2VsbFBhZGRpbmdcIixcclxuXHRcdHJvd3NwYW46IFwicm93U3BhblwiLFxyXG5cdFx0Y29sc3BhbjogXCJjb2xTcGFuXCIsXHJcblx0XHR1c2VtYXA6IFwidXNlTWFwXCIsXHJcblx0XHRmcmFtZWJvcmRlcjogXCJmcmFtZUJvcmRlclwiLFxyXG5cdFx0Y29udGVudGVkaXRhYmxlOiBcImNvbnRlbnRFZGl0YWJsZVwiXHJcblx0fSxcclxuXHJcblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xyXG5cdFx0dmFyIHJldCwgaG9va3MsIG5vdHhtbCxcclxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xyXG5cclxuXHRcdC8vIGRvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcclxuXHRcdGlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRub3R4bWwgPSBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICk7XHJcblxyXG5cdFx0aWYgKCBub3R4bWwgKSB7XHJcblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3NcclxuXHRcdFx0bmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTtcclxuXHRcdFx0aG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSkgIT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0XHRyZXR1cm4gcmV0O1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRyZXR1cm4gKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHJldDtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHByb3BIb29rczoge1xyXG5cdFx0dGFiSW5kZXg6IHtcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHQvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0XHJcblx0XHRcdFx0Ly8gaHR0cDovL2ZsdWlkcHJvamVjdC5vcmcvYmxvZy8yMDA4LzAxLzA5L2dldHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5kZXgtdmFsdWVzLXdpdGgtamF2YXNjcmlwdC9cclxuXHRcdFx0XHR2YXIgYXR0cmlidXRlTm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShcInRhYmluZGV4XCIpO1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gYXR0cmlidXRlTm9kZSAmJiBhdHRyaWJ1dGVOb2RlLnNwZWNpZmllZCA/XHJcblx0XHRcdFx0XHRwYXJzZUludCggYXR0cmlidXRlTm9kZS52YWx1ZSwgMTAgKSA6XHJcblx0XHRcdFx0XHRyZm9jdXNhYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSB8fCByY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiBlbGVtLmhyZWYgP1xyXG5cdFx0XHRcdFx0XHQwIDpcclxuXHRcdFx0XHRcdFx0dW5kZWZpbmVkO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59KTtcclxuXHJcbi8vIEhvb2sgZm9yIGJvb2xlYW4gYXR0cmlidXRlc1xyXG5ib29sSG9vayA9IHtcclxuXHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xyXG5cdFx0Ly8gQWxpZ24gYm9vbGVhbiBhdHRyaWJ1dGVzIHdpdGggY29ycmVzcG9uZGluZyBwcm9wZXJ0aWVzXHJcblx0XHQvLyBGYWxsIGJhY2sgdG8gYXR0cmlidXRlIHByZXNlbmNlIHdoZXJlIHNvbWUgYm9vbGVhbnMgYXJlIG5vdCBzdXBwb3J0ZWRcclxuXHRcdHZhciBhdHRyTm9kZSxcclxuXHRcdFx0cHJvcGVydHkgPSBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSApO1xyXG5cdFx0cmV0dXJuIHByb3BlcnR5ID09PSB0cnVlIHx8IHR5cGVvZiBwcm9wZXJ0eSAhPT0gXCJib29sZWFuXCIgJiYgKCBhdHRyTm9kZSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSApICYmIGF0dHJOb2RlLm5vZGVWYWx1ZSAhPT0gZmFsc2UgP1xyXG5cdFx0XHRuYW1lLnRvTG93ZXJDYXNlKCkgOlxyXG5cdFx0XHR1bmRlZmluZWQ7XHJcblx0fSxcclxuXHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHtcclxuXHRcdHZhciBwcm9wTmFtZTtcclxuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xyXG5cdFx0XHQvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlXHJcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyB2YWx1ZSBpcyB0cnVlIHNpbmNlIHdlIGtub3cgYXQgdGhpcyBwb2ludCBpdCdzIHR5cGUgYm9vbGVhbiBhbmQgbm90IGZhbHNlXHJcblx0XHRcdC8vIFNldCBib29sZWFuIGF0dHJpYnV0ZXMgdG8gdGhlIHNhbWUgbmFtZSBhbmQgc2V0IHRoZSBET00gcHJvcGVydHlcclxuXHRcdFx0cHJvcE5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XHJcblx0XHRcdGlmICggcHJvcE5hbWUgaW4gZWxlbSApIHtcclxuXHRcdFx0XHQvLyBPbmx5IHNldCB0aGUgSURMIHNwZWNpZmljYWxseSBpZiBpdCBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgZWxlbWVudFxyXG5cdFx0XHRcdGVsZW1bIHByb3BOYW1lIF0gPSB0cnVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpICk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbmFtZTtcclxuXHR9XHJcbn07XHJcblxyXG4vLyBJRTYvNyBkbyBub3Qgc3VwcG9ydCBnZXR0aW5nL3NldHRpbmcgc29tZSBhdHRyaWJ1dGVzIHdpdGggZ2V0L3NldEF0dHJpYnV0ZVxyXG5pZiAoICFnZXRTZXRBdHRyaWJ1dGUgKSB7XHJcblxyXG5cdGZpeFNwZWNpZmllZCA9IHtcclxuXHRcdG5hbWU6IHRydWUsXHJcblx0XHRpZDogdHJ1ZSxcclxuXHRcdGNvb3JkczogdHJ1ZVxyXG5cdH07XHJcblxyXG5cdC8vIFVzZSB0aGlzIGZvciBhbnkgYXR0cmlidXRlIGluIElFNi83XHJcblx0Ly8gVGhpcyBmaXhlcyBhbG1vc3QgZXZlcnkgSUU2LzcgaXNzdWVcclxuXHRub2RlSG9vayA9IGpRdWVyeS52YWxIb29rcy5idXR0b24gPSB7XHJcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xyXG5cdFx0XHR2YXIgcmV0O1xyXG5cdFx0XHRyZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKTtcclxuXHRcdFx0cmV0dXJuIHJldCAmJiAoIGZpeFNwZWNpZmllZFsgbmFtZSBdID8gcmV0LnZhbHVlICE9PSBcIlwiIDogcmV0LnNwZWNpZmllZCApID9cclxuXHRcdFx0XHRyZXQudmFsdWUgOlxyXG5cdFx0XHRcdHVuZGVmaW5lZDtcclxuXHRcdH0sXHJcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHtcclxuXHRcdFx0Ly8gU2V0IHRoZSBleGlzdGluZyBvciBjcmVhdGUgYSBuZXcgYXR0cmlidXRlIG5vZGVcclxuXHRcdFx0dmFyIHJldCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApO1xyXG5cdFx0XHRpZiAoICFyZXQgKSB7XHJcblx0XHRcdFx0cmV0ID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKCBuYW1lICk7XHJcblx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGVOb2RlKCByZXQgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gKCByZXQudmFsdWUgPSB2YWx1ZSArIFwiXCIgKTtcclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHQvLyBTZXQgd2lkdGggYW5kIGhlaWdodCB0byBhdXRvIGluc3RlYWQgb2YgMCBvbiBlbXB0eSBzdHJpbmcoIEJ1ZyAjODE1MCApXHJcblx0Ly8gVGhpcyBpcyBmb3IgcmVtb3ZhbHNcclxuXHRqUXVlcnkuZWFjaChbIFwid2lkdGhcIiwgXCJoZWlnaHRcIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcclxuXHRcdGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSwge1xyXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcclxuXHRcdFx0XHRpZiAoIHZhbHVlID09PSBcIlwiICkge1xyXG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIFwiYXV0b1wiICk7XHJcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9KTtcclxuXHJcblx0Ly8gU2V0IGNvbnRlbnRlZGl0YWJsZSB0byBmYWxzZSBvbiByZW1vdmFscygjMTA0MjkpXHJcblx0Ly8gU2V0dGluZyB0byBlbXB0eSBzdHJpbmcgdGhyb3dzIGFuIGVycm9yIGFzIGFuIGludmFsaWQgdmFsdWVcclxuXHRqUXVlcnkuYXR0ckhvb2tzLmNvbnRlbnRlZGl0YWJsZSA9IHtcclxuXHRcdGdldDogbm9kZUhvb2suZ2V0LFxyXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7XHJcblx0XHRcdGlmICggdmFsdWUgPT09IFwiXCIgKSB7XHJcblx0XHRcdFx0dmFsdWUgPSBcImZhbHNlXCI7XHJcblx0XHRcdH1cclxuXHRcdFx0bm9kZUhvb2suc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApO1xyXG5cdFx0fVxyXG5cdH07XHJcbn1cclxuXHJcblxyXG4vLyBTb21lIGF0dHJpYnV0ZXMgcmVxdWlyZSBhIHNwZWNpYWwgY2FsbCBvbiBJRVxyXG5pZiAoICFqUXVlcnkuc3VwcG9ydC5ocmVmTm9ybWFsaXplZCApIHtcclxuXHRqUXVlcnkuZWFjaChbIFwiaHJlZlwiLCBcInNyY1wiLCBcIndpZHRoXCIsIFwiaGVpZ2h0XCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XHJcblx0XHRqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0sIHtcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHR2YXIgcmV0ID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIDIgKTtcclxuXHRcdFx0XHRyZXR1cm4gcmV0ID09PSBudWxsID8gdW5kZWZpbmVkIDogcmV0O1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9KTtcclxufVxyXG5cclxuaWYgKCAhalF1ZXJ5LnN1cHBvcnQuc3R5bGUgKSB7XHJcblx0alF1ZXJ5LmF0dHJIb29rcy5zdHlsZSA9IHtcclxuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdC8vIFJldHVybiB1bmRlZmluZWQgaW4gdGhlIGNhc2Ugb2YgZW1wdHkgc3RyaW5nXHJcblx0XHRcdC8vIE5vcm1hbGl6ZSB0byBsb3dlcmNhc2Ugc2luY2UgSUUgdXBwZXJjYXNlcyBjc3MgcHJvcGVydHkgbmFtZXNcclxuXHRcdFx0cmV0dXJuIGVsZW0uc3R5bGUuY3NzVGV4dC50b0xvd2VyQ2FzZSgpIHx8IHVuZGVmaW5lZDtcclxuXHRcdH0sXHJcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcclxuXHRcdFx0cmV0dXJuICggZWxlbS5zdHlsZS5jc3NUZXh0ID0gXCJcIiArIHZhbHVlICk7XHJcblx0XHR9XHJcblx0fTtcclxufVxyXG5cclxuLy8gU2FmYXJpIG1pcy1yZXBvcnRzIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHByb3BlcnR5IG9mIGFuIG9wdGlvblxyXG4vLyBBY2Nlc3NpbmcgdGhlIHBhcmVudCdzIHNlbGVjdGVkSW5kZXggcHJvcGVydHkgZml4ZXMgaXRcclxuaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7XHJcblx0alF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQsIHtcclxuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XHJcblxyXG5cdFx0XHRpZiAoIHBhcmVudCApIHtcclxuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcclxuXHJcblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgaXQgYWxzbyB3b3JrcyB3aXRoIG9wdGdyb3Vwcywgc2VlICM1NzAxXHJcblx0XHRcdFx0aWYgKCBwYXJlbnQucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG59XHJcblxyXG4vLyBJRTYvNyBjYWxsIGVuY3R5cGUgZW5jb2RpbmdcclxuaWYgKCAhalF1ZXJ5LnN1cHBvcnQuZW5jdHlwZSApIHtcclxuXHRqUXVlcnkucHJvcEZpeC5lbmN0eXBlID0gXCJlbmNvZGluZ1wiO1xyXG59XHJcblxyXG4vLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlclxyXG5pZiAoICFqUXVlcnkuc3VwcG9ydC5jaGVja09uICkge1xyXG5cdGpRdWVyeS5lYWNoKFsgXCJyYWRpb1wiLCBcImNoZWNrYm94XCIgXSwgZnVuY3Rpb24oKSB7XHJcblx0XHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHtcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHQvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgaW4gV2Via2l0IFwiXCIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBcIm9uXCIgaWYgYSB2YWx1ZSBpc24ndCBzcGVjaWZpZWRcclxuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSA9PT0gbnVsbCA/IFwib25cIiA6IGVsZW0udmFsdWU7XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0fSk7XHJcbn1cclxualF1ZXJ5LmVhY2goWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcclxuXHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IGpRdWVyeS5leHRlbmQoIGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLCB7XHJcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcclxuXHRcdFx0aWYgKCBqUXVlcnkuaXNBcnJheSggdmFsdWUgKSApIHtcclxuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KGVsZW0pLnZhbCgpLCB2YWx1ZSApID49IDAgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0pO1xyXG59KTtcclxudmFyIHJmb3JtRWxlbXMgPSAvXig/OnRleHRhcmVhfGlucHV0fHNlbGVjdCkkL2ksXHJcblx0cnR5cGVuYW1lc3BhY2UgPSAvXihbXlxcLl0qfCkoPzpcXC4oLispfCkkLyxcclxuXHRyaG92ZXJIYWNrID0gLyg/Ol58XFxzKWhvdmVyKFxcLlxcUyt8KVxcYi8sXHJcblx0cmtleUV2ZW50ID0gL15rZXkvLFxyXG5cdHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLFxyXG5cdHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFxyXG5cdGhvdmVySGFjayA9IGZ1bmN0aW9uKCBldmVudHMgKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LmV2ZW50LnNwZWNpYWwuaG92ZXIgPyBldmVudHMgOiBldmVudHMucmVwbGFjZSggcmhvdmVySGFjaywgXCJtb3VzZWVudGVyJDEgbW91c2VsZWF2ZSQxXCIgKTtcclxuXHR9O1xyXG5cclxuLypcclxuICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLlxyXG4gKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLlxyXG4gKi9cclxualF1ZXJ5LmV2ZW50ID0ge1xyXG5cclxuXHRhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSwgc2VsZWN0b3IgKSB7XHJcblxyXG5cdFx0dmFyIGVsZW1EYXRhLCBldmVudEhhbmRsZSwgZXZlbnRzLFxyXG5cdFx0XHR0LCB0bnMsIHR5cGUsIG5hbWVzcGFjZXMsIGhhbmRsZU9iaixcclxuXHRcdFx0aGFuZGxlT2JqSW4sIGhhbmRsZXJzLCBzcGVjaWFsO1xyXG5cclxuXHRcdC8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYWxsb3cgcGxhaW4gb2JqZWN0cyB0aG8pXHJcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhdHlwZXMgfHwgIWhhbmRsZXIgfHwgIShlbGVtRGF0YSA9IGpRdWVyeS5fZGF0YSggZWxlbSApKSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlclxyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XHJcblx0XHRcdGhhbmRsZU9iakluID0gaGFuZGxlcjtcclxuXHRcdFx0aGFuZGxlciA9IGhhbmRsZU9iakluLmhhbmRsZXI7XHJcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyXHJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XHJcblx0XHRcdGhhbmRsZXIuZ3VpZCA9IGpRdWVyeS5ndWlkKys7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gSW5pdCB0aGUgZWxlbWVudCdzIGV2ZW50IHN0cnVjdHVyZSBhbmQgbWFpbiBoYW5kbGVyLCBpZiB0aGlzIGlzIHRoZSBmaXJzdFxyXG5cdFx0ZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzO1xyXG5cdFx0aWYgKCAhZXZlbnRzICkge1xyXG5cdFx0XHRlbGVtRGF0YS5ldmVudHMgPSBldmVudHMgPSB7fTtcclxuXHRcdH1cclxuXHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlO1xyXG5cdFx0aWYgKCAhZXZlbnRIYW5kbGUgKSB7XHJcblx0XHRcdGVsZW1EYXRhLmhhbmRsZSA9IGV2ZW50SGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XHJcblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcclxuXHRcdFx0XHQvLyB3aGVuIGFuIGV2ZW50IGlzIGNhbGxlZCBhZnRlciBhIHBhZ2UgaGFzIHVubG9hZGVkXHJcblx0XHRcdFx0cmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09IFwidW5kZWZpbmVkXCIgJiYgKCFlIHx8IGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgIT09IGUudHlwZSkgP1xyXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmRpc3BhdGNoLmFwcGx5KCBldmVudEhhbmRsZS5lbGVtLCBhcmd1bWVudHMgKSA6XHJcblx0XHRcdFx0XHR1bmRlZmluZWQ7XHJcblx0XHRcdH07XHJcblx0XHRcdC8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmbiB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsgd2l0aCBJRSBub24tbmF0aXZlIGV2ZW50c1xyXG5cdFx0XHRldmVudEhhbmRsZS5lbGVtID0gZWxlbTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlXHJcblx0XHQvLyBqUXVlcnkoLi4uKS5iaW5kKFwibW91c2VvdmVyIG1vdXNlb3V0XCIsIGZuKTtcclxuXHRcdHR5cGVzID0galF1ZXJ5LnRyaW0oIGhvdmVySGFjayh0eXBlcykgKS5zcGxpdCggXCIgXCIgKTtcclxuXHRcdGZvciAoIHQgPSAwOyB0IDwgdHlwZXMubGVuZ3RoOyB0KysgKSB7XHJcblxyXG5cdFx0XHR0bnMgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1t0XSApIHx8IFtdO1xyXG5cdFx0XHR0eXBlID0gdG5zWzFdO1xyXG5cdFx0XHRuYW1lc3BhY2VzID0gKCB0bnNbMl0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcclxuXHJcblx0XHRcdC8vIElmIGV2ZW50IGNoYW5nZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3BlY2lhbCBldmVudCBoYW5kbGVycyBmb3IgdGhlIGNoYW5nZWQgdHlwZVxyXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcclxuXHJcblx0XHRcdC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndpc2UgZ2l2ZW4gdHlwZVxyXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XHJcblxyXG5cdFx0XHQvLyBVcGRhdGUgc3BlY2lhbCBiYXNlZCBvbiBuZXdseSByZXNldCB0eXBlXHJcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xyXG5cclxuXHRcdFx0Ly8gaGFuZGxlT2JqIGlzIHBhc3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnNcclxuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCh7XHJcblx0XHRcdFx0dHlwZTogdHlwZSxcclxuXHRcdFx0XHRvcmlnVHlwZTogdG5zWzFdLFxyXG5cdFx0XHRcdGRhdGE6IGRhdGEsXHJcblx0XHRcdFx0aGFuZGxlcjogaGFuZGxlcixcclxuXHRcdFx0XHRndWlkOiBoYW5kbGVyLmd1aWQsXHJcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxyXG5cdFx0XHRcdG5hbWVzcGFjZTogbmFtZXNwYWNlcy5qb2luKFwiLlwiKVxyXG5cdFx0XHR9LCBoYW5kbGVPYmpJbiApO1xyXG5cclxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3RcclxuXHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXTtcclxuXHRcdFx0aWYgKCAhaGFuZGxlcnMgKSB7XHJcblx0XHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSA9IFtdO1xyXG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xyXG5cclxuXHRcdFx0XHQvLyBPbmx5IHVzZSBhZGRFdmVudExpc3RlbmVyL2F0dGFjaEV2ZW50IGlmIHRoZSBzcGVjaWFsIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2VcclxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8IHNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7XHJcblx0XHRcdFx0XHQvLyBCaW5kIHRoZSBnbG9iYWwgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudFxyXG5cdFx0XHRcdFx0aWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7XHJcblx0XHRcdFx0XHRcdGVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUsIGZhbHNlICk7XHJcblxyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggZWxlbS5hdHRhY2hFdmVudCApIHtcclxuXHRcdFx0XHRcdFx0ZWxlbS5hdHRhY2hFdmVudCggXCJvblwiICsgdHlwZSwgZXZlbnRIYW5kbGUgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggc3BlY2lhbC5hZGQgKSB7XHJcblx0XHRcdFx0c3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XHJcblxyXG5cdFx0XHRcdGlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7XHJcblx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcclxuXHRcdFx0aWYgKCBzZWxlY3RvciApIHtcclxuXHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQrKywgMCwgaGFuZGxlT2JqICk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0aGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb25cclxuXHRcdFx0alF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBOdWxsaWZ5IGVsZW0gdG8gcHJldmVudCBtZW1vcnkgbGVha3MgaW4gSUVcclxuXHRcdGVsZW0gPSBudWxsO1xyXG5cdH0sXHJcblxyXG5cdGdsb2JhbDoge30sXHJcblxyXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxyXG5cdHJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7XHJcblxyXG5cdFx0dmFyIHQsIHRucywgdHlwZSwgb3JpZ1R5cGUsIG5hbWVzcGFjZXMsIG9yaWdDb3VudCxcclxuXHRcdFx0aiwgZXZlbnRzLCBzcGVjaWFsLCBldmVudFR5cGUsIGhhbmRsZU9iaixcclxuXHRcdFx0ZWxlbURhdGEgPSBqUXVlcnkuaGFzRGF0YSggZWxlbSApICYmIGpRdWVyeS5fZGF0YSggZWxlbSApO1xyXG5cclxuXHRcdGlmICggIWVsZW1EYXRhIHx8ICEoZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzKSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcclxuXHRcdHR5cGVzID0galF1ZXJ5LnRyaW0oIGhvdmVySGFjayggdHlwZXMgfHwgXCJcIiApICkuc3BsaXQoXCIgXCIpO1xyXG5cdFx0Zm9yICggdCA9IDA7IHQgPCB0eXBlcy5sZW5ndGg7IHQrKyApIHtcclxuXHRcdFx0dG5zID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbdF0gKSB8fCBbXTtcclxuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG5zWzFdO1xyXG5cdFx0XHRuYW1lc3BhY2VzID0gdG5zWzJdO1xyXG5cclxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XHJcblx0XHRcdGlmICggIXR5cGUgKSB7XHJcblx0XHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XHJcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xyXG5cdFx0XHR0eXBlID0gKCBzZWxlY3Rvcj8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcclxuXHRcdFx0ZXZlbnRUeXBlID0gZXZlbnRzWyB0eXBlIF0gfHwgW107XHJcblx0XHRcdG9yaWdDb3VudCA9IGV2ZW50VHlwZS5sZW5ndGg7XHJcblx0XHRcdG5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzID8gbmV3IFJlZ0V4cChcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5zcGxpdChcIi5cIikuc29ydCgpLmpvaW4oXCJcXFxcLig/Oi4qXFxcXC58KVwiKSArIFwiKFxcXFwufCQpXCIpIDogbnVsbDtcclxuXHJcblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcclxuXHRcdFx0Zm9yICggaiA9IDA7IGogPCBldmVudFR5cGUubGVuZ3RoOyBqKysgKSB7XHJcblx0XHRcdFx0aGFuZGxlT2JqID0gZXZlbnRUeXBlWyBqIF07XHJcblxyXG5cdFx0XHRcdGlmICggKCBtYXBwZWRUeXBlcyB8fCBvcmlnVHlwZSA9PT0gaGFuZGxlT2JqLm9yaWdUeXBlICkgJiZcclxuXHRcdFx0XHRcdCAoICFoYW5kbGVyIHx8IGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSAmJlxyXG5cdFx0XHRcdFx0ICggIW5hbWVzcGFjZXMgfHwgbmFtZXNwYWNlcy50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJlxyXG5cdFx0XHRcdFx0ICggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcclxuXHRcdFx0XHRcdGV2ZW50VHlwZS5zcGxpY2UoIGotLSwgMSApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xyXG5cdFx0XHRcdFx0XHRldmVudFR5cGUuZGVsZWdhdGVDb3VudC0tO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCBzcGVjaWFsLnJlbW92ZSApIHtcclxuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBSZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIHdlIHJlbW92ZWQgc29tZXRoaW5nIGFuZCBubyBtb3JlIGhhbmRsZXJzIGV4aXN0XHJcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxyXG5cdFx0XHRpZiAoIGV2ZW50VHlwZS5sZW5ndGggPT09IDAgJiYgb3JpZ0NvdW50ICE9PSBldmVudFR5cGUubGVuZ3RoICkge1xyXG5cdFx0XHRcdGlmICggIXNwZWNpYWwudGVhcmRvd24gfHwgc3BlY2lhbC50ZWFyZG93bi5jYWxsKCBlbGVtLCBuYW1lc3BhY2VzLCBlbGVtRGF0YS5oYW5kbGUgKSA9PT0gZmFsc2UgKSB7XHJcblx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGVsZW1EYXRhLmhhbmRsZSApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZGVsZXRlIGV2ZW50c1sgdHlwZSBdO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWRcclxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xyXG5cdFx0XHRkZWxldGUgZWxlbURhdGEuaGFuZGxlO1xyXG5cclxuXHRcdFx0Ly8gcmVtb3ZlRGF0YSBhbHNvIGNoZWNrcyBmb3IgZW1wdGluZXNzIGFuZCBjbGVhcnMgdGhlIGV4cGFuZG8gaWYgZW1wdHlcclxuXHRcdFx0Ly8gc28gdXNlIGl0IGluc3RlYWQgb2YgZGVsZXRlXHJcblx0XHRcdGpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCBcImV2ZW50c1wiLCB0cnVlICk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly8gRXZlbnRzIHRoYXQgYXJlIHNhZmUgdG8gc2hvcnQtY2lyY3VpdCBpZiBubyBoYW5kbGVycyBhcmUgYXR0YWNoZWQuXHJcblx0Ly8gTmF0aXZlIERPTSBldmVudHMgc2hvdWxkIG5vdCBiZSBhZGRlZCwgdGhleSBtYXkgaGF2ZSBpbmxpbmUgaGFuZGxlcnMuXHJcblx0Y3VzdG9tRXZlbnQ6IHtcclxuXHRcdFwiZ2V0RGF0YVwiOiB0cnVlLFxyXG5cdFx0XCJzZXREYXRhXCI6IHRydWUsXHJcblx0XHRcImNoYW5nZURhdGFcIjogdHJ1ZVxyXG5cdH0sXHJcblxyXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkge1xyXG5cdFx0Ly8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcclxuXHRcdGlmICggZWxlbSAmJiAoZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4KSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEV2ZW50IG9iamVjdCBvciBldmVudCB0eXBlXHJcblx0XHR2YXIgY2FjaGUsIGV4Y2x1c2l2ZSwgaSwgY3VyLCBvbGQsIG9udHlwZSwgc3BlY2lhbCwgaGFuZGxlLCBldmVudFBhdGgsIGJ1YmJsZVR5cGUsXHJcblx0XHRcdHR5cGUgPSBldmVudC50eXBlIHx8IGV2ZW50LFxyXG5cdFx0XHRuYW1lc3BhY2VzID0gW107XHJcblxyXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XHJcblx0XHRpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHR5cGUuaW5kZXhPZiggXCIhXCIgKSA+PSAwICkge1xyXG5cdFx0XHQvLyBFeGNsdXNpdmUgZXZlbnRzIHRyaWdnZXIgb25seSBmb3IgdGhlIGV4YWN0IGV2ZW50IChubyBuYW1lc3BhY2VzKVxyXG5cdFx0XHR0eXBlID0gdHlwZS5zbGljZSgwLCAtMSk7XHJcblx0XHRcdGV4Y2x1c2l2ZSA9IHRydWU7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCB0eXBlLmluZGV4T2YoIFwiLlwiICkgPj0gMCApIHtcclxuXHRcdFx0Ly8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKVxyXG5cdFx0XHRuYW1lc3BhY2VzID0gdHlwZS5zcGxpdChcIi5cIik7XHJcblx0XHRcdHR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7XHJcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggKCFlbGVtIHx8IGpRdWVyeS5ldmVudC5jdXN0b21FdmVudFsgdHlwZSBdKSAmJiAhalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdICkge1xyXG5cdFx0XHQvLyBObyBqUXVlcnkgaGFuZGxlcnMgZm9yIHRoaXMgZXZlbnQgdHlwZSwgYW5kIGl0IGNhbid0IGhhdmUgaW5saW5lIGhhbmRsZXJzXHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gRXZlbnQsIE9iamVjdCwgb3IganVzdCBhbiBldmVudCB0eXBlIHN0cmluZ1xyXG5cdFx0ZXZlbnQgPSB0eXBlb2YgZXZlbnQgPT09IFwib2JqZWN0XCIgP1xyXG5cdFx0XHQvLyBqUXVlcnkuRXZlbnQgb2JqZWN0XHJcblx0XHRcdGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID8gZXZlbnQgOlxyXG5cdFx0XHQvLyBPYmplY3QgbGl0ZXJhbFxyXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCB0eXBlLCBldmVudCApIDpcclxuXHRcdFx0Ly8gSnVzdCB0aGUgZXZlbnQgdHlwZSAoc3RyaW5nKVxyXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCB0eXBlICk7XHJcblxyXG5cdFx0ZXZlbnQudHlwZSA9IHR5cGU7XHJcblx0XHRldmVudC5pc1RyaWdnZXIgPSB0cnVlO1xyXG5cdFx0ZXZlbnQuZXhjbHVzaXZlID0gZXhjbHVzaXZlO1xyXG5cdFx0ZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCBcIi5cIiApO1xyXG5cdFx0ZXZlbnQubmFtZXNwYWNlX3JlID0gZXZlbnQubmFtZXNwYWNlPyBuZXcgUmVnRXhwKFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oXCJcXFxcLig/Oi4qXFxcXC58KVwiKSArIFwiKFxcXFwufCQpXCIpIDogbnVsbDtcclxuXHRcdG9udHlwZSA9IHR5cGUuaW5kZXhPZiggXCI6XCIgKSA8IDAgPyBcIm9uXCIgKyB0eXBlIDogXCJcIjtcclxuXHJcblx0XHQvLyBIYW5kbGUgYSBnbG9iYWwgdHJpZ2dlclxyXG5cdFx0aWYgKCAhZWxlbSApIHtcclxuXHJcblx0XHRcdC8vIFRPRE86IFN0b3AgdGF1bnRpbmcgdGhlIGRhdGEgY2FjaGU7IHJlbW92ZSBnbG9iYWwgZXZlbnRzIGFuZCBhbHdheXMgYXR0YWNoIHRvIGRvY3VtZW50XHJcblx0XHRcdGNhY2hlID0galF1ZXJ5LmNhY2hlO1xyXG5cdFx0XHRmb3IgKCBpIGluIGNhY2hlICkge1xyXG5cdFx0XHRcdGlmICggY2FjaGVbIGkgXS5ldmVudHMgJiYgY2FjaGVbIGkgXS5ldmVudHNbIHR5cGUgXSApIHtcclxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgY2FjaGVbIGkgXS5oYW5kbGUuZWxlbSwgdHJ1ZSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkXHJcblx0XHRldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7XHJcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XHJcblx0XHRcdGV2ZW50LnRhcmdldCA9IGVsZW07XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdFxyXG5cdFx0ZGF0YSA9IGRhdGEgIT0gbnVsbCA/IGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSA6IFtdO1xyXG5cdFx0ZGF0YS51bnNoaWZ0KCBldmVudCApO1xyXG5cclxuXHRcdC8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXNcclxuXHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xyXG5cdFx0aWYgKCBzcGVjaWFsLnRyaWdnZXIgJiYgc3BlY2lhbC50cmlnZ2VyLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpXHJcblx0XHQvLyBCdWJibGUgdXAgdG8gZG9jdW1lbnQsIHRoZW4gdG8gd2luZG93OyB3YXRjaCBmb3IgYSBnbG9iYWwgb3duZXJEb2N1bWVudCB2YXIgKCM5NzI0KVxyXG5cdFx0ZXZlbnRQYXRoID0gW1sgZWxlbSwgc3BlY2lhbC5iaW5kVHlwZSB8fCB0eXBlIF1dO1xyXG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcclxuXHJcblx0XHRcdGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlO1xyXG5cdFx0XHRjdXIgPSByZm9jdXNNb3JwaC50ZXN0KCBidWJibGVUeXBlICsgdHlwZSApID8gZWxlbSA6IGVsZW0ucGFyZW50Tm9kZTtcclxuXHRcdFx0Zm9yICggb2xkID0gZWxlbTsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0XHRldmVudFBhdGgucHVzaChbIGN1ciwgYnViYmxlVHlwZSBdKTtcclxuXHRcdFx0XHRvbGQgPSBjdXI7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKVxyXG5cdFx0XHRpZiAoIG9sZCA9PT0gKGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkgKSB7XHJcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goWyBvbGQuZGVmYXVsdFZpZXcgfHwgb2xkLnBhcmVudFdpbmRvdyB8fCB3aW5kb3csIGJ1YmJsZVR5cGUgXSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoXHJcblx0XHRmb3IgKCBpID0gMDsgaSA8IGV2ZW50UGF0aC5sZW5ndGggJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7IGkrKyApIHtcclxuXHJcblx0XHRcdGN1ciA9IGV2ZW50UGF0aFtpXVswXTtcclxuXHRcdFx0ZXZlbnQudHlwZSA9IGV2ZW50UGF0aFtpXVsxXTtcclxuXHJcblx0XHRcdGhhbmRsZSA9ICggalF1ZXJ5Ll9kYXRhKCBjdXIsIFwiZXZlbnRzXCIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gJiYgalF1ZXJ5Ll9kYXRhKCBjdXIsIFwiaGFuZGxlXCIgKTtcclxuXHRcdFx0aWYgKCBoYW5kbGUgKSB7XHJcblx0XHRcdFx0aGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBOb3RlIHRoYXQgdGhpcyBpcyBhIGJhcmUgSlMgZnVuY3Rpb24gYW5kIG5vdCBhIGpRdWVyeSBoYW5kbGVyXHJcblx0XHRcdGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdO1xyXG5cdFx0XHRpZiAoIGhhbmRsZSAmJiBqUXVlcnkuYWNjZXB0RGF0YSggY3VyICkgJiYgaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKSA9PT0gZmFsc2UgKSB7XHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0ZXZlbnQudHlwZSA9IHR5cGU7XHJcblxyXG5cdFx0Ly8gSWYgbm9ib2R5IHByZXZlbnRlZCB0aGUgZGVmYXVsdCBhY3Rpb24sIGRvIGl0IG5vd1xyXG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHtcclxuXHJcblx0XHRcdGlmICggKCFzcGVjaWFsLl9kZWZhdWx0IHx8IHNwZWNpYWwuX2RlZmF1bHQuYXBwbHkoIGVsZW0ub3duZXJEb2N1bWVudCwgZGF0YSApID09PSBmYWxzZSkgJiZcclxuXHRcdFx0XHQhKHR5cGUgPT09IFwiY2xpY2tcIiAmJiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sIFwiYVwiICkpICYmIGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7XHJcblxyXG5cdFx0XHRcdC8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBuYW1lIGFzIHRoZSBldmVudC5cclxuXHRcdFx0XHQvLyBDYW4ndCB1c2UgYW4gLmlzRnVuY3Rpb24oKSBjaGVjayBoZXJlIGJlY2F1c2UgSUU2LzcgZmFpbHMgdGhhdCB0ZXN0LlxyXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MClcclxuXHRcdFx0XHQvLyBJRTw5IGRpZXMgb24gZm9jdXMvYmx1ciB0byBoaWRkZW4gZWxlbWVudCAoIzE0ODYpXHJcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgZWxlbVsgdHlwZSBdICYmICgodHlwZSAhPT0gXCJmb2N1c1wiICYmIHR5cGUgIT09IFwiYmx1clwiKSB8fCBldmVudC50YXJnZXQub2Zmc2V0V2lkdGggIT09IDApICYmICFqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSApIHtcclxuXHJcblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXHJcblx0XHRcdFx0XHRvbGQgPSBlbGVtWyBvbnR5cGUgXTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG9sZCApIHtcclxuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSBudWxsO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIFByZXZlbnQgcmUtdHJpZ2dlcmluZyBvZiB0aGUgc2FtZSBldmVudCwgc2luY2Ugd2UgYWxyZWFkeSBidWJibGVkIGl0IGFib3ZlXHJcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlwZTtcclxuXHRcdFx0XHRcdGVsZW1bIHR5cGUgXSgpO1xyXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHRcdFx0XHRpZiAoIG9sZCApIHtcclxuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSBvbGQ7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcclxuXHR9LFxyXG5cclxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkge1xyXG5cclxuXHRcdC8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdFxyXG5cdFx0ZXZlbnQgPSBqUXVlcnkuZXZlbnQuZml4KCBldmVudCB8fCB3aW5kb3cuZXZlbnQgKTtcclxuXHJcblx0XHR2YXIgaSwgaiwgY3VyLCByZXQsIHNlbE1hdGNoLCBtYXRjaGVkLCBtYXRjaGVzLCBoYW5kbGVPYmosIHNlbCwgcmVsYXRlZCxcclxuXHRcdFx0aGFuZGxlcnMgPSAoIChqUXVlcnkuX2RhdGEoIHRoaXMsIFwiZXZlbnRzXCIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gfHwgW10pLFxyXG5cdFx0XHRkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCxcclxuXHRcdFx0YXJncyA9IFtdLnNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLFxyXG5cdFx0XHRydW5fYWxsID0gIWV2ZW50LmV4Y2x1c2l2ZSAmJiAhZXZlbnQubmFtZXNwYWNlLFxyXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGV2ZW50LnR5cGUgXSB8fCB7fSxcclxuXHRcdFx0aGFuZGxlclF1ZXVlID0gW107XHJcblxyXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcclxuXHRcdGFyZ3NbMF0gPSBldmVudDtcclxuXHRcdGV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpcztcclxuXHJcblx0XHQvLyBDYWxsIHRoZSBwcmVEaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGUsIGFuZCBsZXQgaXQgYmFpbCBpZiBkZXNpcmVkXHJcblx0XHRpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIERldGVybWluZSBoYW5kbGVycyB0aGF0IHNob3VsZCBydW4gaWYgdGhlcmUgYXJlIGRlbGVnYXRlZCBldmVudHNcclxuXHRcdC8vIEF2b2lkIG5vbi1sZWZ0LWNsaWNrIGJ1YmJsaW5nIGluIEZpcmVmb3ggKCMzODYxKVxyXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50ICYmICEoZXZlbnQuYnV0dG9uICYmIGV2ZW50LnR5cGUgPT09IFwiY2xpY2tcIikgKSB7XHJcblxyXG5cdFx0XHRmb3IgKCBjdXIgPSBldmVudC50YXJnZXQ7IGN1ciAhPSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkge1xyXG5cclxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyAoT05MWSkgb24gZGlzYWJsZWQgZWxlbWVudHMgKCM2OTExLCAjODE2NSwgIzExMzgyLCAjMTE3NjQpXHJcblx0XHRcdFx0aWYgKCBjdXIuZGlzYWJsZWQgIT09IHRydWUgfHwgZXZlbnQudHlwZSAhPT0gXCJjbGlja1wiICkge1xyXG5cdFx0XHRcdFx0c2VsTWF0Y2ggPSB7fTtcclxuXHRcdFx0XHRcdG1hdGNoZXMgPSBbXTtcclxuXHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZGVsZWdhdGVDb3VudDsgaSsrICkge1xyXG5cdFx0XHRcdFx0XHRoYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdO1xyXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3I7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIHNlbE1hdGNoWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRcdFx0XHRcdHNlbE1hdGNoWyBzZWwgXSA9IGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID49IDA7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKCBzZWxNYXRjaFsgc2VsIF0gKSB7XHJcblx0XHRcdFx0XHRcdFx0bWF0Y2hlcy5wdXNoKCBoYW5kbGVPYmogKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVzLmxlbmd0aCApIHtcclxuXHRcdFx0XHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goeyBlbGVtOiBjdXIsIG1hdGNoZXM6IG1hdGNoZXMgfSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVyc1xyXG5cdFx0aWYgKCBoYW5kbGVycy5sZW5ndGggPiBkZWxlZ2F0ZUNvdW50ICkge1xyXG5cdFx0XHRoYW5kbGVyUXVldWUucHVzaCh7IGVsZW06IHRoaXMsIG1hdGNoZXM6IGhhbmRsZXJzLnNsaWNlKCBkZWxlZ2F0ZUNvdW50ICkgfSk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUnVuIGRlbGVnYXRlcyBmaXJzdDsgdGhleSBtYXkgd2FudCB0byBzdG9wIHByb3BhZ2F0aW9uIGJlbmVhdGggdXNcclxuXHRcdGZvciAoIGkgPSAwOyBpIDwgaGFuZGxlclF1ZXVlLmxlbmd0aCAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTsgaSsrICkge1xyXG5cdFx0XHRtYXRjaGVkID0gaGFuZGxlclF1ZXVlWyBpIF07XHJcblx0XHRcdGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07XHJcblxyXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8IG1hdGNoZWQubWF0Y2hlcy5sZW5ndGggJiYgIWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7IGorKyApIHtcclxuXHRcdFx0XHRoYW5kbGVPYmogPSBtYXRjaGVkLm1hdGNoZXNbIGogXTtcclxuXHJcblx0XHRcdFx0Ly8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0aGVyIDEpIGJlIG5vbi1leGNsdXNpdmUgYW5kIGhhdmUgbm8gbmFtZXNwYWNlLCBvclxyXG5cdFx0XHRcdC8vIDIpIGhhdmUgbmFtZXNwYWNlKHMpIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLlxyXG5cdFx0XHRcdGlmICggcnVuX2FsbCB8fCAoIWV2ZW50Lm5hbWVzcGFjZSAmJiAhaGFuZGxlT2JqLm5hbWVzcGFjZSkgfHwgZXZlbnQubmFtZXNwYWNlX3JlICYmIGV2ZW50Lm5hbWVzcGFjZV9yZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xyXG5cdFx0XHRcdFx0ZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqO1xyXG5cclxuXHRcdFx0XHRcdHJldCA9ICggKGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSkuaGFuZGxlIHx8IGhhbmRsZU9iai5oYW5kbGVyIClcclxuXHRcdFx0XHRcdFx0XHQuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApO1xyXG5cclxuXHRcdFx0XHRcdGlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0XHRcdGV2ZW50LnJlc3VsdCA9IHJldDtcclxuXHRcdFx0XHRcdFx0aWYgKCByZXQgPT09IGZhbHNlICkge1xyXG5cdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlXHJcblx0XHRpZiAoIHNwZWNpYWwucG9zdERpc3BhdGNoICkge1xyXG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XHJcblx0fSxcclxuXHJcblx0Ly8gSW5jbHVkZXMgc29tZSBldmVudCBwcm9wcyBzaGFyZWQgYnkgS2V5RXZlbnQgYW5kIE1vdXNlRXZlbnRcclxuXHQvLyAqKiogYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50ICBhcmUgbm90IG5vcm1hbGl6ZWQsIG5vbi1XM0MsIGRlcHJlY2F0ZWQsIHdpbGwgYmUgcmVtb3ZlZCBpbiAxLjggKioqXHJcblx0cHJvcHM6IFwiYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50IGFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaFwiLnNwbGl0KFwiIFwiKSxcclxuXHJcblx0Zml4SG9va3M6IHt9LFxyXG5cclxuXHRrZXlIb29rczoge1xyXG5cdFx0cHJvcHM6IFwiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZVwiLnNwbGl0KFwiIFwiKSxcclxuXHRcdGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHtcclxuXHJcblx0XHRcdC8vIEFkZCB3aGljaCBmb3Iga2V5IGV2ZW50c1xyXG5cdFx0XHRpZiAoIGV2ZW50LndoaWNoID09IG51bGwgKSB7XHJcblx0XHRcdFx0ZXZlbnQud2hpY2ggPSBvcmlnaW5hbC5jaGFyQ29kZSAhPSBudWxsID8gb3JpZ2luYWwuY2hhckNvZGUgOiBvcmlnaW5hbC5rZXlDb2RlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZXZlbnQ7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0bW91c2VIb29rczoge1xyXG5cdFx0cHJvcHM6IFwiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50XCIuc3BsaXQoXCIgXCIpLFxyXG5cdFx0ZmlsdGVyOiBmdW5jdGlvbiggZXZlbnQsIG9yaWdpbmFsICkge1xyXG5cdFx0XHR2YXIgZXZlbnREb2MsIGRvYywgYm9keSxcclxuXHRcdFx0XHRidXR0b24gPSBvcmlnaW5hbC5idXR0b24sXHJcblx0XHRcdFx0ZnJvbUVsZW1lbnQgPSBvcmlnaW5hbC5mcm9tRWxlbWVudDtcclxuXHJcblx0XHRcdC8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGVcclxuXHRcdFx0aWYgKCBldmVudC5wYWdlWCA9PSBudWxsICYmIG9yaWdpbmFsLmNsaWVudFggIT0gbnVsbCApIHtcclxuXHRcdFx0XHRldmVudERvYyA9IGV2ZW50LnRhcmdldC5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50O1xyXG5cdFx0XHRcdGRvYyA9IGV2ZW50RG9jLmRvY3VtZW50RWxlbWVudDtcclxuXHRcdFx0XHRib2R5ID0gZXZlbnREb2MuYm9keTtcclxuXHJcblx0XHRcdFx0ZXZlbnQucGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICsgKCBkb2MgJiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCApIC0gKCBkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCApO1xyXG5cdFx0XHRcdGV2ZW50LnBhZ2VZID0gb3JpZ2luYWwuY2xpZW50WSArICggZG9jICYmIGRvYy5zY3JvbGxUb3AgIHx8IGJvZHkgJiYgYm9keS5zY3JvbGxUb3AgIHx8IDAgKSAtICggZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDAgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQWRkIHJlbGF0ZWRUYXJnZXQsIGlmIG5lY2Vzc2FyeVxyXG5cdFx0XHRpZiAoICFldmVudC5yZWxhdGVkVGFyZ2V0ICYmIGZyb21FbGVtZW50ICkge1xyXG5cdFx0XHRcdGV2ZW50LnJlbGF0ZWRUYXJnZXQgPSBmcm9tRWxlbWVudCA9PT0gZXZlbnQudGFyZ2V0ID8gb3JpZ2luYWwudG9FbGVtZW50IDogZnJvbUVsZW1lbnQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHRcclxuXHRcdFx0Ly8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXRcclxuXHRcdFx0aWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0ZXZlbnQud2hpY2ggPSAoIGJ1dHRvbiAmIDEgPyAxIDogKCBidXR0b24gJiAyID8gMyA6ICggYnV0dG9uICYgNCA/IDIgOiAwICkgKSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZXZlbnQ7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Zml4OiBmdW5jdGlvbiggZXZlbnQgKSB7XHJcblx0XHRpZiAoIGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdICkge1xyXG5cdFx0XHRyZXR1cm4gZXZlbnQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ3JlYXRlIGEgd3JpdGFibGUgY29weSBvZiB0aGUgZXZlbnQgb2JqZWN0IGFuZCBub3JtYWxpemUgc29tZSBwcm9wZXJ0aWVzXHJcblx0XHR2YXIgaSwgcHJvcCxcclxuXHRcdFx0b3JpZ2luYWxFdmVudCA9IGV2ZW50LFxyXG5cdFx0XHRmaXhIb29rID0galF1ZXJ5LmV2ZW50LmZpeEhvb2tzWyBldmVudC50eXBlIF0gfHwge30sXHJcblx0XHRcdGNvcHkgPSBmaXhIb29rLnByb3BzID8gdGhpcy5wcm9wcy5jb25jYXQoIGZpeEhvb2sucHJvcHMgKSA6IHRoaXMucHJvcHM7XHJcblxyXG5cdFx0ZXZlbnQgPSBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTtcclxuXHJcblx0XHRmb3IgKCBpID0gY29weS5sZW5ndGg7IGk7ICkge1xyXG5cdFx0XHRwcm9wID0gY29weVsgLS1pIF07XHJcblx0XHRcdGV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2ZW50WyBwcm9wIF07XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gRml4IHRhcmdldCBwcm9wZXJ0eSwgaWYgbmVjZXNzYXJ5ICgjMTkyNSwgSUUgNi83LzggJiBTYWZhcmkyKVxyXG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xyXG5cdFx0XHRldmVudC50YXJnZXQgPSBvcmlnaW5hbEV2ZW50LnNyY0VsZW1lbnQgfHwgZG9jdW1lbnQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVGFyZ2V0IHNob3VsZCBub3QgYmUgYSB0ZXh0IG5vZGUgKCM1MDQsIFNhZmFyaSlcclxuXHRcdGlmICggZXZlbnQudGFyZ2V0Lm5vZGVUeXBlID09PSAzICkge1xyXG5cdFx0XHRldmVudC50YXJnZXQgPSBldmVudC50YXJnZXQucGFyZW50Tm9kZTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBGb3IgbW91c2Uva2V5IGV2ZW50cywgbWV0YUtleT09ZmFsc2UgaWYgaXQncyB1bmRlZmluZWQgKCMzMzY4LCAjMTEzMjg7IElFNi83LzgpXHJcblx0XHRldmVudC5tZXRhS2V5ID0gISFldmVudC5tZXRhS2V5O1xyXG5cclxuXHRcdHJldHVybiBmaXhIb29rLmZpbHRlcj8gZml4SG9vay5maWx0ZXIoIGV2ZW50LCBvcmlnaW5hbEV2ZW50ICkgOiBldmVudDtcclxuXHR9LFxyXG5cclxuXHRzcGVjaWFsOiB7XHJcblx0XHRsb2FkOiB7XHJcblx0XHRcdC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWRcclxuXHRcdFx0bm9CdWJibGU6IHRydWVcclxuXHRcdH0sXHJcblxyXG5cdFx0Zm9jdXM6IHtcclxuXHRcdFx0ZGVsZWdhdGVUeXBlOiBcImZvY3VzaW5cIlxyXG5cdFx0fSxcclxuXHRcdGJsdXI6IHtcclxuXHRcdFx0ZGVsZWdhdGVUeXBlOiBcImZvY3Vzb3V0XCJcclxuXHRcdH0sXHJcblxyXG5cdFx0YmVmb3JldW5sb2FkOiB7XHJcblx0XHRcdHNldHVwOiBmdW5jdGlvbiggZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSB7XHJcblx0XHRcdFx0Ly8gV2Ugb25seSB3YW50IHRvIGRvIHRoaXMgc3BlY2lhbCBjYXNlIG9uIHdpbmRvd3NcclxuXHRcdFx0XHRpZiAoIGpRdWVyeS5pc1dpbmRvdyggdGhpcyApICkge1xyXG5cdFx0XHRcdFx0dGhpcy5vbmJlZm9yZXVubG9hZCA9IGV2ZW50SGFuZGxlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdHRlYXJkb3duOiBmdW5jdGlvbiggbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSB7XHJcblx0XHRcdFx0aWYgKCB0aGlzLm9uYmVmb3JldW5sb2FkID09PSBldmVudEhhbmRsZSApIHtcclxuXHRcdFx0XHRcdHRoaXMub25iZWZvcmV1bmxvYWQgPSBudWxsO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQsIGJ1YmJsZSApIHtcclxuXHRcdC8vIFBpZ2d5YmFjayBvbiBhIGRvbm9yIGV2ZW50IHRvIHNpbXVsYXRlIGEgZGlmZmVyZW50IG9uZS5cclxuXHRcdC8vIEZha2Ugb3JpZ2luYWxFdmVudCB0byBhdm9pZCBkb25vcidzIHN0b3BQcm9wYWdhdGlvbiwgYnV0IGlmIHRoZVxyXG5cdFx0Ly8gc2ltdWxhdGVkIGV2ZW50IHByZXZlbnRzIGRlZmF1bHQgdGhlbiB3ZSBkbyB0aGUgc2FtZSBvbiB0aGUgZG9ub3IuXHJcblx0XHR2YXIgZSA9IGpRdWVyeS5leHRlbmQoXHJcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoKSxcclxuXHRcdFx0ZXZlbnQsXHJcblx0XHRcdHsgdHlwZTogdHlwZSxcclxuXHRcdFx0XHRpc1NpbXVsYXRlZDogdHJ1ZSxcclxuXHRcdFx0XHRvcmlnaW5hbEV2ZW50OiB7fVxyXG5cdFx0XHR9XHJcblx0XHQpO1xyXG5cdFx0aWYgKCBidWJibGUgKSB7XHJcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBlLCBudWxsLCBlbGVtICk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRqUXVlcnkuZXZlbnQuZGlzcGF0Y2guY2FsbCggZWxlbSwgZSApO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCBlLmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xyXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcbi8vIFNvbWUgcGx1Z2lucyBhcmUgdXNpbmcsIGJ1dCBpdCdzIHVuZG9jdW1lbnRlZC9kZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQuXHJcbi8vIFRoZSAxLjcgc3BlY2lhbCBldmVudCBpbnRlcmZhY2Ugc2hvdWxkIHByb3ZpZGUgYWxsIHRoZSBob29rcyBuZWVkZWQgbm93LlxyXG5qUXVlcnkuZXZlbnQuaGFuZGxlID0galF1ZXJ5LmV2ZW50LmRpc3BhdGNoO1xyXG5cclxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciA/XHJcblx0ZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcclxuXHRcdGlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkge1xyXG5cdFx0XHRlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSwgZmFsc2UgKTtcclxuXHRcdH1cclxuXHR9IDpcclxuXHRmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkge1xyXG5cdFx0dmFyIG5hbWUgPSBcIm9uXCIgKyB0eXBlO1xyXG5cclxuXHRcdGlmICggZWxlbS5kZXRhY2hFdmVudCApIHtcclxuXHJcblx0XHRcdC8vICM4NTQ1LCAjNzA1NCwgcHJldmVudGluZyBtZW1vcnkgbGVha3MgZm9yIGN1c3RvbSBldmVudHMgaW4gSUU2LTgg4oCTXHJcblx0XHRcdC8vIGRldGFjaEV2ZW50IG5lZWRlZCBwcm9wZXJ0eSBvbiBlbGVtZW50LCBieSBuYW1lIG9mIHRoYXQgZXZlbnQsIHRvIHByb3Blcmx5IGV4cG9zZSBpdCB0byBHQ1xyXG5cdFx0XHRpZiAoIHR5cGVvZiBlbGVtWyBuYW1lIF0gPT09IFwidW5kZWZpbmVkXCIgKSB7XHJcblx0XHRcdFx0ZWxlbVsgbmFtZSBdID0gbnVsbDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZWxlbS5kZXRhY2hFdmVudCggbmFtZSwgaGFuZGxlICk7XHJcblx0XHR9XHJcblx0fTtcclxuXHJcbmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkge1xyXG5cdC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZFxyXG5cdGlmICggISh0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50KSApIHtcclxuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XHJcblx0fVxyXG5cclxuXHQvLyBFdmVudCBvYmplY3RcclxuXHRpZiAoIHNyYyAmJiBzcmMudHlwZSApIHtcclxuXHRcdHRoaXMub3JpZ2luYWxFdmVudCA9IHNyYztcclxuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xyXG5cclxuXHRcdC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXHJcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cclxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gKCBzcmMuZGVmYXVsdFByZXZlbnRlZCB8fCBzcmMucmV0dXJuVmFsdWUgPT09IGZhbHNlIHx8XHJcblx0XHRcdHNyYy5nZXRQcmV2ZW50RGVmYXVsdCAmJiBzcmMuZ2V0UHJldmVudERlZmF1bHQoKSApID8gcmV0dXJuVHJ1ZSA6IHJldHVybkZhbHNlO1xyXG5cclxuXHQvLyBFdmVudCB0eXBlXHJcblx0fSBlbHNlIHtcclxuXHRcdHRoaXMudHlwZSA9IHNyYztcclxuXHR9XHJcblxyXG5cdC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0XHJcblx0aWYgKCBwcm9wcyApIHtcclxuXHRcdGpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7XHJcblx0fVxyXG5cclxuXHQvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZVxyXG5cdHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1lU3RhbXAgfHwgalF1ZXJ5Lm5vdygpO1xyXG5cclxuXHQvLyBNYXJrIGl0IGFzIGZpeGVkXHJcblx0dGhpc1sgalF1ZXJ5LmV4cGFuZG8gXSA9IHRydWU7XHJcbn07XHJcblxyXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcclxuXHRyZXR1cm4gZmFsc2U7XHJcbn1cclxuZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcclxuXHRyZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nXHJcbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxyXG5qUXVlcnkuRXZlbnQucHJvdG90eXBlID0ge1xyXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcclxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcclxuXHJcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcclxuXHRcdGlmICggIWUgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBpZiBwcmV2ZW50RGVmYXVsdCBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudFxyXG5cdFx0aWYgKCBlLnByZXZlbnREZWZhdWx0ICkge1xyXG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0Ly8gb3RoZXJ3aXNlIHNldCB0aGUgcmV0dXJuVmFsdWUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIGZhbHNlIChJRSlcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGUucmV0dXJuVmFsdWUgPSBmYWxzZTtcclxuXHRcdH1cclxuXHR9LFxyXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XHJcblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcclxuXHJcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcclxuXHRcdGlmICggIWUgKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdC8vIGlmIHN0b3BQcm9wYWdhdGlvbiBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudFxyXG5cdFx0aWYgKCBlLnN0b3BQcm9wYWdhdGlvbiApIHtcclxuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdH1cclxuXHRcdC8vIG90aGVyd2lzZSBzZXQgdGhlIGNhbmNlbEJ1YmJsZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gdHJ1ZSAoSUUpXHJcblx0XHRlLmNhbmNlbEJ1YmJsZSA9IHRydWU7XHJcblx0fSxcclxuXHRzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xyXG5cdFx0dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XHJcblx0XHR0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdH0sXHJcblx0aXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcclxuXHRpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXHJcblx0aXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlXHJcbn07XHJcblxyXG4vLyBDcmVhdGUgbW91c2VlbnRlci9sZWF2ZSBldmVudHMgdXNpbmcgbW91c2VvdmVyL291dCBhbmQgZXZlbnQtdGltZSBjaGVja3NcclxualF1ZXJ5LmVhY2goe1xyXG5cdG1vdXNlZW50ZXI6IFwibW91c2VvdmVyXCIsXHJcblx0bW91c2VsZWF2ZTogXCJtb3VzZW91dFwiXHJcbn0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XHJcblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHtcclxuXHRcdGRlbGVnYXRlVHlwZTogZml4LFxyXG5cdFx0YmluZFR5cGU6IGZpeCxcclxuXHJcblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcclxuXHRcdFx0dmFyIHJldCxcclxuXHRcdFx0XHR0YXJnZXQgPSB0aGlzLFxyXG5cdFx0XHRcdHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LFxyXG5cdFx0XHRcdGhhbmRsZU9iaiA9IGV2ZW50LmhhbmRsZU9iaixcclxuXHRcdFx0XHRzZWxlY3RvciA9IGhhbmRsZU9iai5zZWxlY3RvcjtcclxuXHJcblx0XHRcdC8vIEZvciBtb3VzZW50ZXIvbGVhdmUgY2FsbCB0aGUgaGFuZGxlciBpZiByZWxhdGVkIGlzIG91dHNpZGUgdGhlIHRhcmdldC5cclxuXHRcdFx0Ly8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3dcclxuXHRcdFx0aWYgKCAhcmVsYXRlZCB8fCAocmVsYXRlZCAhPT0gdGFyZ2V0ICYmICFqUXVlcnkuY29udGFpbnMoIHRhcmdldCwgcmVsYXRlZCApKSApIHtcclxuXHRcdFx0XHRldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlO1xyXG5cdFx0XHRcdHJldCA9IGhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcclxuXHRcdFx0XHRldmVudC50eXBlID0gZml4O1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiByZXQ7XHJcblx0XHR9XHJcblx0fTtcclxufSk7XHJcblxyXG4vLyBJRSBzdWJtaXQgZGVsZWdhdGlvblxyXG5pZiAoICFqUXVlcnkuc3VwcG9ydC5zdWJtaXRCdWJibGVzICkge1xyXG5cclxuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbC5zdWJtaXQgPSB7XHJcblx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdC8vIE9ubHkgbmVlZCB0aGlzIGZvciBkZWxlZ2F0ZWQgZm9ybSBzdWJtaXQgZXZlbnRzXHJcblx0XHRcdGlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImZvcm1cIiApICkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gTGF6eS1hZGQgYSBzdWJtaXQgaGFuZGxlciB3aGVuIGEgZGVzY2VuZGFudCBmb3JtIG1heSBwb3RlbnRpYWxseSBiZSBzdWJtaXR0ZWRcclxuXHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgXCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXRcIiwgZnVuY3Rpb24oIGUgKSB7XHJcblx0XHRcdFx0Ly8gTm9kZSBuYW1lIGNoZWNrIGF2b2lkcyBhIFZNTC1yZWxhdGVkIGNyYXNoIGluIElFICgjOTgwNylcclxuXHRcdFx0XHR2YXIgZWxlbSA9IGUudGFyZ2V0LFxyXG5cdFx0XHRcdFx0Zm9ybSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCBcImJ1dHRvblwiICkgPyBlbGVtLmZvcm0gOiB1bmRlZmluZWQ7XHJcblx0XHRcdFx0aWYgKCBmb3JtICYmICFqUXVlcnkuX2RhdGEoIGZvcm0sIFwiX3N1Ym1pdF9hdHRhY2hlZFwiICkgKSB7XHJcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCBmb3JtLCBcInN1Ym1pdC5fc3VibWl0XCIsIGZ1bmN0aW9uKCBldmVudCApIHtcclxuXHRcdFx0XHRcdFx0ZXZlbnQuX3N1Ym1pdF9idWJibGUgPSB0cnVlO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRqUXVlcnkuX2RhdGEoIGZvcm0sIFwiX3N1Ym1pdF9hdHRhY2hlZFwiLCB0cnVlICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0Ly8gcmV0dXJuIHVuZGVmaW5lZCBzaW5jZSB3ZSBkb24ndCBuZWVkIGFuIGV2ZW50IGxpc3RlbmVyXHJcblx0XHR9LFxyXG5cclxuXHRcdHBvc3REaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkge1xyXG5cdFx0XHQvLyBJZiBmb3JtIHdhcyBzdWJtaXR0ZWQgYnkgdGhlIHVzZXIsIGJ1YmJsZSB0aGUgZXZlbnQgdXAgdGhlIHRyZWVcclxuXHRcdFx0aWYgKCBldmVudC5fc3VibWl0X2J1YmJsZSApIHtcclxuXHRcdFx0XHRkZWxldGUgZXZlbnQuX3N1Ym1pdF9idWJibGU7XHJcblx0XHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgJiYgIWV2ZW50LmlzVHJpZ2dlciApIHtcclxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggXCJzdWJtaXRcIiwgdGhpcy5wYXJlbnROb2RlLCBldmVudCwgdHJ1ZSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XHJcblx0XHRcdC8vIE9ubHkgbmVlZCB0aGlzIGZvciBkZWxlZ2F0ZWQgZm9ybSBzdWJtaXQgZXZlbnRzXHJcblx0XHRcdGlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImZvcm1cIiApICkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gUmVtb3ZlIGRlbGVnYXRlZCBoYW5kbGVyczsgY2xlYW5EYXRhIGV2ZW50dWFsbHkgcmVhcHMgc3VibWl0IGhhbmRsZXJzIGF0dGFjaGVkIGFib3ZlXHJcblx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIFwiLl9zdWJtaXRcIiApO1xyXG5cdFx0fVxyXG5cdH07XHJcbn1cclxuXHJcbi8vIElFIGNoYW5nZSBkZWxlZ2F0aW9uIGFuZCBjaGVja2JveC9yYWRpbyBmaXhcclxuaWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hhbmdlQnViYmxlcyApIHtcclxuXHJcblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWwuY2hhbmdlID0ge1xyXG5cclxuXHRcdHNldHVwOiBmdW5jdGlvbigpIHtcclxuXHJcblx0XHRcdGlmICggcmZvcm1FbGVtcy50ZXN0KCB0aGlzLm5vZGVOYW1lICkgKSB7XHJcblx0XHRcdFx0Ly8gSUUgZG9lc24ndCBmaXJlIGNoYW5nZSBvbiBhIGNoZWNrL3JhZGlvIHVudGlsIGJsdXI7IHRyaWdnZXIgaXQgb24gY2xpY2tcclxuXHRcdFx0XHQvLyBhZnRlciBhIHByb3BlcnR5Y2hhbmdlLiBFYXQgdGhlIGJsdXItY2hhbmdlIGluIHNwZWNpYWwuY2hhbmdlLmhhbmRsZS5cclxuXHRcdFx0XHQvLyBUaGlzIHN0aWxsIGZpcmVzIG9uY2hhbmdlIGEgc2Vjb25kIHRpbWUgZm9yIGNoZWNrL3JhZGlvIGFmdGVyIGJsdXIuXHJcblx0XHRcdFx0aWYgKCB0aGlzLnR5cGUgPT09IFwiY2hlY2tib3hcIiB8fCB0aGlzLnR5cGUgPT09IFwicmFkaW9cIiApIHtcclxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIFwicHJvcGVydHljaGFuZ2UuX2NoYW5nZVwiLCBmdW5jdGlvbiggZXZlbnQgKSB7XHJcblx0XHRcdFx0XHRcdGlmICggZXZlbnQub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUgPT09IFwiY2hlY2tlZFwiICkge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuX2p1c3RfY2hhbmdlZCA9IHRydWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgXCJjbGljay5fY2hhbmdlXCIsIGZ1bmN0aW9uKCBldmVudCApIHtcclxuXHRcdFx0XHRcdFx0aWYgKCB0aGlzLl9qdXN0X2NoYW5nZWQgJiYgIWV2ZW50LmlzVHJpZ2dlciApIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLl9qdXN0X2NoYW5nZWQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHQvLyBBbGxvdyB0cmlnZ2VyZWQsIHNpbXVsYXRlZCBjaGFuZ2UgZXZlbnRzICgjMTE1MDApXHJcblx0XHRcdFx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggXCJjaGFuZ2VcIiwgdGhpcywgZXZlbnQsIHRydWUgKTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gRGVsZWdhdGVkIGV2ZW50OyBsYXp5LWFkZCBhIGNoYW5nZSBoYW5kbGVyIG9uIGRlc2NlbmRhbnQgaW5wdXRzXHJcblx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIFwiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZVwiLCBmdW5jdGlvbiggZSApIHtcclxuXHRcdFx0XHR2YXIgZWxlbSA9IGUudGFyZ2V0O1xyXG5cclxuXHRcdFx0XHRpZiAoIHJmb3JtRWxlbXMudGVzdCggZWxlbS5ub2RlTmFtZSApICYmICFqUXVlcnkuX2RhdGEoIGVsZW0sIFwiX2NoYW5nZV9hdHRhY2hlZFwiICkgKSB7XHJcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCBlbGVtLCBcImNoYW5nZS5fY2hhbmdlXCIsIGZ1bmN0aW9uKCBldmVudCApIHtcclxuXHRcdFx0XHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgJiYgIWV2ZW50LmlzU2ltdWxhdGVkICYmICFldmVudC5pc1RyaWdnZXIgKSB7XHJcblx0XHRcdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBcImNoYW5nZVwiLCB0aGlzLnBhcmVudE5vZGUsIGV2ZW50LCB0cnVlICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0alF1ZXJ5Ll9kYXRhKCBlbGVtLCBcIl9jaGFuZ2VfYXR0YWNoZWRcIiwgdHJ1ZSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9LFxyXG5cclxuXHRcdGhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkge1xyXG5cdFx0XHR2YXIgZWxlbSA9IGV2ZW50LnRhcmdldDtcclxuXHJcblx0XHRcdC8vIFN3YWxsb3cgbmF0aXZlIGNoYW5nZSBldmVudHMgZnJvbSBjaGVja2JveC9yYWRpbywgd2UgYWxyZWFkeSB0cmlnZ2VyZWQgdGhlbSBhYm92ZVxyXG5cdFx0XHRpZiAoIHRoaXMgIT09IGVsZW0gfHwgZXZlbnQuaXNTaW11bGF0ZWQgfHwgZXZlbnQuaXNUcmlnZ2VyIHx8IChlbGVtLnR5cGUgIT09IFwicmFkaW9cIiAmJiBlbGVtLnR5cGUgIT09IFwiY2hlY2tib3hcIikgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGV2ZW50LmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XHJcblx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIFwiLl9jaGFuZ2VcIiApO1xyXG5cclxuXHRcdFx0cmV0dXJuICFyZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTtcclxuXHRcdH1cclxuXHR9O1xyXG59XHJcblxyXG4vLyBDcmVhdGUgXCJidWJibGluZ1wiIGZvY3VzIGFuZCBibHVyIGV2ZW50c1xyXG5pZiAoICFqUXVlcnkuc3VwcG9ydC5mb2N1c2luQnViYmxlcyApIHtcclxuXHRqUXVlcnkuZWFjaCh7IGZvY3VzOiBcImZvY3VzaW5cIiwgYmx1cjogXCJmb2N1c291dFwiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XHJcblxyXG5cdFx0Ly8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dFxyXG5cdFx0dmFyIGF0dGFjaGVzID0gMCxcclxuXHRcdFx0aGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHtcclxuXHRcdFx0XHRqUXVlcnkuZXZlbnQuc2ltdWxhdGUoIGZpeCwgZXZlbnQudGFyZ2V0LCBqUXVlcnkuZXZlbnQuZml4KCBldmVudCApLCB0cnVlICk7XHJcblx0XHRcdH07XHJcblxyXG5cdFx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0ge1xyXG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0aWYgKCBhdHRhY2hlcysrID09PSAwICkge1xyXG5cdFx0XHRcdFx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdFx0dGVhcmRvd246IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGlmICggLS1hdHRhY2hlcyA9PT0gMCApIHtcclxuXHRcdFx0XHRcdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0fSk7XHJcbn1cclxuXHJcbmpRdWVyeS5mbi5leHRlbmQoe1xyXG5cclxuXHRvbjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIC8qSU5URVJOQUwqLyBvbmUgKSB7XHJcblx0XHR2YXIgb3JpZ0ZuLCB0eXBlO1xyXG5cclxuXHRcdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xyXG5cdFx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XHJcblx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApXHJcblx0XHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkgeyAvLyAmJiBzZWxlY3RvciAhPSBudWxsXHJcblx0XHRcdFx0Ly8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKVxyXG5cdFx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xyXG5cdFx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XHJcblx0XHRcdFx0dGhpcy5vbiggdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XHJcblx0XHRcdC8vICggdHlwZXMsIGZuIClcclxuXHRcdFx0Zm4gPSBzZWxlY3RvcjtcclxuXHRcdFx0ZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkO1xyXG5cdFx0fSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHtcclxuXHRcdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XHJcblx0XHRcdFx0Ly8gKCB0eXBlcywgc2VsZWN0b3IsIGZuIClcclxuXHRcdFx0XHRmbiA9IGRhdGE7XHJcblx0XHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyAoIHR5cGVzLCBkYXRhLCBmbiApXHJcblx0XHRcdFx0Zm4gPSBkYXRhO1xyXG5cdFx0XHRcdGRhdGEgPSBzZWxlY3RvcjtcclxuXHRcdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XHJcblx0XHRcdGZuID0gcmV0dXJuRmFsc2U7XHJcblx0XHR9IGVsc2UgaWYgKCAhZm4gKSB7XHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggb25lID09PSAxICkge1xyXG5cdFx0XHRvcmlnRm4gPSBmbjtcclxuXHRcdFx0Zm4gPSBmdW5jdGlvbiggZXZlbnQgKSB7XHJcblx0XHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXHJcblx0XHRcdFx0alF1ZXJ5KCkub2ZmKCBldmVudCApO1xyXG5cdFx0XHRcdHJldHVybiBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xyXG5cdFx0XHR9O1xyXG5cdFx0XHQvLyBVc2Ugc2FtZSBndWlkIHNvIGNhbGxlciBjYW4gcmVtb3ZlIHVzaW5nIG9yaWdGblxyXG5cdFx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cdG9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApO1xyXG5cdH0sXHJcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcclxuXHRcdHZhciBoYW5kbGVPYmosIHR5cGU7XHJcblx0XHRpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYmIHR5cGVzLmhhbmRsZU9iaiApIHtcclxuXHRcdFx0Ly8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudFxyXG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XHJcblx0XHRcdGpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoXHJcblx0XHRcdFx0aGFuZGxlT2JqLm5hbWVzcGFjZSA/IGhhbmRsZU9iai5vcmlnVHlwZSArIFwiLlwiICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6IGhhbmRsZU9iai5vcmlnVHlwZSxcclxuXHRcdFx0XHRoYW5kbGVPYmouc2VsZWN0b3IsXHJcblx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXJcclxuXHRcdFx0KTtcclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblx0XHR9XHJcblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcclxuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcclxuXHRcdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcclxuXHRcdFx0XHR0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5cGVzWyB0eXBlIF0gKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdH1cclxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xyXG5cdFx0XHQvLyAoIHR5cGVzIFssIGZuXSApXHJcblx0XHRcdGZuID0gc2VsZWN0b3I7XHJcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XHJcblx0XHRcdGZuID0gcmV0dXJuRmFsc2U7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cclxuXHRiaW5kOiBmdW5jdGlvbiggdHlwZXMsIGRhdGEsIGZuICkge1xyXG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xyXG5cdH0sXHJcblx0dW5iaW5kOiBmdW5jdGlvbiggdHlwZXMsIGZuICkge1xyXG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcclxuXHR9LFxyXG5cclxuXHRsaXZlOiBmdW5jdGlvbiggdHlwZXMsIGRhdGEsIGZuICkge1xyXG5cdFx0alF1ZXJ5KCB0aGlzLmNvbnRleHQgKS5vbiggdHlwZXMsIHRoaXMuc2VsZWN0b3IsIGRhdGEsIGZuICk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cdGRpZTogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHtcclxuXHRcdGpRdWVyeSggdGhpcy5jb250ZXh0ICkub2ZmKCB0eXBlcywgdGhpcy5zZWxlY3RvciB8fCBcIioqXCIsIGZuICk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cclxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xyXG5cdH0sXHJcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XHJcblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXHJcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PSAxPyB0aGlzLm9mZiggc2VsZWN0b3IsIFwiKipcIiApIDogdGhpcy5vZmYoIHR5cGVzLCBzZWxlY3RvciB8fCBcIioqXCIsIGZuICk7XHJcblx0fSxcclxuXHJcblx0dHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApO1xyXG5cdFx0fSk7XHJcblx0fSxcclxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XHJcblx0XHRpZiAoIHRoaXNbMF0gKSB7XHJcblx0XHRcdHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpc1swXSwgdHJ1ZSApO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHRvZ2dsZTogZnVuY3Rpb24oIGZuICkge1xyXG5cdFx0Ly8gU2F2ZSByZWZlcmVuY2UgdG8gYXJndW1lbnRzIGZvciBhY2Nlc3MgaW4gY2xvc3VyZVxyXG5cdFx0dmFyIGFyZ3MgPSBhcmd1bWVudHMsXHJcblx0XHRcdGd1aWQgPSBmbi5ndWlkIHx8IGpRdWVyeS5ndWlkKyssXHJcblx0XHRcdGkgPSAwLFxyXG5cdFx0XHR0b2dnbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkge1xyXG5cdFx0XHRcdC8vIEZpZ3VyZSBvdXQgd2hpY2ggZnVuY3Rpb24gdG8gZXhlY3V0ZVxyXG5cdFx0XHRcdHZhciBsYXN0VG9nZ2xlID0gKCBqUXVlcnkuX2RhdGEoIHRoaXMsIFwibGFzdFRvZ2dsZVwiICsgZm4uZ3VpZCApIHx8IDAgKSAlIGk7XHJcblx0XHRcdFx0alF1ZXJ5Ll9kYXRhKCB0aGlzLCBcImxhc3RUb2dnbGVcIiArIGZuLmd1aWQsIGxhc3RUb2dnbGUgKyAxICk7XHJcblxyXG5cdFx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IGNsaWNrcyBzdG9wXHJcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0Ly8gYW5kIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uXHJcblx0XHRcdFx0cmV0dXJuIGFyZ3NbIGxhc3RUb2dnbGUgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgfHwgZmFsc2U7XHJcblx0XHRcdH07XHJcblxyXG5cdFx0Ly8gbGluayBhbGwgdGhlIGZ1bmN0aW9ucywgc28gYW55IG9mIHRoZW0gY2FuIHVuYmluZCB0aGlzIGNsaWNrIGhhbmRsZXJcclxuXHRcdHRvZ2dsZXIuZ3VpZCA9IGd1aWQ7XHJcblx0XHR3aGlsZSAoIGkgPCBhcmdzLmxlbmd0aCApIHtcclxuXHRcdFx0YXJnc1sgaSsrIF0uZ3VpZCA9IGd1aWQ7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuY2xpY2soIHRvZ2dsZXIgKTtcclxuXHR9LFxyXG5cclxuXHRob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTtcclxuXHR9XHJcbn0pO1xyXG5cclxualF1ZXJ5LmVhY2goIChcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIFwiICtcclxuXHRcIm1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIFwiICtcclxuXHRcImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnVcIikuc3BsaXQoXCIgXCIpLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcclxuXHJcblx0Ly8gSGFuZGxlIGV2ZW50IGJpbmRpbmdcclxuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBkYXRhLCBmbiApIHtcclxuXHRcdGlmICggZm4gPT0gbnVsbCApIHtcclxuXHRcdFx0Zm4gPSBkYXRhO1xyXG5cdFx0XHRkYXRhID0gbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDAgP1xyXG5cdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcclxuXHRcdFx0dGhpcy50cmlnZ2VyKCBuYW1lICk7XHJcblx0fTtcclxuXHJcblx0aWYgKCBya2V5RXZlbnQudGVzdCggbmFtZSApICkge1xyXG5cdFx0alF1ZXJ5LmV2ZW50LmZpeEhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXZlbnQua2V5SG9va3M7XHJcblx0fVxyXG5cclxuXHRpZiAoIHJtb3VzZUV2ZW50LnRlc3QoIG5hbWUgKSApIHtcclxuXHRcdGpRdWVyeS5ldmVudC5maXhIb29rc1sgbmFtZSBdID0galF1ZXJ5LmV2ZW50Lm1vdXNlSG9va3M7XHJcblx0fVxyXG59KTtcclxuLyohXHJcbiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lXHJcbiAqICBDb3B5cmlnaHQgMjAxMiBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXHJcbiAqICBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcclxuICogIGh0dHA6Ly9zaXp6bGVqcy5jb20vXHJcbiAqL1xyXG4oZnVuY3Rpb24oIHdpbmRvdywgdW5kZWZpbmVkICkge1xyXG5cclxudmFyIGRpcnJ1bnMsXHJcblx0Y2FjaGVkcnVucyxcclxuXHRhc3NlcnRHZXRJZE5vdE5hbWUsXHJcblx0RXhwcixcclxuXHRnZXRUZXh0LFxyXG5cdGlzWE1MLFxyXG5cdGNvbnRhaW5zLFxyXG5cdGNvbXBpbGUsXHJcblx0c29ydE9yZGVyLFxyXG5cdGhhc0R1cGxpY2F0ZSxcclxuXHJcblx0YmFzZUhhc0R1cGxpY2F0ZSA9IHRydWUsXHJcblx0c3RydW5kZWZpbmVkID0gXCJ1bmRlZmluZWRcIixcclxuXHJcblx0ZXhwYW5kbyA9ICggXCJzaXpjYWNoZVwiICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIFwiLlwiLCBcIlwiICksXHJcblxyXG5cdGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50LFxyXG5cdGRvY0VsZW0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXHJcblx0ZG9uZSA9IDAsXHJcblx0c2xpY2UgPSBbXS5zbGljZSxcclxuXHRwdXNoID0gW10ucHVzaCxcclxuXHJcblx0Ly8gQXVnbWVudCBhIGZ1bmN0aW9uIGZvciBzcGVjaWFsIHVzZSBieSBTaXp6bGVcclxuXHRtYXJrRnVuY3Rpb24gPSBmdW5jdGlvbiggZm4sIHZhbHVlICkge1xyXG5cdFx0Zm5bIGV4cGFuZG8gXSA9IHZhbHVlIHx8IHRydWU7XHJcblx0XHRyZXR1cm4gZm47XHJcblx0fSxcclxuXHJcblx0Y3JlYXRlQ2FjaGUgPSBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBjYWNoZSA9IHt9LFxyXG5cdFx0XHRrZXlzID0gW107XHJcblxyXG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcclxuXHRcdFx0Ly8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzXHJcblx0XHRcdGlmICgga2V5cy5wdXNoKCBrZXkgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7XHJcblx0XHRcdFx0ZGVsZXRlIGNhY2hlWyBrZXlzLnNoaWZ0KCkgXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIChjYWNoZVsga2V5IF0gPSB2YWx1ZSk7XHJcblx0XHR9LCBjYWNoZSApO1xyXG5cdH0sXHJcblxyXG5cdGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxyXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxyXG5cdGNvbXBpbGVyQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxyXG5cclxuXHQvLyBSZWdleFxyXG5cclxuXHQvLyBXaGl0ZXNwYWNlIGNoYXJhY3RlcnMgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI3doaXRlc3BhY2VcclxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxyXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc3ludGF4LyNjaGFyYWN0ZXJzXHJcblx0Y2hhcmFjdGVyRW5jb2RpbmcgPSBcIig/OlxcXFxcXFxcLnxbLVxcXFx3XXxbXlxcXFx4MDAtXFxcXHhhMF0pK1wiLFxyXG5cclxuXHQvLyBMb29zZWx5IG1vZGVsZWQgb24gQ1NTIGlkZW50aWZpZXIgY2hhcmFjdGVyc1xyXG5cdC8vIEFuIHVucXVvdGVkIHZhbHVlIHNob3VsZCBiZSBhIENTUyBpZGVudGlmaWVyIChodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9ycylcclxuXHQvLyBQcm9wZXIgc3ludGF4OiBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjdmFsdWUtZGVmLWlkZW50aWZpZXJcclxuXHRpZGVudGlmaWVyID0gY2hhcmFjdGVyRW5jb2RpbmcucmVwbGFjZSggXCJ3XCIsIFwidyNcIiApLFxyXG5cclxuXHQvLyBBY2NlcHRhYmxlIG9wZXJhdG9ycyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnNcclxuXHRvcGVyYXRvcnMgPSBcIihbKl4kfCF+XT89KVwiLFxyXG5cdGF0dHJpYnV0ZXMgPSBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFwiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyBcIilcIiArIHdoaXRlc3BhY2UgK1xyXG5cdFx0XCIqKD86XCIgKyBvcGVyYXRvcnMgKyB3aGl0ZXNwYWNlICsgXCIqKD86KFsnXFxcIl0pKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXSkqPylcXFxcM3woXCIgKyBpZGVudGlmaWVyICsgXCIpfCl8KVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsXHJcblxyXG5cdC8vIFByZWZlciBhcmd1bWVudHMgbm90IGluIHBhcmVucy9icmFja2V0cyxcclxuXHQvLyAgIHRoZW4gYXR0cmlidXRlIHNlbGVjdG9ycyBhbmQgbm9uLXBzZXVkb3MgKGRlbm90ZWQgYnkgOiksXHJcblx0Ly8gICB0aGVuIGFueXRoaW5nIGVsc2VcclxuXHQvLyBUaGVzZSBwcmVmZXJlbmNlcyBhcmUgaGVyZSB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnNcclxuXHQvLyAgIG5lZWRpbmcgdG9rZW5pemUgaW4gdGhlIFBTRVVETyBwcmVGaWx0ZXJcclxuXHRwc2V1ZG9zID0gXCI6KFwiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyBcIikoPzpcXFxcKCg/OihbJ1xcXCJdKSgoPzpcXFxcXFxcXC58W15cXFxcXFxcXF0pKj8pXFxcXDJ8KFteKClbXFxcXF1dKnwoPzooPzpcIiArIGF0dHJpYnV0ZXMgKyBcIil8W146XXxcXFxcXFxcXC4pKnwuKikpXFxcXCl8KVwiLFxyXG5cclxuXHQvLyBGb3IgbWF0Y2hFeHByLlBPUyBhbmQgbWF0Y2hFeHByLm5lZWRzQ29udGV4dFxyXG5cdHBvcyA9IFwiOihudGh8ZXF8Z3R8bHR8Zmlyc3R8bGFzdHxldmVufG9kZCkoPzpcXFxcKCgoPzotXFxcXGQpP1xcXFxkKilcXFxcKXwpKD89W14tXXwkKVwiLFxyXG5cclxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXHJcblx0cnRyaW0gPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIit8KCg/Ol58W15cXFxcXFxcXF0pKD86XFxcXFxcXFwuKSopXCIgKyB3aGl0ZXNwYWNlICsgXCIrJFwiLCBcImdcIiApLFxyXG5cclxuXHRyY29tbWEgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiosXCIgKyB3aGl0ZXNwYWNlICsgXCIqXCIgKSxcclxuXHRyY29tYmluYXRvcnMgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiooW1xcXFx4MjBcXFxcdFxcXFxyXFxcXG5cXFxcZj4rfl0pXCIgKyB3aGl0ZXNwYWNlICsgXCIqXCIgKSxcclxuXHRycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLFxyXG5cclxuXHQvLyBFYXNpbHktcGFyc2VhYmxlL3JldHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFTUyBzZWxlY3RvcnNcclxuXHRycXVpY2tFeHByID0gL14oPzojKFtcXHdcXC1dKyl8KFxcdyspfFxcLihbXFx3XFwtXSspKSQvLFxyXG5cclxuXHRybm90ID0gL146bm90LyxcclxuXHRyc2libGluZyA9IC9bXFx4MjBcXHRcXHJcXG5cXGZdKlsrfl0vLFxyXG5cdHJlbmRzV2l0aE5vdCA9IC86bm90XFwoJC8sXHJcblxyXG5cdHJoZWFkZXIgPSAvaFxcZC9pLFxyXG5cdHJpbnB1dHMgPSAvaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLFxyXG5cclxuXHRyYmFja3NsYXNoID0gL1xcXFwoPyFcXFxcKS9nLFxyXG5cclxuXHRtYXRjaEV4cHIgPSB7XHJcblx0XHRcIklEXCI6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBjaGFyYWN0ZXJFbmNvZGluZyArIFwiKVwiICksXHJcblx0XHRcIkNMQVNTXCI6IG5ldyBSZWdFeHAoIFwiXlxcXFwuKFwiICsgY2hhcmFjdGVyRW5jb2RpbmcgKyBcIilcIiApLFxyXG5cdFx0XCJOQU1FXCI6IG5ldyBSZWdFeHAoIFwiXlxcXFxbbmFtZT1bJ1xcXCJdPyhcIiArIGNoYXJhY3RlckVuY29kaW5nICsgXCIpWydcXFwiXT9cXFxcXVwiICksXHJcblx0XHRcIlRBR1wiOiBuZXcgUmVnRXhwKCBcIl4oXCIgKyBjaGFyYWN0ZXJFbmNvZGluZy5yZXBsYWNlKCBcIndcIiwgXCJ3KlwiICkgKyBcIilcIiApLFxyXG5cdFx0XCJBVFRSXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgYXR0cmlidXRlcyApLFxyXG5cdFx0XCJQU0VVRE9cIjogbmV3IFJlZ0V4cCggXCJeXCIgKyBwc2V1ZG9zICksXHJcblx0XHRcIkNISUxEXCI6IG5ldyBSZWdFeHAoIFwiXjoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcXFxcKFwiICsgd2hpdGVzcGFjZSArXHJcblx0XHRcdFwiKihldmVufG9kZHwoKFsrLV18KShcXFxcZCopbnwpXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86KFsrLV18KVwiICsgd2hpdGVzcGFjZSArXHJcblx0XHRcdFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxyXG5cdFx0XCJQT1NcIjogbmV3IFJlZ0V4cCggcG9zLCBcImlnXCIgKSxcclxuXHRcdC8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKVxyXG5cdFx0XCJuZWVkc0NvbnRleHRcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqWz4rfl18XCIgKyBwb3MsIFwiaVwiIClcclxuXHR9LFxyXG5cclxuXHQvLyBTdXBwb3J0XHJcblxyXG5cdC8vIFVzZWQgZm9yIHRlc3Rpbmcgc29tZXRoaW5nIG9uIGFuIGVsZW1lbnRcclxuXHRhc3NlcnQgPSBmdW5jdGlvbiggZm4gKSB7XHJcblx0XHR2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHJcblx0XHR0cnkge1xyXG5cdFx0XHRyZXR1cm4gZm4oIGRpdiApO1xyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9IGZpbmFsbHkge1xyXG5cdFx0XHQvLyByZWxlYXNlIG1lbW9yeSBpbiBJRVxyXG5cdFx0XHRkaXYgPSBudWxsO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSByZXR1cm5zIG9ubHkgZWxlbWVudHNcclxuXHRhc3NlcnRUYWdOYW1lTm9Db21tZW50cyA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xyXG5cdFx0ZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KFwiXCIpICk7XHJcblx0XHRyZXR1cm4gIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikubGVuZ3RoO1xyXG5cdH0pLFxyXG5cclxuXHQvLyBDaGVjayBpZiBnZXRBdHRyaWJ1dGUgcmV0dXJucyBub3JtYWxpemVkIGhyZWYgYXR0cmlidXRlc1xyXG5cdGFzc2VydEhyZWZOb3ROb3JtYWxpemVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XHJcblx0XHRkaXYuaW5uZXJIVE1MID0gXCI8YSBocmVmPScjJz48L2E+XCI7XHJcblx0XHRyZXR1cm4gZGl2LmZpcnN0Q2hpbGQgJiYgdHlwZW9mIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSAhPT0gc3RydW5kZWZpbmVkICYmXHJcblx0XHRcdGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZShcImhyZWZcIikgPT09IFwiI1wiO1xyXG5cdH0pLFxyXG5cclxuXHQvLyBDaGVjayBpZiBhdHRyaWJ1dGVzIHNob3VsZCBiZSByZXRyaWV2ZWQgYnkgYXR0cmlidXRlIG5vZGVzXHJcblx0YXNzZXJ0QXR0cmlidXRlcyA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xyXG5cdFx0ZGl2LmlubmVySFRNTCA9IFwiPHNlbGVjdD48L3NlbGVjdD5cIjtcclxuXHRcdHZhciB0eXBlID0gdHlwZW9mIGRpdi5sYXN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwibXVsdGlwbGVcIik7XHJcblx0XHQvLyBJRTggcmV0dXJucyBhIHN0cmluZyBmb3Igc29tZSBhdHRyaWJ1dGVzIGV2ZW4gd2hlbiBub3QgcHJlc2VudFxyXG5cdFx0cmV0dXJuIHR5cGUgIT09IFwiYm9vbGVhblwiICYmIHR5cGUgIT09IFwic3RyaW5nXCI7XHJcblx0fSksXHJcblxyXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlDbGFzc05hbWUgY2FuIGJlIHRydXN0ZWRcclxuXHRhc3NlcnRVc2FibGVDbGFzc05hbWUgPSBhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcclxuXHRcdC8vIE9wZXJhIGNhbid0IGZpbmQgYSBzZWNvbmQgY2xhc3NuYW1lIChpbiA5LjYpXHJcblx0XHRkaXYuaW5uZXJIVE1MID0gXCI8ZGl2IGNsYXNzPSdoaWRkZW4gZSc+PC9kaXY+PGRpdiBjbGFzcz0naGlkZGVuJz48L2Rpdj5cIjtcclxuXHRcdGlmICggIWRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIHx8ICFkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImVcIikubGVuZ3RoICkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU2FmYXJpIDMuMiBjYWNoZXMgY2xhc3MgYXR0cmlidXRlcyBhbmQgZG9lc24ndCBjYXRjaCBjaGFuZ2VzXHJcblx0XHRkaXYubGFzdENoaWxkLmNsYXNzTmFtZSA9IFwiZVwiO1xyXG5cdFx0cmV0dXJuIGRpdi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiZVwiKS5sZW5ndGggPT09IDI7XHJcblx0fSksXHJcblxyXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRCeUlkIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZVxyXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlOYW1lIHByaXZpbGVnZXMgZm9ybSBjb250cm9scyBvciByZXR1cm5zIGVsZW1lbnRzIGJ5IElEXHJcblx0YXNzZXJ0VXNhYmxlTmFtZSA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xyXG5cdFx0Ly8gSW5qZWN0IGNvbnRlbnRcclxuXHRcdGRpdi5pZCA9IGV4cGFuZG8gKyAwO1xyXG5cdFx0ZGl2LmlubmVySFRNTCA9IFwiPGEgbmFtZT0nXCIgKyBleHBhbmRvICsgXCInPjwvYT48ZGl2IG5hbWU9J1wiICsgZXhwYW5kbyArIFwiJz48L2Rpdj5cIjtcclxuXHRcdGRvY0VsZW0uaW5zZXJ0QmVmb3JlKCBkaXYsIGRvY0VsZW0uZmlyc3RDaGlsZCApO1xyXG5cclxuXHRcdC8vIFRlc3RcclxuXHRcdHZhciBwYXNzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgJiZcclxuXHRcdFx0Ly8gYnVnZ3kgYnJvd3NlcnMgd2lsbCByZXR1cm4gZmV3ZXIgdGhhbiB0aGUgY29ycmVjdCAyXHJcblx0XHRcdGRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoID09PSAyICtcclxuXHRcdFx0Ly8gYnVnZ3kgYnJvd3NlcnMgd2lsbCByZXR1cm4gbW9yZSB0aGFuIHRoZSBjb3JyZWN0IDBcclxuXHRcdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUoIGV4cGFuZG8gKyAwICkubGVuZ3RoO1xyXG5cdFx0YXNzZXJ0R2V0SWROb3ROYW1lID0gIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBleHBhbmRvICk7XHJcblxyXG5cdFx0Ly8gQ2xlYW51cFxyXG5cdFx0ZG9jRWxlbS5yZW1vdmVDaGlsZCggZGl2ICk7XHJcblxyXG5cdFx0cmV0dXJuIHBhc3M7XHJcblx0fSk7XHJcblxyXG4vLyBJZiBzbGljZSBpcyBub3QgYXZhaWxhYmxlLCBwcm92aWRlIGEgYmFja3VwXHJcbnRyeSB7XHJcblx0c2xpY2UuY2FsbCggZG9jRWxlbS5jaGlsZE5vZGVzLCAwIClbMF0ubm9kZVR5cGU7XHJcbn0gY2F0Y2ggKCBlICkge1xyXG5cdHNsaWNlID0gZnVuY3Rpb24oIGkgKSB7XHJcblx0XHR2YXIgZWxlbSwgcmVzdWx0cyA9IFtdO1xyXG5cdFx0Zm9yICggOyAoZWxlbSA9IHRoaXNbaV0pOyBpKysgKSB7XHJcblx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlc3VsdHM7XHJcblx0fTtcclxufVxyXG5cclxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcclxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcclxuXHRjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDtcclxuXHR2YXIgbWF0Y2gsIGVsZW0sIHhtbCwgbSxcclxuXHRcdG5vZGVUeXBlID0gY29udGV4dC5ub2RlVHlwZTtcclxuXHJcblx0aWYgKCBub2RlVHlwZSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSApIHtcclxuXHRcdHJldHVybiBbXTtcclxuXHR9XHJcblxyXG5cdGlmICggIXNlbGVjdG9yIHx8IHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdHJldHVybiByZXN1bHRzO1xyXG5cdH1cclxuXHJcblx0eG1sID0gaXNYTUwoIGNvbnRleHQgKTtcclxuXHJcblx0aWYgKCAheG1sICYmICFzZWVkICkge1xyXG5cdFx0aWYgKCAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkge1xyXG5cdFx0XHQvLyBTcGVlZC11cDogU2l6emxlKFwiI0lEXCIpXHJcblx0XHRcdGlmICggKG0gPSBtYXRjaFsxXSkgKSB7XHJcblx0XHRcdFx0aWYgKCBub2RlVHlwZSA9PT0gOSApIHtcclxuXHRcdFx0XHRcdGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICk7XHJcblx0XHRcdFx0XHQvLyBDaGVjayBwYXJlbnROb2RlIHRvIGNhdGNoIHdoZW4gQmxhY2tiZXJyeSA0LjYgcmV0dXJuc1xyXG5cdFx0XHRcdFx0Ly8gbm9kZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBkb2N1bWVudCAjNjk2M1xyXG5cdFx0XHRcdFx0aWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFLCBPcGVyYSwgYW5kIFdlYmtpdCByZXR1cm4gaXRlbXNcclxuXHRcdFx0XHRcdFx0Ly8gYnkgbmFtZSBpbnN0ZWFkIG9mIElEXHJcblx0XHRcdFx0XHRcdGlmICggZWxlbS5pZCA9PT0gbSApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIENvbnRleHQgaXMgbm90IGEgZG9jdW1lbnRcclxuXHRcdFx0XHRcdGlmICggY29udGV4dC5vd25lckRvY3VtZW50ICYmIChlbGVtID0gY29udGV4dC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtICkpICYmXHJcblx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiYgZWxlbS5pZCA9PT0gbSApIHtcclxuXHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XHJcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFNwZWVkLXVwOiBTaXp6bGUoXCJUQUdcIilcclxuXHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7XHJcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2xpY2UuY2FsbChjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBzZWxlY3RvciApLCAwKSApO1xyXG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xyXG5cclxuXHRcdFx0Ly8gU3BlZWQtdXA6IFNpenpsZShcIi5DTEFTU1wiKVxyXG5cdFx0XHR9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBhc3NlcnRVc2FibGVDbGFzc05hbWUgJiYgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICkge1xyXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNsaWNlLmNhbGwoY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBtICksIDApICk7XHJcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIEFsbCBvdGhlcnNcclxuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCwgeG1sICk7XHJcbn1cclxuXHJcblNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkge1xyXG5cdHJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7XHJcbn07XHJcblxyXG5TaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7XHJcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xyXG59O1xyXG5cclxuLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlc1xyXG5mdW5jdGlvbiBjcmVhdGVJbnB1dFBzZXVkbyggdHlwZSApIHtcclxuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHRcdHJldHVybiBuYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSB0eXBlO1xyXG5cdH07XHJcbn1cclxuXHJcbi8vIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9uc1xyXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7XHJcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRyZXR1cm4gKG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XHJcblx0fTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXHJcbiAqIEBwYXJhbSB7QXJyYXl8RWxlbWVudH0gZWxlbVxyXG4gKi9cclxuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0dmFyIG5vZGUsXHJcblx0XHRyZXQgPSBcIlwiLFxyXG5cdFx0aSA9IDAsXHJcblx0XHRub2RlVHlwZSA9IGVsZW0ubm9kZVR5cGU7XHJcblxyXG5cdGlmICggbm9kZVR5cGUgKSB7XHJcblx0XHRpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcclxuXHRcdFx0Ly8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50c1xyXG5cdFx0XHQvLyBpbm5lclRleHQgdXNhZ2UgcmVtb3ZlZCBmb3IgY29uc2lzdGVuY3kgb2YgbmV3IGxpbmVzIChzZWUgIzExMTUzKVxyXG5cdFx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xyXG5cdFx0XHRcdHJldHVybiBlbGVtLnRleHRDb250ZW50O1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxyXG5cdFx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xyXG5cdFx0XHRcdFx0cmV0ICs9IGdldFRleHQoIGVsZW0gKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkge1xyXG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XHJcblx0XHR9XHJcblx0XHQvLyBEbyBub3QgaW5jbHVkZSBjb21tZW50IG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm9kZXNcclxuXHR9IGVsc2Uge1xyXG5cclxuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XHJcblx0XHRmb3IgKCA7IChub2RlID0gZWxlbVtpXSk7IGkrKyApIHtcclxuXHRcdFx0Ly8gRG8gbm90IHRyYXZlcnNlIGNvbW1lbnQgbm9kZXNcclxuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIHJldDtcclxufTtcclxuXHJcbmlzWE1MID0gU2l6emxlLmlzWE1MID0gZnVuY3Rpb24gaXNYTUwoIGVsZW0gKSB7XHJcblx0Ly8gZG9jdW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVyZSBpdCBkb2Vzbid0IHlldCBleGlzdFxyXG5cdC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKVxyXG5cdHZhciBkb2N1bWVudEVsZW1lbnQgPSBlbGVtICYmIChlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSkuZG9jdW1lbnRFbGVtZW50O1xyXG5cdHJldHVybiBkb2N1bWVudEVsZW1lbnQgPyBkb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09IFwiSFRNTFwiIDogZmFsc2U7XHJcbn07XHJcblxyXG4vLyBFbGVtZW50IGNvbnRhaW5zIGFub3RoZXJcclxuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnMgPSBkb2NFbGVtLmNvbnRhaW5zID9cclxuXHRmdW5jdGlvbiggYSwgYiApIHtcclxuXHRcdHZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsXHJcblx0XHRcdGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlO1xyXG5cdFx0cmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiBhZG93bi5jb250YWlucyAmJiBhZG93bi5jb250YWlucyhidXApICk7XHJcblx0fSA6XHJcblx0ZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/XHJcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XHJcblx0XHRyZXR1cm4gYiAmJiAhISggYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApICYgMTYgKTtcclxuXHR9IDpcclxuXHRmdW5jdGlvbiggYSwgYiApIHtcclxuXHRcdHdoaWxlICggKGIgPSBiLnBhcmVudE5vZGUpICkge1xyXG5cdFx0XHRpZiAoIGIgPT09IGEgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9O1xyXG5cclxuU2l6emxlLmF0dHIgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcclxuXHR2YXIgYXR0cixcclxuXHRcdHhtbCA9IGlzWE1MKCBlbGVtICk7XHJcblxyXG5cdGlmICggIXhtbCApIHtcclxuXHRcdG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XHJcblx0fVxyXG5cdGlmICggRXhwci5hdHRySGFuZGxlWyBuYW1lIF0gKSB7XHJcblx0XHRyZXR1cm4gRXhwci5hdHRySGFuZGxlWyBuYW1lIF0oIGVsZW0gKTtcclxuXHR9XHJcblx0aWYgKCBhc3NlcnRBdHRyaWJ1dGVzIHx8IHhtbCApIHtcclxuXHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApO1xyXG5cdH1cclxuXHRhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICk7XHJcblx0cmV0dXJuIGF0dHIgP1xyXG5cdFx0dHlwZW9mIGVsZW1bIG5hbWUgXSA9PT0gXCJib29sZWFuXCIgP1xyXG5cdFx0XHRlbGVtWyBuYW1lIF0gPyBuYW1lIDogbnVsbCA6XHJcblx0XHRcdGF0dHIuc3BlY2lmaWVkID8gYXR0ci52YWx1ZSA6IG51bGwgOlxyXG5cdFx0bnVsbDtcclxufTtcclxuXHJcbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xyXG5cclxuXHQvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXJcclxuXHRjYWNoZUxlbmd0aDogNTAsXHJcblxyXG5cdGNyZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLFxyXG5cclxuXHRtYXRjaDogbWF0Y2hFeHByLFxyXG5cclxuXHRvcmRlcjogbmV3IFJlZ0V4cCggXCJJRHxUQUdcIiArXHJcblx0XHQoYXNzZXJ0VXNhYmxlTmFtZSA/IFwifE5BTUVcIiA6IFwiXCIpICtcclxuXHRcdChhc3NlcnRVc2FibGVDbGFzc05hbWUgPyBcInxDTEFTU1wiIDogXCJcIilcclxuXHQpLFxyXG5cclxuXHQvLyBJRTYvNyByZXR1cm4gYSBtb2RpZmllZCBocmVmXHJcblx0YXR0ckhhbmRsZTogYXNzZXJ0SHJlZk5vdE5vcm1hbGl6ZWQgP1xyXG5cdFx0e30gOlxyXG5cdFx0e1xyXG5cdFx0XHRcImhyZWZcIjogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBcImhyZWZcIiwgMiApO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRcInR5cGVcIjogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0ZmluZDoge1xyXG5cdFx0XCJJRFwiOiBhc3NlcnRHZXRJZE5vdE5hbWUgP1xyXG5cdFx0XHRmdW5jdGlvbiggaWQsIGNvbnRleHQsIHhtbCApIHtcclxuXHRcdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBzdHJ1bmRlZmluZWQgJiYgIXhtbCApIHtcclxuXHRcdFx0XHRcdHZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcclxuXHRcdFx0XHRcdC8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zXHJcblx0XHRcdFx0XHQvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzXHJcblx0XHRcdFx0XHRyZXR1cm4gbSAmJiBtLnBhcmVudE5vZGUgPyBbbV0gOiBbXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gOlxyXG5cdFx0XHRmdW5jdGlvbiggaWQsIGNvbnRleHQsIHhtbCApIHtcclxuXHRcdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBzdHJ1bmRlZmluZWQgJiYgIXhtbCApIHtcclxuXHRcdFx0XHRcdHZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gbSA/XHJcblx0XHRcdFx0XHRcdG0uaWQgPT09IGlkIHx8IHR5cGVvZiBtLmdldEF0dHJpYnV0ZU5vZGUgIT09IHN0cnVuZGVmaW5lZCAmJiBtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKS52YWx1ZSA9PT0gaWQgP1xyXG5cdFx0XHRcdFx0XHRcdFttXSA6XHJcblx0XHRcdFx0XHRcdFx0dW5kZWZpbmVkIDpcclxuXHRcdFx0XHRcdFx0W107XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cclxuXHRcdFwiVEFHXCI6IGFzc2VydFRhZ05hbWVOb0NvbW1lbnRzID9cclxuXHRcdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcclxuXHRcdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBzdHJ1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IDpcclxuXHRcdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcclxuXHRcdFx0XHR2YXIgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xyXG5cclxuXHRcdFx0XHQvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzXHJcblx0XHRcdFx0aWYgKCB0YWcgPT09IFwiKlwiICkge1xyXG5cdFx0XHRcdFx0dmFyIGVsZW0sXHJcblx0XHRcdFx0XHRcdHRtcCA9IFtdLFxyXG5cdFx0XHRcdFx0XHRpID0gMDtcclxuXHJcblx0XHRcdFx0XHRmb3IgKCA7IChlbGVtID0gcmVzdWx0c1tpXSk7IGkrKyApIHtcclxuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xyXG5cdFx0XHRcdFx0XHRcdHRtcC5wdXNoKCBlbGVtICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRyZXR1cm4gdG1wO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcclxuXHRcdFx0fSxcclxuXHJcblx0XHRcIk5BTUVcIjogZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcclxuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSAhPT0gc3RydW5kZWZpbmVkICkge1xyXG5cdFx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBuYW1lICk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblxyXG5cdFx0XCJDTEFTU1wiOiBmdW5jdGlvbiggY2xhc3NOYW1lLCBjb250ZXh0LCB4bWwgKSB7XHJcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAhPT0gc3RydW5kZWZpbmVkICYmICF4bWwgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggY2xhc3NOYW1lICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRyZWxhdGl2ZToge1xyXG5cdFx0XCI+XCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiwgZmlyc3Q6IHRydWUgfSxcclxuXHRcdFwiIFwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIgfSxcclxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcclxuXHRcdFwiflwiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiB9XHJcblx0fSxcclxuXHJcblx0cHJlRmlsdGVyOiB7XHJcblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG1hdGNoICkge1xyXG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJiYWNrc2xhc2gsIFwiXCIgKTtcclxuXHJcblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXHJcblx0XHRcdG1hdGNoWzNdID0gKCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBcIlwiICkucmVwbGFjZSggcmJhY2tzbGFzaCwgXCJcIiApO1xyXG5cclxuXHRcdFx0aWYgKCBtYXRjaFsyXSA9PT0gXCJ+PVwiICkge1xyXG5cdFx0XHRcdG1hdGNoWzNdID0gXCIgXCIgKyBtYXRjaFszXSArIFwiIFwiO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDQgKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XHJcblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHIuQ0hJTERcclxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcclxuXHRcdFx0XHQyIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxyXG5cdFx0XHRcdDMgeG4tY29tcG9uZW50IG9mIHhuK3kgYXJndW1lbnQgKFsrLV0/XFxkKm58KVxyXG5cdFx0XHRcdDQgc2lnbiBvZiB4bi1jb21wb25lbnRcclxuXHRcdFx0XHQ1IHggb2YgeG4tY29tcG9uZW50XHJcblx0XHRcdFx0NiBzaWduIG9mIHktY29tcG9uZW50XHJcblx0XHRcdFx0NyB5IG9mIHktY29tcG9uZW50XHJcblx0XHRcdCovXHJcblx0XHRcdG1hdGNoWzFdID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTtcclxuXHJcblx0XHRcdGlmICggbWF0Y2hbMV0gPT09IFwibnRoXCIgKSB7XHJcblx0XHRcdFx0Ly8gbnRoLWNoaWxkIHJlcXVpcmVzIGFyZ3VtZW50XHJcblx0XHRcdFx0aWYgKCAhbWF0Y2hbMl0gKSB7XHJcblx0XHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBudW1lcmljIHggYW5kIHkgcGFyYW1ldGVycyBmb3IgRXhwci5maWx0ZXIuQ0hJTERcclxuXHRcdFx0XHQvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xXHJcblx0XHRcdFx0bWF0Y2hbM10gPSArKCBtYXRjaFszXSA/IG1hdGNoWzRdICsgKG1hdGNoWzVdIHx8IDEpIDogMiAqICggbWF0Y2hbMl0gPT09IFwiZXZlblwiIHx8IG1hdGNoWzJdID09PSBcIm9kZFwiICkgKTtcclxuXHRcdFx0XHRtYXRjaFs0XSA9ICsoICggbWF0Y2hbNl0gKyBtYXRjaFs3XSApIHx8IG1hdGNoWzJdID09PSBcIm9kZFwiICk7XHJcblxyXG5cdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcclxuXHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7XHJcblx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbWF0Y2g7XHJcblx0XHR9LFxyXG5cclxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCwgeG1sICkge1xyXG5cdFx0XHR2YXIgdW5xdW90ZWQsIGV4Y2VzcztcclxuXHRcdFx0aWYgKCBtYXRjaEV4cHJbXCJDSElMRFwiXS50ZXN0KCBtYXRjaFswXSApICkge1xyXG5cdFx0XHRcdHJldHVybiBudWxsO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIG1hdGNoWzNdICkge1xyXG5cdFx0XHRcdG1hdGNoWzJdID0gbWF0Y2hbM107XHJcblx0XHRcdH0gZWxzZSBpZiAoICh1bnF1b3RlZCA9IG1hdGNoWzRdKSApIHtcclxuXHRcdFx0XHQvLyBPbmx5IGNoZWNrIGFyZ3VtZW50cyB0aGF0IGNvbnRhaW4gYSBwc2V1ZG9cclxuXHRcdFx0XHRpZiAoIHJwc2V1ZG8udGVzdCh1bnF1b3RlZCkgJiZcclxuXHRcdFx0XHRcdC8vIEdldCBleGNlc3MgZnJvbSB0b2tlbml6ZSAocmVjdXJzaXZlbHkpXHJcblx0XHRcdFx0XHQoZXhjZXNzID0gdG9rZW5pemUoIHVucXVvdGVkLCBjb250ZXh0LCB4bWwsIHRydWUgKSkgJiZcclxuXHRcdFx0XHRcdC8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpc1xyXG5cdFx0XHRcdFx0KGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcclxuXHRcdFx0XHRcdHVucXVvdGVkID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xyXG5cdFx0XHRcdFx0bWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCwgZXhjZXNzICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdG1hdGNoWzJdID0gdW5xdW90ZWQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFJldHVybiBvbmx5IGNhcHR1cmVzIG5lZWRlZCBieSB0aGUgcHNldWRvIGZpbHRlciBtZXRob2QgKHR5cGUgYW5kIGFyZ3VtZW50KVxyXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRmaWx0ZXI6IHtcclxuXHRcdFwiSURcIjogYXNzZXJ0R2V0SWROb3ROYW1lID9cclxuXHRcdFx0ZnVuY3Rpb24oIGlkICkge1xyXG5cdFx0XHRcdGlkID0gaWQucmVwbGFjZSggcmJhY2tzbGFzaCwgXCJcIiApO1xyXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpID09PSBpZDtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9IDpcclxuXHRcdFx0ZnVuY3Rpb24oIGlkICkge1xyXG5cdFx0XHRcdGlkID0gaWQucmVwbGFjZSggcmJhY2tzbGFzaCwgXCJcIiApO1xyXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHRcdHZhciBub2RlID0gdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gc3RydW5kZWZpbmVkICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZShcImlkXCIpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQ7XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fSxcclxuXHJcblx0XHRcIlRBR1wiOiBmdW5jdGlvbiggbm9kZU5hbWUgKSB7XHJcblx0XHRcdGlmICggbm9kZU5hbWUgPT09IFwiKlwiICkge1xyXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH07XHJcblx0XHRcdH1cclxuXHRcdFx0bm9kZU5hbWUgPSBub2RlTmFtZS5yZXBsYWNlKCByYmFja3NsYXNoLCBcIlwiICkudG9Mb3dlckNhc2UoKTtcclxuXHJcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xyXG5cdFx0XHR9O1xyXG5cdFx0fSxcclxuXHJcblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XHJcblx0XHRcdHZhciBwYXR0ZXJuID0gY2xhc3NDYWNoZVsgZXhwYW5kbyBdWyBjbGFzc05hbWUgXTtcclxuXHRcdFx0aWYgKCAhcGF0dGVybiApIHtcclxuXHRcdFx0XHRwYXR0ZXJuID0gY2xhc3NDYWNoZSggY2xhc3NOYW1lLCBuZXcgUmVnRXhwKFwiKF58XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyBjbGFzc05hbWUgKyBcIihcIiArIHdoaXRlc3BhY2UgKyBcInwkKVwiKSApO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KCBlbGVtLmNsYXNzTmFtZSB8fCAodHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBzdHJ1bmRlZmluZWQgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSkgfHwgXCJcIiApO1xyXG5cdFx0XHR9O1xyXG5cdFx0fSxcclxuXHJcblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHtcclxuXHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICkgIT0gbnVsbDtcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdFx0dmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICksXHJcblx0XHRcdFx0XHR2YWx1ZSA9IHJlc3VsdCArIFwiXCI7XHJcblxyXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiIT1cIjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHN3aXRjaCAoIG9wZXJhdG9yICkge1xyXG5cdFx0XHRcdFx0Y2FzZSBcIj1cIjpcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSBjaGVjaztcclxuXHRcdFx0XHRcdGNhc2UgXCIhPVwiOlxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWUgIT09IGNoZWNrO1xyXG5cdFx0XHRcdFx0Y2FzZSBcIl49XCI6XHJcblx0XHRcdFx0XHRcdHJldHVybiBjaGVjayAmJiB2YWx1ZS5pbmRleE9mKCBjaGVjayApID09PSAwO1xyXG5cdFx0XHRcdFx0Y2FzZSBcIio9XCI6XHJcblx0XHRcdFx0XHRcdHJldHVybiBjaGVjayAmJiB2YWx1ZS5pbmRleE9mKCBjaGVjayApID4gLTE7XHJcblx0XHRcdFx0XHRjYXNlIFwiJD1cIjpcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGNoZWNrICYmIHZhbHVlLnN1YnN0ciggdmFsdWUubGVuZ3RoIC0gY2hlY2subGVuZ3RoICkgPT09IGNoZWNrO1xyXG5cdFx0XHRcdFx0Y2FzZSBcIn49XCI6XHJcblx0XHRcdFx0XHRcdHJldHVybiAoIFwiIFwiICsgdmFsdWUgKyBcIiBcIiApLmluZGV4T2YoIGNoZWNrICkgPiAtMTtcclxuXHRcdFx0XHRcdGNhc2UgXCJ8PVwiOlxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IGNoZWNrIHx8IHZhbHVlLnN1YnN0ciggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fTtcclxuXHRcdH0sXHJcblxyXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggdHlwZSwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkge1xyXG5cclxuXHRcdFx0aWYgKCB0eXBlID09PSBcIm50aFwiICkge1xyXG5cdFx0XHRcdHZhciBkb25lTmFtZSA9IGRvbmUrKztcclxuXHJcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRcdFx0dmFyIHBhcmVudCwgZGlmZixcclxuXHRcdFx0XHRcdFx0Y291bnQgPSAwLFxyXG5cdFx0XHRcdFx0XHRub2RlID0gZWxlbTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGZpcnN0ID09PSAxICYmIGxhc3QgPT09IDAgKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIHBhcmVudCAmJiAocGFyZW50WyBleHBhbmRvIF0gIT09IGRvbmVOYW1lIHx8ICFlbGVtLnNpenNldCkgKSB7XHJcblx0XHRcdFx0XHRcdGZvciAoIG5vZGUgPSBwYXJlbnQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcgKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0bm9kZS5zaXpzZXQgPSArK2NvdW50O1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBub2RlID09PSBlbGVtICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHBhcmVudFsgZXhwYW5kbyBdID0gZG9uZU5hbWU7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0ZGlmZiA9IGVsZW0uc2l6c2V0IC0gbGFzdDtcclxuXHJcblx0XHRcdFx0XHRpZiAoIGZpcnN0ID09PSAwICkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZGlmZiA9PT0gMDtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdFx0dmFyIG5vZGUgPSBlbGVtO1xyXG5cclxuXHRcdFx0XHRzd2l0Y2ggKCB0eXBlICkge1xyXG5cdFx0XHRcdFx0Y2FzZSBcIm9ubHlcIjpcclxuXHRcdFx0XHRcdGNhc2UgXCJmaXJzdFwiOlxyXG5cdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpICkge1xyXG5cdFx0XHRcdFx0XHRcdGlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmaXJzdFwiICkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRub2RlID0gZWxlbTtcclxuXHJcblx0XHRcdFx0XHRcdC8qIGZhbGxzIHRocm91Z2ggKi9cclxuXHRcdFx0XHRcdGNhc2UgXCJsYXN0XCI6XHJcblx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSBub2RlLm5leHRTaWJsaW5nKSApIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH07XHJcblx0XHR9LFxyXG5cclxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50LCBjb250ZXh0LCB4bWwgKSB7XHJcblx0XHRcdC8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZVxyXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI3BzZXVkby1jbGFzc2VzXHJcblx0XHRcdC8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzXHJcblx0XHRcdHZhciBhcmdzLFxyXG5cdFx0XHRcdGZuID0gRXhwci5wc2V1ZG9zWyBwc2V1ZG8gXSB8fCBFeHByLnBzZXVkb3NbIHBzZXVkby50b0xvd2VyQ2FzZSgpIF07XHJcblxyXG5cdFx0XHRpZiAoICFmbiApIHtcclxuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgcHNldWRvOiBcIiArIHBzZXVkbyApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0XHJcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXHJcblx0XHRcdC8vIGp1c3QgYXMgU2l6emxlIGRvZXNcclxuXHRcdFx0aWYgKCAhZm5bIGV4cGFuZG8gXSApIHtcclxuXHRcdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XHJcblx0XHRcdFx0XHRhcmdzID0gWyBwc2V1ZG8sIHBzZXVkbywgXCJcIiwgYXJndW1lbnQgXTtcclxuXHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7XHJcblx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gZm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBmbiggYXJndW1lbnQsIGNvbnRleHQsIHhtbCApO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHBzZXVkb3M6IHtcclxuXHRcdFwibm90XCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHhtbCApIHtcclxuXHRcdFx0Ly8gVHJpbSB0aGUgc2VsZWN0b3IgcGFzc2VkIHRvIGNvbXBpbGVcclxuXHRcdFx0Ly8gdG8gYXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmdcclxuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXHJcblx0XHRcdHZhciBtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLCBjb250ZXh0LCB4bWwgKTtcclxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRcdHJldHVybiAhbWF0Y2hlciggZWxlbSApO1xyXG5cdFx0XHR9O1xyXG5cdFx0fSksXHJcblxyXG5cdFx0XCJlbmFibGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2U7XHJcblx0XHR9LFxyXG5cclxuXHRcdFwiZGlzYWJsZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlO1xyXG5cdFx0fSxcclxuXHJcblx0XHRcImNoZWNrZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdC8vIEluIENTUzMsIDpjaGVja2VkIHNob3VsZCByZXR1cm4gYm90aCBjaGVja2VkIGFuZCBzZWxlY3RlZCBlbGVtZW50c1xyXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxyXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdHJldHVybiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSBcIm9wdGlvblwiICYmICEhZWxlbS5zZWxlY3RlZCk7XHJcblx0XHR9LFxyXG5cclxuXHRcdFwic2VsZWN0ZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdC8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHRcclxuXHRcdFx0Ly8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseVxyXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0XHRlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7XHJcblx0XHR9LFxyXG5cclxuXHRcdFwicGFyZW50XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRyZXR1cm4gIUV4cHIucHNldWRvc1tcImVtcHR5XCJdKCBlbGVtICk7XHJcblx0XHR9LFxyXG5cclxuXHRcdFwiZW1wdHlcIjogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jZW1wdHktcHNldWRvXHJcblx0XHRcdC8vIDplbXB0eSBpcyBvbmx5IGFmZmVjdGVkIGJ5IGVsZW1lbnQgbm9kZXMgYW5kIGNvbnRlbnQgbm9kZXMoaW5jbHVkaW5nIHRleHQoMyksIGNkYXRhKDQpKSxcclxuXHRcdFx0Ly8gICBub3QgY29tbWVudCwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIG9yIG90aGVyc1xyXG5cdFx0XHQvLyBUaGFua3MgdG8gRGllZ28gUGVyaW5pIGZvciB0aGUgbm9kZU5hbWUgc2hvcnRjdXRcclxuXHRcdFx0Ly8gICBHcmVhdGVyIHRoYW4gXCJAXCIgbWVhbnMgYWxwaGEgY2hhcmFjdGVycyAoc3BlY2lmaWNhbGx5IG5vdCBzdGFydGluZyB3aXRoIFwiI1wiIG9yIFwiP1wiKVxyXG5cdFx0XHR2YXIgbm9kZVR5cGU7XHJcblx0XHRcdGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7XHJcblx0XHRcdHdoaWxlICggZWxlbSApIHtcclxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZU5hbWUgPiBcIkBcIiB8fCAobm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlKSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmc7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9LFxyXG5cclxuXHRcdFwiY29udGFpbnNcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCB0ZXh0ICkge1xyXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdFx0cmV0dXJuICggZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBnZXRUZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0ZXh0ICkgPiAtMTtcclxuXHRcdFx0fTtcclxuXHRcdH0pLFxyXG5cclxuXHRcdFwiaGFzXCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7XHJcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHRyZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7XHJcblx0XHRcdH07XHJcblx0XHR9KSxcclxuXHJcblx0XHRcImhlYWRlclwiOiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApO1xyXG5cdFx0fSxcclxuXHJcblx0XHRcInRleHRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdHZhciB0eXBlLCBhdHRyO1xyXG5cdFx0XHQvLyBJRTYgYW5kIDcgd2lsbCBtYXAgZWxlbS50eXBlIHRvICd0ZXh0JyBmb3IgbmV3IEhUTUw1IHR5cGVzIChzZWFyY2gsIGV0YylcclxuXHRcdFx0Ly8gdXNlIGdldEF0dHJpYnV0ZSBpbnN0ZWFkIHRvIHRlc3QgdGhpcyBjYXNlXHJcblx0XHRcdHJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiAmJlxyXG5cdFx0XHRcdCh0eXBlID0gZWxlbS50eXBlKSA9PT0gXCJ0ZXh0XCIgJiZcclxuXHRcdFx0XHQoIChhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKSA9PSBudWxsIHx8IGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gdHlwZSApO1xyXG5cdFx0fSxcclxuXHJcblx0XHQvLyBJbnB1dCB0eXBlc1xyXG5cdFx0XCJyYWRpb1wiOiBjcmVhdGVJbnB1dFBzZXVkbyhcInJhZGlvXCIpLFxyXG5cdFx0XCJjaGVja2JveFwiOiBjcmVhdGVJbnB1dFBzZXVkbyhcImNoZWNrYm94XCIpLFxyXG5cdFx0XCJmaWxlXCI6IGNyZWF0ZUlucHV0UHNldWRvKFwiZmlsZVwiKSxcclxuXHRcdFwicGFzc3dvcmRcIjogY3JlYXRlSW5wdXRQc2V1ZG8oXCJwYXNzd29yZFwiKSxcclxuXHRcdFwiaW1hZ2VcIjogY3JlYXRlSW5wdXRQc2V1ZG8oXCJpbWFnZVwiKSxcclxuXHJcblx0XHRcInN1Ym1pdFwiOiBjcmVhdGVCdXR0b25Qc2V1ZG8oXCJzdWJtaXRcIiksXHJcblx0XHRcInJlc2V0XCI6IGNyZWF0ZUJ1dHRvblBzZXVkbyhcInJlc2V0XCIpLFxyXG5cclxuXHRcdFwiYnV0dG9uXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFwiYnV0dG9uXCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIjtcclxuXHRcdH0sXHJcblxyXG5cdFx0XCJpbnB1dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0cmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApO1xyXG5cdFx0fSxcclxuXHJcblx0XHRcImZvY3VzXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHR2YXIgZG9jID0gZWxlbS5vd25lckRvY3VtZW50O1xyXG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jLmFjdGl2ZUVsZW1lbnQgJiYgKCFkb2MuaGFzRm9jdXMgfHwgZG9jLmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYpO1xyXG5cdFx0fSxcclxuXHJcblx0XHRcImFjdGl2ZVwiOiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGVsZW0ub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50O1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHNldEZpbHRlcnM6IHtcclxuXHRcdFwiZmlyc3RcIjogZnVuY3Rpb24oIGVsZW1lbnRzLCBhcmd1bWVudCwgbm90ICkge1xyXG5cdFx0XHRyZXR1cm4gbm90ID8gZWxlbWVudHMuc2xpY2UoIDEgKSA6IFsgZWxlbWVudHNbMF0gXTtcclxuXHRcdH0sXHJcblxyXG5cdFx0XCJsYXN0XCI6IGZ1bmN0aW9uKCBlbGVtZW50cywgYXJndW1lbnQsIG5vdCApIHtcclxuXHRcdFx0dmFyIGVsZW0gPSBlbGVtZW50cy5wb3AoKTtcclxuXHRcdFx0cmV0dXJuIG5vdCA/IGVsZW1lbnRzIDogWyBlbGVtIF07XHJcblx0XHR9LFxyXG5cclxuXHRcdFwiZXZlblwiOiBmdW5jdGlvbiggZWxlbWVudHMsIGFyZ3VtZW50LCBub3QgKSB7XHJcblx0XHRcdHZhciByZXN1bHRzID0gW10sXHJcblx0XHRcdFx0aSA9IG5vdCA/IDEgOiAwLFxyXG5cdFx0XHRcdGxlbiA9IGVsZW1lbnRzLmxlbmd0aDtcclxuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpID0gaSArIDIgKSB7XHJcblx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtZW50c1tpXSApO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiByZXN1bHRzO1xyXG5cdFx0fSxcclxuXHJcblx0XHRcIm9kZFwiOiBmdW5jdGlvbiggZWxlbWVudHMsIGFyZ3VtZW50LCBub3QgKSB7XHJcblx0XHRcdHZhciByZXN1bHRzID0gW10sXHJcblx0XHRcdFx0aSA9IG5vdCA/IDAgOiAxLFxyXG5cdFx0XHRcdGxlbiA9IGVsZW1lbnRzLmxlbmd0aDtcclxuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpID0gaSArIDIgKSB7XHJcblx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtZW50c1tpXSApO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiByZXN1bHRzO1xyXG5cdFx0fSxcclxuXHJcblx0XHRcImx0XCI6IGZ1bmN0aW9uKCBlbGVtZW50cywgYXJndW1lbnQsIG5vdCApIHtcclxuXHRcdFx0cmV0dXJuIG5vdCA/IGVsZW1lbnRzLnNsaWNlKCArYXJndW1lbnQgKSA6IGVsZW1lbnRzLnNsaWNlKCAwLCArYXJndW1lbnQgKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0XCJndFwiOiBmdW5jdGlvbiggZWxlbWVudHMsIGFyZ3VtZW50LCBub3QgKSB7XHJcblx0XHRcdHJldHVybiBub3QgPyBlbGVtZW50cy5zbGljZSggMCwgK2FyZ3VtZW50ICsgMSApIDogZWxlbWVudHMuc2xpY2UoICthcmd1bWVudCArIDEgKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0XCJlcVwiOiBmdW5jdGlvbiggZWxlbWVudHMsIGFyZ3VtZW50LCBub3QgKSB7XHJcblx0XHRcdHZhciBlbGVtID0gZWxlbWVudHMuc3BsaWNlKCArYXJndW1lbnQsIDEgKTtcclxuXHRcdFx0cmV0dXJuIG5vdCA/IGVsZW1lbnRzIDogZWxlbTtcclxuXHRcdH1cclxuXHR9XHJcbn07XHJcblxyXG5mdW5jdGlvbiBzaWJsaW5nQ2hlY2soIGEsIGIsIHJldCApIHtcclxuXHRpZiAoIGEgPT09IGIgKSB7XHJcblx0XHRyZXR1cm4gcmV0O1xyXG5cdH1cclxuXHJcblx0dmFyIGN1ciA9IGEubmV4dFNpYmxpbmc7XHJcblxyXG5cdHdoaWxlICggY3VyICkge1xyXG5cdFx0aWYgKCBjdXIgPT09IGIgKSB7XHJcblx0XHRcdHJldHVybiAtMTtcclxuXHRcdH1cclxuXHJcblx0XHRjdXIgPSBjdXIubmV4dFNpYmxpbmc7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gMTtcclxufVxyXG5cclxuc29ydE9yZGVyID0gZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/XHJcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XHJcblx0XHRpZiAoIGEgPT09IGIgKSB7XHJcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XHJcblx0XHRcdHJldHVybiAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAoICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHx8ICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID9cclxuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA6XHJcblx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiA0XHJcblx0XHQpID8gLTEgOiAxO1xyXG5cdH0gOlxyXG5cdGZ1bmN0aW9uKCBhLCBiICkge1xyXG5cdFx0Ly8gVGhlIG5vZGVzIGFyZSBpZGVudGljYWwsIHdlIGNhbiBleGl0IGVhcmx5XHJcblx0XHRpZiAoIGEgPT09IGIgKSB7XHJcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XHJcblx0XHRcdHJldHVybiAwO1xyXG5cclxuXHRcdC8vIEZhbGxiYWNrIHRvIHVzaW5nIHNvdXJjZUluZGV4IChpbiBJRSkgaWYgaXQncyBhdmFpbGFibGUgb24gYm90aCBub2Rlc1xyXG5cdFx0fSBlbHNlIGlmICggYS5zb3VyY2VJbmRleCAmJiBiLnNvdXJjZUluZGV4ICkge1xyXG5cdFx0XHRyZXR1cm4gYS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGFsLCBibCxcclxuXHRcdFx0YXAgPSBbXSxcclxuXHRcdFx0YnAgPSBbXSxcclxuXHRcdFx0YXVwID0gYS5wYXJlbnROb2RlLFxyXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXHJcblx0XHRcdGN1ciA9IGF1cDtcclxuXHJcblx0XHQvLyBJZiB0aGUgbm9kZXMgYXJlIHNpYmxpbmdzIChvciBpZGVudGljYWwpIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXHJcblx0XHRpZiAoIGF1cCA9PT0gYnVwICkge1xyXG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XHJcblxyXG5cdFx0Ly8gSWYgbm8gcGFyZW50cyB3ZXJlIGZvdW5kIHRoZW4gdGhlIG5vZGVzIGFyZSBkaXNjb25uZWN0ZWRcclxuXHRcdH0gZWxzZSBpZiAoICFhdXAgKSB7XHJcblx0XHRcdHJldHVybiAtMTtcclxuXHJcblx0XHR9IGVsc2UgaWYgKCAhYnVwICkge1xyXG5cdFx0XHRyZXR1cm4gMTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBPdGhlcndpc2UgdGhleSdyZSBzb21ld2hlcmUgZWxzZSBpbiB0aGUgdHJlZSBzbyB3ZSBuZWVkXHJcblx0XHQvLyB0byBidWlsZCB1cCBhIGZ1bGwgbGlzdCBvZiB0aGUgcGFyZW50Tm9kZXMgZm9yIGNvbXBhcmlzb25cclxuXHRcdHdoaWxlICggY3VyICkge1xyXG5cdFx0XHRhcC51bnNoaWZ0KCBjdXIgKTtcclxuXHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XHJcblx0XHR9XHJcblxyXG5cdFx0Y3VyID0gYnVwO1xyXG5cclxuXHRcdHdoaWxlICggY3VyICkge1xyXG5cdFx0XHRicC51bnNoaWZ0KCBjdXIgKTtcclxuXHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XHJcblx0XHR9XHJcblxyXG5cdFx0YWwgPSBhcC5sZW5ndGg7XHJcblx0XHRibCA9IGJwLmxlbmd0aDtcclxuXHJcblx0XHQvLyBTdGFydCB3YWxraW5nIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeVxyXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYWwgJiYgaSA8IGJsOyBpKysgKSB7XHJcblx0XHRcdGlmICggYXBbaV0gIT09IGJwW2ldICkge1xyXG5cdFx0XHRcdHJldHVybiBzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gV2UgZW5kZWQgc29tZXBsYWNlIHVwIHRoZSB0cmVlIHNvIGRvIGEgc2libGluZyBjaGVja1xyXG5cdFx0cmV0dXJuIGkgPT09IGFsID9cclxuXHRcdFx0c2libGluZ0NoZWNrKCBhLCBicFtpXSwgLTEgKSA6XHJcblx0XHRcdHNpYmxpbmdDaGVjayggYXBbaV0sIGIsIDEgKTtcclxuXHR9O1xyXG5cclxuLy8gQWx3YXlzIGFzc3VtZSB0aGUgcHJlc2VuY2Ugb2YgZHVwbGljYXRlcyBpZiBzb3J0IGRvZXNuJ3RcclxuLy8gcGFzcyB0aGVtIHRvIG91ciBjb21wYXJpc29uIGZ1bmN0aW9uIChhcyBpbiBHb29nbGUgQ2hyb21lKS5cclxuWzAsIDBdLnNvcnQoIHNvcnRPcmRlciApO1xyXG5iYXNlSGFzRHVwbGljYXRlID0gIWhhc0R1cGxpY2F0ZTtcclxuXHJcbi8vIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcclxuU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHtcclxuXHR2YXIgZWxlbSxcclxuXHRcdGkgPSAxO1xyXG5cclxuXHRoYXNEdXBsaWNhdGUgPSBiYXNlSGFzRHVwbGljYXRlO1xyXG5cdHJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7XHJcblxyXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xyXG5cdFx0Zm9yICggOyAoZWxlbSA9IHJlc3VsdHNbaV0pOyBpKysgKSB7XHJcblx0XHRcdGlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSAtIDEgXSApIHtcclxuXHRcdFx0XHRyZXN1bHRzLnNwbGljZSggaS0tLCAxICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJldHVybiByZXN1bHRzO1xyXG59O1xyXG5cclxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcclxuXHR0aHJvdyBuZXcgRXJyb3IoIFwiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogXCIgKyBtc2cgKTtcclxufTtcclxuXHJcbmZ1bmN0aW9uIHRva2VuaXplKCBzZWxlY3RvciwgY29udGV4dCwgeG1sLCBwYXJzZU9ubHkgKSB7XHJcblx0dmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsXHJcblx0XHRzb0ZhciwgZ3JvdXBzLCBncm91cCwgaSxcclxuXHRcdHByZUZpbHRlcnMsIGZpbHRlcnMsXHJcblx0XHRjaGVja0NvbnRleHQgPSAheG1sICYmIGNvbnRleHQgIT09IGRvY3VtZW50LFxyXG5cdFx0Ly8gVG9rZW4gY2FjaGUgc2hvdWxkIG1haW50YWluIHNwYWNlc1xyXG5cdFx0a2V5ID0gKCBjaGVja0NvbnRleHQgPyBcIjxzPlwiIDogXCJcIiApICsgc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDE8cz5cIiApLFxyXG5cdFx0Y2FjaGVkID0gdG9rZW5DYWNoZVsgZXhwYW5kbyBdWyBrZXkgXTtcclxuXHJcblx0aWYgKCBjYWNoZWQgKSB7XHJcblx0XHRyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IHNsaWNlLmNhbGwoIGNhY2hlZCwgMCApO1xyXG5cdH1cclxuXHJcblx0c29GYXIgPSBzZWxlY3RvcjtcclxuXHRncm91cHMgPSBbXTtcclxuXHRpID0gMDtcclxuXHRwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7XHJcblx0ZmlsdGVycyA9IEV4cHIuZmlsdGVyO1xyXG5cclxuXHR3aGlsZSAoIHNvRmFyICkge1xyXG5cclxuXHRcdC8vIENvbW1hIGFuZCBmaXJzdCBydW5cclxuXHRcdGlmICggIW1hdGNoZWQgfHwgKG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFyICkpICkge1xyXG5cdFx0XHRpZiAoIG1hdGNoICkge1xyXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApO1xyXG5cdFx0XHRcdHRva2Vucy5zZWxlY3RvciA9IGdyb3VwO1xyXG5cdFx0XHR9XHJcblx0XHRcdGdyb3Vwcy5wdXNoKCB0b2tlbnMgPSBbXSApO1xyXG5cdFx0XHRncm91cCA9IFwiXCI7XHJcblxyXG5cdFx0XHQvLyBOZWVkIHRvIG1ha2Ugc3VyZSB3ZSdyZSB3aXRoaW4gYSBuYXJyb3dlciBjb250ZXh0IGlmIG5lY2Vzc2FyeVxyXG5cdFx0XHQvLyBBZGRpbmcgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3Igd2lsbCBnZW5lcmF0ZSB3aGF0IGlzIG5lZWRlZFxyXG5cdFx0XHRpZiAoIGNoZWNrQ29udGV4dCApIHtcclxuXHRcdFx0XHRzb0ZhciA9IFwiIFwiICsgc29GYXI7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRtYXRjaGVkID0gZmFsc2U7XHJcblxyXG5cdFx0Ly8gQ29tYmluYXRvcnNcclxuXHRcdGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkge1xyXG5cdFx0XHRncm91cCArPSBtYXRjaFswXTtcclxuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICk7XHJcblxyXG5cdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2VcclxuXHRcdFx0bWF0Y2hlZCA9IHRva2Vucy5wdXNoKHtcclxuXHRcdFx0XHRwYXJ0OiBtYXRjaC5wb3AoKS5yZXBsYWNlKCBydHJpbSwgXCIgXCIgKSxcclxuXHRcdFx0XHRzdHJpbmc6IG1hdGNoWzBdLFxyXG5cdFx0XHRcdGNhcHR1cmVzOiBtYXRjaFxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBGaWx0ZXJzXHJcblx0XHRmb3IgKCB0eXBlIGluIGZpbHRlcnMgKSB7XHJcblx0XHRcdGlmICggKG1hdGNoID0gbWF0Y2hFeHByWyB0eXBlIF0uZXhlYyggc29GYXIgKSkgJiYgKCFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcclxuXHRcdFx0XHQoIG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKG1hdGNoLCBjb250ZXh0LCB4bWwpICkpICkge1xyXG5cclxuXHRcdFx0XHRncm91cCArPSBtYXRjaFswXTtcclxuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaFswXS5sZW5ndGggKTtcclxuXHRcdFx0XHRtYXRjaGVkID0gdG9rZW5zLnB1c2goe1xyXG5cdFx0XHRcdFx0cGFydDogdHlwZSxcclxuXHRcdFx0XHRcdHN0cmluZzogbWF0Y2guc2hpZnQoKSxcclxuXHRcdFx0XHRcdGNhcHR1cmVzOiBtYXRjaFxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCAhbWF0Y2hlZCApIHtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBBdHRhY2ggdGhlIGZ1bGwgZ3JvdXAgYXMgYSBzZWxlY3RvclxyXG5cdGlmICggZ3JvdXAgKSB7XHJcblx0XHR0b2tlbnMuc2VsZWN0b3IgPSBncm91cDtcclxuXHR9XHJcblxyXG5cdC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2Vzc1xyXG5cdC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZ1xyXG5cdC8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2Vuc1xyXG5cdHJldHVybiBwYXJzZU9ubHkgP1xyXG5cdFx0c29GYXIubGVuZ3RoIDpcclxuXHRcdHNvRmFyID9cclxuXHRcdFx0U2l6emxlLmVycm9yKCBzZWxlY3RvciApIDpcclxuXHRcdFx0Ly8gQ2FjaGUgdGhlIHRva2Vuc1xyXG5cdFx0XHRzbGljZS5jYWxsKCB0b2tlbkNhY2hlKGtleSwgZ3JvdXBzKSwgMCApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRDb21iaW5hdG9yKCBtYXRjaGVyLCBjb21iaW5hdG9yLCBjb250ZXh0LCB4bWwgKSB7XHJcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxyXG5cdFx0ZG9uZU5hbWUgPSBkb25lKys7XHJcblxyXG5cdGlmICggIW1hdGNoZXIgKSB7XHJcblx0XHQvLyBJZiB0aGVyZSBpcyBubyBtYXRjaGVyIHRvIGNoZWNrLCBjaGVjayBhZ2FpbnN0IHRoZSBjb250ZXh0XHJcblx0XHRtYXRjaGVyID0gZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdHJldHVybiBlbGVtID09PSBjb250ZXh0O1xyXG5cdFx0fTtcclxuXHR9XHJcblx0cmV0dXJuIGNvbWJpbmF0b3IuZmlyc3QgP1xyXG5cdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XHJcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoZXIoIGVsZW0gKSAmJiBlbGVtO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSA6XHJcblx0XHR4bWwgP1xyXG5cdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xyXG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xyXG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0gKSApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZWxlbTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSA6XHJcblx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRcdHZhciBjYWNoZSxcclxuXHRcdFx0XHRcdGRpcmtleSA9IGRvbmVOYW1lICsgXCIuXCIgKyBkaXJydW5zLFxyXG5cdFx0XHRcdFx0Y2FjaGVka2V5ID0gZGlya2V5ICsgXCIuXCIgKyBjYWNoZWRydW5zO1xyXG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XHJcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XHJcblx0XHRcdFx0XHRcdGlmICggKGNhY2hlID0gZWxlbVsgZXhwYW5kbyBdKSA9PT0gY2FjaGVka2V5ICkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBlbGVtLnNpenNldDtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZW9mIGNhY2hlID09PSBcInN0cmluZ1wiICYmIGNhY2hlLmluZGV4T2YoZGlya2V5KSA9PT0gMCApIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGVsZW0uc2l6c2V0ICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGVsZW07XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGVsZW1bIGV4cGFuZG8gXSA9IGNhY2hlZGtleTtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0gKSApIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVsZW0uc2l6c2V0ID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBlbGVtO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRlbGVtLnNpenNldCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBhZGRNYXRjaGVyKCBoaWdoZXIsIGRlZXBlciApIHtcclxuXHRyZXR1cm4gaGlnaGVyID9cclxuXHRcdGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHR2YXIgcmVzdWx0ID0gZGVlcGVyKCBlbGVtICk7XHJcblx0XHRcdHJldHVybiByZXN1bHQgJiYgaGlnaGVyKCByZXN1bHQgPT09IHRydWUgPyBlbGVtIDogcmVzdWx0ICk7XHJcblx0XHR9IDpcclxuXHRcdGRlZXBlcjtcclxufVxyXG5cclxuLy8gW1wiVEFHXCIsIFwiPlwiLCBcIklEXCIsIFwiIFwiLCBcIkNMQVNTXCJdXHJcbmZ1bmN0aW9uIG1hdGNoZXJGcm9tVG9rZW5zKCB0b2tlbnMsIGNvbnRleHQsIHhtbCApIHtcclxuXHR2YXIgdG9rZW4sIG1hdGNoZXIsXHJcblx0XHRpID0gMDtcclxuXHJcblx0Zm9yICggOyAodG9rZW4gPSB0b2tlbnNbaV0pOyBpKysgKSB7XHJcblx0XHRpZiAoIEV4cHIucmVsYXRpdmVbIHRva2VuLnBhcnQgXSApIHtcclxuXHRcdFx0bWF0Y2hlciA9IGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIEV4cHIucmVsYXRpdmVbIHRva2VuLnBhcnQgXSwgY29udGV4dCwgeG1sICk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRtYXRjaGVyID0gYWRkTWF0Y2hlciggbWF0Y2hlciwgRXhwci5maWx0ZXJbIHRva2VuLnBhcnQgXS5hcHBseShudWxsLCB0b2tlbi5jYXB0dXJlcy5jb25jYXQoIGNvbnRleHQsIHhtbCApKSApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIG1hdGNoZXI7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggbWF0Y2hlcnMgKSB7XHJcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0dmFyIG1hdGNoZXIsXHJcblx0XHRcdGogPSAwO1xyXG5cdFx0Zm9yICggOyAobWF0Y2hlciA9IG1hdGNoZXJzW2pdKTsgaisrICkge1xyXG5cdFx0XHRpZiAoIG1hdGNoZXIoZWxlbSkgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9O1xyXG59XHJcblxyXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHhtbCApIHtcclxuXHR2YXIgZ3JvdXAsIGksIGxlbixcclxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIGV4cGFuZG8gXVsgc2VsZWN0b3IgXTtcclxuXHJcblx0Ly8gUmV0dXJuIGEgY2FjaGVkIGdyb3VwIGZ1bmN0aW9uIGlmIGFscmVhZHkgZ2VuZXJhdGVkIChjb250ZXh0IGRlcGVuZGVudClcclxuXHRpZiAoIGNhY2hlZCAmJiBjYWNoZWQuY29udGV4dCA9PT0gY29udGV4dCApIHtcclxuXHRcdHJldHVybiBjYWNoZWQ7XHJcblx0fVxyXG5cclxuXHQvLyBHZW5lcmF0ZSBhIGZ1bmN0aW9uIG9mIHJlY3Vyc2l2ZSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjaGVjayBlYWNoIGVsZW1lbnRcclxuXHRncm91cCA9IHRva2VuaXplKCBzZWxlY3RvciwgY29udGV4dCwgeG1sICk7XHJcblx0Zm9yICggaSA9IDAsIGxlbiA9IGdyb3VwLmxlbmd0aDsgaSA8IGxlbjsgaSsrICkge1xyXG5cdFx0Z3JvdXBbaV0gPSBtYXRjaGVyRnJvbVRva2Vucyhncm91cFtpXSwgY29udGV4dCwgeG1sKTtcclxuXHR9XHJcblxyXG5cdC8vIENhY2hlIHRoZSBjb21waWxlZCBmdW5jdGlvblxyXG5cdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGUoIHNlbGVjdG9yLCBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoZ3JvdXApICk7XHJcblx0Y2FjaGVkLmNvbnRleHQgPSBjb250ZXh0O1xyXG5cdGNhY2hlZC5ydW5zID0gY2FjaGVkLmRpcnJ1bnMgPSAwO1xyXG5cdHJldHVybiBjYWNoZWQ7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciwgY29udGV4dHMsIHJlc3VsdHMsIHNlZWQgKSB7XHJcblx0dmFyIGkgPSAwLFxyXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xyXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xyXG5cdFx0U2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbaV0sIHJlc3VsdHMsIHNlZWQgKTtcclxuXHR9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZVBPU0dyb3VwKCBzZWxlY3RvciwgcG9zZmlsdGVyLCBhcmd1bWVudCwgY29udGV4dHMsIHNlZWQsIG5vdCApIHtcclxuXHR2YXIgcmVzdWx0cyxcclxuXHRcdGZuID0gRXhwci5zZXRGaWx0ZXJzWyBwb3NmaWx0ZXIudG9Mb3dlckNhc2UoKSBdO1xyXG5cclxuXHRpZiAoICFmbiApIHtcclxuXHRcdFNpenpsZS5lcnJvciggcG9zZmlsdGVyICk7XHJcblx0fVxyXG5cclxuXHRpZiAoIHNlbGVjdG9yIHx8ICEocmVzdWx0cyA9IHNlZWQpICkge1xyXG5cdFx0bXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IgfHwgXCIqXCIsIGNvbnRleHRzLCAocmVzdWx0cyA9IFtdKSwgc2VlZCApO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHJlc3VsdHMubGVuZ3RoID4gMCA/IGZuKCByZXN1bHRzLCBhcmd1bWVudCwgbm90ICkgOiBbXTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFuZGxlUE9TKCBncm91cHMsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XHJcblx0dmFyIGdyb3VwLCBwYXJ0LCBqLCBncm91cExlbiwgdG9rZW4sIHNlbGVjdG9yLFxyXG5cdFx0YW5jaG9yLCBlbGVtZW50cywgbWF0Y2gsIG1hdGNoZWQsXHJcblx0XHRsYXN0SW5kZXgsIGN1cnJlbnRDb250ZXh0cywgbm90LFxyXG5cdFx0aSA9IDAsXHJcblx0XHRsZW4gPSBncm91cHMubGVuZ3RoLFxyXG5cdFx0cnBvcyA9IG1hdGNoRXhwcltcIlBPU1wiXSxcclxuXHRcdC8vIFRoaXMgaXMgZ2VuZXJhdGVkIGhlcmUgaW4gY2FzZSBtYXRjaEV4cHJbXCJQT1NcIl0gaXMgZXh0ZW5kZWRcclxuXHRcdHJwb3Nncm91cHMgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHJwb3Muc291cmNlICsgXCIoPyFcIiArIHdoaXRlc3BhY2UgKyBcIilcIiwgXCJpXCIgKSxcclxuXHRcdC8vIFRoaXMgaXMgZm9yIG1ha2luZyBzdXJlIG5vbi1wYXJ0aWNpcGF0aW5nXHJcblx0XHQvLyBtYXRjaGluZyBncm91cHMgYXJlIHJlcHJlc2VudGVkIGNyb3NzLWJyb3dzZXIgKElFNi04KVxyXG5cdFx0c2V0VW5kZWZpbmVkID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBpID0gMSxcclxuXHRcdFx0XHRsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcclxuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XHJcblx0XHRcdFx0aWYgKCBhcmd1bWVudHNbaV0gPT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0XHRcdG1hdGNoW2ldID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHJcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XHJcblx0XHRncm91cCA9IGdyb3Vwc1tpXTtcclxuXHRcdHBhcnQgPSBcIlwiO1xyXG5cdFx0ZWxlbWVudHMgPSBzZWVkO1xyXG5cdFx0Zm9yICggaiA9IDAsIGdyb3VwTGVuID0gZ3JvdXAubGVuZ3RoOyBqIDwgZ3JvdXBMZW47IGorKyApIHtcclxuXHRcdFx0dG9rZW4gPSBncm91cFtqXTtcclxuXHRcdFx0c2VsZWN0b3IgPSB0b2tlbi5zdHJpbmc7XHJcblx0XHRcdGlmICggdG9rZW4ucGFydCA9PT0gXCJQU0VVRE9cIiApIHtcclxuXHRcdFx0XHQvLyBSZXNldCByZWdleCBpbmRleCB0byAwXHJcblx0XHRcdFx0cnBvcy5leGVjKFwiXCIpO1xyXG5cdFx0XHRcdGFuY2hvciA9IDA7XHJcblx0XHRcdFx0d2hpbGUgKCAobWF0Y2ggPSBycG9zLmV4ZWMoIHNlbGVjdG9yICkpICkge1xyXG5cdFx0XHRcdFx0bWF0Y2hlZCA9IHRydWU7XHJcblx0XHRcdFx0XHRsYXN0SW5kZXggPSBycG9zLmxhc3RJbmRleCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoO1xyXG5cdFx0XHRcdFx0aWYgKCBsYXN0SW5kZXggPiBhbmNob3IgKSB7XHJcblx0XHRcdFx0XHRcdHBhcnQgKz0gc2VsZWN0b3Iuc2xpY2UoIGFuY2hvciwgbWF0Y2guaW5kZXggKTtcclxuXHRcdFx0XHRcdFx0YW5jaG9yID0gbGFzdEluZGV4O1xyXG5cdFx0XHRcdFx0XHRjdXJyZW50Q29udGV4dHMgPSBbIGNvbnRleHQgXTtcclxuXHJcblx0XHRcdFx0XHRcdGlmICggcmNvbWJpbmF0b3JzLnRlc3QocGFydCkgKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCBlbGVtZW50cyApIHtcclxuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRDb250ZXh0cyA9IGVsZW1lbnRzO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRlbGVtZW50cyA9IHNlZWQ7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICggKG5vdCA9IHJlbmRzV2l0aE5vdC50ZXN0KCBwYXJ0ICkpICkge1xyXG5cdFx0XHRcdFx0XHRcdHBhcnQgPSBwYXJ0LnNsaWNlKCAwLCAtNSApLnJlcGxhY2UoIHJjb21iaW5hdG9ycywgXCIkJipcIiApO1xyXG5cdFx0XHRcdFx0XHRcdGFuY2hvcisrO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoLmxlbmd0aCA+IDEgKSB7XHJcblx0XHRcdFx0XHRcdFx0bWF0Y2hbMF0ucmVwbGFjZSggcnBvc2dyb3Vwcywgc2V0VW5kZWZpbmVkICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0ZWxlbWVudHMgPSBoYW5kbGVQT1NHcm91cCggcGFydCwgbWF0Y2hbMV0sIG1hdGNoWzJdLCBjdXJyZW50Q29udGV4dHMsIGVsZW1lbnRzLCBub3QgKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHBhcnQgPSBcIlwiO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggIW1hdGNoZWQgKSB7XHJcblx0XHRcdFx0cGFydCArPSBzZWxlY3RvcjtcclxuXHRcdFx0fVxyXG5cdFx0XHRtYXRjaGVkID0gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBwYXJ0ICkge1xyXG5cdFx0XHRpZiAoIHJjb21iaW5hdG9ycy50ZXN0KHBhcnQpICkge1xyXG5cdFx0XHRcdG11bHRpcGxlQ29udGV4dHMoIHBhcnQsIGVsZW1lbnRzIHx8IFsgY29udGV4dCBdLCByZXN1bHRzLCBzZWVkICk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0U2l6emxlKCBwYXJ0LCBjb250ZXh0LCByZXN1bHRzLCBzZWVkID8gc2VlZC5jb25jYXQoZWxlbWVudHMpIDogZWxlbWVudHMgKTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgZWxlbWVudHMgKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIERvIG5vdCBzb3J0IGlmIHRoaXMgaXMgYSBzaW5nbGUgZmlsdGVyXHJcblx0cmV0dXJuIGxlbiA9PT0gMSA/IHJlc3VsdHMgOiBTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZWxlY3QoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkLCB4bWwgKSB7XHJcblx0Ly8gUmVtb3ZlIGV4Y2Vzc2l2ZSB3aGl0ZXNwYWNlXHJcblx0c2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICk7XHJcblx0dmFyIGVsZW1lbnRzLCBtYXRjaGVyLCBjYWNoZWQsIGVsZW0sXHJcblx0XHRpLCB0b2tlbnMsIHRva2VuLCBsYXN0VG9rZW4sIGZpbmRDb250ZXh0LCB0eXBlLFxyXG5cdFx0bWF0Y2ggPSB0b2tlbml6ZSggc2VsZWN0b3IsIGNvbnRleHQsIHhtbCApLFxyXG5cdFx0Y29udGV4dE5vZGVUeXBlID0gY29udGV4dC5ub2RlVHlwZTtcclxuXHJcblx0Ly8gUE9TIGhhbmRsaW5nXHJcblx0aWYgKCBtYXRjaEV4cHJbXCJQT1NcIl0udGVzdChzZWxlY3RvcikgKSB7XHJcblx0XHRyZXR1cm4gaGFuZGxlUE9TKCBtYXRjaCwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApO1xyXG5cdH1cclxuXHJcblx0aWYgKCBzZWVkICkge1xyXG5cdFx0ZWxlbWVudHMgPSBzbGljZS5jYWxsKCBzZWVkLCAwICk7XHJcblxyXG5cdC8vIFRvIG1haW50YWluIGRvY3VtZW50IG9yZGVyLCBvbmx5IG5hcnJvdyB0aGVcclxuXHQvLyBzZXQgaWYgdGhlcmUgaXMgb25lIGdyb3VwXHJcblx0fSBlbHNlIGlmICggbWF0Y2gubGVuZ3RoID09PSAxICkge1xyXG5cclxuXHRcdC8vIFRha2UgYSBzaG9ydGN1dCBhbmQgc2V0IHRoZSBjb250ZXh0IGlmIHRoZSByb290IHNlbGVjdG9yIGlzIGFuIElEXHJcblx0XHRpZiAoICh0b2tlbnMgPSBzbGljZS5jYWxsKCBtYXRjaFswXSwgMCApKS5sZW5ndGggPiAyICYmXHJcblx0XHRcdFx0KHRva2VuID0gdG9rZW5zWzBdKS5wYXJ0ID09PSBcIklEXCIgJiZcclxuXHRcdFx0XHRjb250ZXh0Tm9kZVR5cGUgPT09IDkgJiYgIXhtbCAmJlxyXG5cdFx0XHRcdEV4cHIucmVsYXRpdmVbIHRva2Vuc1sxXS5wYXJ0IF0gKSB7XHJcblxyXG5cdFx0XHRjb250ZXh0ID0gRXhwci5maW5kW1wiSURcIl0oIHRva2VuLmNhcHR1cmVzWzBdLnJlcGxhY2UoIHJiYWNrc2xhc2gsIFwiXCIgKSwgY29udGV4dCwgeG1sIClbMF07XHJcblx0XHRcdGlmICggIWNvbnRleHQgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnN0cmluZy5sZW5ndGggKTtcclxuXHRcdH1cclxuXHJcblx0XHRmaW5kQ29udGV4dCA9ICggKG1hdGNoID0gcnNpYmxpbmcuZXhlYyggdG9rZW5zWzBdLnN0cmluZyApKSAmJiAhbWF0Y2guaW5kZXggJiYgY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dDtcclxuXHJcblx0XHQvLyBSZWR1Y2UgdGhlIHNldCBpZiBwb3NzaWJsZVxyXG5cdFx0bGFzdFRva2VuID0gXCJcIjtcclxuXHRcdGZvciAoIGkgPSB0b2tlbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKSB7XHJcblx0XHRcdHRva2VuID0gdG9rZW5zW2ldO1xyXG5cdFx0XHR0eXBlID0gdG9rZW4ucGFydDtcclxuXHRcdFx0bGFzdFRva2VuID0gdG9rZW4uc3RyaW5nICsgbGFzdFRva2VuO1xyXG5cdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbIHR5cGUgXSApIHtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIEV4cHIub3JkZXIudGVzdCh0eXBlKSApIHtcclxuXHRcdFx0XHRlbGVtZW50cyA9IEV4cHIuZmluZFsgdHlwZSBdKCB0b2tlbi5jYXB0dXJlc1swXS5yZXBsYWNlKCByYmFja3NsYXNoLCBcIlwiICksIGZpbmRDb250ZXh0LCB4bWwgKTtcclxuXHRcdFx0XHRpZiAoIGVsZW1lbnRzID09IG51bGwgKSB7XHJcblx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZSggMCwgc2VsZWN0b3IubGVuZ3RoIC0gbGFzdFRva2VuLmxlbmd0aCApICtcclxuXHRcdFx0XHRcdFx0bGFzdFRva2VuLnJlcGxhY2UoIG1hdGNoRXhwclsgdHlwZSBdLCBcIlwiICk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhc2VsZWN0b3IgKSB7XHJcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNsaWNlLmNhbGwoZWxlbWVudHMsIDApICk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBPbmx5IGxvb3Agb3ZlciB0aGUgZ2l2ZW4gZWxlbWVudHMgb25jZVxyXG5cdGlmICggc2VsZWN0b3IgKSB7XHJcblx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IsIGNvbnRleHQsIHhtbCApO1xyXG5cdFx0ZGlycnVucyA9IG1hdGNoZXIuZGlycnVucysrO1xyXG5cdFx0aWYgKCBlbGVtZW50cyA9PSBudWxsICkge1xyXG5cdFx0XHRlbGVtZW50cyA9IEV4cHIuZmluZFtcIlRBR1wiXSggXCIqXCIsIChyc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIGNvbnRleHQucGFyZW50Tm9kZSkgfHwgY29udGV4dCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoIGkgPSAwOyAoZWxlbSA9IGVsZW1lbnRzW2ldKTsgaSsrICkge1xyXG5cdFx0XHRjYWNoZWRydW5zID0gbWF0Y2hlci5ydW5zKys7XHJcblx0XHRcdGlmICggbWF0Y2hlcihlbGVtKSApIHtcclxuXHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHJlc3VsdHM7XHJcbn1cclxuXHJcbmlmICggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApIHtcclxuXHQoZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgZGlzY29ubmVjdGVkTWF0Y2gsXHJcblx0XHRcdG9sZFNlbGVjdCA9IHNlbGVjdCxcclxuXHRcdFx0cmVzY2FwZSA9IC8nfFxcXFwvZyxcclxuXHRcdFx0cmF0dHJpYnV0ZVF1b3RlcyA9IC9cXD1bXFx4MjBcXHRcXHJcXG5cXGZdKihbXidcIlxcXV0qKVtcXHgyMFxcdFxcclxcblxcZl0qXFxdL2csXHJcblx0XHRcdHJidWdneVFTQSA9IFtdLFxyXG5cdFx0XHQvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KVxyXG5cdFx0XHQvLyBBIHN1cHBvcnQgdGVzdCB3b3VsZCByZXF1aXJlIHRvbyBtdWNoIGNvZGUgKHdvdWxkIGluY2x1ZGUgZG9jdW1lbnQgcmVhZHkpXHJcblx0XHRcdC8vIGp1c3Qgc2tpcCBtYXRjaGVzU2VsZWN0b3IgZm9yIDphY3RpdmVcclxuXHRcdFx0cmJ1Z2d5TWF0Y2hlcyA9IFtcIjphY3RpdmVcIl0sXHJcblx0XHRcdG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXNTZWxlY3RvciB8fFxyXG5cdFx0XHRcdGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XHJcblx0XHRcdFx0ZG9jRWxlbS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcclxuXHRcdFx0XHRkb2NFbGVtLm9NYXRjaGVzU2VsZWN0b3IgfHxcclxuXHRcdFx0XHRkb2NFbGVtLm1zTWF0Y2hlc1NlbGVjdG9yO1xyXG5cclxuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxyXG5cdFx0Ly8gUmVnZXggc3RyYXRlZ3kgYWRvcHRlZCBmcm9tIERpZWdvIFBlcmluaVxyXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XHJcblx0XHRcdC8vIFNlbGVjdCBpcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9uIHB1cnBvc2VcclxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWN0bHlcclxuXHRcdFx0Ly8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsXHJcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXHJcblx0XHRcdC8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzU5XHJcblx0XHRcdGRpdi5pbm5lckhUTUwgPSBcIjxzZWxlY3Q+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD5cIjtcclxuXHJcblx0XHRcdC8vIElFOCAtIFNvbWUgYm9vbGVhbiBhdHRyaWJ1dGVzIGFyZSBub3QgdHJlYXRlZCBjb3JyZWN0bHlcclxuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbc2VsZWN0ZWRdXCIpLmxlbmd0aCApIHtcclxuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKig/OmNoZWNrZWR8ZGlzYWJsZWR8aXNtYXB8bXVsdGlwbGV8cmVhZG9ubHl8c2VsZWN0ZWR8dmFsdWUpXCIgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gV2Via2l0L09wZXJhIC0gOmNoZWNrZWQgc2hvdWxkIHJldHVybiBzZWxlY3RlZCBvcHRpb24gZWxlbWVudHNcclxuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcclxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIChkbyBub3QgcHV0IHRlc3RzIGFmdGVyIHRoaXMgb25lKVxyXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbChcIjpjaGVja2VkXCIpLmxlbmd0aCApIHtcclxuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIjpjaGVja2VkXCIpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcclxuXHJcblx0XHRcdC8vIE9wZXJhIDEwLTEyL0lFOSAtIF49ICQ9ICo9IGFuZCBlbXB0eSB2YWx1ZXNcclxuXHRcdFx0Ly8gU2hvdWxkIG5vdCBzZWxlY3QgYW55dGhpbmdcclxuXHRcdFx0ZGl2LmlubmVySFRNTCA9IFwiPHAgdGVzdD0nJz48L3A+XCI7XHJcblx0XHRcdGlmICggZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbdGVzdF49JyddXCIpLmxlbmd0aCApIHtcclxuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJbKl4kXT1cIiArIHdoaXRlc3BhY2UgKyBcIiooPzpcXFwiXFxcInwnJylcIiApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKVxyXG5cdFx0XHQvLyBJRTggdGhyb3dzIGVycm9yIGhlcmUgKGRvIG5vdCBwdXQgdGVzdHMgYWZ0ZXIgdGhpcyBvbmUpXHJcblx0XHRcdGRpdi5pbm5lckhUTUwgPSBcIjxpbnB1dCB0eXBlPSdoaWRkZW4nLz5cIjtcclxuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCI6ZW5hYmxlZFwiKS5sZW5ndGggKSB7XHJcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCI6ZW5hYmxlZFwiLCBcIjpkaXNhYmxlZFwiKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0cmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbihcInxcIikgKTtcclxuXHJcblx0XHRzZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQsIHhtbCApIHtcclxuXHRcdFx0Ly8gT25seSB1c2UgcXVlcnlTZWxlY3RvckFsbCB3aGVuIG5vdCBmaWx0ZXJpbmcsXHJcblx0XHRcdC8vIHdoZW4gdGhpcyBpcyBub3QgeG1sLFxyXG5cdFx0XHQvLyBhbmQgd2hlbiBubyBRU0EgYnVncyBhcHBseVxyXG5cdFx0XHRpZiAoICFzZWVkICYmICF4bWwgJiYgKCFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBzZWxlY3RvciApKSApIHtcclxuXHRcdFx0XHRpZiAoIGNvbnRleHQubm9kZVR5cGUgPT09IDkgKSB7XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzbGljZS5jYWxsKGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggc2VsZWN0b3IgKSwgMCkgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XHJcblx0XHRcdFx0XHR9IGNhdGNoKHFzYUVycm9yKSB7fVxyXG5cdFx0XHRcdC8vIHFTQSB3b3JrcyBzdHJhbmdlbHkgb24gRWxlbWVudC1yb290ZWQgcXVlcmllc1xyXG5cdFx0XHRcdC8vIFdlIGNhbiB3b3JrIGFyb3VuZCB0aGlzIGJ5IHNwZWNpZnlpbmcgYW4gZXh0cmEgSUQgb24gdGhlIHJvb3RcclxuXHRcdFx0XHQvLyBhbmQgd29ya2luZyB1cCBmcm9tIHRoZXJlIChUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhlIHRlY2huaXF1ZSlcclxuXHRcdFx0XHQvLyBJRSA4IGRvZXNuJ3Qgd29yayBvbiBvYmplY3QgZWxlbWVudHNcclxuXHRcdFx0XHR9IGVsc2UgaWYgKCBjb250ZXh0Lm5vZGVUeXBlID09PSAxICYmIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJvYmplY3RcIiApIHtcclxuXHRcdFx0XHRcdHZhciBncm91cHMsIGksIGxlbixcclxuXHRcdFx0XHRcdFx0b2xkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoXCJpZFwiKSxcclxuXHRcdFx0XHRcdFx0bmlkID0gb2xkIHx8IGV4cGFuZG8sXHJcblx0XHRcdFx0XHRcdG5ld0NvbnRleHQgPSByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIGNvbnRleHQucGFyZW50Tm9kZSB8fCBjb250ZXh0O1xyXG5cclxuXHRcdFx0XHRcdGlmICggb2xkICkge1xyXG5cdFx0XHRcdFx0XHRuaWQgPSBuaWQucmVwbGFjZSggcmVzY2FwZSwgXCJcXFxcJCZcIiApO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgbmlkICk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Z3JvdXBzID0gdG9rZW5pemUoc2VsZWN0b3IsIGNvbnRleHQsIHhtbCk7XHJcblx0XHRcdFx0XHQvLyBUcmFpbGluZyBzcGFjZSBpcyB1bm5lY2Vzc2FyeVxyXG5cdFx0XHRcdFx0Ly8gVGhlcmUgaXMgYWx3YXlzIGEgY29udGV4dCBjaGVja1xyXG5cdFx0XHRcdFx0bmlkID0gXCJbaWQ9J1wiICsgbmlkICsgXCInXVwiO1xyXG5cdFx0XHRcdFx0Zm9yICggaSA9IDAsIGxlbiA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsZW47IGkrKyApIHtcclxuXHRcdFx0XHRcdFx0Z3JvdXBzW2ldID0gbmlkICsgZ3JvdXBzW2ldLnNlbGVjdG9yO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2xpY2UuY2FsbCggbmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKFxyXG5cdFx0XHRcdFx0XHRcdGdyb3Vwcy5qb2luKFwiLFwiKVxyXG5cdFx0XHRcdFx0XHQpLCAwICkgKTtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XHJcblx0XHRcdFx0XHR9IGNhdGNoKHFzYUVycm9yKSB7XHJcblx0XHRcdFx0XHR9IGZpbmFsbHkge1xyXG5cdFx0XHRcdFx0XHRpZiAoICFvbGQgKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoXCJpZFwiKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIG9sZFNlbGVjdCggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQsIHhtbCApO1xyXG5cdFx0fTtcclxuXHJcblx0XHRpZiAoIG1hdGNoZXMgKSB7XHJcblx0XHRcdGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xyXG5cdFx0XHRcdC8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvclxyXG5cdFx0XHRcdC8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkpXHJcblx0XHRcdFx0ZGlzY29ubmVjdGVkTWF0Y2ggPSBtYXRjaGVzLmNhbGwoIGRpdiwgXCJkaXZcIiApO1xyXG5cclxuXHRcdFx0XHQvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uXHJcblx0XHRcdFx0Ly8gR2Vja28gZG9lcyBub3QgZXJyb3IsIHJldHVybnMgZmFsc2UgaW5zdGVhZFxyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRtYXRjaGVzLmNhbGwoIGRpdiwgXCJbdGVzdCE9JyddOnNpenpsZVwiICk7XHJcblx0XHRcdFx0XHRyYnVnZ3lNYXRjaGVzLnB1c2goIG1hdGNoRXhwcltcIlBTRVVET1wiXS5zb3VyY2UsIG1hdGNoRXhwcltcIlBPU1wiXS5zb3VyY2UsIFwiIT1cIiApO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge31cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyByYnVnZ3lNYXRjaGVzIGFsd2F5cyBjb250YWlucyA6YWN0aXZlLCBzbyBubyBuZWVkIGZvciBhIGxlbmd0aCBjaGVja1xyXG5cdFx0XHRyYnVnZ3lNYXRjaGVzID0gLyogcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgKi8gbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKFwifFwiKSApO1xyXG5cclxuXHRcdFx0U2l6emxlLm1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKCBlbGVtLCBleHByICkge1xyXG5cdFx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IGF0dHJpYnV0ZSBzZWxlY3RvcnMgYXJlIHF1b3RlZFxyXG5cdFx0XHRcdGV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsIFwiPSckMSddXCIgKTtcclxuXHJcblx0XHRcdFx0Ly8gcmJ1Z2d5TWF0Y2hlcyBhbHdheXMgY29udGFpbnMgOmFjdGl2ZSwgc28gbm8gbmVlZCBmb3IgYW4gZXhpc3RlbmNlIGNoZWNrXHJcblx0XHRcdFx0aWYgKCAhaXNYTUwoIGVsZW0gKSAmJiAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgJiYgKCFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkpICkge1xyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0dmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xyXG5cdFx0XHRcdFx0XHRpZiAoIHJldCB8fCBkaXNjb25uZWN0ZWRNYXRjaCB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnRcclxuXHRcdFx0XHRcdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcclxuXHRcdFx0XHRcdFx0XHRcdGVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJldDtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBjYXRjaChlKSB7fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdH0pKCk7XHJcbn1cclxuXHJcbi8vIERlcHJlY2F0ZWRcclxuRXhwci5zZXRGaWx0ZXJzW1wibnRoXCJdID0gRXhwci5zZXRGaWx0ZXJzW1wiZXFcIl07XHJcblxyXG4vLyBCYWNrLWNvbXBhdFxyXG5FeHByLmZpbHRlcnMgPSBFeHByLnBzZXVkb3M7XHJcblxyXG4vLyBPdmVycmlkZSBzaXp6bGUgYXR0cmlidXRlIHJldHJpZXZhbFxyXG5TaXp6bGUuYXR0ciA9IGpRdWVyeS5hdHRyO1xyXG5qUXVlcnkuZmluZCA9IFNpenpsZTtcclxualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xyXG5qUXVlcnkuZXhwcltcIjpcIl0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zO1xyXG5qUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7XHJcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XHJcbmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDtcclxualF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zO1xyXG5cclxuXHJcbn0pKCB3aW5kb3cgKTtcclxudmFyIHJ1bnRpbCA9IC9VbnRpbCQvLFxyXG5cdHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFxyXG5cdGlzU2ltcGxlID0gL14uW146I1xcW1xcLixdKiQvLFxyXG5cdHJuZWVkc0NvbnRleHQgPSBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQsXHJcblx0Ly8gbWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXRcclxuXHRndWFyYW50ZWVkVW5pcXVlID0ge1xyXG5cdFx0Y2hpbGRyZW46IHRydWUsXHJcblx0XHRjb250ZW50czogdHJ1ZSxcclxuXHRcdG5leHQ6IHRydWUsXHJcblx0XHRwcmV2OiB0cnVlXHJcblx0fTtcclxuXHJcbmpRdWVyeS5mbi5leHRlbmQoe1xyXG5cdGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcclxuXHRcdHZhciBpLCBsLCBsZW5ndGgsIG4sIHIsIHJldCxcclxuXHRcdFx0c2VsZiA9IHRoaXM7XHJcblxyXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XHJcblx0XHRcdHJldHVybiBqUXVlcnkoIHNlbGVjdG9yICkuZmlsdGVyKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gc2VsZi5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XHJcblx0XHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0ID0gdGhpcy5wdXNoU3RhY2soIFwiXCIsIFwiZmluZFwiLCBzZWxlY3RvciApO1xyXG5cclxuXHRcdGZvciAoIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XHJcblx0XHRcdGxlbmd0aCA9IHJldC5sZW5ndGg7XHJcblx0XHRcdGpRdWVyeS5maW5kKCBzZWxlY3RvciwgdGhpc1tpXSwgcmV0ICk7XHJcblxyXG5cdFx0XHRpZiAoIGkgPiAwICkge1xyXG5cdFx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHRzIGFyZSB1bmlxdWVcclxuXHRcdFx0XHRmb3IgKCBuID0gbGVuZ3RoOyBuIDwgcmV0Lmxlbmd0aDsgbisrICkge1xyXG5cdFx0XHRcdFx0Zm9yICggciA9IDA7IHIgPCBsZW5ndGg7IHIrKyApIHtcclxuXHRcdFx0XHRcdFx0aWYgKCByZXRbcl0gPT09IHJldFtuXSApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXQuc3BsaWNlKG4tLSwgMSk7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmV0O1xyXG5cdH0sXHJcblxyXG5cdGhhczogZnVuY3Rpb24oIHRhcmdldCApIHtcclxuXHRcdHZhciBpLFxyXG5cdFx0XHR0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSxcclxuXHRcdFx0bGVuID0gdGFyZ2V0cy5sZW5ndGg7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xyXG5cdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzW2ldICkgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH0sXHJcblxyXG5cdG5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xyXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3codGhpcywgc2VsZWN0b3IsIGZhbHNlKSwgXCJub3RcIiwgc2VsZWN0b3IpO1xyXG5cdH0sXHJcblxyXG5cdGZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xyXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3codGhpcywgc2VsZWN0b3IsIHRydWUpLCBcImZpbHRlclwiLCBzZWxlY3RvciApO1xyXG5cdH0sXHJcblxyXG5cdGlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XHJcblx0XHRyZXR1cm4gISFzZWxlY3RvciAmJiAoXHJcblx0XHRcdHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiA/XHJcblx0XHRcdFx0Ly8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldFxyXG5cdFx0XHRcdC8vIHNvICQoXCJwOmZpcnN0XCIpLmlzKFwicDpsYXN0XCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3byBcInBcIi5cclxuXHRcdFx0XHRybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgP1xyXG5cdFx0XHRcdFx0alF1ZXJ5KCBzZWxlY3RvciwgdGhpcy5jb250ZXh0ICkuaW5kZXgoIHRoaXNbMF0gKSA+PSAwIDpcclxuXHRcdFx0XHRcdGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCB0aGlzICkubGVuZ3RoID4gMCA6XHJcblx0XHRcdFx0dGhpcy5maWx0ZXIoIHNlbGVjdG9yICkubGVuZ3RoID4gMCApO1xyXG5cdH0sXHJcblxyXG5cdGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7XHJcblx0XHR2YXIgY3VyLFxyXG5cdFx0XHRpID0gMCxcclxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxyXG5cdFx0XHRyZXQgPSBbXSxcclxuXHRcdFx0cG9zID0gcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSB8fCB0eXBlb2Ygc2VsZWN0b3JzICE9PSBcInN0cmluZ1wiID9cclxuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9ycywgY29udGV4dCB8fCB0aGlzLmNvbnRleHQgKSA6XHJcblx0XHRcdFx0MDtcclxuXHJcblx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XHJcblx0XHRcdGN1ciA9IHRoaXNbaV07XHJcblxyXG5cdFx0XHR3aGlsZSAoIGN1ciAmJiBjdXIub3duZXJEb2N1bWVudCAmJiBjdXIgIT09IGNvbnRleHQgJiYgY3VyLm5vZGVUeXBlICE9PSAxMSApIHtcclxuXHRcdFx0XHRpZiAoIHBvcyA/IHBvcy5pbmRleChjdXIpID4gLTEgOiBqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoY3VyLCBzZWxlY3RvcnMpICkge1xyXG5cdFx0XHRcdFx0cmV0LnB1c2goIGN1ciApO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGN1ciA9IGN1ci5wYXJlbnROb2RlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0ID0gcmV0Lmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldDtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgXCJjbG9zZXN0XCIsIHNlbGVjdG9ycyApO1xyXG5cdH0sXHJcblxyXG5cdC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW5cclxuXHQvLyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHNcclxuXHRpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblxyXG5cdFx0Ly8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnRcclxuXHRcdGlmICggIWVsZW0gKSB7XHJcblx0XHRcdHJldHVybiAoIHRoaXNbMF0gJiYgdGhpc1swXS5wYXJlbnROb2RlICkgPyB0aGlzLnByZXZBbGwoKS5sZW5ndGggOiAtMTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBpbmRleCBpbiBzZWxlY3RvclxyXG5cdFx0aWYgKCB0eXBlb2YgZWxlbSA9PT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0cmV0dXJuIGpRdWVyeS5pbkFycmF5KCB0aGlzWzBdLCBqUXVlcnkoIGVsZW0gKSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudFxyXG5cdFx0cmV0dXJuIGpRdWVyeS5pbkFycmF5KFxyXG5cdFx0XHQvLyBJZiBpdCByZWNlaXZlcyBhIGpRdWVyeSBvYmplY3QsIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVzZWRcclxuXHRcdFx0ZWxlbS5qcXVlcnkgPyBlbGVtWzBdIDogZWxlbSwgdGhpcyApO1xyXG5cdH0sXHJcblxyXG5cdGFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xyXG5cdFx0dmFyIHNldCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiA/XHJcblx0XHRcdFx0alF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIDpcclxuXHRcdFx0XHRqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciAmJiBzZWxlY3Rvci5ub2RlVHlwZSA/IFsgc2VsZWN0b3IgXSA6IHNlbGVjdG9yICksXHJcblx0XHRcdGFsbCA9IGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgc2V0ICk7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBpc0Rpc2Nvbm5lY3RlZCggc2V0WzBdICkgfHwgaXNEaXNjb25uZWN0ZWQoIGFsbFswXSApID9cclxuXHRcdFx0YWxsIDpcclxuXHRcdFx0alF1ZXJ5LnVuaXF1ZSggYWxsICkgKTtcclxuXHR9LFxyXG5cclxuXHRhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgP1xyXG5cdFx0XHR0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKHNlbGVjdG9yKVxyXG5cdFx0KTtcclxuXHR9XHJcbn0pO1xyXG5cclxualF1ZXJ5LmZuLmFuZFNlbGYgPSBqUXVlcnkuZm4uYWRkQmFjaztcclxuXHJcbi8vIEEgcGFpbmZ1bGx5IHNpbXBsZSBjaGVjayB0byBzZWUgaWYgYW4gZWxlbWVudCBpcyBkaXNjb25uZWN0ZWRcclxuLy8gZnJvbSBhIGRvY3VtZW50IChzaG91bGQgYmUgaW1wcm92ZWQsIHdoZXJlIGZlYXNpYmxlKS5cclxuZnVuY3Rpb24gaXNEaXNjb25uZWN0ZWQoIG5vZGUgKSB7XHJcblx0cmV0dXJuICFub2RlIHx8ICFub2RlLnBhcmVudE5vZGUgfHwgbm9kZS5wYXJlbnROb2RlLm5vZGVUeXBlID09PSAxMTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7XHJcblx0ZG8ge1xyXG5cdFx0Y3VyID0gY3VyWyBkaXIgXTtcclxuXHR9IHdoaWxlICggY3VyICYmIGN1ci5ub2RlVHlwZSAhPT0gMSApO1xyXG5cclxuXHRyZXR1cm4gY3VyO1xyXG59XHJcblxyXG5qUXVlcnkuZWFjaCh7XHJcblx0cGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XHJcblx0XHRyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsO1xyXG5cdH0sXHJcblx0cGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIgKTtcclxuXHR9LFxyXG5cdHBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiLCB1bnRpbCApO1xyXG5cdH0sXHJcblx0bmV4dDogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XHJcblx0fSxcclxuXHRwcmV2OiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XHJcblx0fSxcclxuXHRuZXh0QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdHJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcclxuXHR9LFxyXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcclxuXHR9LFxyXG5cdG5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiwgdW50aWwgKTtcclxuXHR9LFxyXG5cdHByZXZVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIsIHVudGlsICk7XHJcblx0fSxcclxuXHRzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LnNpYmxpbmcoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApO1xyXG5cdH0sXHJcblx0Y2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTtcclxuXHR9LFxyXG5cdGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdHJldHVybiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sIFwiaWZyYW1lXCIgKSA/XHJcblx0XHRcdGVsZW0uY29udGVudERvY3VtZW50IHx8IGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudCA6XHJcblx0XHRcdGpRdWVyeS5tZXJnZSggW10sIGVsZW0uY2hpbGROb2RlcyApO1xyXG5cdH1cclxufSwgZnVuY3Rpb24oIG5hbWUsIGZuICkge1xyXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHtcclxuXHRcdHZhciByZXQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTtcclxuXHJcblx0XHRpZiAoICFydW50aWwudGVzdCggbmFtZSApICkge1xyXG5cdFx0XHRzZWxlY3RvciA9IHVudGlsO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xyXG5cdFx0XHRyZXQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgcmV0ICk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0ID0gdGhpcy5sZW5ndGggPiAxICYmICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gPyBqUXVlcnkudW5pcXVlKCByZXQgKSA6IHJldDtcclxuXHJcblx0XHRpZiAoIHRoaXMubGVuZ3RoID4gMSAmJiBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkge1xyXG5cdFx0XHRyZXQgPSByZXQucmV2ZXJzZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0LCBuYW1lLCBjb3JlX3NsaWNlLmNhbGwoIGFyZ3VtZW50cyApLmpvaW4oXCIsXCIpICk7XHJcblx0fTtcclxufSk7XHJcblxyXG5qUXVlcnkuZXh0ZW5kKHtcclxuXHRmaWx0ZXI6IGZ1bmN0aW9uKCBleHByLCBlbGVtcywgbm90ICkge1xyXG5cdFx0aWYgKCBub3QgKSB7XHJcblx0XHRcdGV4cHIgPSBcIjpub3QoXCIgKyBleHByICsgXCIpXCI7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGVsZW1zLmxlbmd0aCA9PT0gMSA/XHJcblx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihlbGVtc1swXSwgZXhwcikgPyBbIGVsZW1zWzBdIF0gOiBbXSA6XHJcblx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXMoZXhwciwgZWxlbXMpO1xyXG5cdH0sXHJcblxyXG5cdGRpcjogZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7XHJcblx0XHR2YXIgbWF0Y2hlZCA9IFtdLFxyXG5cdFx0XHRjdXIgPSBlbGVtWyBkaXIgXTtcclxuXHJcblx0XHR3aGlsZSAoIGN1ciAmJiBjdXIubm9kZVR5cGUgIT09IDkgJiYgKHVudGlsID09PSB1bmRlZmluZWQgfHwgY3VyLm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkoIGN1ciApLmlzKCB1bnRpbCApKSApIHtcclxuXHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPT09IDEgKSB7XHJcblx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBjdXIgKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjdXIgPSBjdXJbZGlyXTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBtYXRjaGVkO1xyXG5cdH0sXHJcblxyXG5cdHNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkge1xyXG5cdFx0dmFyIHIgPSBbXTtcclxuXHJcblx0XHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xyXG5cdFx0XHRpZiAoIG4ubm9kZVR5cGUgPT09IDEgJiYgbiAhPT0gZWxlbSApIHtcclxuXHRcdFx0XHRyLnB1c2goIG4gKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByO1xyXG5cdH1cclxufSk7XHJcblxyXG4vLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdFxyXG5mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIGtlZXAgKSB7XHJcblxyXG5cdC8vIENhbid0IHBhc3MgbnVsbCBvciB1bmRlZmluZWQgdG8gaW5kZXhPZiBpbiBGaXJlZm94IDRcclxuXHQvLyBTZXQgdG8gMCB0byBza2lwIHN0cmluZyBjaGVja1xyXG5cdHF1YWxpZmllciA9IHF1YWxpZmllciB8fCAwO1xyXG5cclxuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHtcclxuXHRcdHJldHVybiBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XHJcblx0XHRcdHZhciByZXRWYWwgPSAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICk7XHJcblx0XHRcdHJldHVybiByZXRWYWwgPT09IGtlZXA7XHJcblx0XHR9KTtcclxuXHJcblx0fSBlbHNlIGlmICggcXVhbGlmaWVyLm5vZGVUeXBlICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcclxuXHRcdFx0cmV0dXJuICggZWxlbSA9PT0gcXVhbGlmaWVyICkgPT09IGtlZXA7XHJcblx0XHR9KTtcclxuXHJcblx0fSBlbHNlIGlmICggdHlwZW9mIHF1YWxpZmllciA9PT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdHZhciBmaWx0ZXJlZCA9IGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7XHJcblx0XHR9KTtcclxuXHJcblx0XHRpZiAoIGlzU2ltcGxlLnRlc3QoIHF1YWxpZmllciApICkge1xyXG5cdFx0XHRyZXR1cm4galF1ZXJ5LmZpbHRlcihxdWFsaWZpZXIsIGZpbHRlcmVkLCAha2VlcCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRxdWFsaWZpZXIgPSBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGZpbHRlcmVkICk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4galF1ZXJ5LmdyZXAoZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xyXG5cdFx0cmV0dXJuICggalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHF1YWxpZmllciApID49IDAgKSA9PT0ga2VlcDtcclxuXHR9KTtcclxufVxyXG5mdW5jdGlvbiBjcmVhdGVTYWZlRnJhZ21lbnQoIGRvY3VtZW50ICkge1xyXG5cdHZhciBsaXN0ID0gbm9kZU5hbWVzLnNwbGl0KCBcInxcIiApLFxyXG5cdHNhZmVGcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xyXG5cclxuXHRpZiAoIHNhZmVGcmFnLmNyZWF0ZUVsZW1lbnQgKSB7XHJcblx0XHR3aGlsZSAoIGxpc3QubGVuZ3RoICkge1xyXG5cdFx0XHRzYWZlRnJhZy5jcmVhdGVFbGVtZW50KFxyXG5cdFx0XHRcdGxpc3QucG9wKClcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIHNhZmVGcmFnO1xyXG59XHJcblxyXG52YXIgbm9kZU5hbWVzID0gXCJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98YmRpfGNhbnZhc3xkYXRhfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfFwiICtcclxuXHRcdFwiaGVhZGVyfGhncm91cHxtYXJrfG1ldGVyfG5hdnxvdXRwdXR8cHJvZ3Jlc3N8c2VjdGlvbnxzdW1tYXJ5fHRpbWV8dmlkZW9cIixcclxuXHRyaW5saW5lalF1ZXJ5ID0gLyBqUXVlcnlcXGQrPVwiKD86bnVsbHxcXGQrKVwiL2csXHJcblx0cmxlYWRpbmdXaGl0ZXNwYWNlID0gL15cXHMrLyxcclxuXHRyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXFx3Ol0rKVtePl0qKVxcLz4vZ2ksXHJcblx0cnRhZ05hbWUgPSAvPChbXFx3Ol0rKS8sXHJcblx0cnRib2R5ID0gLzx0Ym9keS9pLFxyXG5cdHJodG1sID0gLzx8JiM/XFx3KzsvLFxyXG5cdHJub0lubmVyaHRtbCA9IC88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksXHJcblx0cm5vY2FjaGUgPSAvPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLFxyXG5cdHJub3NoaW1jYWNoZSA9IG5ldyBSZWdFeHAoXCI8KD86XCIgKyBub2RlTmFtZXMgKyBcIilbXFxcXHMvPl1cIiwgXCJpXCIpLFxyXG5cdHJjaGVja2FibGVUeXBlID0gL14oPzpjaGVja2JveHxyYWRpbykkLyxcclxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcclxuXHRyY2hlY2tlZCA9IC9jaGVja2VkXFxzKig/OltePV18PVxccyouY2hlY2tlZC4pL2ksXHJcblx0cnNjcmlwdFR5cGUgPSAvXFwvKGphdmF8ZWNtYSlzY3JpcHQvaSxcclxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfFxcLVxcLSl8W1xcXVxcLV17Mn0+XFxzKiQvZyxcclxuXHR3cmFwTWFwID0ge1xyXG5cdFx0b3B0aW9uOiBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF0sXHJcblx0XHRsZWdlbmQ6IFsgMSwgXCI8ZmllbGRzZXQ+XCIsIFwiPC9maWVsZHNldD5cIiBdLFxyXG5cdFx0dGhlYWQ6IFsgMSwgXCI8dGFibGU+XCIsIFwiPC90YWJsZT5cIiBdLFxyXG5cdFx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxyXG5cdFx0dGQ6IFsgMywgXCI8dGFibGU+PHRib2R5Pjx0cj5cIiwgXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIiBdLFxyXG5cdFx0Y29sOiBbIDIsIFwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcclxuXHRcdGFyZWE6IFsgMSwgXCI8bWFwPlwiLCBcIjwvbWFwPlwiIF0sXHJcblx0XHRfZGVmYXVsdDogWyAwLCBcIlwiLCBcIlwiIF1cclxuXHR9LFxyXG5cdHNhZmVGcmFnbWVudCA9IGNyZWF0ZVNhZmVGcmFnbWVudCggZG9jdW1lbnQgKSxcclxuXHRmcmFnbWVudERpdiA9IHNhZmVGcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSApO1xyXG5cclxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xyXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xyXG53cmFwTWFwLnRoID0gd3JhcE1hcC50ZDtcclxuXHJcbi8vIElFNi04IGNhbid0IHNlcmlhbGl6ZSBsaW5rLCBzY3JpcHQsIHN0eWxlLCBvciBhbnkgaHRtbDUgKE5vU2NvcGUpIHRhZ3MsXHJcbi8vIHVubGVzcyB3cmFwcGVkIGluIGEgZGl2IHdpdGggbm9uLWJyZWFraW5nIGNoYXJhY3RlcnMgaW4gZnJvbnQgb2YgaXQuXHJcbmlmICggIWpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgKSB7XHJcblx0d3JhcE1hcC5fZGVmYXVsdCA9IFsgMSwgXCJYPGRpdj5cIiwgXCI8L2Rpdj5cIiBdO1xyXG59XHJcblxyXG5qUXVlcnkuZm4uZXh0ZW5kKHtcclxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xyXG5cdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XHJcblx0XHRcdFx0alF1ZXJ5LnRleHQoIHRoaXMgKSA6XHJcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggKCB0aGlzWzBdICYmIHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApLmNyZWF0ZVRleHROb2RlKCB2YWx1ZSApICk7XHJcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xyXG5cdH0sXHJcblxyXG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xyXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggaHRtbCApICkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHtcclxuXHRcdFx0XHRqUXVlcnkodGhpcykud3JhcEFsbCggaHRtbC5jYWxsKHRoaXMsIGkpICk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggdGhpc1swXSApIHtcclxuXHRcdFx0Ly8gVGhlIGVsZW1lbnRzIHRvIHdyYXAgdGhlIHRhcmdldCBhcm91bmRcclxuXHRcdFx0dmFyIHdyYXAgPSBqUXVlcnkoIGh0bWwsIHRoaXNbMF0ub3duZXJEb2N1bWVudCApLmVxKDApLmNsb25lKHRydWUpO1xyXG5cclxuXHRcdFx0aWYgKCB0aGlzWzBdLnBhcmVudE5vZGUgKSB7XHJcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbMF0gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0d3JhcC5tYXAoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0dmFyIGVsZW0gPSB0aGlzO1xyXG5cclxuXHRcdFx0XHR3aGlsZSAoIGVsZW0uZmlyc3RDaGlsZCAmJiBlbGVtLmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDEgKSB7XHJcblx0XHRcdFx0XHRlbGVtID0gZWxlbS5maXJzdENoaWxkO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIGVsZW07XHJcblx0XHRcdH0pLmFwcGVuZCggdGhpcyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH0sXHJcblxyXG5cdHdyYXBJbm5lcjogZnVuY3Rpb24oIGh0bWwgKSB7XHJcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkge1xyXG5cdFx0XHRcdGpRdWVyeSh0aGlzKS53cmFwSW5uZXIoIGh0bWwuY2FsbCh0aGlzLCBpKSApO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLFxyXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xyXG5cclxuXHRcdFx0aWYgKCBjb250ZW50cy5sZW5ndGggKSB7XHJcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cclxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcclxuXHRcdHZhciBpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHtcclxuXHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaXNGdW5jdGlvbiA/IGh0bWwuY2FsbCh0aGlzLCBpKSA6IGh0bWwgKTtcclxuXHRcdH0pO1xyXG5cdH0sXHJcblxyXG5cdHVud3JhcDogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRpZiAoICFqUXVlcnkubm9kZU5hbWUoIHRoaXMsIFwiYm9keVwiICkgKSB7XHJcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApO1xyXG5cdFx0XHR9XHJcblx0XHR9KS5lbmQoKTtcclxuXHR9LFxyXG5cclxuXHRhcHBlbmQ6IGZ1bmN0aW9uKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExICkge1xyXG5cdFx0XHRcdHRoaXMuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fSxcclxuXHJcblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgKSB7XHJcblx0XHRcdFx0dGhpcy5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMuZmlyc3RDaGlsZCApO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9LFxyXG5cclxuXHRiZWZvcmU6IGZ1bmN0aW9uKCkge1xyXG5cdFx0aWYgKCAhaXNEaXNjb25uZWN0ZWQoIHRoaXNbMF0gKSApIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XHJcblx0XHRcdHZhciBzZXQgPSBqUXVlcnkuY2xlYW4oIGFyZ3VtZW50cyApO1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tZXJnZSggc2V0LCB0aGlzICksIFwiYmVmb3JlXCIsIHRoaXMuc2VsZWN0b3IgKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XHJcblx0XHRpZiAoICFpc0Rpc2Nvbm5lY3RlZCggdGhpc1swXSApICkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIGZhbHNlLCBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCApIHtcclxuXHRcdFx0dmFyIHNldCA9IGpRdWVyeS5jbGVhbiggYXJndW1lbnRzICk7XHJcblx0XHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1lcmdlKCB0aGlzLCBzZXQgKSwgXCJhZnRlclwiLCB0aGlzLnNlbGVjdG9yICk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly8ga2VlcERhdGEgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LS1kbyBub3QgZG9jdW1lbnRcclxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBzZWxlY3Rvciwga2VlcERhdGEgKSB7XHJcblx0XHR2YXIgZWxlbSxcclxuXHRcdFx0aSA9IDA7XHJcblxyXG5cdFx0Zm9yICggOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHtcclxuXHRcdFx0aWYgKCAhc2VsZWN0b3IgfHwgalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIFsgZWxlbSBdICkubGVuZ3RoICkge1xyXG5cdFx0XHRcdGlmICggIWtlZXBEYXRhICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XHJcblx0XHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSApO1xyXG5cdFx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggWyBlbGVtIF0gKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICkge1xyXG5cdFx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fSxcclxuXHJcblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIGVsZW0sXHJcblx0XHRcdGkgPSAwO1xyXG5cclxuXHRcdGZvciAoIDsgKGVsZW0gPSB0aGlzW2ldKSAhPSBudWxsOyBpKysgKSB7XHJcblx0XHRcdC8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrc1xyXG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XHJcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXNcclxuXHRcdFx0d2hpbGUgKCBlbGVtLmZpcnN0Q2hpbGQgKSB7XHJcblx0XHRcdFx0ZWxlbS5yZW1vdmVDaGlsZCggZWxlbS5maXJzdENoaWxkICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cclxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xyXG5cdFx0ZGF0YUFuZEV2ZW50cyA9IGRhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGZhbHNlIDogZGF0YUFuZEV2ZW50cztcclxuXHRcdGRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50cztcclxuXHJcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0cmV0dXJuIGpRdWVyeS5jbG9uZSggdGhpcywgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKTtcclxuXHRcdH0pO1xyXG5cdH0sXHJcblxyXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcclxuXHRcdHJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XHJcblx0XHRcdHZhciBlbGVtID0gdGhpc1swXSB8fCB7fSxcclxuXHRcdFx0XHRpID0gMCxcclxuXHRcdFx0XHRsID0gdGhpcy5sZW5ndGg7XHJcblxyXG5cdFx0XHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgP1xyXG5cdFx0XHRcdFx0ZWxlbS5pbm5lckhUTUwucmVwbGFjZSggcmlubGluZWpRdWVyeSwgXCJcIiApIDpcclxuXHRcdFx0XHRcdHVuZGVmaW5lZDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxyXG5cdFx0XHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhcm5vSW5uZXJodG1sLnRlc3QoIHZhbHVlICkgJiZcclxuXHRcdFx0XHQoIGpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgfHwgIXJub3NoaW1jYWNoZS50ZXN0KCB2YWx1ZSApICApICYmXHJcblx0XHRcdFx0KCBqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSB8fCAhcmxlYWRpbmdXaGl0ZXNwYWNlLnRlc3QoIHZhbHVlICkgKSAmJlxyXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgW1wiXCIsIFwiXCJdIClbMV0udG9Mb3dlckNhc2UoKSBdICkge1xyXG5cclxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoIHJ4aHRtbFRhZywgXCI8JDE+PC8kMj5cIiApO1xyXG5cclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0Zm9yICg7IGkgPCBsOyBpKysgKSB7XHJcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrc1xyXG5cdFx0XHRcdFx0XHRlbGVtID0gdGhpc1tpXSB8fCB7fTtcclxuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xyXG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwiKlwiICkgKTtcclxuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0ZWxlbSA9IDA7XHJcblxyXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxyXG5cdFx0XHRcdH0gY2F0Y2goZSkge31cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBlbGVtICkge1xyXG5cdFx0XHRcdHRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7XHJcblx0XHRcdH1cclxuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XHJcblx0fSxcclxuXHJcblx0cmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcclxuXHRcdGlmICggIWlzRGlzY29ubmVjdGVkKCB0aGlzWzBdICkgKSB7XHJcblx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBlbGVtZW50cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBET00gYmVmb3JlIHRoZXkgYXJlIGluc2VydGVkXHJcblx0XHRcdC8vIHRoaXMgY2FuIGhlbHAgZml4IHJlcGxhY2luZyBhIHBhcmVudCB3aXRoIGNoaWxkIGVsZW1lbnRzXHJcblx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XHJcblx0XHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7XHJcblx0XHRcdFx0XHR2YXIgc2VsZiA9IGpRdWVyeSh0aGlzKSwgb2xkID0gc2VsZi5odG1sKCk7XHJcblx0XHRcdFx0XHRzZWxmLnJlcGxhY2VXaXRoKCB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBvbGQgKSApO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeSggdmFsdWUgKS5kZXRhY2goKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcclxuXHRcdFx0XHR2YXIgbmV4dCA9IHRoaXMubmV4dFNpYmxpbmcsXHJcblx0XHRcdFx0XHRwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XHJcblxyXG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnJlbW92ZSgpO1xyXG5cclxuXHRcdFx0XHRpZiAoIG5leHQgKSB7XHJcblx0XHRcdFx0XHRqUXVlcnkobmV4dCkuYmVmb3JlKCB2YWx1ZSApO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRqUXVlcnkocGFyZW50KS5hcHBlbmQoIHZhbHVlICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5sZW5ndGggP1xyXG5cdFx0XHR0aGlzLnB1c2hTdGFjayggalF1ZXJ5KGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlKCkgOiB2YWx1ZSksIFwicmVwbGFjZVdpdGhcIiwgdmFsdWUgKSA6XHJcblx0XHRcdHRoaXM7XHJcblx0fSxcclxuXHJcblx0ZGV0YWNoOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5yZW1vdmUoIHNlbGVjdG9yLCB0cnVlICk7XHJcblx0fSxcclxuXHJcblx0ZG9tTWFuaXA6IGZ1bmN0aW9uKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xyXG5cdFx0YXJncyA9IFtdLmNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTtcclxuXHJcblx0XHR2YXIgcmVzdWx0cywgZmlyc3QsIGZyYWdtZW50LCBpTm9DbG9uZSxcclxuXHRcdFx0aSA9IDAsXHJcblx0XHRcdHZhbHVlID0gYXJnc1swXSxcclxuXHRcdFx0c2NyaXB0cyA9IFtdLFxyXG5cdFx0XHRsID0gdGhpcy5sZW5ndGg7XHJcblxyXG5cdFx0Ly8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0XHJcblx0XHRpZiAoICFqUXVlcnkuc3VwcG9ydC5jaGVja0Nsb25lICYmIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiByY2hlY2tlZC50ZXN0KCB2YWx1ZSApICkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGpRdWVyeSh0aGlzKS5kb21NYW5pcCggYXJncywgdGFibGUsIGNhbGxiYWNrICk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24odmFsdWUpICkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpIHtcclxuXHRcdFx0XHR2YXIgc2VsZiA9IGpRdWVyeSh0aGlzKTtcclxuXHRcdFx0XHRhcmdzWzBdID0gdmFsdWUuY2FsbCggdGhpcywgaSwgdGFibGUgPyBzZWxmLmh0bWwoKSA6IHVuZGVmaW5lZCApO1xyXG5cdFx0XHRcdHNlbGYuZG9tTWFuaXAoIGFyZ3MsIHRhYmxlLCBjYWxsYmFjayApO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIHRoaXNbMF0gKSB7XHJcblx0XHRcdHJlc3VsdHMgPSBqUXVlcnkuYnVpbGRGcmFnbWVudCggYXJncywgdGhpcywgc2NyaXB0cyApO1xyXG5cdFx0XHRmcmFnbWVudCA9IHJlc3VsdHMuZnJhZ21lbnQ7XHJcblx0XHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcclxuXHJcblx0XHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XHJcblx0XHRcdFx0ZnJhZ21lbnQgPSBmaXJzdDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBmaXJzdCApIHtcclxuXHRcdFx0XHR0YWJsZSA9IHRhYmxlICYmIGpRdWVyeS5ub2RlTmFtZSggZmlyc3QsIFwidHJcIiApO1xyXG5cclxuXHRcdFx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50IGZvciB0aGUgbGFzdCBpdGVtIGluc3RlYWQgb2YgdGhlIGZpcnN0IGJlY2F1c2UgaXQgY2FuIGVuZCB1cFxyXG5cdFx0XHRcdC8vIGJlaW5nIGVtcHRpZWQgaW5jb3JyZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRpb25zICgjODA3MCkuXHJcblx0XHRcdFx0Ly8gRnJhZ21lbnRzIGZyb20gdGhlIGZyYWdtZW50IGNhY2hlIG11c3QgYWx3YXlzIGJlIGNsb25lZCBhbmQgbmV2ZXIgdXNlZCBpbiBwbGFjZS5cclxuXHRcdFx0XHRmb3IgKCBpTm9DbG9uZSA9IHJlc3VsdHMuY2FjaGVhYmxlIHx8IGwgLSAxOyBpIDwgbDsgaSsrICkge1xyXG5cdFx0XHRcdFx0Y2FsbGJhY2suY2FsbChcclxuXHRcdFx0XHRcdFx0dGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzW2ldLCBcInRhYmxlXCIgKSA/XHJcblx0XHRcdFx0XHRcdFx0ZmluZE9yQXBwZW5kKCB0aGlzW2ldLCBcInRib2R5XCIgKSA6XHJcblx0XHRcdFx0XHRcdFx0dGhpc1tpXSxcclxuXHRcdFx0XHRcdFx0aSA9PT0gaU5vQ2xvbmUgP1xyXG5cdFx0XHRcdFx0XHRcdGZyYWdtZW50IDpcclxuXHRcdFx0XHRcdFx0XHRqUXVlcnkuY2xvbmUoIGZyYWdtZW50LCB0cnVlLCB0cnVlIClcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBGaXggIzExODA5OiBBdm9pZCBsZWFraW5nIG1lbW9yeVxyXG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0ID0gbnVsbDtcclxuXHJcblx0XHRcdGlmICggc2NyaXB0cy5sZW5ndGggKSB7XHJcblx0XHRcdFx0alF1ZXJ5LmVhY2goIHNjcmlwdHMsIGZ1bmN0aW9uKCBpLCBlbGVtICkge1xyXG5cdFx0XHRcdFx0aWYgKCBlbGVtLnNyYyApIHtcclxuXHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuYWpheCApIHtcclxuXHRcdFx0XHRcdFx0XHRqUXVlcnkuYWpheCh7XHJcblx0XHRcdFx0XHRcdFx0XHR1cmw6IGVsZW0uc3JjLFxyXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJHRVRcIixcclxuXHRcdFx0XHRcdFx0XHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0YXN5bmM6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdFx0Z2xvYmFsOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0XHRcdFwidGhyb3dzXCI6IHRydWVcclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRqUXVlcnkuZXJyb3IoXCJubyBhamF4XCIpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggKCBlbGVtLnRleHQgfHwgZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVySFRNTCB8fCBcIlwiICkucmVwbGFjZSggcmNsZWFuU2NyaXB0LCBcIlwiICkgKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gZmluZE9yQXBwZW5kKCBlbGVtLCB0YWcgKSB7XHJcblx0cmV0dXJuIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApWzBdIHx8IGVsZW0uYXBwZW5kQ2hpbGQoIGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCB0YWcgKSApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkge1xyXG5cclxuXHRpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgfHwgIWpRdWVyeS5oYXNEYXRhKCBzcmMgKSApIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdHZhciB0eXBlLCBpLCBsLFxyXG5cdFx0b2xkRGF0YSA9IGpRdWVyeS5fZGF0YSggc3JjICksXHJcblx0XHRjdXJEYXRhID0galF1ZXJ5Ll9kYXRhKCBkZXN0LCBvbGREYXRhICksXHJcblx0XHRldmVudHMgPSBvbGREYXRhLmV2ZW50cztcclxuXHJcblx0aWYgKCBldmVudHMgKSB7XHJcblx0XHRkZWxldGUgY3VyRGF0YS5oYW5kbGU7XHJcblx0XHRjdXJEYXRhLmV2ZW50cyA9IHt9O1xyXG5cclxuXHRcdGZvciAoIHR5cGUgaW4gZXZlbnRzICkge1xyXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IGV2ZW50c1sgdHlwZSBdLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcclxuXHRcdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCBkZXN0LCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaSBdICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIG1ha2UgdGhlIGNsb25lZCBwdWJsaWMgZGF0YSBvYmplY3QgYSBjb3B5IGZyb20gdGhlIG9yaWdpbmFsXHJcblx0aWYgKCBjdXJEYXRhLmRhdGEgKSB7XHJcblx0XHRjdXJEYXRhLmRhdGEgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyRGF0YS5kYXRhICk7XHJcblx0fVxyXG59XHJcblxyXG5mdW5jdGlvbiBjbG9uZUZpeEF0dHJpYnV0ZXMoIHNyYywgZGVzdCApIHtcclxuXHR2YXIgbm9kZU5hbWU7XHJcblxyXG5cdC8vIFdlIGRvIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nIGZvciBub24tRWxlbWVudHNcclxuXHRpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHQvLyBjbGVhckF0dHJpYnV0ZXMgcmVtb3ZlcyB0aGUgYXR0cmlidXRlcywgd2hpY2ggd2UgZG9uJ3Qgd2FudCxcclxuXHQvLyBidXQgYWxzbyByZW1vdmVzIHRoZSBhdHRhY2hFdmVudCBldmVudHMsIHdoaWNoIHdlICpkbyogd2FudFxyXG5cdGlmICggZGVzdC5jbGVhckF0dHJpYnV0ZXMgKSB7XHJcblx0XHRkZXN0LmNsZWFyQXR0cmlidXRlcygpO1xyXG5cdH1cclxuXHJcblx0Ly8gbWVyZ2VBdHRyaWJ1dGVzLCBpbiBjb250cmFzdCwgb25seSBtZXJnZXMgYmFjayBvbiB0aGVcclxuXHQvLyBvcmlnaW5hbCBhdHRyaWJ1dGVzLCBub3QgdGhlIGV2ZW50c1xyXG5cdGlmICggZGVzdC5tZXJnZUF0dHJpYnV0ZXMgKSB7XHJcblx0XHRkZXN0Lm1lcmdlQXR0cmlidXRlcyggc3JjICk7XHJcblx0fVxyXG5cclxuXHRub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcclxuXHJcblx0aWYgKCBub2RlTmFtZSA9PT0gXCJvYmplY3RcIiApIHtcclxuXHRcdC8vIElFNi0xMCBpbXByb3Blcmx5IGNsb25lcyBjaGlsZHJlbiBvZiBvYmplY3QgZWxlbWVudHMgdXNpbmcgY2xhc3NpZC5cclxuXHRcdC8vIElFMTAgdGhyb3dzIE5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycm9yIGlmIHBhcmVudCBpcyBudWxsLCAjMTIxMzIuXHJcblx0XHRpZiAoIGRlc3QucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0ZGVzdC5vdXRlckhUTUwgPSBzcmMub3V0ZXJIVE1MO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFRoaXMgcGF0aCBhcHBlYXJzIHVuYXZvaWRhYmxlIGZvciBJRTkuIFdoZW4gY2xvbmluZyBhbiBvYmplY3RcclxuXHRcdC8vIGVsZW1lbnQgaW4gSUU5LCB0aGUgb3V0ZXJIVE1MIHN0cmF0ZWd5IGFib3ZlIGlzIG5vdCBzdWZmaWNpZW50LlxyXG5cdFx0Ly8gSWYgdGhlIHNyYyBoYXMgaW5uZXJIVE1MIGFuZCB0aGUgZGVzdGluYXRpb24gZG9lcyBub3QsXHJcblx0XHQvLyBjb3B5IHRoZSBzcmMuaW5uZXJIVE1MIGludG8gdGhlIGRlc3QuaW5uZXJIVE1MLiAjMTAzMjRcclxuXHRcdGlmICggalF1ZXJ5LnN1cHBvcnQuaHRtbDVDbG9uZSAmJiAoc3JjLmlubmVySFRNTCAmJiAhalF1ZXJ5LnRyaW0oZGVzdC5pbm5lckhUTUwpKSApIHtcclxuXHRcdFx0ZGVzdC5pbm5lckhUTUwgPSBzcmMuaW5uZXJIVE1MO1xyXG5cdFx0fVxyXG5cclxuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIHJjaGVja2FibGVUeXBlLnRlc3QoIHNyYy50eXBlICkgKSB7XHJcblx0XHQvLyBJRTYtOCBmYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94XHJcblx0XHQvLyBvciByYWRpbyBidXR0b24uIFdvcnNlLCBJRTYtNyBmYWlsIHRvIGdpdmUgdGhlIGNsb25lZCBlbGVtZW50XHJcblx0XHQvLyBhIGNoZWNrZWQgYXBwZWFyYW5jZSBpZiB0aGUgZGVmYXVsdENoZWNrZWQgdmFsdWUgaXNuJ3QgYWxzbyBzZXRcclxuXHJcblx0XHRkZXN0LmRlZmF1bHRDaGVja2VkID0gZGVzdC5jaGVja2VkID0gc3JjLmNoZWNrZWQ7XHJcblxyXG5cdFx0Ly8gSUU2LTcgZ2V0IGNvbmZ1c2VkIGFuZCBlbmQgdXAgc2V0dGluZyB0aGUgdmFsdWUgb2YgYSBjbG9uZWRcclxuXHRcdC8vIGNoZWNrYm94L3JhZGlvIGJ1dHRvbiB0byBhbiBlbXB0eSBzdHJpbmcgaW5zdGVhZCBvZiBcIm9uXCJcclxuXHRcdGlmICggZGVzdC52YWx1ZSAhPT0gc3JjLnZhbHVlICkge1xyXG5cdFx0XHRkZXN0LnZhbHVlID0gc3JjLnZhbHVlO1xyXG5cdFx0fVxyXG5cclxuXHQvLyBJRTYtOCBmYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZFxyXG5cdC8vIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXHJcblx0fSBlbHNlIGlmICggbm9kZU5hbWUgPT09IFwib3B0aW9uXCIgKSB7XHJcblx0XHRkZXN0LnNlbGVjdGVkID0gc3JjLmRlZmF1bHRTZWxlY3RlZDtcclxuXHJcblx0Ly8gSUU2LTggZmFpbHMgdG8gc2V0IHRoZSBkZWZhdWx0VmFsdWUgdG8gdGhlIGNvcnJlY3QgdmFsdWUgd2hlblxyXG5cdC8vIGNsb25pbmcgb3RoZXIgdHlwZXMgb2YgaW5wdXQgZmllbGRzXHJcblx0fSBlbHNlIGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiB8fCBub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiICkge1xyXG5cdFx0ZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlO1xyXG5cclxuXHQvLyBJRSBibGFua3MgY29udGVudHMgd2hlbiBjbG9uaW5nIHNjcmlwdHNcclxuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJzY3JpcHRcIiAmJiBkZXN0LnRleHQgIT09IHNyYy50ZXh0ICkge1xyXG5cdFx0ZGVzdC50ZXh0ID0gc3JjLnRleHQ7XHJcblx0fVxyXG5cclxuXHQvLyBFdmVudCBkYXRhIGdldHMgcmVmZXJlbmNlZCBpbnN0ZWFkIG9mIGNvcGllZCBpZiB0aGUgZXhwYW5kb1xyXG5cdC8vIGdldHMgY29waWVkIHRvb1xyXG5cdGRlc3QucmVtb3ZlQXR0cmlidXRlKCBqUXVlcnkuZXhwYW5kbyApO1xyXG59XHJcblxyXG5qUXVlcnkuYnVpbGRGcmFnbWVudCA9IGZ1bmN0aW9uKCBhcmdzLCBjb250ZXh0LCBzY3JpcHRzICkge1xyXG5cdHZhciBmcmFnbWVudCwgY2FjaGVhYmxlLCBjYWNoZWhpdCxcclxuXHRcdGZpcnN0ID0gYXJnc1sgMCBdO1xyXG5cclxuXHQvLyBTZXQgY29udGV4dCBmcm9tIHdoYXQgbWF5IGNvbWUgaW4gYXMgdW5kZWZpbmVkIG9yIGEgalF1ZXJ5IGNvbGxlY3Rpb24gb3IgYSBub2RlXHJcblx0Ly8gVXBkYXRlZCB0byBmaXggIzEyMjY2IHdoZXJlIGFjY2Vzc2luZyBjb250ZXh0WzBdIGNvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBpbiBJRTkvMTAgJlxyXG5cdC8vIGFsc28gZG91YmxlcyBhcyBmaXggZm9yICM4OTUwIHdoZXJlIHBsYWluIG9iamVjdHMgY2F1c2VkIGNyZWF0ZURvY3VtZW50RnJhZ21lbnQgZXhjZXB0aW9uXHJcblx0Y29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7XHJcblx0Y29udGV4dCA9ICFjb250ZXh0Lm5vZGVUeXBlICYmIGNvbnRleHRbMF0gfHwgY29udGV4dDtcclxuXHRjb250ZXh0ID0gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQ7XHJcblxyXG5cdC8vIE9ubHkgY2FjaGUgXCJzbWFsbFwiICgxLzIgS0IpIEhUTUwgc3RyaW5ncyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1haW4gZG9jdW1lbnRcclxuXHQvLyBDbG9uaW5nIG9wdGlvbnMgbG9zZXMgdGhlIHNlbGVjdGVkIHN0YXRlLCBzbyBkb24ndCBjYWNoZSB0aGVtXHJcblx0Ly8gSUUgNiBkb2Vzbid0IGxpa2UgaXQgd2hlbiB5b3UgcHV0IDxvYmplY3Q+IG9yIDxlbWJlZD4gZWxlbWVudHMgaW4gYSBmcmFnbWVudFxyXG5cdC8vIEFsc28sIFdlYktpdCBkb2VzIG5vdCBjbG9uZSAnY2hlY2tlZCcgYXR0cmlidXRlcyBvbiBjbG9uZU5vZGUsIHNvIGRvbid0IGNhY2hlXHJcblx0Ly8gTGFzdGx5LCBJRTYsNyw4IHdpbGwgbm90IGNvcnJlY3RseSByZXVzZSBjYWNoZWQgZnJhZ21lbnRzIHRoYXQgd2VyZSBjcmVhdGVkIGZyb20gdW5rbm93biBlbGVtcyAjMTA1MDFcclxuXHRpZiAoIGFyZ3MubGVuZ3RoID09PSAxICYmIHR5cGVvZiBmaXJzdCA9PT0gXCJzdHJpbmdcIiAmJiBmaXJzdC5sZW5ndGggPCA1MTIgJiYgY29udGV4dCA9PT0gZG9jdW1lbnQgJiZcclxuXHRcdGZpcnN0LmNoYXJBdCgwKSA9PT0gXCI8XCIgJiYgIXJub2NhY2hlLnRlc3QoIGZpcnN0ICkgJiZcclxuXHRcdChqUXVlcnkuc3VwcG9ydC5jaGVja0Nsb25lIHx8ICFyY2hlY2tlZC50ZXN0KCBmaXJzdCApKSAmJlxyXG5cdFx0KGpRdWVyeS5zdXBwb3J0Lmh0bWw1Q2xvbmUgfHwgIXJub3NoaW1jYWNoZS50ZXN0KCBmaXJzdCApKSApIHtcclxuXHJcblx0XHQvLyBNYXJrIGNhY2hlYWJsZSBhbmQgbG9vayBmb3IgYSBoaXRcclxuXHRcdGNhY2hlYWJsZSA9IHRydWU7XHJcblx0XHRmcmFnbWVudCA9IGpRdWVyeS5mcmFnbWVudHNbIGZpcnN0IF07XHJcblx0XHRjYWNoZWhpdCA9IGZyYWdtZW50ICE9PSB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHRpZiAoICFmcmFnbWVudCApIHtcclxuXHRcdGZyYWdtZW50ID0gY29udGV4dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XHJcblx0XHRqUXVlcnkuY2xlYW4oIGFyZ3MsIGNvbnRleHQsIGZyYWdtZW50LCBzY3JpcHRzICk7XHJcblxyXG5cdFx0Ly8gVXBkYXRlIHRoZSBjYWNoZSwgYnV0IG9ubHkgc3RvcmUgZmFsc2VcclxuXHRcdC8vIHVubGVzcyB0aGlzIGlzIGEgc2Vjb25kIHBhcnNpbmcgb2YgdGhlIHNhbWUgY29udGVudFxyXG5cdFx0aWYgKCBjYWNoZWFibGUgKSB7XHJcblx0XHRcdGpRdWVyeS5mcmFnbWVudHNbIGZpcnN0IF0gPSBjYWNoZWhpdCAmJiBmcmFnbWVudDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJldHVybiB7IGZyYWdtZW50OiBmcmFnbWVudCwgY2FjaGVhYmxlOiBjYWNoZWFibGUgfTtcclxufTtcclxuXHJcbmpRdWVyeS5mcmFnbWVudHMgPSB7fTtcclxuXHJcbmpRdWVyeS5lYWNoKHtcclxuXHRhcHBlbmRUbzogXCJhcHBlbmRcIixcclxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxyXG5cdGluc2VydEJlZm9yZTogXCJiZWZvcmVcIixcclxuXHRpbnNlcnRBZnRlcjogXCJhZnRlclwiLFxyXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxyXG59LCBmdW5jdGlvbiggbmFtZSwgb3JpZ2luYWwgKSB7XHJcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XHJcblx0XHR2YXIgZWxlbXMsXHJcblx0XHRcdGkgPSAwLFxyXG5cdFx0XHRyZXQgPSBbXSxcclxuXHRcdFx0aW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLFxyXG5cdFx0XHRsID0gaW5zZXJ0Lmxlbmd0aCxcclxuXHRcdFx0cGFyZW50ID0gdGhpcy5sZW5ndGggPT09IDEgJiYgdGhpc1swXS5wYXJlbnROb2RlO1xyXG5cclxuXHRcdGlmICggKHBhcmVudCA9PSBudWxsIHx8IHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgPT09IDExICYmIHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSkgJiYgbCA9PT0gMSApIHtcclxuXHRcdFx0aW5zZXJ0WyBvcmlnaW5hbCBdKCB0aGlzWzBdICk7XHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xyXG5cdFx0XHRcdGVsZW1zID0gKCBpID4gMCA/IHRoaXMuY2xvbmUodHJ1ZSkgOiB0aGlzICkuZ2V0KCk7XHJcblx0XHRcdFx0alF1ZXJ5KCBpbnNlcnRbaV0gKVsgb3JpZ2luYWwgXSggZWxlbXMgKTtcclxuXHRcdFx0XHRyZXQgPSByZXQuY29uY2F0KCBlbGVtcyApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgaW5zZXJ0LnNlbGVjdG9yICk7XHJcblx0XHR9XHJcblx0fTtcclxufSk7XHJcblxyXG5mdW5jdGlvbiBnZXRBbGwoIGVsZW0gKSB7XHJcblx0aWYgKCB0eXBlb2YgZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcclxuXHRcdHJldHVybiBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcIipcIiApO1xyXG5cclxuXHR9IGVsc2UgaWYgKCB0eXBlb2YgZWxlbS5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiICkge1xyXG5cdFx0cmV0dXJuIGVsZW0ucXVlcnlTZWxlY3RvckFsbCggXCIqXCIgKTtcclxuXHJcblx0fSBlbHNlIHtcclxuXHRcdHJldHVybiBbXTtcclxuXHR9XHJcbn1cclxuXHJcbi8vIFVzZWQgaW4gY2xlYW4sIGZpeGVzIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9wZXJ0eVxyXG5mdW5jdGlvbiBmaXhEZWZhdWx0Q2hlY2tlZCggZWxlbSApIHtcclxuXHRpZiAoIHJjaGVja2FibGVUeXBlLnRlc3QoIGVsZW0udHlwZSApICkge1xyXG5cdFx0ZWxlbS5kZWZhdWx0Q2hlY2tlZCA9IGVsZW0uY2hlY2tlZDtcclxuXHR9XHJcbn1cclxuXHJcbmpRdWVyeS5leHRlbmQoe1xyXG5cdGNsb25lOiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XHJcblx0XHR2YXIgc3JjRWxlbWVudHMsXHJcblx0XHRcdGRlc3RFbGVtZW50cyxcclxuXHRcdFx0aSxcclxuXHRcdFx0Y2xvbmU7XHJcblxyXG5cdFx0aWYgKCBqUXVlcnkuc3VwcG9ydC5odG1sNUNsb25lIHx8IGpRdWVyeS5pc1hNTERvYyhlbGVtKSB8fCAhcm5vc2hpbWNhY2hlLnRlc3QoIFwiPFwiICsgZWxlbS5ub2RlTmFtZSArIFwiPlwiICkgKSB7XHJcblx0XHRcdGNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKTtcclxuXHJcblx0XHQvLyBJRTw9OCBkb2VzIG5vdCBwcm9wZXJseSBjbG9uZSBkZXRhY2hlZCwgdW5rbm93biBlbGVtZW50IG5vZGVzXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRmcmFnbWVudERpdi5pbm5lckhUTUwgPSBlbGVtLm91dGVySFRNTDtcclxuXHRcdFx0ZnJhZ21lbnREaXYucmVtb3ZlQ2hpbGQoIGNsb25lID0gZnJhZ21lbnREaXYuZmlyc3RDaGlsZCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggKCFqUXVlcnkuc3VwcG9ydC5ub0Nsb25lRXZlbnQgfHwgIWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSAmJlxyXG5cdFx0XHRcdChlbGVtLm5vZGVUeXBlID09PSAxIHx8IGVsZW0ubm9kZVR5cGUgPT09IDExKSAmJiAhalF1ZXJ5LmlzWE1MRG9jKGVsZW0pICkge1xyXG5cdFx0XHQvLyBJRSBjb3BpZXMgZXZlbnRzIGJvdW5kIHZpYSBhdHRhY2hFdmVudCB3aGVuIHVzaW5nIGNsb25lTm9kZS5cclxuXHRcdFx0Ly8gQ2FsbGluZyBkZXRhY2hFdmVudCBvbiB0aGUgY2xvbmUgd2lsbCBhbHNvIHJlbW92ZSB0aGUgZXZlbnRzXHJcblx0XHRcdC8vIGZyb20gdGhlIG9yaWdpbmFsLiBJbiBvcmRlciB0byBnZXQgYXJvdW5kIHRoaXMsIHdlIHVzZSBzb21lXHJcblx0XHRcdC8vIHByb3ByaWV0YXJ5IG1ldGhvZHMgdG8gY2xlYXIgdGhlIGV2ZW50cy4gVGhhbmtzIHRvIE1vb1Rvb2xzXHJcblx0XHRcdC8vIGd1eXMgZm9yIHRoaXMgaG90bmVzcy5cclxuXHJcblx0XHRcdGNsb25lRml4QXR0cmlidXRlcyggZWxlbSwgY2xvbmUgKTtcclxuXHJcblx0XHRcdC8vIFVzaW5nIFNpenpsZSBoZXJlIGlzIGNyYXp5IHNsb3csIHNvIHdlIHVzZSBnZXRFbGVtZW50c0J5VGFnTmFtZSBpbnN0ZWFkXHJcblx0XHRcdHNyY0VsZW1lbnRzID0gZ2V0QWxsKCBlbGVtICk7XHJcblx0XHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUgKTtcclxuXHJcblx0XHRcdC8vIFdlaXJkIGl0ZXJhdGlvbiBiZWNhdXNlIElFIHdpbGwgcmVwbGFjZSB0aGUgbGVuZ3RoIHByb3BlcnR5XHJcblx0XHRcdC8vIHdpdGggYW4gZWxlbWVudCBpZiB5b3UgYXJlIGNsb25pbmcgdGhlIGJvZHkgYW5kIG9uZSBvZiB0aGVcclxuXHRcdFx0Ly8gZWxlbWVudHMgb24gdGhlIHBhZ2UgaGFzIGEgbmFtZSBvciBpZCBvZiBcImxlbmd0aFwiXHJcblx0XHRcdGZvciAoIGkgPSAwOyBzcmNFbGVtZW50c1tpXTsgKytpICkge1xyXG5cdFx0XHRcdC8vIEVuc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBub2RlIGlzIG5vdCBudWxsOyBGaXhlcyAjOTU4N1xyXG5cdFx0XHRcdGlmICggZGVzdEVsZW1lbnRzW2ldICkge1xyXG5cdFx0XHRcdFx0Y2xvbmVGaXhBdHRyaWJ1dGVzKCBzcmNFbGVtZW50c1tpXSwgZGVzdEVsZW1lbnRzW2ldICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxyXG5cdFx0aWYgKCBkYXRhQW5kRXZlbnRzICkge1xyXG5cdFx0XHRjbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTtcclxuXHJcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XHJcblx0XHRcdFx0c3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTtcclxuXHRcdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XHJcblxyXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBzcmNFbGVtZW50c1tpXTsgKytpICkge1xyXG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzW2ldLCBkZXN0RWxlbWVudHNbaV0gKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRzcmNFbGVtZW50cyA9IGRlc3RFbGVtZW50cyA9IG51bGw7XHJcblxyXG5cdFx0Ly8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0XHJcblx0XHRyZXR1cm4gY2xvbmU7XHJcblx0fSxcclxuXHJcblx0Y2xlYW46IGZ1bmN0aW9uKCBlbGVtcywgY29udGV4dCwgZnJhZ21lbnQsIHNjcmlwdHMgKSB7XHJcblx0XHR2YXIgaSwgaiwgZWxlbSwgdGFnLCB3cmFwLCBkZXB0aCwgZGl2LCBoYXNCb2R5LCB0Ym9keSwgbGVuLCBoYW5kbGVTY3JpcHQsIGpzVGFncyxcclxuXHRcdFx0c2FmZSA9IGNvbnRleHQgPT09IGRvY3VtZW50ICYmIHNhZmVGcmFnbWVudCxcclxuXHRcdFx0cmV0ID0gW107XHJcblxyXG5cdFx0Ly8gRW5zdXJlIHRoYXQgY29udGV4dCBpcyBhIGRvY3VtZW50XHJcblx0XHRpZiAoICFjb250ZXh0IHx8IHR5cGVvZiBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQgPT09IFwidW5kZWZpbmVkXCIgKSB7XHJcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBVc2UgdGhlIGFscmVhZHktY3JlYXRlZCBzYWZlIGZyYWdtZW50IGlmIGNvbnRleHQgcGVybWl0c1xyXG5cdFx0Zm9yICggaSA9IDA7IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHtcclxuXHRcdFx0aWYgKCB0eXBlb2YgZWxlbSA9PT0gXCJudW1iZXJcIiApIHtcclxuXHRcdFx0XHRlbGVtICs9IFwiXCI7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICggIWVsZW0gKSB7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIENvbnZlcnQgaHRtbCBzdHJpbmcgaW50byBET00gbm9kZXNcclxuXHRcdFx0aWYgKCB0eXBlb2YgZWxlbSA9PT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0XHRpZiAoICFyaHRtbC50ZXN0KCBlbGVtICkgKSB7XHJcblx0XHRcdFx0XHRlbGVtID0gY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyBFbnN1cmUgYSBzYWZlIGNvbnRhaW5lciBpbiB3aGljaCB0byByZW5kZXIgdGhlIGh0bWxcclxuXHRcdFx0XHRcdHNhZmUgPSBzYWZlIHx8IGNyZWF0ZVNhZmVGcmFnbWVudCggY29udGV4dCApO1xyXG5cdFx0XHRcdFx0ZGl2ID0gY29udGV4dC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0XHRcdFx0c2FmZS5hcHBlbmRDaGlsZCggZGl2ICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gRml4IFwiWEhUTUxcIi1zdHlsZSB0YWdzIGluIGFsbCBicm93c2Vyc1xyXG5cdFx0XHRcdFx0ZWxlbSA9IGVsZW0ucmVwbGFjZShyeGh0bWxUYWcsIFwiPCQxPjwvJDI+XCIpO1xyXG5cclxuXHRcdFx0XHRcdC8vIEdvIHRvIGh0bWwgYW5kIGJhY2ssIHRoZW4gcGVlbCBvZmYgZXh0cmEgd3JhcHBlcnNcclxuXHRcdFx0XHRcdHRhZyA9ICggcnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFtcIlwiLCBcIlwiXSApWzFdLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0XHR3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdDtcclxuXHRcdFx0XHRcdGRlcHRoID0gd3JhcFswXTtcclxuXHRcdFx0XHRcdGRpdi5pbm5lckhUTUwgPSB3cmFwWzFdICsgZWxlbSArIHdyYXBbMl07XHJcblxyXG5cdFx0XHRcdFx0Ly8gTW92ZSB0byB0aGUgcmlnaHQgZGVwdGhcclxuXHRcdFx0XHRcdHdoaWxlICggZGVwdGgtLSApIHtcclxuXHRcdFx0XHRcdFx0ZGl2ID0gZGl2Lmxhc3RDaGlsZDtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50c1xyXG5cdFx0XHRcdFx0aWYgKCAhalF1ZXJ5LnN1cHBvcnQudGJvZHkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBTdHJpbmcgd2FzIGEgPHRhYmxlPiwgKm1heSogaGF2ZSBzcHVyaW91cyA8dGJvZHk+XHJcblx0XHRcdFx0XHRcdGhhc0JvZHkgPSBydGJvZHkudGVzdChlbGVtKTtcclxuXHRcdFx0XHRcdFx0XHR0Ym9keSA9IHRhZyA9PT0gXCJ0YWJsZVwiICYmICFoYXNCb2R5ID9cclxuXHRcdFx0XHRcdFx0XHRcdGRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLmNoaWxkTm9kZXMgOlxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIFN0cmluZyB3YXMgYSBiYXJlIDx0aGVhZD4gb3IgPHRmb290PlxyXG5cdFx0XHRcdFx0XHRcdFx0d3JhcFsxXSA9PT0gXCI8dGFibGU+XCIgJiYgIWhhc0JvZHkgP1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRkaXYuY2hpbGROb2RlcyA6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFtdO1xyXG5cclxuXHRcdFx0XHRcdFx0Zm9yICggaiA9IHRib2R5Lmxlbmd0aCAtIDE7IGogPj0gMCA7IC0taiApIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGJvZHlbIGogXSwgXCJ0Ym9keVwiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0Ym9keVsgaiBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRib2R5WyBqIF0gKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBJRSBjb21wbGV0ZWx5IGtpbGxzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIGlubmVySFRNTCBpcyB1c2VkXHJcblx0XHRcdFx0XHRpZiAoICFqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiBybGVhZGluZ1doaXRlc3BhY2UudGVzdCggZWxlbSApICkge1xyXG5cdFx0XHRcdFx0XHRkaXYuaW5zZXJ0QmVmb3JlKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBybGVhZGluZ1doaXRlc3BhY2UuZXhlYyhlbGVtKVswXSApLCBkaXYuZmlyc3RDaGlsZCApO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGVsZW0gPSBkaXYuY2hpbGROb2RlcztcclxuXHJcblx0XHRcdFx0XHQvLyBUYWtlIG91dCBvZiBmcmFnbWVudCBjb250YWluZXIgKHdlIG5lZWQgYSBmcmVzaCBkaXYgZWFjaCB0aW1lKVxyXG5cdFx0XHRcdFx0ZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGRpdiApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlICkge1xyXG5cdFx0XHRcdHJldC5wdXNoKCBlbGVtICk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCByZXQsIGVsZW0gKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEZpeCAjMTEzNTY6IENsZWFyIGVsZW1lbnRzIGZyb20gc2FmZUZyYWdtZW50XHJcblx0XHRpZiAoIGRpdiApIHtcclxuXHRcdFx0ZWxlbSA9IGRpdiA9IHNhZmUgPSBudWxsO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFJlc2V0IGRlZmF1bHRDaGVja2VkIGZvciBhbnkgcmFkaW9zIGFuZCBjaGVja2JveGVzXHJcblx0XHQvLyBhYm91dCB0byBiZSBhcHBlbmRlZCB0byB0aGUgRE9NIGluIElFIDYvNyAoIzgwNjApXHJcblx0XHRpZiAoICFqUXVlcnkuc3VwcG9ydC5hcHBlbmRDaGVja2VkICkge1xyXG5cdFx0XHRmb3IgKCBpID0gMDsgKGVsZW0gPSByZXRbaV0pICE9IG51bGw7IGkrKyApIHtcclxuXHRcdFx0XHRpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgKSB7XHJcblx0XHRcdFx0XHRmaXhEZWZhdWx0Q2hlY2tlZCggZWxlbSApO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGVvZiBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xyXG5cdFx0XHRcdFx0alF1ZXJ5LmdyZXAoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJpbnB1dFwiKSwgZml4RGVmYXVsdENoZWNrZWQgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBBcHBlbmQgZWxlbWVudHMgdG8gYSBwcm92aWRlZCBkb2N1bWVudCBmcmFnbWVudFxyXG5cdFx0aWYgKCBmcmFnbWVudCApIHtcclxuXHRcdFx0Ly8gU3BlY2lhbCBoYW5kbGluZyBvZiBlYWNoIHNjcmlwdCBlbGVtZW50XHJcblx0XHRcdGhhbmRsZVNjcmlwdCA9IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0XHRcdC8vIENoZWNrIGlmIHdlIGNvbnNpZGVyIGl0IGV4ZWN1dGFibGVcclxuXHRcdFx0XHRpZiAoICFlbGVtLnR5cGUgfHwgcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlICkgKSB7XHJcblx0XHRcdFx0XHQvLyBEZXRhY2ggdGhlIHNjcmlwdCBhbmQgc3RvcmUgaXQgaW4gdGhlIHNjcmlwdHMgYXJyYXkgKGlmIHByb3ZpZGVkKSBvciB0aGUgZnJhZ21lbnRcclxuXHRcdFx0XHRcdC8vIFJldHVybiB0cnV0aHkgdG8gaW5kaWNhdGUgdGhhdCBpdCBoYXMgYmVlbiBoYW5kbGVkXHJcblx0XHRcdFx0XHRyZXR1cm4gc2NyaXB0cyA/XHJcblx0XHRcdFx0XHRcdHNjcmlwdHMucHVzaCggZWxlbS5wYXJlbnROb2RlID8gZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICkgOiBlbGVtICkgOlxyXG5cdFx0XHRcdFx0XHRmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGZvciAoIGkgPSAwOyAoZWxlbSA9IHJldFtpXSkgIT0gbnVsbDsgaSsrICkge1xyXG5cdFx0XHRcdC8vIENoZWNrIGlmIHdlJ3JlIGRvbmUgYWZ0ZXIgaGFuZGxpbmcgYW4gZXhlY3V0YWJsZSBzY3JpcHRcclxuXHRcdFx0XHRpZiAoICEoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJzY3JpcHRcIiApICYmIGhhbmRsZVNjcmlwdCggZWxlbSApICkgKSB7XHJcblx0XHRcdFx0XHQvLyBBcHBlbmQgdG8gZnJhZ21lbnQgYW5kIGhhbmRsZSBlbWJlZGRlZCBzY3JpcHRzXHJcblx0XHRcdFx0XHRmcmFnbWVudC5hcHBlbmRDaGlsZCggZWxlbSApO1xyXG5cdFx0XHRcdFx0aWYgKCB0eXBlb2YgZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcclxuXHRcdFx0XHRcdFx0Ly8gaGFuZGxlU2NyaXB0IGFsdGVycyB0aGUgRE9NLCBzbyB1c2UgalF1ZXJ5Lm1lcmdlIHRvIGVuc3VyZSBzbmFwc2hvdCBpdGVyYXRpb25cclxuXHRcdFx0XHRcdFx0anNUYWdzID0galF1ZXJ5LmdyZXAoIGpRdWVyeS5tZXJnZSggW10sIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIikgKSwgaGFuZGxlU2NyaXB0ICk7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBTcGxpY2UgdGhlIHNjcmlwdHMgaW50byByZXQgYWZ0ZXIgdGhlaXIgZm9ybWVyIGFuY2VzdG9yIGFuZCBhZHZhbmNlIG91ciBpbmRleCBiZXlvbmQgdGhlbVxyXG5cdFx0XHRcdFx0XHRyZXQuc3BsaWNlLmFwcGx5KCByZXQsIFtpICsgMSwgMF0uY29uY2F0KCBqc1RhZ3MgKSApO1xyXG5cdFx0XHRcdFx0XHRpICs9IGpzVGFncy5sZW5ndGg7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJldDtcclxuXHR9LFxyXG5cclxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcywgLyogaW50ZXJuYWwgKi8gYWNjZXB0RGF0YSApIHtcclxuXHRcdHZhciBkYXRhLCBpZCwgZWxlbSwgdHlwZSxcclxuXHRcdFx0aSA9IDAsXHJcblx0XHRcdGludGVybmFsS2V5ID0galF1ZXJ5LmV4cGFuZG8sXHJcblx0XHRcdGNhY2hlID0galF1ZXJ5LmNhY2hlLFxyXG5cdFx0XHRkZWxldGVFeHBhbmRvID0galF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyxcclxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsO1xyXG5cclxuXHRcdGZvciAoIDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkge1xyXG5cclxuXHRcdFx0aWYgKCBhY2NlcHREYXRhIHx8IGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7XHJcblxyXG5cdFx0XHRcdGlkID0gZWxlbVsgaW50ZXJuYWxLZXkgXTtcclxuXHRcdFx0XHRkYXRhID0gaWQgJiYgY2FjaGVbIGlkIF07XHJcblxyXG5cdFx0XHRcdGlmICggZGF0YSApIHtcclxuXHRcdFx0XHRcdGlmICggZGF0YS5ldmVudHMgKSB7XHJcblx0XHRcdFx0XHRcdGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3ZlcmhlYWRcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIFJlbW92ZSBjYWNoZSBvbmx5IGlmIGl0IHdhcyBub3QgYWxyZWFkeSByZW1vdmVkIGJ5IGpRdWVyeS5ldmVudC5yZW1vdmVcclxuXHRcdFx0XHRcdGlmICggY2FjaGVbIGlkIF0gKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRkZWxldGUgY2FjaGVbIGlkIF07XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBJRSBkb2VzIG5vdCBhbGxvdyB1cyB0byBkZWxldGUgZXhwYW5kbyBwcm9wZXJ0aWVzIGZyb20gbm9kZXMsXHJcblx0XHRcdFx0XHRcdC8vIG5vciBkb2VzIGl0IGhhdmUgYSByZW1vdmVBdHRyaWJ1dGUgZnVuY3Rpb24gb24gRG9jdW1lbnQgbm9kZXM7XHJcblx0XHRcdFx0XHRcdC8vIHdlIG11c3QgaGFuZGxlIGFsbCBvZiB0aGVzZSBjYXNlc1xyXG5cdFx0XHRcdFx0XHRpZiAoIGRlbGV0ZUV4cGFuZG8gKSB7XHJcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIGVsZW1bIGludGVybmFsS2V5IF07XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApIHtcclxuXHRcdFx0XHRcdFx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggaW50ZXJuYWxLZXkgKTtcclxuXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0ZWxlbVsgaW50ZXJuYWxLZXkgXSA9IG51bGw7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGpRdWVyeS5kZWxldGVkSWRzLnB1c2goIGlkICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59KTtcclxuLy8gTGltaXQgc2NvcGUgcG9sbHV0aW9uIGZyb20gYW55IGRlcHJlY2F0ZWQgQVBJXHJcbihmdW5jdGlvbigpIHtcclxuXHJcbnZhciBtYXRjaGVkLCBicm93c2VyO1xyXG5cclxuLy8gVXNlIG9mIGpRdWVyeS5icm93c2VyIGlzIGZyb3duZWQgdXBvbi5cclxuLy8gTW9yZSBkZXRhaWxzOiBodHRwOi8vYXBpLmpxdWVyeS5jb20valF1ZXJ5LmJyb3dzZXJcclxuLy8galF1ZXJ5LnVhTWF0Y2ggbWFpbnRhaW5lZCBmb3IgYmFjay1jb21wYXRcclxualF1ZXJ5LnVhTWF0Y2ggPSBmdW5jdGlvbiggdWEgKSB7XHJcblx0dWEgPSB1YS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuXHR2YXIgbWF0Y2ggPSAvKGNocm9tZSlbIFxcL10oW1xcdy5dKykvLmV4ZWMoIHVhICkgfHxcclxuXHRcdC8od2Via2l0KVsgXFwvXShbXFx3Ll0rKS8uZXhlYyggdWEgKSB8fFxyXG5cdFx0LyhvcGVyYSkoPzouKnZlcnNpb258KVsgXFwvXShbXFx3Ll0rKS8uZXhlYyggdWEgKSB8fFxyXG5cdFx0Lyhtc2llKSAoW1xcdy5dKykvLmV4ZWMoIHVhICkgfHxcclxuXHRcdHVhLmluZGV4T2YoXCJjb21wYXRpYmxlXCIpIDwgMCAmJiAvKG1vemlsbGEpKD86Lio/IHJ2OihbXFx3Ll0rKXwpLy5leGVjKCB1YSApIHx8XHJcblx0XHRbXTtcclxuXHJcblx0cmV0dXJuIHtcclxuXHRcdGJyb3dzZXI6IG1hdGNoWyAxIF0gfHwgXCJcIixcclxuXHRcdHZlcnNpb246IG1hdGNoWyAyIF0gfHwgXCIwXCJcclxuXHR9O1xyXG59O1xyXG5cclxubWF0Y2hlZCA9IGpRdWVyeS51YU1hdGNoKCBuYXZpZ2F0b3IudXNlckFnZW50ICk7XHJcbmJyb3dzZXIgPSB7fTtcclxuXHJcbmlmICggbWF0Y2hlZC5icm93c2VyICkge1xyXG5cdGJyb3dzZXJbIG1hdGNoZWQuYnJvd3NlciBdID0gdHJ1ZTtcclxuXHRicm93c2VyLnZlcnNpb24gPSBtYXRjaGVkLnZlcnNpb247XHJcbn1cclxuXHJcbi8vIENocm9tZSBpcyBXZWJraXQsIGJ1dCBXZWJraXQgaXMgYWxzbyBTYWZhcmkuXHJcbmlmICggYnJvd3Nlci5jaHJvbWUgKSB7XHJcblx0YnJvd3Nlci53ZWJraXQgPSB0cnVlO1xyXG59IGVsc2UgaWYgKCBicm93c2VyLndlYmtpdCApIHtcclxuXHRicm93c2VyLnNhZmFyaSA9IHRydWU7XHJcbn1cclxuXHJcbmpRdWVyeS5icm93c2VyID0gYnJvd3NlcjtcclxuXHJcbmpRdWVyeS5zdWIgPSBmdW5jdGlvbigpIHtcclxuXHRmdW5jdGlvbiBqUXVlcnlTdWIoIHNlbGVjdG9yLCBjb250ZXh0ICkge1xyXG5cdFx0cmV0dXJuIG5ldyBqUXVlcnlTdWIuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQgKTtcclxuXHR9XHJcblx0alF1ZXJ5LmV4dGVuZCggdHJ1ZSwgalF1ZXJ5U3ViLCB0aGlzICk7XHJcblx0alF1ZXJ5U3ViLnN1cGVyY2xhc3MgPSB0aGlzO1xyXG5cdGpRdWVyeVN1Yi5mbiA9IGpRdWVyeVN1Yi5wcm90b3R5cGUgPSB0aGlzKCk7XHJcblx0alF1ZXJ5U3ViLmZuLmNvbnN0cnVjdG9yID0galF1ZXJ5U3ViO1xyXG5cdGpRdWVyeVN1Yi5zdWIgPSB0aGlzLnN1YjtcclxuXHRqUXVlcnlTdWIuZm4uaW5pdCA9IGZ1bmN0aW9uIGluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICkge1xyXG5cdFx0aWYgKCBjb250ZXh0ICYmIGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgJiYgIShjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5U3ViKSApIHtcclxuXHRcdFx0Y29udGV4dCA9IGpRdWVyeVN1YiggY29udGV4dCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBqUXVlcnkuZm4uaW5pdC5jYWxsKCB0aGlzLCBzZWxlY3RvciwgY29udGV4dCwgcm9vdGpRdWVyeVN1YiApO1xyXG5cdH07XHJcblx0alF1ZXJ5U3ViLmZuLmluaXQucHJvdG90eXBlID0galF1ZXJ5U3ViLmZuO1xyXG5cdHZhciByb290alF1ZXJ5U3ViID0galF1ZXJ5U3ViKGRvY3VtZW50KTtcclxuXHRyZXR1cm4galF1ZXJ5U3ViO1xyXG59O1xyXG5cclxufSkoKTtcclxudmFyIGN1ckNTUywgaWZyYW1lLCBpZnJhbWVEb2MsXHJcblx0cmFscGhhID0gL2FscGhhXFwoW14pXSpcXCkvaSxcclxuXHRyb3BhY2l0eSA9IC9vcGFjaXR5PShbXildKikvLFxyXG5cdHJwb3NpdGlvbiA9IC9eKHRvcHxyaWdodHxib3R0b218bGVmdCkkLyxcclxuXHQvLyBzd2FwcGFibGUgaWYgZGlzcGxheSBpcyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlIGV4Y2VwdCBcInRhYmxlXCIsIFwidGFibGUtY2VsbFwiLCBvciBcInRhYmxlLWNhcHRpb25cIlxyXG5cdC8vIHNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheVxyXG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcclxuXHRybWFyZ2luID0gL15tYXJnaW4vLFxyXG5cdHJudW1zcGxpdCA9IG5ldyBSZWdFeHAoIFwiXihcIiArIGNvcmVfcG51bSArIFwiKSguKikkXCIsIFwiaVwiICksXHJcblx0cm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgY29yZV9wbnVtICsgXCIpKD8hcHgpW2EteiVdKyRcIiwgXCJpXCIgKSxcclxuXHRycmVsTnVtID0gbmV3IFJlZ0V4cCggXCJeKFstK10pPShcIiArIGNvcmVfcG51bSArIFwiKVwiLCBcImlcIiApLFxyXG5cdGVsZW1kaXNwbGF5ID0ge30sXHJcblxyXG5cdGNzc1Nob3cgPSB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIGRpc3BsYXk6IFwiYmxvY2tcIiB9LFxyXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcclxuXHRcdGxldHRlclNwYWNpbmc6IDAsXHJcblx0XHRmb250V2VpZ2h0OiA0MDBcclxuXHR9LFxyXG5cclxuXHRjc3NFeHBhbmQgPSBbIFwiVG9wXCIsIFwiUmlnaHRcIiwgXCJCb3R0b21cIiwgXCJMZWZ0XCIgXSxcclxuXHRjc3NQcmVmaXhlcyA9IFsgXCJXZWJraXRcIiwgXCJPXCIsIFwiTW96XCIsIFwibXNcIiBdLFxyXG5cclxuXHRldmVudHNUb2dnbGUgPSBqUXVlcnkuZm4udG9nZ2xlO1xyXG5cclxuLy8gcmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eVxyXG5mdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggc3R5bGUsIG5hbWUgKSB7XHJcblxyXG5cdC8vIHNob3J0Y3V0IGZvciBuYW1lcyB0aGF0IGFyZSBub3QgdmVuZG9yIHByZWZpeGVkXHJcblx0aWYgKCBuYW1lIGluIHN0eWxlICkge1xyXG5cdFx0cmV0dXJuIG5hbWU7XHJcblx0fVxyXG5cclxuXHQvLyBjaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzXHJcblx0dmFyIGNhcE5hbWUgPSBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKSxcclxuXHRcdG9yaWdOYW1lID0gbmFtZSxcclxuXHRcdGkgPSBjc3NQcmVmaXhlcy5sZW5ndGg7XHJcblxyXG5cdHdoaWxlICggaS0tICkge1xyXG5cdFx0bmFtZSA9IGNzc1ByZWZpeGVzWyBpIF0gKyBjYXBOYW1lO1xyXG5cdFx0aWYgKCBuYW1lIGluIHN0eWxlICkge1xyXG5cdFx0XHRyZXR1cm4gbmFtZTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJldHVybiBvcmlnTmFtZTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNIaWRkZW4oIGVsZW0sIGVsICkge1xyXG5cdGVsZW0gPSBlbCB8fCBlbGVtO1xyXG5cdHJldHVybiBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApID09PSBcIm5vbmVcIiB8fCAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd0hpZGUoIGVsZW1lbnRzLCBzaG93ICkge1xyXG5cdHZhciBlbGVtLCBkaXNwbGF5LFxyXG5cdFx0dmFsdWVzID0gW10sXHJcblx0XHRpbmRleCA9IDAsXHJcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XHJcblxyXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XHJcblx0XHRlbGVtID0gZWxlbWVudHNbIGluZGV4IF07XHJcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xyXG5cdFx0XHRjb250aW51ZTtcclxuXHRcdH1cclxuXHRcdHZhbHVlc1sgaW5kZXggXSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgXCJvbGRkaXNwbGF5XCIgKTtcclxuXHRcdGlmICggc2hvdyApIHtcclxuXHRcdFx0Ly8gUmVzZXQgdGhlIGlubGluZSBkaXNwbGF5IG9mIHRoaXMgZWxlbWVudCB0byBsZWFybiBpZiBpdCBpc1xyXG5cdFx0XHQvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90XHJcblx0XHRcdGlmICggIXZhbHVlc1sgaW5kZXggXSAmJiBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiICkge1xyXG5cdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFNldCBlbGVtZW50cyB3aGljaCBoYXZlIGJlZW4gb3ZlcnJpZGRlbiB3aXRoIGRpc3BsYXk6IG5vbmVcclxuXHRcdFx0Ly8gaW4gYSBzdHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJyb3dzZXIgc3R5bGUgaXNcclxuXHRcdFx0Ly8gZm9yIHN1Y2ggYW4gZWxlbWVudFxyXG5cdFx0XHRpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJiBpc0hpZGRlbiggZWxlbSApICkge1xyXG5cdFx0XHRcdHZhbHVlc1sgaW5kZXggXSA9IGpRdWVyeS5fZGF0YSggZWxlbSwgXCJvbGRkaXNwbGF5XCIsIGNzc19kZWZhdWx0RGlzcGxheShlbGVtLm5vZGVOYW1lKSApO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRkaXNwbGF5ID0gY3VyQ1NTKCBlbGVtLCBcImRpc3BsYXlcIiApO1xyXG5cclxuXHRcdFx0aWYgKCAhdmFsdWVzWyBpbmRleCBdICYmIGRpc3BsYXkgIT09IFwibm9uZVwiICkge1xyXG5cdFx0XHRcdGpRdWVyeS5fZGF0YSggZWxlbSwgXCJvbGRkaXNwbGF5XCIsIGRpc3BsYXkgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gU2V0IHRoZSBkaXNwbGF5IG9mIG1vc3Qgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3BcclxuXHQvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93XHJcblx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcclxuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcclxuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XHJcblx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCAhc2hvdyB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiIHx8IGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiApIHtcclxuXHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/IHZhbHVlc1sgaW5kZXggXSB8fCBcIlwiIDogXCJub25lXCI7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZWxlbWVudHM7XHJcbn1cclxuXHJcbmpRdWVyeS5mbi5leHRlbmQoe1xyXG5cdGNzczogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcclxuXHRcdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgP1xyXG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XHJcblx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApO1xyXG5cdFx0fSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XHJcblx0fSxcclxuXHRzaG93OiBmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApO1xyXG5cdH0sXHJcblx0aGlkZTogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTtcclxuXHR9LFxyXG5cdHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlLCBmbjIgKSB7XHJcblx0XHR2YXIgYm9vbCA9IHR5cGVvZiBzdGF0ZSA9PT0gXCJib29sZWFuXCI7XHJcblxyXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc3RhdGUgKSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggZm4yICkgKSB7XHJcblx0XHRcdHJldHVybiBldmVudHNUb2dnbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XHJcblx0XHRcdGlmICggYm9vbCA/IHN0YXRlIDogaXNIaWRkZW4oIHRoaXMgKSApIHtcclxuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5zaG93KCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuaGlkZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcbn0pO1xyXG5cclxualF1ZXJ5LmV4dGVuZCh7XHJcblx0Ly8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0XHJcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XHJcblx0Y3NzSG9va3M6IHtcclxuXHRcdG9wYWNpdHk6IHtcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XHJcblx0XHRcdFx0aWYgKCBjb21wdXRlZCApIHtcclxuXHRcdFx0XHRcdC8vIFdlIHNob3VsZCBhbHdheXMgZ2V0IGEgbnVtYmVyIGJhY2sgZnJvbSBvcGFjaXR5XHJcblx0XHRcdFx0XHR2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCBcIm9wYWNpdHlcIiApO1xyXG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xyXG5cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHQvLyBFeGNsdWRlIHRoZSBmb2xsb3dpbmcgY3NzIHByb3BlcnRpZXMgdG8gYWRkIHB4XHJcblx0Y3NzTnVtYmVyOiB7XHJcblx0XHRcImZpbGxPcGFjaXR5XCI6IHRydWUsXHJcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcclxuXHRcdFwibGluZUhlaWdodFwiOiB0cnVlLFxyXG5cdFx0XCJvcGFjaXR5XCI6IHRydWUsXHJcblx0XHRcIm9ycGhhbnNcIjogdHJ1ZSxcclxuXHRcdFwid2lkb3dzXCI6IHRydWUsXHJcblx0XHRcInpJbmRleFwiOiB0cnVlLFxyXG5cdFx0XCJ6b29tXCI6IHRydWVcclxuXHR9LFxyXG5cclxuXHQvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlXHJcblx0Ly8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZVxyXG5cdGNzc1Byb3BzOiB7XHJcblx0XHQvLyBub3JtYWxpemUgZmxvYXQgY3NzIHByb3BlcnR5XHJcblx0XHRcImZsb2F0XCI6IGpRdWVyeS5zdXBwb3J0LmNzc0Zsb2F0ID8gXCJjc3NGbG9hdFwiIDogXCJzdHlsZUZsb2F0XCJcclxuXHR9LFxyXG5cclxuXHQvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZVxyXG5cdHN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4dHJhICkge1xyXG5cdFx0Ly8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXHJcblx0XHRpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxyXG5cdFx0dmFyIHJldCwgdHlwZSwgaG9va3MsXHJcblx0XHRcdG9yaWdOYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApLFxyXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XHJcblxyXG5cdFx0bmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSB8fCAoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBzdHlsZSwgb3JpZ05hbWUgKSApO1xyXG5cclxuXHRcdC8vIGdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb25cclxuXHRcdC8vIGZvbGxvd2VkIGJ5IHRoZSB1bnByZWZpeGVkIHZlcnNpb25cclxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xyXG5cclxuXHRcdC8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZVxyXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHR0eXBlID0gdHlwZW9mIHZhbHVlO1xyXG5cclxuXHRcdFx0Ly8gY29udmVydCByZWxhdGl2ZSBudW1iZXIgc3RyaW5ncyAoKz0gb3IgLT0pIHRvIHJlbGF0aXZlIG51bWJlcnMuICM3MzQ1XHJcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAocmV0ID0gcnJlbE51bS5leGVjKCB2YWx1ZSApKSApIHtcclxuXHRcdFx0XHR2YWx1ZSA9ICggcmV0WzFdICsgMSApICogcmV0WzJdICsgcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApICk7XHJcblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM5MjM3XHJcblx0XHRcdFx0dHlwZSA9IFwibnVtYmVyXCI7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IE5hTiBhbmQgbnVsbCB2YWx1ZXMgYXJlbid0IHNldC4gU2VlOiAjNzExNlxyXG5cdFx0XHRpZiAoIHZhbHVlID09IG51bGwgfHwgdHlwZSA9PT0gXCJudW1iZXJcIiAmJiBpc05hTiggdmFsdWUgKSApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFkZCAncHgnIHRvIHRoZSAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKVxyXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwibnVtYmVyXCIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7XHJcblx0XHRcdFx0dmFsdWUgKz0gXCJweFwiO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWVcclxuXHRcdFx0aWYgKCAhaG9va3MgfHwgIShcInNldFwiIGluIGhvb2tzKSB8fCAodmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRcdC8vIFdyYXBwZWQgdG8gcHJldmVudCBJRSBmcm9tIHRocm93aW5nIGVycm9ycyB3aGVuICdpbnZhbGlkJyB2YWx1ZXMgYXJlIHByb3ZpZGVkXHJcblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM1NTA5XHJcblx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSB2YWx1ZTtcclxuXHRcdFx0XHR9IGNhdGNoKGUpIHt9XHJcblx0XHRcdH1cclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgbm9uLWNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcclxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIGZhbHNlLCBleHRyYSApKSAhPT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRcdHJldHVybiByZXQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0XHJcblx0XHRcdHJldHVybiBzdHlsZVsgbmFtZSBdO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdGNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIG51bWVyaWMsIGV4dHJhICkge1xyXG5cdFx0dmFyIHZhbCwgbnVtLCBob29rcyxcclxuXHRcdFx0b3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICk7XHJcblxyXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXHJcblx0XHRuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8ICggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIGVsZW0uc3R5bGUsIG9yaWdOYW1lICkgKTtcclxuXHJcblx0XHQvLyBnZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uXHJcblx0XHQvLyBmb2xsb3dlZCBieSB0aGUgdW5wcmVmaXhlZCB2ZXJzaW9uXHJcblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcclxuXHJcblx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxyXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICkge1xyXG5cdFx0XHR2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXRcclxuXHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vY29udmVydCBcIm5vcm1hbFwiIHRvIGNvbXB1dGVkIHZhbHVlXHJcblx0XHRpZiAoIHZhbCA9PT0gXCJub3JtYWxcIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHtcclxuXHRcdFx0dmFsID0gY3NzTm9ybWFsVHJhbnNmb3JtWyBuYW1lIF07XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUmV0dXJuLCBjb252ZXJ0aW5nIHRvIG51bWJlciBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpY1xyXG5cdFx0aWYgKCBudW1lcmljIHx8IGV4dHJhICE9PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdG51bSA9IHBhcnNlRmxvYXQoIHZhbCApO1xyXG5cdFx0XHRyZXR1cm4gbnVtZXJpYyB8fCBqUXVlcnkuaXNOdW1lcmljKCBudW0gKSA/IG51bSB8fCAwIDogdmFsO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHZhbDtcclxuXHR9LFxyXG5cclxuXHQvLyBBIG1ldGhvZCBmb3IgcXVpY2tseSBzd2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3QgY2FsY3VsYXRpb25zXHJcblx0c3dhcDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrICkge1xyXG5cdFx0dmFyIHJldCwgbmFtZSxcclxuXHRcdFx0b2xkID0ge307XHJcblxyXG5cdFx0Ly8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzXHJcblx0XHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XHJcblx0XHRcdG9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xyXG5cdFx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvcHRpb25zWyBuYW1lIF07XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0ID0gY2FsbGJhY2suY2FsbCggZWxlbSApO1xyXG5cclxuXHRcdC8vIFJldmVydCB0aGUgb2xkIHZhbHVlc1xyXG5cdFx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xyXG5cdFx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmV0O1xyXG5cdH1cclxufSk7XHJcblxyXG4vLyBOT1RFOiBUbyBhbnkgZnV0dXJlIG1haW50YWluZXIsIHdlJ3ZlIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlXHJcbi8vIGJlY2F1c2UganNkb20gb24gbm9kZS5qcyB3aWxsIGJyZWFrIHdpdGhvdXQgaXQuXHJcbmlmICggd2luZG93LmdldENvbXB1dGVkU3R5bGUgKSB7XHJcblx0Y3VyQ1NTID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XHJcblx0XHR2YXIgcmV0LCB3aWR0aCwgbWluV2lkdGgsIG1heFdpZHRoLFxyXG5cdFx0XHRjb21wdXRlZCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICksXHJcblx0XHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcclxuXHJcblx0XHRpZiAoIGNvbXB1dGVkICkge1xyXG5cclxuXHRcdFx0cmV0ID0gY29tcHV0ZWRbIG5hbWUgXTtcclxuXHRcdFx0aWYgKCByZXQgPT09IFwiXCIgJiYgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7XHJcblx0XHRcdFx0cmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcclxuXHRcdFx0Ly8gQ2hyb21lIDwgMTcgYW5kIFNhZmFyaSA1LjAgdXNlcyBcImNvbXB1dGVkIHZhbHVlXCIgaW5zdGVhZCBvZiBcInVzZWQgdmFsdWVcIiBmb3IgbWFyZ2luLXJpZ2h0XHJcblx0XHRcdC8vIFNhZmFyaSA1LjEuNyAoYXQgbGVhc3QpIHJldHVybnMgcGVyY2VudGFnZSBmb3IgYSBsYXJnZXIgc2V0IG9mIHZhbHVlcywgYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVsc1xyXG5cdFx0XHQvLyB0aGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6IGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXNcclxuXHRcdFx0aWYgKCBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcm1hcmdpbi50ZXN0KCBuYW1lICkgKSB7XHJcblx0XHRcdFx0d2lkdGggPSBzdHlsZS53aWR0aDtcclxuXHRcdFx0XHRtaW5XaWR0aCA9IHN0eWxlLm1pbldpZHRoO1xyXG5cdFx0XHRcdG1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7XHJcblxyXG5cdFx0XHRcdHN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDtcclxuXHRcdFx0XHRyZXQgPSBjb21wdXRlZC53aWR0aDtcclxuXHJcblx0XHRcdFx0c3R5bGUud2lkdGggPSB3aWR0aDtcclxuXHRcdFx0XHRzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoO1xyXG5cdFx0XHRcdHN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmV0O1xyXG5cdH07XHJcbn0gZWxzZSBpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUgKSB7XHJcblx0Y3VyQ1NTID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XHJcblx0XHR2YXIgbGVmdCwgcnNMZWZ0LFxyXG5cdFx0XHRyZXQgPSBlbGVtLmN1cnJlbnRTdHlsZSAmJiBlbGVtLmN1cnJlbnRTdHlsZVsgbmFtZSBdLFxyXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XHJcblxyXG5cdFx0Ly8gQXZvaWQgc2V0dGluZyByZXQgdG8gZW1wdHkgc3RyaW5nIGhlcmVcclxuXHRcdC8vIHNvIHdlIGRvbid0IGRlZmF1bHQgdG8gYXV0b1xyXG5cdFx0aWYgKCByZXQgPT0gbnVsbCAmJiBzdHlsZSAmJiBzdHlsZVsgbmFtZSBdICkge1xyXG5cdFx0XHRyZXQgPSBzdHlsZVsgbmFtZSBdO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEZyb20gdGhlIGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHNcclxuXHRcdC8vIGh0dHA6Ly9lcmlrLmVhZS5uZXQvYXJjaGl2ZXMvMjAwNy8wNy8yNy8xOC41NC4xNS8jY29tbWVudC0xMDIyOTFcclxuXHJcblx0XHQvLyBJZiB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgcmVndWxhciBwaXhlbCBudW1iZXJcclxuXHRcdC8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIHBpeGVsc1xyXG5cdFx0Ly8gYnV0IG5vdCBwb3NpdGlvbiBjc3MgYXR0cmlidXRlcywgYXMgdGhvc2UgYXJlIHByb3BvcnRpb25hbCB0byB0aGUgcGFyZW50IGVsZW1lbnQgaW5zdGVhZFxyXG5cdFx0Ly8gYW5kIHdlIGNhbid0IG1lYXN1cmUgdGhlIHBhcmVudCBpbnN0ZWFkIGJlY2F1c2UgaXQgbWlnaHQgdHJpZ2dlciBhIFwic3RhY2tpbmcgZG9sbHNcIiBwcm9ibGVtXHJcblx0XHRpZiAoIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiAhcnBvc2l0aW9uLnRlc3QoIG5hbWUgKSApIHtcclxuXHJcblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXNcclxuXHRcdFx0bGVmdCA9IHN0eWxlLmxlZnQ7XHJcblx0XHRcdHJzTGVmdCA9IGVsZW0ucnVudGltZVN0eWxlICYmIGVsZW0ucnVudGltZVN0eWxlLmxlZnQ7XHJcblxyXG5cdFx0XHQvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XHJcblx0XHRcdGlmICggcnNMZWZ0ICkge1xyXG5cdFx0XHRcdGVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5sZWZ0O1xyXG5cdFx0XHR9XHJcblx0XHRcdHN0eWxlLmxlZnQgPSBuYW1lID09PSBcImZvbnRTaXplXCIgPyBcIjFlbVwiIDogcmV0O1xyXG5cdFx0XHRyZXQgPSBzdHlsZS5waXhlbExlZnQgKyBcInB4XCI7XHJcblxyXG5cdFx0XHQvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzXHJcblx0XHRcdHN0eWxlLmxlZnQgPSBsZWZ0O1xyXG5cdFx0XHRpZiAoIHJzTGVmdCApIHtcclxuXHRcdFx0XHRlbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gcnNMZWZ0O1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiYXV0b1wiIDogcmV0O1xyXG5cdH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7XHJcblx0dmFyIG1hdGNoZXMgPSBybnVtc3BsaXQuZXhlYyggdmFsdWUgKTtcclxuXHRyZXR1cm4gbWF0Y2hlcyA/XHJcblx0XHRcdE1hdGgubWF4KCAwLCBtYXRjaGVzWyAxIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAyIF0gfHwgXCJweFwiICkgOlxyXG5cdFx0XHR2YWx1ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gYXVnbWVudFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhLCBpc0JvcmRlckJveCApIHtcclxuXHR2YXIgaSA9IGV4dHJhID09PSAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICkgP1xyXG5cdFx0Ly8gSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSByaWdodCBtZWFzdXJlbWVudCwgYXZvaWQgYXVnbWVudGF0aW9uXHJcblx0XHQ0IDpcclxuXHRcdC8vIE90aGVyd2lzZSBpbml0aWFsaXplIGZvciBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHByb3BlcnRpZXNcclxuXHRcdG5hbWUgPT09IFwid2lkdGhcIiA/IDEgOiAwLFxyXG5cclxuXHRcdHZhbCA9IDA7XHJcblxyXG5cdGZvciAoIDsgaSA8IDQ7IGkgKz0gMiApIHtcclxuXHRcdC8vIGJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpbiwgc28gYWRkIGl0IGlmIHdlIHdhbnQgaXRcclxuXHRcdGlmICggZXh0cmEgPT09IFwibWFyZ2luXCIgKSB7XHJcblx0XHRcdC8vIHdlIHVzZSBqUXVlcnkuY3NzIGluc3RlYWQgb2YgY3VyQ1NTIGhlcmVcclxuXHRcdFx0Ly8gYmVjYXVzZSBvZiB0aGUgcmVsaWFibGVNYXJnaW5SaWdodCBDU1MgaG9vayFcclxuXHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgY3NzRXhwYW5kWyBpIF0sIHRydWUgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBGcm9tIHRoaXMgcG9pbnQgb24gd2UgdXNlIGN1ckNTUyBmb3IgbWF4aW11bSBwZXJmb3JtYW5jZSAocmVsZXZhbnQgaW4gYW5pbWF0aW9ucylcclxuXHRcdGlmICggaXNCb3JkZXJCb3ggKSB7XHJcblx0XHRcdC8vIGJvcmRlci1ib3ggaW5jbHVkZXMgcGFkZGluZywgc28gcmVtb3ZlIGl0IGlmIHdlIHdhbnQgY29udGVudFxyXG5cdFx0XHRpZiAoIGV4dHJhID09PSBcImNvbnRlbnRcIiApIHtcclxuXHRcdFx0XHR2YWwgLT0gcGFyc2VGbG9hdCggY3VyQ1NTKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdICkgKSB8fCAwO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBhdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBib3JkZXIgbm9yIG1hcmdpbiwgc28gcmVtb3ZlIGJvcmRlclxyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcIm1hcmdpblwiICkge1xyXG5cdFx0XHRcdHZhbCAtPSBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiApICkgfHwgMDtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gYXQgdGhpcyBwb2ludCwgZXh0cmEgaXNuJ3QgY29udGVudCwgc28gYWRkIHBhZGRpbmdcclxuXHRcdFx0dmFsICs9IHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSApICkgfHwgMDtcclxuXHJcblx0XHRcdC8vIGF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGNvbnRlbnQgbm9yIHBhZGRpbmcsIHNvIGFkZCBib3JkZXJcclxuXHRcdFx0aWYgKCBleHRyYSAhPT0gXCJwYWRkaW5nXCIgKSB7XHJcblx0XHRcdFx0dmFsICs9IHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiICkgKSB8fCAwO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdmFsO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApIHtcclxuXHJcblx0Ly8gU3RhcnQgd2l0aCBvZmZzZXQgcHJvcGVydHksIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJvcmRlci1ib3ggdmFsdWVcclxuXHR2YXIgdmFsID0gbmFtZSA9PT0gXCJ3aWR0aFwiID8gZWxlbS5vZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0SGVpZ2h0LFxyXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IHRydWUsXHJcblx0XHRpc0JvcmRlckJveCA9IGpRdWVyeS5zdXBwb3J0LmJveFNpemluZyAmJiBqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiICkgPT09IFwiYm9yZGVyLWJveFwiO1xyXG5cclxuXHQvLyBzb21lIG5vbi1odG1sIGVsZW1lbnRzIHJldHVybiB1bmRlZmluZWQgZm9yIG9mZnNldFdpZHRoLCBzbyBjaGVjayBmb3IgbnVsbC91bmRlZmluZWRcclxuXHQvLyBzdmcgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02NDkyODVcclxuXHQvLyBNYXRoTUwgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD00OTE2NjhcclxuXHRpZiAoIHZhbCA8PSAwIHx8IHZhbCA9PSBudWxsICkge1xyXG5cdFx0Ly8gRmFsbCBiYWNrIHRvIGNvbXB1dGVkIHRoZW4gdW5jb21wdXRlZCBjc3MgaWYgbmVjZXNzYXJ5XHJcblx0XHR2YWwgPSBjdXJDU1MoIGVsZW0sIG5hbWUgKTtcclxuXHRcdGlmICggdmFsIDwgMCB8fCB2YWwgPT0gbnVsbCApIHtcclxuXHRcdFx0dmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENvbXB1dGVkIHVuaXQgaXMgbm90IHBpeGVscy4gU3RvcCBoZXJlIGFuZCByZXR1cm4uXHJcblx0XHRpZiAoIHJudW1ub25weC50ZXN0KHZhbCkgKSB7XHJcblx0XHRcdHJldHVybiB2YWw7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gd2UgbmVlZCB0aGUgY2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXNcclxuXHRcdC8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGVcclxuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCAmJiAoIGpRdWVyeS5zdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlIHx8IHZhbCA9PT0gZWxlbS5zdHlsZVsgbmFtZSBdICk7XHJcblxyXG5cdFx0Ly8gTm9ybWFsaXplIFwiXCIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYVxyXG5cdFx0dmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDtcclxuXHR9XHJcblxyXG5cdC8vIHVzZSB0aGUgYWN0aXZlIGJveC1zaXppbmcgbW9kZWwgdG8gYWRkL3N1YnRyYWN0IGlycmVsZXZhbnQgc3R5bGVzXHJcblx0cmV0dXJuICggdmFsICtcclxuXHRcdGF1Z21lbnRXaWR0aE9ySGVpZ2h0KFxyXG5cdFx0XHRlbGVtLFxyXG5cdFx0XHRuYW1lLFxyXG5cdFx0XHRleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICksXHJcblx0XHRcdHZhbHVlSXNCb3JkZXJCb3hcclxuXHRcdClcclxuXHQpICsgXCJweFwiO1xyXG59XHJcblxyXG5cclxuLy8gVHJ5IHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBkaXNwbGF5IHZhbHVlIG9mIGFuIGVsZW1lbnRcclxuZnVuY3Rpb24gY3NzX2RlZmF1bHREaXNwbGF5KCBub2RlTmFtZSApIHtcclxuXHRpZiAoIGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdICkge1xyXG5cdFx0cmV0dXJuIGVsZW1kaXNwbGF5WyBub2RlTmFtZSBdO1xyXG5cdH1cclxuXHJcblx0dmFyIGVsZW0gPSBqUXVlcnkoIFwiPFwiICsgbm9kZU5hbWUgKyBcIj5cIiApLmFwcGVuZFRvKCBkb2N1bWVudC5ib2R5ICksXHJcblx0XHRkaXNwbGF5ID0gZWxlbS5jc3MoXCJkaXNwbGF5XCIpO1xyXG5cdGVsZW0ucmVtb3ZlKCk7XHJcblxyXG5cdC8vIElmIHRoZSBzaW1wbGUgd2F5IGZhaWxzLFxyXG5cdC8vIGdldCBlbGVtZW50J3MgcmVhbCBkZWZhdWx0IGRpc3BsYXkgYnkgYXR0YWNoaW5nIGl0IHRvIGEgdGVtcCBpZnJhbWVcclxuXHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiIHx8IGRpc3BsYXkgPT09IFwiXCIgKSB7XHJcblx0XHQvLyBVc2UgdGhlIGFscmVhZHktY3JlYXRlZCBpZnJhbWUgaWYgcG9zc2libGVcclxuXHRcdGlmcmFtZSA9IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoXHJcblx0XHRcdGlmcmFtZSB8fCBqUXVlcnkuZXh0ZW5kKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpLCB7XHJcblx0XHRcdFx0ZnJhbWVCb3JkZXI6IDAsXHJcblx0XHRcdFx0d2lkdGg6IDAsXHJcblx0XHRcdFx0aGVpZ2h0OiAwXHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdC8vIENyZWF0ZSBhIGNhY2hlYWJsZSBjb3B5IG9mIHRoZSBpZnJhbWUgZG9jdW1lbnQgb24gZmlyc3QgY2FsbC5cclxuXHRcdC8vIElFIGFuZCBPcGVyYSB3aWxsIGFsbG93IHVzIHRvIHJldXNlIHRoZSBpZnJhbWVEb2Mgd2l0aG91dCByZS13cml0aW5nIHRoZSBmYWtlIEhUTUxcclxuXHRcdC8vIGRvY3VtZW50IHRvIGl0OyBXZWJLaXQgJiBGaXJlZm94IHdvbid0IGFsbG93IHJldXNpbmcgdGhlIGlmcmFtZSBkb2N1bWVudC5cclxuXHRcdGlmICggIWlmcmFtZURvYyB8fCAhaWZyYW1lLmNyZWF0ZUVsZW1lbnQgKSB7XHJcblx0XHRcdGlmcmFtZURvYyA9ICggaWZyYW1lLmNvbnRlbnRXaW5kb3cgfHwgaWZyYW1lLmNvbnRlbnREb2N1bWVudCApLmRvY3VtZW50O1xyXG5cdFx0XHRpZnJhbWVEb2Mud3JpdGUoXCI8IWRvY3R5cGUgaHRtbD48aHRtbD48Ym9keT5cIik7XHJcblx0XHRcdGlmcmFtZURvYy5jbG9zZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGVsZW0gPSBpZnJhbWVEb2MuYm9keS5hcHBlbmRDaGlsZCggaWZyYW1lRG9jLmNyZWF0ZUVsZW1lbnQobm9kZU5hbWUpICk7XHJcblxyXG5cdFx0ZGlzcGxheSA9IGN1ckNTUyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcclxuXHRcdGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoIGlmcmFtZSApO1xyXG5cdH1cclxuXHJcblx0Ly8gU3RvcmUgdGhlIGNvcnJlY3QgZGVmYXVsdCBkaXNwbGF5XHJcblx0ZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF0gPSBkaXNwbGF5O1xyXG5cclxuXHRyZXR1cm4gZGlzcGxheTtcclxufVxyXG5cclxualF1ZXJ5LmVhY2goWyBcImhlaWdodFwiLCBcIndpZHRoXCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XHJcblx0alF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gPSB7XHJcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7XHJcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XHJcblx0XHRcdFx0Ly8gY2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtXHJcblx0XHRcdFx0Ly8gaG93ZXZlciwgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdCBmcm9tIHRoaXNcclxuXHRcdFx0XHRpZiAoIGVsZW0ub2Zmc2V0V2lkdGggPT09IDAgJiYgcmRpc3BsYXlzd2FwLnRlc3QoIGN1ckNTUyggZWxlbSwgXCJkaXNwbGF5XCIgKSApICkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5zd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cclxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBleHRyYSApIHtcclxuXHRcdFx0cmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgZXh0cmEgP1xyXG5cdFx0XHRcdGF1Z21lbnRXaWR0aE9ySGVpZ2h0KFxyXG5cdFx0XHRcdFx0ZWxlbSxcclxuXHRcdFx0XHRcdG5hbWUsXHJcblx0XHRcdFx0XHRleHRyYSxcclxuXHRcdFx0XHRcdGpRdWVyeS5zdXBwb3J0LmJveFNpemluZyAmJiBqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiICkgPT09IFwiYm9yZGVyLWJveFwiXHJcblx0XHRcdFx0KSA6IDBcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHR9O1xyXG59KTtcclxuXHJcbmlmICggIWpRdWVyeS5zdXBwb3J0Lm9wYWNpdHkgKSB7XHJcblx0alF1ZXJ5LmNzc0hvb2tzLm9wYWNpdHkgPSB7XHJcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcclxuXHRcdFx0Ly8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5XHJcblx0XHRcdHJldHVybiByb3BhY2l0eS50ZXN0KCAoY29tcHV0ZWQgJiYgZWxlbS5jdXJyZW50U3R5bGUgPyBlbGVtLmN1cnJlbnRTdHlsZS5maWx0ZXIgOiBlbGVtLnN0eWxlLmZpbHRlcikgfHwgXCJcIiApID9cclxuXHRcdFx0XHQoIDAuMDEgKiBwYXJzZUZsb2F0KCBSZWdFeHAuJDEgKSApICsgXCJcIiA6XHJcblx0XHRcdFx0Y29tcHV0ZWQgPyBcIjFcIiA6IFwiXCI7XHJcblx0XHR9LFxyXG5cclxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xyXG5cdFx0XHR2YXIgc3R5bGUgPSBlbGVtLnN0eWxlLFxyXG5cdFx0XHRcdGN1cnJlbnRTdHlsZSA9IGVsZW0uY3VycmVudFN0eWxlLFxyXG5cdFx0XHRcdG9wYWNpdHkgPSBqUXVlcnkuaXNOdW1lcmljKCB2YWx1ZSApID8gXCJhbHBoYShvcGFjaXR5PVwiICsgdmFsdWUgKiAxMDAgKyBcIilcIiA6IFwiXCIsXHJcblx0XHRcdFx0ZmlsdGVyID0gY3VycmVudFN0eWxlICYmIGN1cnJlbnRTdHlsZS5maWx0ZXIgfHwgc3R5bGUuZmlsdGVyIHx8IFwiXCI7XHJcblxyXG5cdFx0XHQvLyBJRSBoYXMgdHJvdWJsZSB3aXRoIG9wYWNpdHkgaWYgaXQgZG9lcyBub3QgaGF2ZSBsYXlvdXRcclxuXHRcdFx0Ly8gRm9yY2UgaXQgYnkgc2V0dGluZyB0aGUgem9vbSBsZXZlbFxyXG5cdFx0XHRzdHlsZS56b29tID0gMTtcclxuXHJcblx0XHRcdC8vIGlmIHNldHRpbmcgb3BhY2l0eSB0byAxLCBhbmQgbm8gb3RoZXIgZmlsdGVycyBleGlzdCAtIGF0dGVtcHQgdG8gcmVtb3ZlIGZpbHRlciBhdHRyaWJ1dGUgIzY2NTJcclxuXHRcdFx0aWYgKCB2YWx1ZSA+PSAxICYmIGpRdWVyeS50cmltKCBmaWx0ZXIucmVwbGFjZSggcmFscGhhLCBcIlwiICkgKSA9PT0gXCJcIiAmJlxyXG5cdFx0XHRcdHN0eWxlLnJlbW92ZUF0dHJpYnV0ZSApIHtcclxuXHJcblx0XHRcdFx0Ly8gU2V0dGluZyBzdHlsZS5maWx0ZXIgdG8gbnVsbCwgXCJcIiAmIFwiIFwiIHN0aWxsIGxlYXZlIFwiZmlsdGVyOlwiIGluIHRoZSBjc3NUZXh0XHJcblx0XHRcdFx0Ly8gaWYgXCJmaWx0ZXI6XCIgaXMgcHJlc2VudCBhdCBhbGwsIGNsZWFyVHlwZSBpcyBkaXNhYmxlZCwgd2Ugd2FudCB0byBhdm9pZCB0aGlzXHJcblx0XHRcdFx0Ly8gc3R5bGUucmVtb3ZlQXR0cmlidXRlIGlzIElFIE9ubHksIGJ1dCBzbyBhcHBhcmVudGx5IGlzIHRoaXMgY29kZSBwYXRoLi4uXHJcblx0XHRcdFx0c3R5bGUucmVtb3ZlQXR0cmlidXRlKCBcImZpbHRlclwiICk7XHJcblxyXG5cdFx0XHRcdC8vIGlmIHRoZXJlIHRoZXJlIGlzIG5vIGZpbHRlciBzdHlsZSBhcHBsaWVkIGluIGEgY3NzIHJ1bGUsIHdlIGFyZSBkb25lXHJcblx0XHRcdFx0aWYgKCBjdXJyZW50U3R5bGUgJiYgIWN1cnJlbnRTdHlsZS5maWx0ZXIgKSB7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBvdGhlcndpc2UsIHNldCBuZXcgZmlsdGVyIHZhbHVlc1xyXG5cdFx0XHRzdHlsZS5maWx0ZXIgPSByYWxwaGEudGVzdCggZmlsdGVyICkgP1xyXG5cdFx0XHRcdGZpbHRlci5yZXBsYWNlKCByYWxwaGEsIG9wYWNpdHkgKSA6XHJcblx0XHRcdFx0ZmlsdGVyICsgXCIgXCIgKyBvcGFjaXR5O1xyXG5cdFx0fVxyXG5cdH07XHJcbn1cclxuXHJcbi8vIFRoZXNlIGhvb2tzIGNhbm5vdCBiZSBhZGRlZCB1bnRpbCBET00gcmVhZHkgYmVjYXVzZSB0aGUgc3VwcG9ydCB0ZXN0XHJcbi8vIGZvciBpdCBpcyBub3QgcnVuIHVudGlsIGFmdGVyIERPTSByZWFkeVxyXG5qUXVlcnkoZnVuY3Rpb24oKSB7XHJcblx0aWYgKCAhalF1ZXJ5LnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCApIHtcclxuXHRcdGpRdWVyeS5jc3NIb29rcy5tYXJnaW5SaWdodCA9IHtcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XHJcblx0XHRcdFx0Ly8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0XHJcblx0XHRcdFx0Ly8gV29yayBhcm91bmQgYnkgdGVtcG9yYXJpbHkgc2V0dGluZyBlbGVtZW50IGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrXHJcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5zd2FwKCBlbGVtLCB7IFwiZGlzcGxheVwiOiBcImlubGluZS1ibG9ja1wiIH0sIGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0aWYgKCBjb21wdXRlZCApIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGN1ckNTUyggZWxlbSwgXCJtYXJnaW5SaWdodFwiICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHQvLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODRcclxuXHQvLyBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNwZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0XHJcblx0Ly8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIHdlIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmVcclxuXHRpZiAoICFqUXVlcnkuc3VwcG9ydC5waXhlbFBvc2l0aW9uICYmIGpRdWVyeS5mbi5wb3NpdGlvbiApIHtcclxuXHRcdGpRdWVyeS5lYWNoKCBbIFwidG9wXCIsIFwibGVmdFwiIF0sIGZ1bmN0aW9uKCBpLCBwcm9wICkge1xyXG5cdFx0XHRqUXVlcnkuY3NzSG9va3NbIHByb3AgXSA9IHtcclxuXHRcdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcclxuXHRcdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XHJcblx0XHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTtcclxuXHRcdFx0XHRcdFx0Ly8gaWYgY3VyQ1NTIHJldHVybnMgcGVyY2VudGFnZSwgZmFsbGJhY2sgdG8gb2Zmc2V0XHJcblx0XHRcdFx0XHRcdHJldHVybiBybnVtbm9ucHgudGVzdCggcmV0ICkgPyBqUXVlcnkoIGVsZW0gKS5wb3NpdGlvbigpWyBwcm9wIF0gKyBcInB4XCIgOiByZXQ7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxufSk7XHJcblxyXG5pZiAoIGpRdWVyeS5leHByICYmIGpRdWVyeS5leHByLmZpbHRlcnMgKSB7XHJcblx0alF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4gPSBmdW5jdGlvbiggZWxlbSApIHtcclxuXHRcdHJldHVybiAoIGVsZW0ub2Zmc2V0V2lkdGggPT09IDAgJiYgZWxlbS5vZmZzZXRIZWlnaHQgPT09IDAgKSB8fCAoIWpRdWVyeS5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyAmJiAoKGVsZW0uc3R5bGUgJiYgZWxlbS5zdHlsZS5kaXNwbGF5KSB8fCBjdXJDU1MoIGVsZW0sIFwiZGlzcGxheVwiICkpID09PSBcIm5vbmVcIik7XHJcblx0fTtcclxuXHJcblx0alF1ZXJ5LmV4cHIuZmlsdGVycy52aXNpYmxlID0gZnVuY3Rpb24oIGVsZW0gKSB7XHJcblx0XHRyZXR1cm4gIWpRdWVyeS5leHByLmZpbHRlcnMuaGlkZGVuKCBlbGVtICk7XHJcblx0fTtcclxufVxyXG5cclxuLy8gVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgYW5pbWF0ZSB0byBleHBhbmQgcHJvcGVydGllc1xyXG5qUXVlcnkuZWFjaCh7XHJcblx0bWFyZ2luOiBcIlwiLFxyXG5cdHBhZGRpbmc6IFwiXCIsXHJcblx0Ym9yZGVyOiBcIldpZHRoXCJcclxufSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkge1xyXG5cdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7XHJcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcclxuXHRcdFx0dmFyIGksXHJcblxyXG5cdFx0XHRcdC8vIGFzc3VtZXMgYSBzaW5nbGUgbnVtYmVyIGlmIG5vdCBhIHN0cmluZ1xyXG5cdFx0XHRcdHBhcnRzID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUuc3BsaXQoXCIgXCIpIDogWyB2YWx1ZSBdLFxyXG5cdFx0XHRcdGV4cGFuZGVkID0ge307XHJcblxyXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IDQ7IGkrKyApIHtcclxuXHRcdFx0XHRleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9XHJcblx0XHRcdFx0XHRwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBleHBhbmRlZDtcclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHRpZiAoICFybWFyZ2luLnRlc3QoIHByZWZpeCApICkge1xyXG5cdFx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXS5zZXQgPSBzZXRQb3NpdGl2ZU51bWJlcjtcclxuXHR9XHJcbn0pO1xyXG52YXIgcjIwID0gLyUyMC9nLFxyXG5cdHJicmFja2V0ID0gL1xcW1xcXSQvLFxyXG5cdHJDUkxGID0gL1xccj9cXG4vZyxcclxuXHRyaW5wdXQgPSAvXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksXHJcblx0cnNlbGVjdFRleHRhcmVhID0gL14oPzpzZWxlY3R8dGV4dGFyZWEpL2k7XHJcblxyXG5qUXVlcnkuZm4uZXh0ZW5kKHtcclxuXHRzZXJpYWxpemU6IGZ1bmN0aW9uKCkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7XHJcblx0fSxcclxuXHRzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KCB0aGlzLmVsZW1lbnRzICkgOiB0aGlzO1xyXG5cdFx0fSlcclxuXHRcdC5maWx0ZXIoZnVuY3Rpb24oKXtcclxuXHRcdFx0cmV0dXJuIHRoaXMubmFtZSAmJiAhdGhpcy5kaXNhYmxlZCAmJlxyXG5cdFx0XHRcdCggdGhpcy5jaGVja2VkIHx8IHJzZWxlY3RUZXh0YXJlYS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgfHxcclxuXHRcdFx0XHRcdHJpbnB1dC50ZXN0KCB0aGlzLnR5cGUgKSApO1xyXG5cdFx0fSlcclxuXHRcdC5tYXAoZnVuY3Rpb24oIGksIGVsZW0gKXtcclxuXHRcdFx0dmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpO1xyXG5cclxuXHRcdFx0cmV0dXJuIHZhbCA9PSBudWxsID9cclxuXHRcdFx0XHRudWxsIDpcclxuXHRcdFx0XHRqUXVlcnkuaXNBcnJheSggdmFsICkgP1xyXG5cdFx0XHRcdFx0alF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsLCBpICl7XHJcblx0XHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XHJcblx0XHRcdFx0XHR9KSA6XHJcblx0XHRcdFx0XHR7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XHJcblx0XHR9KS5nZXQoKTtcclxuXHR9XHJcbn0pO1xyXG5cclxuLy9TZXJpYWxpemUgYW4gYXJyYXkgb2YgZm9ybSBlbGVtZW50cyBvciBhIHNldCBvZlxyXG4vL2tleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZ1xyXG5qUXVlcnkucGFyYW0gPSBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7XHJcblx0dmFyIHByZWZpeCxcclxuXHRcdHMgPSBbXSxcclxuXHRcdGFkZCA9IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xyXG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWVcclxuXHRcdFx0dmFsdWUgPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSA/IHZhbHVlKCkgOiAoIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKTtcclxuXHRcdFx0c1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudCgga2V5ICkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTtcclxuXHRcdH07XHJcblxyXG5cdC8vIFNldCB0cmFkaXRpb25hbCB0byB0cnVlIGZvciBqUXVlcnkgPD0gMS4zLjIgYmVoYXZpb3IuXHJcblx0aWYgKCB0cmFkaXRpb25hbCA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0dHJhZGl0aW9uYWwgPSBqUXVlcnkuYWpheFNldHRpbmdzICYmIGpRdWVyeS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWw7XHJcblx0fVxyXG5cclxuXHQvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLlxyXG5cdGlmICggalF1ZXJ5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7XHJcblx0XHQvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxlbWVudHNcclxuXHRcdGpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHtcclxuXHRcdFx0YWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTtcclxuXHRcdH0pO1xyXG5cclxuXHR9IGVsc2Uge1xyXG5cdFx0Ly8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgXCJvbGRcIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXJcclxuXHRcdC8vIGRpZCBpdCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LlxyXG5cdFx0Zm9yICggcHJlZml4IGluIGEgKSB7XHJcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uXHJcblx0cmV0dXJuIHMuam9pbiggXCImXCIgKS5yZXBsYWNlKCByMjAsIFwiK1wiICk7XHJcbn07XHJcblxyXG5mdW5jdGlvbiBidWlsZFBhcmFtcyggcHJlZml4LCBvYmosIHRyYWRpdGlvbmFsLCBhZGQgKSB7XHJcblx0dmFyIG5hbWU7XHJcblxyXG5cdGlmICggalF1ZXJ5LmlzQXJyYXkoIG9iaiApICkge1xyXG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXHJcblx0XHRqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHtcclxuXHRcdFx0aWYgKCB0cmFkaXRpb25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVmaXggKSApIHtcclxuXHRcdFx0XHQvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuXHJcblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gSWYgYXJyYXkgaXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzXHJcblx0XHRcdFx0Ly8gbnVtZXJpYyBpbmRleCB0byByZXNvbHZlIGRlc2VyaWFsaXphdGlvbiBhbWJpZ3VpdHkgaXNzdWVzLlxyXG5cdFx0XHRcdC8vIE5vdGUgdGhhdCByYWNrIChhcyBvZiAxLjAuMCkgY2FuJ3QgY3VycmVudGx5IGRlc2VyaWFsaXplXHJcblx0XHRcdFx0Ly8gbmVzdGVkIGFycmF5cyBwcm9wZXJseSwgYW5kIGF0dGVtcHRpbmcgdG8gZG8gc28gbWF5IGNhdXNlXHJcblx0XHRcdFx0Ly8gYSBzZXJ2ZXIgZXJyb3IuIFBvc3NpYmxlIGZpeGVzIGFyZSB0byBtb2RpZnkgcmFjaydzXHJcblx0XHRcdFx0Ly8gZGVzZXJpYWxpemF0aW9uIGFsZ29yaXRobSBvciB0byBwcm92aWRlIGFuIG9wdGlvbiBvciBmbGFnXHJcblx0XHRcdFx0Ly8gdG8gZm9yY2UgYXJyYXkgc2VyaWFsaXphdGlvbiB0byBiZSBzaGFsbG93LlxyXG5cdFx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArICggdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgPyBpIDogXCJcIiApICsgXCJdXCIsIHYsIHRyYWRpdGlvbmFsLCBhZGQgKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiBqUXVlcnkudHlwZSggb2JqICkgPT09IFwib2JqZWN0XCIgKSB7XHJcblx0XHQvLyBTZXJpYWxpemUgb2JqZWN0IGl0ZW0uXHJcblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcclxuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCArIFwiW1wiICsgbmFtZSArIFwiXVwiLCBvYmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xyXG5cdFx0fVxyXG5cclxuXHR9IGVsc2Uge1xyXG5cdFx0Ly8gU2VyaWFsaXplIHNjYWxhciBpdGVtLlxyXG5cdFx0YWRkKCBwcmVmaXgsIG9iaiApO1xyXG5cdH1cclxufVxyXG52YXIgLy8gRG9jdW1lbnQgbG9jYXRpb25cclxuXHRhamF4TG9jYXRpb24sXHJcblx0Ly8gRG9jdW1lbnQgbG9jYXRpb24gc2VnbWVudHNcclxuXHRhamF4TG9jUGFydHMsXHJcblxyXG5cdHJoYXNoID0gLyMuKiQvLFxyXG5cdHJoZWFkZXJzID0gL14oLio/KTpbIFxcdF0qKFteXFxyXFxuXSopXFxyPyQvbWcsIC8vIElFIGxlYXZlcyBhbiBcXHIgY2hhcmFjdGVyIGF0IEVPTFxyXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxyXG5cdHJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwXFwtc3RvcmFnZXwuK1xcLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxyXG5cdHJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLFxyXG5cdHJwcm90b2NvbCA9IC9eXFwvXFwvLyxcclxuXHRycXVlcnkgPSAvXFw/LyxcclxuXHRyc2NyaXB0ID0gLzxzY3JpcHRcXGJbXjxdKig/Oig/ITxcXC9zY3JpcHQ+KTxbXjxdKikqPFxcL3NjcmlwdD4vZ2ksXHJcblx0cnRzID0gLyhbPyZdKV89W14mXSovLFxyXG5cdHJ1cmwgPSAvXihbXFx3XFwrXFwuXFwtXSs6KSg/OlxcL1xcLyhbXlxcLz8jOl0qKSg/OjooXFxkKyl8KXwpLyxcclxuXHJcblx0Ly8gS2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkIG1ldGhvZFxyXG5cdF9sb2FkID0galF1ZXJ5LmZuLmxvYWQsXHJcblxyXG5cdC8qIFByZWZpbHRlcnNcclxuXHQgKiAxKSBUaGV5IGFyZSB1c2VmdWwgdG8gaW50cm9kdWNlIGN1c3RvbSBkYXRhVHlwZXMgKHNlZSBhamF4L2pzb25wLmpzIGZvciBhbiBleGFtcGxlKVxyXG5cdCAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6XHJcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxyXG5cdCAqICAgIC0gQUZURVIgcGFyYW0gc2VyaWFsaXphdGlvbiAocy5kYXRhIGlzIGEgc3RyaW5nIGlmIHMucHJvY2Vzc0RhdGEgaXMgdHJ1ZSlcclxuXHQgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlXHJcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxyXG5cdCAqIDUpIGV4ZWN1dGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGNvbnRpbnVlIGRvd24gdG8gXCIqXCIgaWYgbmVlZGVkXHJcblx0ICovXHJcblx0cHJlZmlsdGVycyA9IHt9LFxyXG5cclxuXHQvKiBUcmFuc3BvcnRzIGJpbmRpbmdzXHJcblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxyXG5cdCAqIDIpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcclxuXHQgKiAzKSBzZWxlY3Rpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBnbyB0byBcIipcIiBpZiBuZWVkZWRcclxuXHQgKi9cclxuXHR0cmFuc3BvcnRzID0ge30sXHJcblxyXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxyXG5cdGFsbFR5cGVzID0gW1wiKi9cIl0gKyBbXCIqXCJdO1xyXG5cclxuLy8gIzgxMzgsIElFIG1heSB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmdcclxuLy8gYSBmaWVsZCBmcm9tIHdpbmRvdy5sb2NhdGlvbiBpZiBkb2N1bWVudC5kb21haW4gaGFzIGJlZW4gc2V0XHJcbnRyeSB7XHJcblx0YWpheExvY2F0aW9uID0gbG9jYXRpb24uaHJlZjtcclxufSBjYXRjaCggZSApIHtcclxuXHQvLyBVc2UgdGhlIGhyZWYgYXR0cmlidXRlIG9mIGFuIEEgZWxlbWVudFxyXG5cdC8vIHNpbmNlIElFIHdpbGwgbW9kaWZ5IGl0IGdpdmVuIGRvY3VtZW50LmxvY2F0aW9uXHJcblx0YWpheExvY2F0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJhXCIgKTtcclxuXHRhamF4TG9jYXRpb24uaHJlZiA9IFwiXCI7XHJcblx0YWpheExvY2F0aW9uID0gYWpheExvY2F0aW9uLmhyZWY7XHJcbn1cclxuXHJcbi8vIFNlZ21lbnQgbG9jYXRpb24gaW50byBwYXJ0c1xyXG5hamF4TG9jUGFydHMgPSBydXJsLmV4ZWMoIGFqYXhMb2NhdGlvbi50b0xvd2VyQ2FzZSgpICkgfHwgW107XHJcblxyXG4vLyBCYXNlIFwiY29uc3RydWN0b3JcIiBmb3IgalF1ZXJ5LmFqYXhQcmVmaWx0ZXIgYW5kIGpRdWVyeS5hamF4VHJhbnNwb3J0XHJcbmZ1bmN0aW9uIGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlICkge1xyXG5cclxuXHQvLyBkYXRhVHlwZUV4cHJlc3Npb24gaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIFwiKlwiXHJcblx0cmV0dXJuIGZ1bmN0aW9uKCBkYXRhVHlwZUV4cHJlc3Npb24sIGZ1bmMgKSB7XHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgZGF0YVR5cGVFeHByZXNzaW9uICE9PSBcInN0cmluZ1wiICkge1xyXG5cdFx0XHRmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uO1xyXG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgZGF0YVR5cGUsIGxpc3QsIHBsYWNlQmVmb3JlLFxyXG5cdFx0XHRkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5zcGxpdCggY29yZV9yc3BhY2UgKSxcclxuXHRcdFx0aSA9IDAsXHJcblx0XHRcdGxlbmd0aCA9IGRhdGFUeXBlcy5sZW5ndGg7XHJcblxyXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZnVuYyApICkge1xyXG5cdFx0XHQvLyBGb3IgZWFjaCBkYXRhVHlwZSBpbiB0aGUgZGF0YVR5cGVFeHByZXNzaW9uXHJcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xyXG5cdFx0XHRcdGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpIF07XHJcblx0XHRcdFx0Ly8gV2UgY29udHJvbCBpZiB3ZSdyZSBhc2tlZCB0byBhZGQgYmVmb3JlXHJcblx0XHRcdFx0Ly8gYW55IGV4aXN0aW5nIGVsZW1lbnRcclxuXHRcdFx0XHRwbGFjZUJlZm9yZSA9IC9eXFwrLy50ZXN0KCBkYXRhVHlwZSApO1xyXG5cdFx0XHRcdGlmICggcGxhY2VCZWZvcmUgKSB7XHJcblx0XHRcdFx0XHRkYXRhVHlwZSA9IGRhdGFUeXBlLnN1YnN0ciggMSApIHx8IFwiKlwiO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRsaXN0ID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdO1xyXG5cdFx0XHRcdC8vIHRoZW4gd2UgYWRkIHRvIHRoZSBzdHJ1Y3R1cmUgYWNjb3JkaW5nbHlcclxuXHRcdFx0XHRsaXN0WyBwbGFjZUJlZm9yZSA/IFwidW5zaGlmdFwiIDogXCJwdXNoXCIgXSggZnVuYyApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fTtcclxufVxyXG5cclxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXHJcbmZ1bmN0aW9uIGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIsXHJcblx0XHRkYXRhVHlwZSAvKiBpbnRlcm5hbCAqLywgaW5zcGVjdGVkIC8qIGludGVybmFsICovICkge1xyXG5cclxuXHRkYXRhVHlwZSA9IGRhdGFUeXBlIHx8IG9wdGlvbnMuZGF0YVR5cGVzWyAwIF07XHJcblx0aW5zcGVjdGVkID0gaW5zcGVjdGVkIHx8IHt9O1xyXG5cclxuXHRpbnNwZWN0ZWRbIGRhdGFUeXBlIF0gPSB0cnVlO1xyXG5cclxuXHR2YXIgc2VsZWN0aW9uLFxyXG5cdFx0bGlzdCA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSxcclxuXHRcdGkgPSAwLFxyXG5cdFx0bGVuZ3RoID0gbGlzdCA/IGxpc3QubGVuZ3RoIDogMCxcclxuXHRcdGV4ZWN1dGVPbmx5ID0gKCBzdHJ1Y3R1cmUgPT09IHByZWZpbHRlcnMgKTtcclxuXHJcblx0Zm9yICggOyBpIDwgbGVuZ3RoICYmICggZXhlY3V0ZU9ubHkgfHwgIXNlbGVjdGlvbiApOyBpKysgKSB7XHJcblx0XHRzZWxlY3Rpb24gPSBsaXN0WyBpIF0oIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcclxuXHRcdC8vIElmIHdlIGdvdCByZWRpcmVjdGVkIHRvIGFub3RoZXIgZGF0YVR5cGVcclxuXHRcdC8vIHdlIHRyeSB0aGVyZSBpZiBleGVjdXRpbmcgb25seSBhbmQgbm90IGRvbmUgYWxyZWFkeVxyXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0aW9uID09PSBcInN0cmluZ1wiICkge1xyXG5cdFx0XHRpZiAoICFleGVjdXRlT25seSB8fCBpbnNwZWN0ZWRbIHNlbGVjdGlvbiBdICkge1xyXG5cdFx0XHRcdHNlbGVjdGlvbiA9IHVuZGVmaW5lZDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBzZWxlY3Rpb24gKTtcclxuXHRcdFx0XHRzZWxlY3Rpb24gPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyhcclxuXHRcdFx0XHRcdFx0c3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSLCBzZWxlY3Rpb24sIGluc3BlY3RlZCApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdC8vIElmIHdlJ3JlIG9ubHkgZXhlY3V0aW5nIG9yIG5vdGhpbmcgd2FzIHNlbGVjdGVkXHJcblx0Ly8gd2UgdHJ5IHRoZSBjYXRjaGFsbCBkYXRhVHlwZSBpZiBub3QgZG9uZSBhbHJlYWR5XHJcblx0aWYgKCAoIGV4ZWN1dGVPbmx5IHx8ICFzZWxlY3Rpb24gKSAmJiAhaW5zcGVjdGVkWyBcIipcIiBdICkge1xyXG5cdFx0c2VsZWN0aW9uID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoXHJcblx0XHRcdFx0c3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSLCBcIipcIiwgaW5zcGVjdGVkICk7XHJcblx0fVxyXG5cdC8vIHVubmVjZXNzYXJ5IHdoZW4gb25seSBleGVjdXRpbmcgKHByZWZpbHRlcnMpXHJcblx0Ly8gYnV0IGl0J2xsIGJlIGlnbm9yZWQgYnkgdGhlIGNhbGxlciBpbiB0aGF0IGNhc2VcclxuXHRyZXR1cm4gc2VsZWN0aW9uO1xyXG59XHJcblxyXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcclxuLy8gdGhhdCB0YWtlcyBcImZsYXRcIiBvcHRpb25zIChub3QgdG8gYmUgZGVlcCBleHRlbmRlZClcclxuLy8gRml4ZXMgIzk4ODdcclxuZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7XHJcblx0dmFyIGtleSwgZGVlcCxcclxuXHRcdGZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTtcclxuXHRmb3IgKCBrZXkgaW4gc3JjICkge1xyXG5cdFx0aWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XHJcblx0XHRcdCggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8ICggZGVlcCA9IHt9ICkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmICggZGVlcCApIHtcclxuXHRcdGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApO1xyXG5cdH1cclxufVxyXG5cclxualF1ZXJ5LmZuLmxvYWQgPSBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkge1xyXG5cdGlmICggdHlwZW9mIHVybCAhPT0gXCJzdHJpbmdcIiAmJiBfbG9hZCApIHtcclxuXHRcdHJldHVybiBfbG9hZC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XHJcblx0fVxyXG5cclxuXHQvLyBEb24ndCBkbyBhIHJlcXVlc3QgaWYgbm8gZWxlbWVudHMgYXJlIGJlaW5nIHJlcXVlc3RlZFxyXG5cdGlmICggIXRoaXMubGVuZ3RoICkge1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fVxyXG5cclxuXHR2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLFxyXG5cdFx0c2VsZiA9IHRoaXMsXHJcblx0XHRvZmYgPSB1cmwuaW5kZXhPZihcIiBcIik7XHJcblxyXG5cdGlmICggb2ZmID49IDAgKSB7XHJcblx0XHRzZWxlY3RvciA9IHVybC5zbGljZSggb2ZmLCB1cmwubGVuZ3RoICk7XHJcblx0XHR1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApO1xyXG5cdH1cclxuXHJcblx0Ly8gSWYgaXQncyBhIGZ1bmN0aW9uXHJcblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7XHJcblxyXG5cdFx0Ly8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2tcclxuXHRcdGNhbGxiYWNrID0gcGFyYW1zO1xyXG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xyXG5cclxuXHQvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nXHJcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XHJcblx0XHR0eXBlID0gXCJQT1NUXCI7XHJcblx0fVxyXG5cclxuXHQvLyBSZXF1ZXN0IHRoZSByZW1vdGUgZG9jdW1lbnRcclxuXHRqUXVlcnkuYWpheCh7XHJcblx0XHR1cmw6IHVybCxcclxuXHJcblx0XHQvLyBpZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkXHJcblx0XHR0eXBlOiB0eXBlLFxyXG5cdFx0ZGF0YVR5cGU6IFwiaHRtbFwiLFxyXG5cdFx0ZGF0YTogcGFyYW1zLFxyXG5cdFx0Y29tcGxldGU6IGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkge1xyXG5cdFx0XHRpZiAoIGNhbGxiYWNrICkge1xyXG5cdFx0XHRcdHNlbGYuZWFjaCggY2FsbGJhY2ssIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0pLmRvbmUoZnVuY3Rpb24oIHJlc3BvbnNlVGV4dCApIHtcclxuXHJcblx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcclxuXHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xyXG5cclxuXHRcdC8vIFNlZSBpZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWRcclxuXHRcdHNlbGYuaHRtbCggc2VsZWN0b3IgP1xyXG5cclxuXHRcdFx0Ly8gQ3JlYXRlIGEgZHVtbXkgZGl2IHRvIGhvbGQgdGhlIHJlc3VsdHNcclxuXHRcdFx0alF1ZXJ5KFwiPGRpdj5cIilcclxuXHJcblx0XHRcdFx0Ly8gaW5qZWN0IHRoZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQgaW4sIHJlbW92aW5nIHRoZSBzY3JpcHRzXHJcblx0XHRcdFx0Ly8gdG8gYXZvaWQgYW55ICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzIGluIElFXHJcblx0XHRcdFx0LmFwcGVuZCggcmVzcG9uc2VUZXh0LnJlcGxhY2UoIHJzY3JpcHQsIFwiXCIgKSApXHJcblxyXG5cdFx0XHRcdC8vIExvY2F0ZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzXHJcblx0XHRcdFx0LmZpbmQoIHNlbGVjdG9yICkgOlxyXG5cclxuXHRcdFx0Ly8gSWYgbm90LCBqdXN0IGluamVjdCB0aGUgZnVsbCByZXN1bHRcclxuXHRcdFx0cmVzcG9uc2VUZXh0ICk7XHJcblxyXG5cdH0pO1xyXG5cclxuXHRyZXR1cm4gdGhpcztcclxufTtcclxuXHJcbi8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29tbW9uIEFKQVggZXZlbnRzXHJcbmpRdWVyeS5lYWNoKCBcImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kXCIuc3BsaXQoIFwiIFwiICksIGZ1bmN0aW9uKCBpLCBvICl7XHJcblx0alF1ZXJ5LmZuWyBvIF0gPSBmdW5jdGlvbiggZiApe1xyXG5cdFx0cmV0dXJuIHRoaXMub24oIG8sIGYgKTtcclxuXHR9O1xyXG59KTtcclxuXHJcbmpRdWVyeS5lYWNoKCBbIFwiZ2V0XCIsIFwicG9zdFwiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7XHJcblx0alF1ZXJ5WyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkge1xyXG5cdFx0Ly8gc2hpZnQgYXJndW1lbnRzIGlmIGRhdGEgYXJndW1lbnQgd2FzIG9taXR0ZWRcclxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHtcclxuXHRcdFx0dHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7XHJcblx0XHRcdGNhbGxiYWNrID0gZGF0YTtcclxuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4galF1ZXJ5LmFqYXgoe1xyXG5cdFx0XHR0eXBlOiBtZXRob2QsXHJcblx0XHRcdHVybDogdXJsLFxyXG5cdFx0XHRkYXRhOiBkYXRhLFxyXG5cdFx0XHRzdWNjZXNzOiBjYWxsYmFjayxcclxuXHRcdFx0ZGF0YVR5cGU6IHR5cGVcclxuXHRcdH0pO1xyXG5cdH07XHJcbn0pO1xyXG5cclxualF1ZXJ5LmV4dGVuZCh7XHJcblxyXG5cdGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCB1bmRlZmluZWQsIGNhbGxiYWNrLCBcInNjcmlwdFwiICk7XHJcblx0fSxcclxuXHJcblx0Z2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFjaywgXCJqc29uXCIgKTtcclxuXHR9LFxyXG5cclxuXHQvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldFxyXG5cdC8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy5cclxuXHQvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLlxyXG5cdGFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7XHJcblx0XHRpZiAoIHNldHRpbmdzICkge1xyXG5cdFx0XHQvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9iamVjdFxyXG5cdFx0XHRhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGluZ3MgKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3NcclxuXHRcdFx0c2V0dGluZ3MgPSB0YXJnZXQ7XHJcblx0XHRcdHRhcmdldCA9IGpRdWVyeS5hamF4U2V0dGluZ3M7XHJcblx0XHR9XHJcblx0XHRhamF4RXh0ZW5kKCB0YXJnZXQsIHNldHRpbmdzICk7XHJcblx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cdH0sXHJcblxyXG5cdGFqYXhTZXR0aW5nczoge1xyXG5cdFx0dXJsOiBhamF4TG9jYXRpb24sXHJcblx0XHRpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBhamF4TG9jUGFydHNbIDEgXSApLFxyXG5cdFx0Z2xvYmFsOiB0cnVlLFxyXG5cdFx0dHlwZTogXCJHRVRcIixcclxuXHRcdGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOFwiLFxyXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXHJcblx0XHRhc3luYzogdHJ1ZSxcclxuXHRcdC8qXHJcblx0XHR0aW1lb3V0OiAwLFxyXG5cdFx0ZGF0YTogbnVsbCxcclxuXHRcdGRhdGFUeXBlOiBudWxsLFxyXG5cdFx0dXNlcm5hbWU6IG51bGwsXHJcblx0XHRwYXNzd29yZDogbnVsbCxcclxuXHRcdGNhY2hlOiBudWxsLFxyXG5cdFx0dGhyb3dzOiBmYWxzZSxcclxuXHRcdHRyYWRpdGlvbmFsOiBmYWxzZSxcclxuXHRcdGhlYWRlcnM6IHt9LFxyXG5cdFx0Ki9cclxuXHJcblx0XHRhY2NlcHRzOiB7XHJcblx0XHRcdHhtbDogXCJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sXCIsXHJcblx0XHRcdGh0bWw6IFwidGV4dC9odG1sXCIsXHJcblx0XHRcdHRleHQ6IFwidGV4dC9wbGFpblwiLFxyXG5cdFx0XHRqc29uOiBcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdFwiLFxyXG5cdFx0XHRcIipcIjogYWxsVHlwZXNcclxuXHRcdH0sXHJcblxyXG5cdFx0Y29udGVudHM6IHtcclxuXHRcdFx0eG1sOiAveG1sLyxcclxuXHRcdFx0aHRtbDogL2h0bWwvLFxyXG5cdFx0XHRqc29uOiAvanNvbi9cclxuXHRcdH0sXHJcblxyXG5cdFx0cmVzcG9uc2VGaWVsZHM6IHtcclxuXHRcdFx0eG1sOiBcInJlc3BvbnNlWE1MXCIsXHJcblx0XHRcdHRleHQ6IFwicmVzcG9uc2VUZXh0XCJcclxuXHRcdH0sXHJcblxyXG5cdFx0Ly8gTGlzdCBvZiBkYXRhIGNvbnZlcnRlcnNcclxuXHRcdC8vIDEpIGtleSBmb3JtYXQgaXMgXCJzb3VyY2VfdHlwZSBkZXN0aW5hdGlvbl90eXBlXCIgKGEgc2luZ2xlIHNwYWNlIGluLWJldHdlZW4pXHJcblx0XHQvLyAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkIGZvciBzb3VyY2VfdHlwZVxyXG5cdFx0Y29udmVydGVyczoge1xyXG5cclxuXHRcdFx0Ly8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0XHJcblx0XHRcdFwiKiB0ZXh0XCI6IHdpbmRvdy5TdHJpbmcsXHJcblxyXG5cdFx0XHQvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbilcclxuXHRcdFx0XCJ0ZXh0IGh0bWxcIjogdHJ1ZSxcclxuXHJcblx0XHRcdC8vIEV2YWx1YXRlIHRleHQgYXMgYSBqc29uIGV4cHJlc3Npb25cclxuXHRcdFx0XCJ0ZXh0IGpzb25cIjogalF1ZXJ5LnBhcnNlSlNPTixcclxuXHJcblx0XHRcdC8vIFBhcnNlIHRleHQgYXMgeG1sXHJcblx0XHRcdFwidGV4dCB4bWxcIjogalF1ZXJ5LnBhcnNlWE1MXHJcblx0XHR9LFxyXG5cclxuXHRcdC8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6XHJcblx0XHQvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmXHJcblx0XHQvLyBhbmQgd2hlbiB5b3UgY3JlYXRlIG9uZSB0aGF0IHNob3VsZG4ndCBiZVxyXG5cdFx0Ly8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpXHJcblx0XHRmbGF0T3B0aW9uczoge1xyXG5cdFx0XHRjb250ZXh0OiB0cnVlLFxyXG5cdFx0XHR1cmw6IHRydWVcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRhamF4UHJlZmlsdGVyOiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMgKSxcclxuXHRhamF4VHJhbnNwb3J0OiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMgKSxcclxuXHJcblx0Ly8gTWFpbiBtZXRob2RcclxuXHRhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkge1xyXG5cclxuXHRcdC8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlXHJcblx0XHRpZiAoIHR5cGVvZiB1cmwgPT09IFwib2JqZWN0XCIgKSB7XHJcblx0XHRcdG9wdGlvbnMgPSB1cmw7XHJcblx0XHRcdHVybCA9IHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBGb3JjZSBvcHRpb25zIHRvIGJlIGFuIG9iamVjdFxyXG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XHJcblxyXG5cdFx0dmFyIC8vIGlmTW9kaWZpZWQga2V5XHJcblx0XHRcdGlmTW9kaWZpZWRLZXksXHJcblx0XHRcdC8vIFJlc3BvbnNlIGhlYWRlcnNcclxuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nLFxyXG5cdFx0XHRyZXNwb25zZUhlYWRlcnMsXHJcblx0XHRcdC8vIHRyYW5zcG9ydFxyXG5cdFx0XHR0cmFuc3BvcnQsXHJcblx0XHRcdC8vIHRpbWVvdXQgaGFuZGxlXHJcblx0XHRcdHRpbWVvdXRUaW1lcixcclxuXHRcdFx0Ly8gQ3Jvc3MtZG9tYWluIGRldGVjdGlvbiB2YXJzXHJcblx0XHRcdHBhcnRzLFxyXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcclxuXHRcdFx0ZmlyZUdsb2JhbHMsXHJcblx0XHRcdC8vIExvb3AgdmFyaWFibGVcclxuXHRcdFx0aSxcclxuXHRcdFx0Ly8gQ3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdFxyXG5cdFx0XHRzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSxcclxuXHRcdFx0Ly8gQ2FsbGJhY2tzIGNvbnRleHRcclxuXHRcdFx0Y2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsXHJcblx0XHRcdC8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHNcclxuXHRcdFx0Ly8gSXQncyB0aGUgY2FsbGJhY2tDb250ZXh0IGlmIG9uZSB3YXMgcHJvdmlkZWQgaW4gdGhlIG9wdGlvbnNcclxuXHRcdFx0Ly8gYW5kIGlmIGl0J3MgYSBET00gbm9kZSBvciBhIGpRdWVyeSBjb2xsZWN0aW9uXHJcblx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dCA9IGNhbGxiYWNrQ29udGV4dCAhPT0gcyAmJlxyXG5cdFx0XHRcdCggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSApID9cclxuXHRcdFx0XHRcdFx0alF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6IGpRdWVyeS5ldmVudCxcclxuXHRcdFx0Ly8gRGVmZXJyZWRzXHJcblx0XHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksXHJcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcclxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3NcclxuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcclxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcclxuXHRcdFx0cmVxdWVzdEhlYWRlcnMgPSB7fSxcclxuXHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LFxyXG5cdFx0XHQvLyBUaGUganFYSFIgc3RhdGVcclxuXHRcdFx0c3RhdGUgPSAwLFxyXG5cdFx0XHQvLyBEZWZhdWx0IGFib3J0IG1lc3NhZ2VcclxuXHRcdFx0c3RyQWJvcnQgPSBcImNhbmNlbGVkXCIsXHJcblx0XHRcdC8vIEZha2UgeGhyXHJcblx0XHRcdGpxWEhSID0ge1xyXG5cclxuXHRcdFx0XHRyZWFkeVN0YXRlOiAwLFxyXG5cclxuXHRcdFx0XHQvLyBDYWNoZXMgdGhlIGhlYWRlclxyXG5cdFx0XHRcdHNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcclxuXHRcdFx0XHRcdGlmICggIXN0YXRlICkge1xyXG5cdFx0XHRcdFx0XHR2YXIgbG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XHJcblx0XHRcdFx0XHRcdG5hbWUgPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbG5hbWUgXSB8fCBuYW1lO1xyXG5cdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc1sgbmFtZSBdID0gdmFsdWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdFx0XHR9LFxyXG5cclxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXHJcblx0XHRcdFx0Z2V0QWxsUmVzcG9uc2VIZWFkZXJzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdHJldHVybiBzdGF0ZSA9PT0gMiA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XHJcblx0XHRcdFx0fSxcclxuXHJcblx0XHRcdFx0Ly8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZFxyXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xyXG5cdFx0XHRcdFx0dmFyIG1hdGNoO1xyXG5cdFx0XHRcdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcclxuXHRcdFx0XHRcdFx0aWYgKCAhcmVzcG9uc2VIZWFkZXJzICkge1xyXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVycyA9IHt9O1xyXG5cdFx0XHRcdFx0XHRcdHdoaWxlKCAoIG1hdGNoID0gcmhlYWRlcnMuZXhlYyggcmVzcG9uc2VIZWFkZXJzU3RyaW5nICkgKSApIHtcclxuXHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0bWF0Y2ggPSByZXNwb25zZUhlYWRlcnNbIGtleS50b0xvd2VyQ2FzZSgpIF07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT09IHVuZGVmaW5lZCA/IG51bGwgOiBtYXRjaDtcclxuXHRcdFx0XHR9LFxyXG5cclxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxyXG5cdFx0XHRcdG92ZXJyaWRlTWltZVR5cGU6IGZ1bmN0aW9uKCB0eXBlICkge1xyXG5cdFx0XHRcdFx0aWYgKCAhc3RhdGUgKSB7XHJcblx0XHRcdFx0XHRcdHMubWltZVR5cGUgPSB0eXBlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XHJcblx0XHRcdFx0fSxcclxuXHJcblx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSByZXF1ZXN0XHJcblx0XHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkge1xyXG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XHJcblx0XHRcdFx0XHRpZiAoIHRyYW5zcG9ydCApIHtcclxuXHRcdFx0XHRcdFx0dHJhbnNwb3J0LmFib3J0KCBzdGF0dXNUZXh0ICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRkb25lKCAwLCBzdGF0dXNUZXh0ICk7XHJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH07XHJcblxyXG5cdFx0Ly8gQ2FsbGJhY2sgZm9yIHdoZW4gZXZlcnl0aGluZyBpcyBkb25lXHJcblx0XHQvLyBJdCBpcyBkZWZpbmVkIGhlcmUgYmVjYXVzZSBqc2xpbnQgY29tcGxhaW5zIGlmIGl0IGlzIGRlY2xhcmVkXHJcblx0XHQvLyBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiAod2hpY2ggd291bGQgYmUgbW9yZSBsb2dpY2FsIGFuZCByZWFkYWJsZSlcclxuXHRcdGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkge1xyXG5cdFx0XHR2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLFxyXG5cdFx0XHRcdHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0O1xyXG5cclxuXHRcdFx0Ly8gQ2FsbGVkIG9uY2VcclxuXHRcdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFN0YXRlIGlzIFwiZG9uZVwiIG5vd1xyXG5cdFx0XHRzdGF0ZSA9IDI7XHJcblxyXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xyXG5cdFx0XHRpZiAoIHRpbWVvdXRUaW1lciApIHtcclxuXHRcdFx0XHRjbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvblxyXG5cdFx0XHQvLyAobm8gbWF0dGVyIGhvdyBsb25nIHRoZSBqcVhIUiBvYmplY3Qgd2lsbCBiZSB1c2VkKVxyXG5cdFx0XHR0cmFuc3BvcnQgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0XHQvLyBDYWNoZSByZXNwb25zZSBoZWFkZXJzXHJcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyA9IGhlYWRlcnMgfHwgXCJcIjtcclxuXHJcblx0XHRcdC8vIFNldCByZWFkeVN0YXRlXHJcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSBzdGF0dXMgPiAwID8gNCA6IDA7XHJcblxyXG5cdFx0XHQvLyBHZXQgcmVzcG9uc2UgZGF0YVxyXG5cdFx0XHRpZiAoIHJlc3BvbnNlcyApIHtcclxuXHRcdFx0XHRyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmdcclxuXHRcdFx0aWYgKCBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCB8fCBzdGF0dXMgPT09IDMwNCApIHtcclxuXHJcblx0XHRcdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cclxuXHRcdFx0XHRpZiAoIHMuaWZNb2RpZmllZCApIHtcclxuXHJcblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKFwiTGFzdC1Nb2RpZmllZFwiKTtcclxuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XHJcblx0XHRcdFx0XHRcdGpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSA9IG1vZGlmaWVkO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlcihcIkV0YWdcIik7XHJcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xyXG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgaWZNb2RpZmllZEtleSBdID0gbW9kaWZpZWQ7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBJZiBub3QgbW9kaWZpZWRcclxuXHRcdFx0XHRpZiAoIHN0YXR1cyA9PT0gMzA0ICkge1xyXG5cclxuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vdG1vZGlmaWVkXCI7XHJcblx0XHRcdFx0XHRpc1N1Y2Nlc3MgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGRhdGFcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRcdGlzU3VjY2VzcyA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSApO1xyXG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IGlzU3VjY2Vzcy5zdGF0ZTtcclxuXHRcdFx0XHRcdHN1Y2Nlc3MgPSBpc1N1Y2Nlc3MuZGF0YTtcclxuXHRcdFx0XHRcdGVycm9yID0gaXNTdWNjZXNzLmVycm9yO1xyXG5cdFx0XHRcdFx0aXNTdWNjZXNzID0gIWVycm9yO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBXZSBleHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dFxyXG5cdFx0XHRcdC8vIHRoZW4gbm9ybWFsaXplIHN0YXR1c1RleHQgYW5kIHN0YXR1cyBmb3Igbm9uLWFib3J0c1xyXG5cdFx0XHRcdGVycm9yID0gc3RhdHVzVGV4dDtcclxuXHRcdFx0XHRpZiAoICFzdGF0dXNUZXh0IHx8IHN0YXR1cyApIHtcclxuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcImVycm9yXCI7XHJcblx0XHRcdFx0XHRpZiAoIHN0YXR1cyA8IDAgKSB7XHJcblx0XHRcdFx0XHRcdHN0YXR1cyA9IDA7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdFxyXG5cdFx0XHRqcVhIUi5zdGF0dXMgPSBzdGF0dXM7XHJcblx0XHRcdGpxWEhSLnN0YXR1c1RleHQgPSBcIlwiICsgKCBuYXRpdmVTdGF0dXNUZXh0IHx8IHN0YXR1c1RleHQgKTtcclxuXHJcblx0XHRcdC8vIFN1Y2Nlc3MvRXJyb3JcclxuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XHJcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXHJcblx0XHRcdGpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTtcclxuXHRcdFx0c3RhdHVzQ29kZSA9IHVuZGVmaW5lZDtcclxuXHJcblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XHJcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheFwiICsgKCBpc1N1Y2Nlc3MgPyBcIlN1Y2Nlc3NcIiA6IFwiRXJyb3JcIiApLFxyXG5cdFx0XHRcdFx0XHRbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBDb21wbGV0ZVxyXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApO1xyXG5cclxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcclxuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4Q29tcGxldGVcIiwgWyBqcVhIUiwgcyBdICk7XHJcblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyXHJcblx0XHRcdFx0aWYgKCAhKCAtLWpRdWVyeS5hY3RpdmUgKSApIHtcclxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdG9wXCIgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBBdHRhY2ggZGVmZXJyZWRzXHJcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApO1xyXG5cdFx0anFYSFIuc3VjY2VzcyA9IGpxWEhSLmRvbmU7XHJcblx0XHRqcVhIUi5lcnJvciA9IGpxWEhSLmZhaWw7XHJcblx0XHRqcVhIUi5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkO1xyXG5cclxuXHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXHJcblx0XHRqcVhIUi5zdGF0dXNDb2RlID0gZnVuY3Rpb24oIG1hcCApIHtcclxuXHRcdFx0aWYgKCBtYXAgKSB7XHJcblx0XHRcdFx0dmFyIHRtcDtcclxuXHRcdFx0XHRpZiAoIHN0YXRlIDwgMiApIHtcclxuXHRcdFx0XHRcdGZvciAoIHRtcCBpbiBtYXAgKSB7XHJcblx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIHRtcCBdID0gWyBzdGF0dXNDb2RlW3RtcF0sIG1hcFt0bXBdIF07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRtcCA9IG1hcFsganFYSFIuc3RhdHVzIF07XHJcblx0XHRcdFx0XHRqcVhIUi5hbHdheXMoIHRtcCApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gUmVtb3ZlIGhhc2ggY2hhcmFjdGVyICgjNzUzMTogYW5kIHN0cmluZyBwcm9tb3Rpb24pXHJcblx0XHQvLyBBZGQgcHJvdG9jb2wgaWYgbm90IHByb3ZpZGVkICgjNTg2NjogSUU3IGlzc3VlIHdpdGggcHJvdG9jb2wtbGVzcyB1cmxzKVxyXG5cdFx0Ly8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlXHJcblx0XHRzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgKSArIFwiXCIgKS5yZXBsYWNlKCByaGFzaCwgXCJcIiApLnJlcGxhY2UoIHJwcm90b2NvbCwgYWpheExvY1BhcnRzWyAxIF0gKyBcIi8vXCIgKTtcclxuXHJcblx0XHQvLyBFeHRyYWN0IGRhdGFUeXBlcyBsaXN0XHJcblx0XHRzLmRhdGFUeXBlcyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8IFwiKlwiICkudG9Mb3dlckNhc2UoKS5zcGxpdCggY29yZV9yc3BhY2UgKTtcclxuXHJcblx0XHQvLyBEZXRlcm1pbmUgaWYgYSBjcm9zcy1kb21haW4gcmVxdWVzdCBpcyBpbiBvcmRlclxyXG5cdFx0aWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7XHJcblx0XHRcdHBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7XHJcblx0XHRcdHMuY3Jvc3NEb21haW4gPSAhISggcGFydHMgJiZcclxuXHRcdFx0XHQoIHBhcnRzWyAxIF0gIT0gYWpheExvY1BhcnRzWyAxIF0gfHwgcGFydHNbIDIgXSAhPSBhamF4TG9jUGFydHNbIDIgXSB8fFxyXG5cdFx0XHRcdFx0KCBwYXJ0c1sgMyBdIHx8ICggcGFydHNbIDEgXSA9PT0gXCJodHRwOlwiID8gODAgOiA0NDMgKSApICE9XHJcblx0XHRcdFx0XHRcdCggYWpheExvY1BhcnRzWyAzIF0gfHwgKCBhamF4TG9jUGFydHNbIDEgXSA9PT0gXCJodHRwOlwiID8gODAgOiA0NDMgKSApIClcclxuXHRcdFx0KTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmdcclxuXHRcdGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0cy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBBcHBseSBwcmVmaWx0ZXJzXHJcblx0XHRpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTtcclxuXHJcblx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZVxyXG5cdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcclxuXHRcdFx0cmV0dXJuIGpxWEhSO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvXHJcblx0XHRmaXJlR2xvYmFscyA9IHMuZ2xvYmFsO1xyXG5cclxuXHRcdC8vIFVwcGVyY2FzZSB0aGUgdHlwZVxyXG5cdFx0cy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7XHJcblxyXG5cdFx0Ly8gRGV0ZXJtaW5lIGlmIHJlcXVlc3QgaGFzIGNvbnRlbnRcclxuXHRcdHMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRlc3QoIHMudHlwZSApO1xyXG5cclxuXHRcdC8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHNcclxuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xyXG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggXCJhamF4U3RhcnRcIiApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50XHJcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XHJcblxyXG5cdFx0XHQvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsXHJcblx0XHRcdGlmICggcy5kYXRhICkge1xyXG5cdFx0XHRcdHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIHMudXJsICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGE7XHJcblx0XHRcdFx0Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeVxyXG5cdFx0XHRcdGRlbGV0ZSBzLmRhdGE7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEdldCBpZk1vZGlmaWVkS2V5IGJlZm9yZSBhZGRpbmcgdGhlIGFudGktY2FjaGUgcGFyYW1ldGVyXHJcblx0XHRcdGlmTW9kaWZpZWRLZXkgPSBzLnVybDtcclxuXHJcblx0XHRcdC8vIEFkZCBhbnRpLWNhY2hlIGluIHVybCBpZiBuZWVkZWRcclxuXHRcdFx0aWYgKCBzLmNhY2hlID09PSBmYWxzZSApIHtcclxuXHJcblx0XHRcdFx0dmFyIHRzID0galF1ZXJ5Lm5vdygpLFxyXG5cdFx0XHRcdFx0Ly8gdHJ5IHJlcGxhY2luZyBfPSBpZiBpdCBpcyB0aGVyZVxyXG5cdFx0XHRcdFx0cmV0ID0gcy51cmwucmVwbGFjZSggcnRzLCBcIiQxXz1cIiArIHRzICk7XHJcblxyXG5cdFx0XHRcdC8vIGlmIG5vdGhpbmcgd2FzIHJlcGxhY2VkLCBhZGQgdGltZXN0YW1wIHRvIHRoZSBlbmRcclxuXHRcdFx0XHRzLnVybCA9IHJldCArICggKCByZXQgPT09IHMudXJsICkgPyAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gXCImXCIgOiBcIj9cIiApICsgXCJfPVwiICsgdHMgOiBcIlwiICk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnRcclxuXHRcdGlmICggcy5kYXRhICYmIHMuaGFzQ29udGVudCAmJiBzLmNvbnRlbnRUeXBlICE9PSBmYWxzZSB8fCBvcHRpb25zLmNvbnRlbnRUeXBlICkge1xyXG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cclxuXHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xyXG5cdFx0XHRpZk1vZGlmaWVkS2V5ID0gaWZNb2RpZmllZEtleSB8fCBzLnVybDtcclxuXHRcdFx0aWYgKCBqUXVlcnkubGFzdE1vZGlmaWVkWyBpZk1vZGlmaWVkS2V5IF0gKSB7XHJcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Nb2RpZmllZC1TaW5jZVwiLCBqUXVlcnkubGFzdE1vZGlmaWVkWyBpZk1vZGlmaWVkS2V5IF0gKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIGpRdWVyeS5ldGFnWyBpZk1vZGlmaWVkS2V5IF0gKSB7XHJcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBpZk1vZGlmaWVkS2V5IF0gKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGVcclxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXHJcblx0XHRcdFwiQWNjZXB0XCIsXHJcblx0XHRcdHMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID9cclxuXHRcdFx0XHRzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWzBdIF0gKyAoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxyXG5cdFx0XHRcdHMuYWNjZXB0c1sgXCIqXCIgXVxyXG5cdFx0KTtcclxuXHJcblx0XHQvLyBDaGVjayBmb3IgaGVhZGVycyBvcHRpb25cclxuXHRcdGZvciAoIGkgaW4gcy5oZWFkZXJzICkge1xyXG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcclxuXHRcdGlmICggcy5iZWZvcmVTZW5kICYmICggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29udGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgc3RhdGUgPT09IDIgKSApIHtcclxuXHRcdFx0XHQvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm5cclxuXHRcdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcclxuXHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gYWJvcnRpbmcgaXMgbm8gbG9uZ2VyIGEgY2FuY2VsbGF0aW9uXHJcblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcclxuXHJcblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrcyBvbiBkZWZlcnJlZHNcclxuXHRcdGZvciAoIGkgaW4geyBzdWNjZXNzOiAxLCBlcnJvcjogMSwgY29tcGxldGU6IDEgfSApIHtcclxuXHRcdFx0anFYSFJbIGkgXSggc1sgaSBdICk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxyXG5cdFx0dHJhbnNwb3J0ID0gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XHJcblxyXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XHJcblx0XHRpZiAoICF0cmFuc3BvcnQgKSB7XHJcblx0XHRcdGRvbmUoIC0xLCBcIk5vIFRyYW5zcG9ydFwiICk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRqcVhIUi5yZWFkeVN0YXRlID0gMTtcclxuXHRcdFx0Ly8gU2VuZCBnbG9iYWwgZXZlbnRcclxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcclxuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcclxuXHRcdFx0fVxyXG5cdFx0XHQvLyBUaW1lb3V0XHJcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xyXG5cdFx0XHRcdHRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoIGZ1bmN0aW9uKCl7XHJcblx0XHRcdFx0XHRqcVhIUi5hYm9ydCggXCJ0aW1lb3V0XCIgKTtcclxuXHRcdFx0XHR9LCBzLnRpbWVvdXQgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRzdGF0ZSA9IDE7XHJcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XHJcblx0XHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHQvLyBQcm9wYWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lXHJcblx0XHRcdFx0aWYgKCBzdGF0ZSA8IDIgKSB7XHJcblx0XHRcdFx0XHRkb25lKCAtMSwgZSApO1xyXG5cdFx0XHRcdC8vIFNpbXBseSByZXRocm93IG90aGVyd2lzZVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aHJvdyBlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBqcVhIUjtcclxuXHR9LFxyXG5cclxuXHQvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXNcclxuXHRhY3RpdmU6IDAsXHJcblxyXG5cdC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3RcclxuXHRsYXN0TW9kaWZpZWQ6IHt9LFxyXG5cdGV0YWc6IHt9XHJcblxyXG59KTtcclxuXHJcbi8qIEhhbmRsZXMgcmVzcG9uc2VzIHRvIGFuIGFqYXggcmVxdWVzdDpcclxuICogLSBzZXRzIGFsbCByZXNwb25zZVhYWCBmaWVsZHMgYWNjb3JkaW5nbHlcclxuICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSlcclxuICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXHJcbiAqL1xyXG5mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkge1xyXG5cclxuXHR2YXIgY3QsIHR5cGUsIGZpbmFsRGF0YVR5cGUsIGZpcnN0RGF0YVR5cGUsXHJcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXHJcblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcyxcclxuXHRcdHJlc3BvbnNlRmllbGRzID0gcy5yZXNwb25zZUZpZWxkcztcclxuXHJcblx0Ly8gRmlsbCByZXNwb25zZVhYWCBmaWVsZHNcclxuXHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlRmllbGRzICkge1xyXG5cdFx0aWYgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcclxuXHRcdFx0anFYSFJbIHJlc3BvbnNlRmllbGRzW3R5cGVdIF0gPSByZXNwb25zZXNbIHR5cGUgXTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIFJlbW92ZSBhdXRvIGRhdGFUeXBlIGFuZCBnZXQgY29udGVudC10eXBlIGluIHRoZSBwcm9jZXNzXHJcblx0d2hpbGUoIGRhdGFUeXBlc1sgMCBdID09PSBcIipcIiApIHtcclxuXHRcdGRhdGFUeXBlcy5zaGlmdCgpO1xyXG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0XHRjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiY29udGVudC10eXBlXCIgKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZVxyXG5cdGlmICggY3QgKSB7XHJcblx0XHRmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkge1xyXG5cdFx0XHRpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkge1xyXG5cdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0eXBlICk7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZVxyXG5cdGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkge1xyXG5cdFx0ZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdO1xyXG5cdH0gZWxzZSB7XHJcblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXHJcblx0XHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcclxuXHRcdFx0aWYgKCAhZGF0YVR5cGVzWyAwIF0gfHwgcy5jb252ZXJ0ZXJzWyB0eXBlICsgXCIgXCIgKyBkYXRhVHlwZXNbMF0gXSApIHtcclxuXHRcdFx0XHRmaW5hbERhdGFUeXBlID0gdHlwZTtcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoICFmaXJzdERhdGFUeXBlICkge1xyXG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHQvLyBPciBqdXN0IHVzZSBmaXJzdCBvbmVcclxuXHRcdGZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7XHJcblx0fVxyXG5cclxuXHQvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlXHJcblx0Ly8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWRcclxuXHQvLyBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXHJcblx0aWYgKCBmaW5hbERhdGFUeXBlICkge1xyXG5cdFx0aWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHtcclxuXHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIGZpbmFsRGF0YVR5cGUgKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTtcclxuXHR9XHJcbn1cclxuXHJcbi8vIENoYWluIGNvbnZlcnNpb25zIGdpdmVuIHRoZSByZXF1ZXN0IGFuZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2VcclxuZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlICkge1xyXG5cclxuXHR2YXIgY29udiwgY29udjIsIGN1cnJlbnQsIHRtcCxcclxuXHRcdC8vIFdvcmsgd2l0aCBhIGNvcHkgb2YgZGF0YVR5cGVzIGluIGNhc2Ugd2UgbmVlZCB0byBtb2RpZnkgaXQgZm9yIGNvbnZlcnNpb25cclxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCksXHJcblx0XHRwcmV2ID0gZGF0YVR5cGVzWyAwIF0sXHJcblx0XHRjb252ZXJ0ZXJzID0ge30sXHJcblx0XHRpID0gMDtcclxuXHJcblx0Ly8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWRcclxuXHRpZiAoIHMuZGF0YUZpbHRlciApIHtcclxuXHRcdHJlc3BvbnNlID0gcy5kYXRhRmlsdGVyKCByZXNwb25zZSwgcy5kYXRhVHlwZSApO1xyXG5cdH1cclxuXHJcblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXHJcblx0aWYgKCBkYXRhVHlwZXNbIDEgXSApIHtcclxuXHRcdGZvciAoIGNvbnYgaW4gcy5jb252ZXJ0ZXJzICkge1xyXG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gQ29udmVydCB0byBlYWNoIHNlcXVlbnRpYWwgZGF0YVR5cGUsIHRvbGVyYXRpbmcgbGlzdCBtb2RpZmljYXRpb25cclxuXHRmb3IgKCA7IChjdXJyZW50ID0gZGF0YVR5cGVzWysraV0pOyApIHtcclxuXHJcblx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXHJcblx0XHRpZiAoIGN1cnJlbnQgIT09IFwiKlwiICkge1xyXG5cclxuXHRcdFx0Ly8gQ29udmVydCByZXNwb25zZSBpZiBwcmV2IGRhdGFUeXBlIGlzIG5vbi1hdXRvIGFuZCBkaWZmZXJzIGZyb20gY3VycmVudFxyXG5cdFx0XHRpZiAoIHByZXYgIT09IFwiKlwiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7XHJcblxyXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXHJcblx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyBcIiogXCIgKyBjdXJyZW50IF07XHJcblxyXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXHJcblx0XHRcdFx0aWYgKCAhY29udiApIHtcclxuXHRcdFx0XHRcdGZvciAoIGNvbnYyIGluIGNvbnZlcnRlcnMgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnRcclxuXHRcdFx0XHRcdFx0dG1wID0gY29udjIuc3BsaXQoXCIgXCIpO1xyXG5cdFx0XHRcdFx0XHRpZiAoIHRtcFsgMSBdID09PSBjdXJyZW50ICkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXRcclxuXHRcdFx0XHRcdFx0XHRjb252ID0gY29udmVydGVyc1sgcHJldiArIFwiIFwiICsgdG1wWyAwIF0gXSB8fFxyXG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcclxuXHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgPT09IHRydWUgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBpbnRlcm1lZGlhdGUgZGF0YVR5cGVcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnZlcnRlcnNbIGNvbnYyIF0gIT09IHRydWUgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnQgPSB0bXBbIDAgXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZGF0YVR5cGVzLnNwbGljZSggaS0tLCAwLCBjdXJyZW50ICk7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSlcclxuXHRcdFx0XHRpZiAoIGNvbnYgIT09IHRydWUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbVxyXG5cdFx0XHRcdFx0aWYgKCBjb252ICYmIHNbXCJ0aHJvd3NcIl0gKSB7XHJcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xyXG5cdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4geyBzdGF0ZTogXCJwYXJzZXJlcnJvclwiLCBlcnJvcjogY29udiA/IGUgOiBcIk5vIGNvbnZlcnNpb24gZnJvbSBcIiArIHByZXYgKyBcIiB0byBcIiArIGN1cnJlbnQgfTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gVXBkYXRlIHByZXYgZm9yIG5leHQgaXRlcmF0aW9uXHJcblx0XHRcdHByZXYgPSBjdXJyZW50O1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHsgc3RhdGU6IFwic3VjY2Vzc1wiLCBkYXRhOiByZXNwb25zZSB9O1xyXG59XHJcbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcclxuXHRycXVlc3Rpb24gPSAvXFw/LyxcclxuXHRyanNvbnAgPSAvKD0pXFw/KD89JnwkKXxcXD9cXD8vLFxyXG5cdG5vbmNlID0galF1ZXJ5Lm5vdygpO1xyXG5cclxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xyXG5qUXVlcnkuYWpheFNldHVwKHtcclxuXHRqc29ucDogXCJjYWxsYmFja1wiLFxyXG5cdGpzb25wQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyBcIl9cIiArICggbm9uY2UrKyApICk7XHJcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcclxuXHRcdHJldHVybiBjYWxsYmFjaztcclxuXHR9XHJcbn0pO1xyXG5cclxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXHJcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcImpzb24ganNvbnBcIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpxWEhSICkge1xyXG5cclxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXHJcblx0XHRkYXRhID0gcy5kYXRhLFxyXG5cdFx0dXJsID0gcy51cmwsXHJcblx0XHRoYXNDYWxsYmFjayA9IHMuanNvbnAgIT09IGZhbHNlLFxyXG5cdFx0cmVwbGFjZUluVXJsID0gaGFzQ2FsbGJhY2sgJiYgcmpzb25wLnRlc3QoIHVybCApLFxyXG5cdFx0cmVwbGFjZUluRGF0YSA9IGhhc0NhbGxiYWNrICYmICFyZXBsYWNlSW5VcmwgJiYgdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgJiZcclxuXHRcdFx0ISggcy5jb250ZW50VHlwZSB8fCBcIlwiICkuaW5kZXhPZihcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKSAmJlxyXG5cdFx0XHRyanNvbnAudGVzdCggZGF0YSApO1xyXG5cclxuXHQvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgXCJqc29ucFwiIG9yIHdlIGhhdmUgYSBwYXJhbWV0ZXIgdG8gc2V0XHJcblx0aWYgKCBzLmRhdGFUeXBlc1sgMCBdID09PSBcImpzb25wXCIgfHwgcmVwbGFjZUluVXJsIHx8IHJlcGxhY2VJbkRhdGEgKSB7XHJcblxyXG5cdFx0Ly8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdFxyXG5cdFx0Y2FsbGJhY2tOYW1lID0gcy5qc29ucENhbGxiYWNrID0galF1ZXJ5LmlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID9cclxuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxyXG5cdFx0XHRzLmpzb25wQ2FsbGJhY2s7XHJcblx0XHRvdmVyd3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07XHJcblxyXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxyXG5cdFx0aWYgKCByZXBsYWNlSW5VcmwgKSB7XHJcblx0XHRcdHMudXJsID0gdXJsLnJlcGxhY2UoIHJqc29ucCwgXCIkMVwiICsgY2FsbGJhY2tOYW1lICk7XHJcblx0XHR9IGVsc2UgaWYgKCByZXBsYWNlSW5EYXRhICkge1xyXG5cdFx0XHRzLmRhdGEgPSBkYXRhLnJlcGxhY2UoIHJqc29ucCwgXCIkMVwiICsgY2FsbGJhY2tOYW1lICk7XHJcblx0XHR9IGVsc2UgaWYgKCBoYXNDYWxsYmFjayApIHtcclxuXHRcdFx0cy51cmwgKz0gKCBycXVlc3Rpb24udGVzdCggdXJsICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmpzb25wICsgXCI9XCIgKyBjYWxsYmFja05hbWU7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVXNlIGRhdGEgY29udmVydGVyIHRvIHJldHJpZXZlIGpzb24gYWZ0ZXIgc2NyaXB0IGV4ZWN1dGlvblxyXG5cdFx0cy5jb252ZXJ0ZXJzW1wic2NyaXB0IGpzb25cIl0gPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XHJcblx0XHRcdFx0alF1ZXJ5LmVycm9yKCBjYWxsYmFja05hbWUgKyBcIiB3YXMgbm90IGNhbGxlZFwiICk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIGZvcmNlIGpzb24gZGF0YVR5cGVcclxuXHRcdHMuZGF0YVR5cGVzWyAwIF0gPSBcImpzb25cIjtcclxuXHJcblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXHJcblx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcclxuXHRcdGpxWEhSLmFsd2F5cyhmdW5jdGlvbigpIHtcclxuXHRcdFx0Ly8gUmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZVxyXG5cdFx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47XHJcblxyXG5cdFx0XHQvLyBTYXZlIGJhY2sgYXMgZnJlZVxyXG5cdFx0XHRpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkge1xyXG5cdFx0XHRcdC8vIG1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZFxyXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcclxuXHJcblx0XHRcdFx0Ly8gc2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZVxyXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXHJcblx0XHRcdGlmICggcmVzcG9uc2VDb250YWluZXIgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XHJcblx0XHRcdFx0b3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIERlbGVnYXRlIHRvIHNjcmlwdFxyXG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XHJcblx0fVxyXG59KTtcclxuLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGVcclxualF1ZXJ5LmFqYXhTZXR1cCh7XHJcblx0YWNjZXB0czoge1xyXG5cdFx0c2NyaXB0OiBcInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0XCJcclxuXHR9LFxyXG5cdGNvbnRlbnRzOiB7XHJcblx0XHRzY3JpcHQ6IC9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvXHJcblx0fSxcclxuXHRjb252ZXJ0ZXJzOiB7XHJcblx0XHRcInRleHQgc2NyaXB0XCI6IGZ1bmN0aW9uKCB0ZXh0ICkge1xyXG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApO1xyXG5cdFx0XHRyZXR1cm4gdGV4dDtcclxuXHRcdH1cclxuXHR9XHJcbn0pO1xyXG5cclxuLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBnbG9iYWxcclxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xyXG5cdGlmICggcy5jYWNoZSA9PT0gdW5kZWZpbmVkICkge1xyXG5cdFx0cy5jYWNoZSA9IGZhbHNlO1xyXG5cdH1cclxuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XHJcblx0XHRzLnR5cGUgPSBcIkdFVFwiO1xyXG5cdFx0cy5nbG9iYWwgPSBmYWxzZTtcclxuXHR9XHJcbn0pO1xyXG5cclxuLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0XHJcbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBcInNjcmlwdFwiLCBmdW5jdGlvbihzKSB7XHJcblxyXG5cdC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVzdHNcclxuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XHJcblxyXG5cdFx0dmFyIHNjcmlwdCxcclxuXHRcdFx0aGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwiaGVhZFwiIClbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG5cclxuXHRcdHJldHVybiB7XHJcblxyXG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggXywgY2FsbGJhY2sgKSB7XHJcblxyXG5cdFx0XHRcdHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2NyaXB0XCIgKTtcclxuXHJcblx0XHRcdFx0c2NyaXB0LmFzeW5jID0gXCJhc3luY1wiO1xyXG5cclxuXHRcdFx0XHRpZiAoIHMuc2NyaXB0Q2hhcnNldCApIHtcclxuXHRcdFx0XHRcdHNjcmlwdC5jaGFyc2V0ID0gcy5zY3JpcHRDaGFyc2V0O1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0c2NyaXB0LnNyYyA9IHMudXJsO1xyXG5cclxuXHRcdFx0XHQvLyBBdHRhY2ggaGFuZGxlcnMgZm9yIGFsbCBicm93c2Vyc1xyXG5cdFx0XHRcdHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKCBpc0Fib3J0IHx8ICFzY3JpcHQucmVhZHlTdGF0ZSB8fCAvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KCBzY3JpcHQucmVhZHlTdGF0ZSApICkge1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gSGFuZGxlIG1lbW9yeSBsZWFrIGluIElFXHJcblx0XHRcdFx0XHRcdHNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcclxuXHJcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSB0aGUgc2NyaXB0XHJcblx0XHRcdFx0XHRcdGlmICggaGVhZCAmJiBzY3JpcHQucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0XHRcdFx0XHRoZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0Ly8gRGVyZWZlcmVuY2UgdGhlIHNjcmlwdFxyXG5cdFx0XHRcdFx0XHRzY3JpcHQgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBDYWxsYmFjayBpZiBub3QgYWJvcnRcclxuXHRcdFx0XHRcdFx0aWYgKCAhaXNBYm9ydCApIHtcclxuXHRcdFx0XHRcdFx0XHRjYWxsYmFjayggMjAwLCBcInN1Y2Nlc3NcIiApO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHQvLyBVc2UgaW5zZXJ0QmVmb3JlIGluc3RlYWQgb2YgYXBwZW5kQ2hpbGQgIHRvIGNpcmN1bXZlbnQgYW4gSUU2IGJ1Zy5cclxuXHRcdFx0XHQvLyBUaGlzIGFyaXNlcyB3aGVuIGEgYmFzZSBub2RlIGlzIHVzZWQgKCMyNzA5IGFuZCAjNDM3OCkuXHJcblx0XHRcdFx0aGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxkICk7XHJcblx0XHRcdH0sXHJcblxyXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0aWYgKCBzY3JpcHQgKSB7XHJcblx0XHRcdFx0XHRzY3JpcHQub25sb2FkKCAwLCAxICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdH1cclxufSk7XHJcbnZhciB4aHJDYWxsYmFja3MsXHJcblx0Ly8gIzUyODA6IEludGVybmV0IEV4cGxvcmVyIHdpbGwga2VlcCBjb25uZWN0aW9ucyBhbGl2ZSBpZiB3ZSBkb24ndCBhYm9ydCBvbiB1bmxvYWRcclxuXHR4aHJPblVubG9hZEFib3J0ID0gd2luZG93LkFjdGl2ZVhPYmplY3QgPyBmdW5jdGlvbigpIHtcclxuXHRcdC8vIEFib3J0IGFsbCBwZW5kaW5nIHJlcXVlc3RzXHJcblx0XHRmb3IgKCB2YXIga2V5IGluIHhockNhbGxiYWNrcyApIHtcclxuXHRcdFx0eGhyQ2FsbGJhY2tzWyBrZXkgXSggMCwgMSApO1xyXG5cdFx0fVxyXG5cdH0gOiBmYWxzZSxcclxuXHR4aHJJZCA9IDA7XHJcblxyXG4vLyBGdW5jdGlvbnMgdG8gY3JlYXRlIHhocnNcclxuZnVuY3Rpb24gY3JlYXRlU3RhbmRhcmRYSFIoKSB7XHJcblx0dHJ5IHtcclxuXHRcdHJldHVybiBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XHJcblx0fSBjYXRjaCggZSApIHt9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUFjdGl2ZVhIUigpIHtcclxuXHR0cnkge1xyXG5cdFx0cmV0dXJuIG5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdCggXCJNaWNyb3NvZnQuWE1MSFRUUFwiICk7XHJcblx0fSBjYXRjaCggZSApIHt9XHJcbn1cclxuXHJcbi8vIENyZWF0ZSB0aGUgcmVxdWVzdCBvYmplY3RcclxuLy8gKFRoaXMgaXMgc3RpbGwgYXR0YWNoZWQgdG8gYWpheFNldHRpbmdzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxyXG5qUXVlcnkuYWpheFNldHRpbmdzLnhociA9IHdpbmRvdy5BY3RpdmVYT2JqZWN0ID9cclxuXHQvKiBNaWNyb3NvZnQgZmFpbGVkIHRvIHByb3Blcmx5XHJcblx0ICogaW1wbGVtZW50IHRoZSBYTUxIdHRwUmVxdWVzdCBpbiBJRTcgKGNhbid0IHJlcXVlc3QgbG9jYWwgZmlsZXMpLFxyXG5cdCAqIHNvIHdlIHVzZSB0aGUgQWN0aXZlWE9iamVjdCB3aGVuIGl0IGlzIGF2YWlsYWJsZVxyXG5cdCAqIEFkZGl0aW9uYWxseSBYTUxIdHRwUmVxdWVzdCBjYW4gYmUgZGlzYWJsZWQgaW4gSUU3L0lFOCBzb1xyXG5cdCAqIHdlIG5lZWQgYSBmYWxsYmFjay5cclxuXHQgKi9cclxuXHRmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiAhdGhpcy5pc0xvY2FsICYmIGNyZWF0ZVN0YW5kYXJkWEhSKCkgfHwgY3JlYXRlQWN0aXZlWEhSKCk7XHJcblx0fSA6XHJcblx0Ly8gRm9yIGFsbCBvdGhlciBicm93c2VycywgdXNlIHRoZSBzdGFuZGFyZCBYTUxIdHRwUmVxdWVzdCBvYmplY3RcclxuXHRjcmVhdGVTdGFuZGFyZFhIUjtcclxuXHJcbi8vIERldGVybWluZSBzdXBwb3J0IHByb3BlcnRpZXNcclxuKGZ1bmN0aW9uKCB4aHIgKSB7XHJcblx0alF1ZXJ5LmV4dGVuZCggalF1ZXJ5LnN1cHBvcnQsIHtcclxuXHRcdGFqYXg6ICEheGhyLFxyXG5cdFx0Y29yczogISF4aHIgJiYgKCBcIndpdGhDcmVkZW50aWFsc1wiIGluIHhociApXHJcblx0fSk7XHJcbn0pKCBqUXVlcnkuYWpheFNldHRpbmdzLnhocigpICk7XHJcblxyXG4vLyBDcmVhdGUgdHJhbnNwb3J0IGlmIHRoZSBicm93c2VyIGNhbiBwcm92aWRlIGFuIHhoclxyXG5pZiAoIGpRdWVyeS5zdXBwb3J0LmFqYXggKSB7XHJcblxyXG5cdGpRdWVyeS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKCBzICkge1xyXG5cdFx0Ly8gQ3Jvc3MgZG9tYWluIG9ubHkgYWxsb3dlZCBpZiBzdXBwb3J0ZWQgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdFxyXG5cdFx0aWYgKCAhcy5jcm9zc0RvbWFpbiB8fCBqUXVlcnkuc3VwcG9ydC5jb3JzICkge1xyXG5cclxuXHRcdFx0dmFyIGNhbGxiYWNrO1xyXG5cclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7XHJcblxyXG5cdFx0XHRcdFx0Ly8gR2V0IGEgbmV3IHhoclxyXG5cdFx0XHRcdFx0dmFyIGhhbmRsZSwgaSxcclxuXHRcdFx0XHRcdFx0eGhyID0gcy54aHIoKTtcclxuXHJcblx0XHRcdFx0XHQvLyBPcGVuIHRoZSBzb2NrZXRcclxuXHRcdFx0XHRcdC8vIFBhc3NpbmcgbnVsbCB1c2VybmFtZSwgZ2VuZXJhdGVzIGEgbG9naW4gcG9wdXAgb24gT3BlcmEgKCMyODY1KVxyXG5cdFx0XHRcdFx0aWYgKCBzLnVzZXJuYW1lICkge1xyXG5cdFx0XHRcdFx0XHR4aHIub3Blbiggcy50eXBlLCBzLnVybCwgcy5hc3luYywgcy51c2VybmFtZSwgcy5wYXNzd29yZCApO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0eGhyLm9wZW4oIHMudHlwZSwgcy51cmwsIHMuYXN5bmMgKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBBcHBseSBjdXN0b20gZmllbGRzIGlmIHByb3ZpZGVkXHJcblx0XHRcdFx0XHRpZiAoIHMueGhyRmllbGRzICkge1xyXG5cdFx0XHRcdFx0XHRmb3IgKCBpIGluIHMueGhyRmllbGRzICkge1xyXG5cdFx0XHRcdFx0XHRcdHhoclsgaSBdID0gcy54aHJGaWVsZHNbIGkgXTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWRcclxuXHRcdFx0XHRcdGlmICggcy5taW1lVHlwZSAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSApIHtcclxuXHRcdFx0XHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoIHMubWltZVR5cGUgKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlclxyXG5cdFx0XHRcdFx0Ly8gRm9yIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc2VlaW5nIGFzIGNvbmRpdGlvbnMgZm9yIGEgcHJlZmxpZ2h0IGFyZVxyXG5cdFx0XHRcdFx0Ly8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS5cclxuXHRcdFx0XHRcdC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKVxyXG5cdFx0XHRcdFx0Ly8gRm9yIHNhbWUtZG9tYWluIHJlcXVlc3RzLCB3b24ndCBjaGFuZ2UgaGVhZGVyIGlmIGFscmVhZHkgcHJvdmlkZWQuXHJcblx0XHRcdFx0XHRpZiAoICFzLmNyb3NzRG9tYWluICYmICFoZWFkZXJzW1wiWC1SZXF1ZXN0ZWQtV2l0aFwiXSApIHtcclxuXHRcdFx0XHRcdFx0aGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSA9IFwiWE1MSHR0cFJlcXVlc3RcIjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvLyBOZWVkIGFuIGV4dHJhIHRyeS9jYXRjaCBmb3IgY3Jvc3MgZG9tYWluIHJlcXVlc3RzIGluIEZpcmVmb3ggM1xyXG5cdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xyXG5cdFx0XHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBjYXRjaCggXyApIHt9XHJcblxyXG5cdFx0XHRcdFx0Ly8gRG8gc2VuZCB0aGUgcmVxdWVzdFxyXG5cdFx0XHRcdFx0Ly8gVGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uIHdoaWNoIGlzIGFjdHVhbGx5XHJcblx0XHRcdFx0XHQvLyBoYW5kbGVkIGluIGpRdWVyeS5hamF4IChzbyBubyB0cnkvY2F0Y2ggaGVyZSlcclxuXHRcdFx0XHRcdHhoci5zZW5kKCAoIHMuaGFzQ29udGVudCAmJiBzLmRhdGEgKSB8fCBudWxsICk7XHJcblxyXG5cdFx0XHRcdFx0Ly8gTGlzdGVuZXJcclxuXHRcdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHR2YXIgc3RhdHVzLFxyXG5cdFx0XHRcdFx0XHRcdHN0YXR1c1RleHQsXHJcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzLFxyXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlcyxcclxuXHRcdFx0XHRcdFx0XHR4bWw7XHJcblxyXG5cdFx0XHRcdFx0XHQvLyBGaXJlZm94IHRocm93cyBleGNlcHRpb25zIHdoZW4gYWNjZXNzaW5nIHByb3BlcnRpZXNcclxuXHRcdFx0XHRcdFx0Ly8gb2YgYW4geGhyIHdoZW4gYSBuZXR3b3JrIGVycm9yIG9jY3VycmVkXHJcblx0XHRcdFx0XHRcdC8vIGh0dHA6Ly9oZWxwZnVsLmtub2JzLWRpYWxzLmNvbS9pbmRleC5waHAvQ29tcG9uZW50X3JldHVybmVkX2ZhaWx1cmVfY29kZTpfMHg4MDA0MDExMV8oTlNfRVJST1JfTk9UX0FWQUlMQUJMRSlcclxuXHRcdFx0XHRcdFx0dHJ5IHtcclxuXHJcblx0XHRcdFx0XHRcdFx0Ly8gV2FzIG5ldmVyIGNhbGxlZCBhbmQgaXMgYWJvcnRlZCBvciBjb21wbGV0ZVxyXG5cdFx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sgJiYgKCBpc0Fib3J0IHx8IHhoci5yZWFkeVN0YXRlID09PSA0ICkgKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBjYWxsZWQgb25jZVxyXG5cdFx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSB1bmRlZmluZWQ7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRG8gbm90IGtlZXAgYXMgYWN0aXZlIGFueW1vcmVcclxuXHRcdFx0XHRcdFx0XHRcdGlmICggaGFuZGxlICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0galF1ZXJ5Lm5vb3A7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggeGhyT25VbmxvYWRBYm9ydCApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWxldGUgeGhyQ2FsbGJhY2tzWyBoYW5kbGUgXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8vIElmIGl0J3MgYW4gYWJvcnRcclxuXHRcdFx0XHRcdFx0XHRcdGlmICggaXNBYm9ydCApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gQWJvcnQgaXQgbWFudWFsbHkgaWYgbmVlZGVkXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggeGhyLnJlYWR5U3RhdGUgIT09IDQgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLmFib3J0KCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXR1cyA9IHhoci5zdGF0dXM7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVycyA9IHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VzID0ge307XHJcblx0XHRcdFx0XHRcdFx0XHRcdHhtbCA9IHhoci5yZXNwb25zZVhNTDtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8vIENvbnN0cnVjdCByZXNwb25zZSBsaXN0XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggeG1sICYmIHhtbC5kb2N1bWVudEVsZW1lbnQgLyogIzQ5NTggKi8gKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VzLnhtbCA9IHhtbDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiByZXF1ZXN0aW5nIGJpbmFyeSBkYXRhLCBJRTYtOSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBvbiBhbnkgYXR0ZW1wdCB0byBhY2Nlc3MgcmVzcG9uc2VUZXh0ICgjMTE0MjYpXHJcblx0XHRcdFx0XHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VzLnRleHQgPSB4aHIucmVzcG9uc2VUZXh0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGNhdGNoKCBfICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBGaXJlZm94IHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmdcclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gc3RhdHVzVGV4dCBmb3IgZmF1bHR5IGNyb3NzLWRvbWFpbiByZXF1ZXN0c1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXR1c1RleHQgPSB4aHIuc3RhdHVzVGV4dDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCggZSApIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBXZSBub3JtYWxpemUgd2l0aCBXZWJraXQgZ2l2aW5nIGFuIGVtcHR5IHN0YXR1c1RleHRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gRmlsdGVyIHN0YXR1cyBmb3Igbm9uIHN0YW5kYXJkIGJlaGF2aW9yc1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHJlcXVlc3QgaXMgbG9jYWwgYW5kIHdlIGhhdmUgZGF0YTogYXNzdW1lIGEgc3VjY2Vzc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyAoc3VjY2VzcyB3aXRoIG5vIGRhdGEgd29uJ3QgZ2V0IG5vdGlmaWVkLCB0aGF0J3MgdGhlIGJlc3Qgd2VcclxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gY2FuIGRvIGdpdmVuIGN1cnJlbnQgaW1wbGVtZW50YXRpb25zKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoICFzdGF0dXMgJiYgcy5pc0xvY2FsICYmICFzLmNyb3NzRG9tYWluICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXR1cyA9IHJlc3BvbnNlcy50ZXh0ID8gMjAwIDogNDA0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBJRSAtICMxNDUwOiBzb21ldGltZXMgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNFxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDEyMjMgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RhdHVzID0gMjA0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGNhdGNoKCBmaXJlZm94QWNjZXNzRXhjZXB0aW9uICkge1xyXG5cdFx0XHRcdFx0XHRcdGlmICggIWlzQWJvcnQgKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggLTEsIGZpcmVmb3hBY2Nlc3NFeGNlcHRpb24gKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8vIENhbGwgY29tcGxldGUgaWYgbmVlZGVkXHJcblx0XHRcdFx0XHRcdGlmICggcmVzcG9uc2VzICkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCBzdGF0dXMsIHN0YXR1c1RleHQsIHJlc3BvbnNlcywgcmVzcG9uc2VIZWFkZXJzICk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0aWYgKCAhcy5hc3luYyApIHtcclxuXHRcdFx0XHRcdFx0Ly8gaWYgd2UncmUgaW4gc3luYyBtb2RlIHdlIGZpcmUgdGhlIGNhbGxiYWNrXHJcblx0XHRcdFx0XHRcdGNhbGxiYWNrKCk7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHtcclxuXHRcdFx0XHRcdFx0Ly8gKElFNiAmIElFNykgaWYgaXQncyBpbiBjYWNoZSBhbmQgaGFzIGJlZW5cclxuXHRcdFx0XHRcdFx0Ly8gcmV0cmlldmVkIGRpcmVjdGx5IHdlIG5lZWQgdG8gZmlyZSB0aGUgY2FsbGJhY2tcclxuXHRcdFx0XHRcdFx0c2V0VGltZW91dCggY2FsbGJhY2ssIDAgKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdGhhbmRsZSA9ICsreGhySWQ7XHJcblx0XHRcdFx0XHRcdGlmICggeGhyT25VbmxvYWRBYm9ydCApIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFjdGl2ZSB4aHJzIGNhbGxiYWNrcyBsaXN0IGlmIG5lZWRlZFxyXG5cdFx0XHRcdFx0XHRcdC8vIGFuZCBhdHRhY2ggdGhlIHVubG9hZCBoYW5kbGVyXHJcblx0XHRcdFx0XHRcdFx0aWYgKCAheGhyQ2FsbGJhY2tzICkge1xyXG5cdFx0XHRcdFx0XHRcdFx0eGhyQ2FsbGJhY2tzID0ge307XHJcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkoIHdpbmRvdyApLnVubG9hZCggeGhyT25VbmxvYWRBYm9ydCApO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHQvLyBBZGQgdG8gbGlzdCBvZiBhY3RpdmUgeGhycyBjYWxsYmFja3NcclxuXHRcdFx0XHRcdFx0XHR4aHJDYWxsYmFja3NbIGhhbmRsZSBdID0gY2FsbGJhY2s7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGNhbGxiYWNrO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblxyXG5cdFx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XHJcblx0XHRcdFx0XHRcdGNhbGxiYWNrKDAsMSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdH0pO1xyXG59XHJcbnZhciBmeE5vdywgdGltZXJJZCxcclxuXHRyZnh0eXBlcyA9IC9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxcclxuXHRyZnhudW0gPSBuZXcgUmVnRXhwKCBcIl4oPzooWy0rXSk9fCkoXCIgKyBjb3JlX3BudW0gKyBcIikoW2EteiVdKikkXCIsIFwiaVwiICksXHJcblx0cnJ1biA9IC9xdWV1ZUhvb2tzJC8sXHJcblx0YW5pbWF0aW9uUHJlZmlsdGVycyA9IFsgZGVmYXVsdFByZWZpbHRlciBdLFxyXG5cdHR3ZWVuZXJzID0ge1xyXG5cdFx0XCIqXCI6IFtmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7XHJcblx0XHRcdHZhciBlbmQsIHVuaXQsIHByZXZTY2FsZSxcclxuXHRcdFx0XHR0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICksXHJcblx0XHRcdFx0cGFydHMgPSByZnhudW0uZXhlYyggdmFsdWUgKSxcclxuXHRcdFx0XHR0YXJnZXQgPSB0d2Vlbi5jdXIoKSxcclxuXHRcdFx0XHRzdGFydCA9ICt0YXJnZXQgfHwgMCxcclxuXHRcdFx0XHRzY2FsZSA9IDE7XHJcblxyXG5cdFx0XHRpZiAoIHBhcnRzICkge1xyXG5cdFx0XHRcdGVuZCA9ICtwYXJ0c1syXTtcclxuXHRcdFx0XHR1bml0ID0gcGFydHNbM10gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICk7XHJcblxyXG5cdFx0XHRcdC8vIFdlIG5lZWQgdG8gY29tcHV0ZSBzdGFydGluZyB2YWx1ZVxyXG5cdFx0XHRcdGlmICggdW5pdCAhPT0gXCJweFwiICYmIHN0YXJ0ICkge1xyXG5cdFx0XHRcdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcclxuXHRcdFx0XHRcdC8vIFByZWZlciB0aGUgY3VycmVudCBwcm9wZXJ0eSwgYmVjYXVzZSB0aGlzIHByb2Nlc3Mgd2lsbCBiZSB0cml2aWFsIGlmIGl0IHVzZXMgdGhlIHNhbWUgdW5pdHNcclxuXHRcdFx0XHRcdC8vIEZhbGxiYWNrIHRvIGVuZCBvciBhIHNpbXBsZSBjb25zdGFudFxyXG5cdFx0XHRcdFx0c3RhcnQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCBwcm9wLCB0cnVlICkgfHwgZW5kIHx8IDE7XHJcblxyXG5cdFx0XHRcdFx0ZG8ge1xyXG5cdFx0XHRcdFx0XHQvLyBJZiBwcmV2aW91cyBpdGVyYXRpb24gemVyb2VkIG91dCwgZG91YmxlIHVudGlsIHdlIGdldCAqc29tZXRoaW5nKlxyXG5cdFx0XHRcdFx0XHQvLyBVc2UgYSBzdHJpbmcgZm9yIGRvdWJsaW5nIGZhY3RvciBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxlIGFzIHVuY2hhbmdlZCBiZWxvd1xyXG5cdFx0XHRcdFx0XHRwcmV2U2NhbGUgPSBzY2FsZSA9IHNjYWxlIHx8IFwiLjVcIjtcclxuXHJcblx0XHRcdFx0XHRcdC8vIEFkanVzdCBhbmQgYXBwbHlcclxuXHRcdFx0XHRcdFx0c3RhcnQgPSBzdGFydCAvIHNjYWxlO1xyXG5cdFx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIHR3ZWVuLmVsZW0sIHByb3AsIHN0YXJ0ICsgdW5pdCApO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gVXBkYXRlIHNjYWxlLCB0b2xlcmF0aW5nIHplcm9lcyBmcm9tIHR3ZWVuLmN1cigpXHJcblx0XHRcdFx0XHRcdHNjYWxlID0gdHdlZW4uY3VyKCkgLyB0YXJnZXQ7XHJcblxyXG5cdFx0XHRcdFx0Ly8gU3RvcCBsb29waW5nIGlmIHdlJ3ZlIGhpdCB0aGUgbWFyayBvciBzY2FsZSBpcyB1bmNoYW5nZWRcclxuXHRcdFx0XHRcdH0gd2hpbGUgKCBzY2FsZSAhPT0gMSAmJiBzY2FsZSAhPT0gcHJldlNjYWxlICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR0d2Vlbi51bml0ID0gdW5pdDtcclxuXHRcdFx0XHR0d2Vlbi5zdGFydCA9IHN0YXJ0O1xyXG5cdFx0XHRcdC8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3ZSdyZSBkb2luZyBhIHJlbGF0aXZlIGFuaW1hdGlvblxyXG5cdFx0XHRcdHR3ZWVuLmVuZCA9IHBhcnRzWzFdID8gc3RhcnQgKyAoIHBhcnRzWzFdICsgMSApICogZW5kIDogZW5kO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB0d2VlbjtcclxuXHRcdH1dXHJcblx0fTtcclxuXHJcbi8vIEFuaW1hdGlvbnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHlcclxuZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7XHJcblx0c2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xyXG5cdH0sIDAgKTtcclxuXHRyZXR1cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3coKSApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVUd2VlbnMoIGFuaW1hdGlvbiwgcHJvcHMgKSB7XHJcblx0alF1ZXJ5LmVhY2goIHByb3BzLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7XHJcblx0XHR2YXIgY29sbGVjdGlvbiA9ICggdHdlZW5lcnNbIHByb3AgXSB8fCBbXSApLmNvbmNhdCggdHdlZW5lcnNbIFwiKlwiIF0gKSxcclxuXHRcdFx0aW5kZXggPSAwLFxyXG5cdFx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcclxuXHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XHJcblx0XHRcdGlmICggY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSB7XHJcblxyXG5cdFx0XHRcdC8vIHdlJ3JlIGRvbmUgd2l0aCB0aGlzIHByb3BlcnR5XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcclxuXHR2YXIgcmVzdWx0LFxyXG5cdFx0aW5kZXggPSAwLFxyXG5cdFx0dHdlZW5lckluZGV4ID0gMCxcclxuXHRcdGxlbmd0aCA9IGFuaW1hdGlvblByZWZpbHRlcnMubGVuZ3RoLFxyXG5cdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkge1xyXG5cdFx0XHQvLyBkb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3JcclxuXHRcdFx0ZGVsZXRlIHRpY2suZWxlbTtcclxuXHRcdH0pLFxyXG5cdFx0dGljayA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgY3VycmVudFRpbWUgPSBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxyXG5cdFx0XHRcdHJlbWFpbmluZyA9IE1hdGgubWF4KCAwLCBhbmltYXRpb24uc3RhcnRUaW1lICsgYW5pbWF0aW9uLmR1cmF0aW9uIC0gY3VycmVudFRpbWUgKSxcclxuXHRcdFx0XHRwZXJjZW50ID0gMSAtICggcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAgKSxcclxuXHRcdFx0XHRpbmRleCA9IDAsXHJcblx0XHRcdFx0bGVuZ3RoID0gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGg7XHJcblxyXG5cdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcclxuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggcGVyY2VudCApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgcGVyY2VudCwgcmVtYWluaW5nIF0pO1xyXG5cclxuXHRcdFx0aWYgKCBwZXJjZW50IDwgMSAmJiBsZW5ndGggKSB7XHJcblx0XHRcdFx0cmV0dXJuIHJlbWFpbmluZztcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggZWxlbSwgWyBhbmltYXRpb24gXSApO1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2Uoe1xyXG5cdFx0XHRlbGVtOiBlbGVtLFxyXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcclxuXHRcdFx0b3B0czogalF1ZXJ5LmV4dGVuZCggdHJ1ZSwgeyBzcGVjaWFsRWFzaW5nOiB7fSB9LCBvcHRpb25zICksXHJcblx0XHRcdG9yaWdpbmFsUHJvcGVydGllczogcHJvcGVydGllcyxcclxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxyXG5cdFx0XHRzdGFydFRpbWU6IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXHJcblx0XHRcdGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uLFxyXG5cdFx0XHR0d2VlbnM6IFtdLFxyXG5cdFx0XHRjcmVhdGVUd2VlbjogZnVuY3Rpb24oIHByb3AsIGVuZCwgZWFzaW5nICkge1xyXG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcclxuXHRcdFx0XHRcdFx0YW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBdIHx8IGFuaW1hdGlvbi5vcHRzLmVhc2luZyApO1xyXG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTtcclxuXHRcdFx0XHRyZXR1cm4gdHdlZW47XHJcblx0XHRcdH0sXHJcblx0XHRcdHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkge1xyXG5cdFx0XHRcdHZhciBpbmRleCA9IDAsXHJcblx0XHRcdFx0XHQvLyBpZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcclxuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3ZSBza2lwIHRoaXMgcGFydFxyXG5cdFx0XHRcdFx0bGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDtcclxuXHJcblx0XHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XHJcblx0XHRcdFx0XHRhbmltYXRpb24udHdlZW5zWyBpbmRleCBdLnJ1biggMSApO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Ly8gcmVzb2x2ZSB3aGVuIHdlIHBsYXllZCB0aGUgbGFzdCBmcmFtZVxyXG5cdFx0XHRcdC8vIG90aGVyd2lzZSwgcmVqZWN0XHJcblx0XHRcdFx0aWYgKCBnb3RvRW5kICkge1xyXG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdFx0fVxyXG5cdFx0fSksXHJcblx0XHRwcm9wcyA9IGFuaW1hdGlvbi5wcm9wcztcclxuXHJcblx0cHJvcEZpbHRlciggcHJvcHMsIGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmcgKTtcclxuXHJcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XHJcblx0XHRyZXN1bHQgPSBhbmltYXRpb25QcmVmaWx0ZXJzWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgZWxlbSwgcHJvcHMsIGFuaW1hdGlvbi5vcHRzICk7XHJcblx0XHRpZiAoIHJlc3VsdCApIHtcclxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNyZWF0ZVR3ZWVucyggYW5pbWF0aW9uLCBwcm9wcyApO1xyXG5cclxuXHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBhbmltYXRpb24ub3B0cy5zdGFydCApICkge1xyXG5cdFx0YW5pbWF0aW9uLm9wdHMuc3RhcnQuY2FsbCggZWxlbSwgYW5pbWF0aW9uICk7XHJcblx0fVxyXG5cclxuXHRqUXVlcnkuZngudGltZXIoXHJcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XHJcblx0XHRcdGFuaW06IGFuaW1hdGlvbixcclxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlLFxyXG5cdFx0XHRlbGVtOiBlbGVtXHJcblx0XHR9KVxyXG5cdCk7XHJcblxyXG5cdC8vIGF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zXHJcblx0cmV0dXJuIGFuaW1hdGlvbi5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKVxyXG5cdFx0LmRvbmUoIGFuaW1hdGlvbi5vcHRzLmRvbmUsIGFuaW1hdGlvbi5vcHRzLmNvbXBsZXRlIClcclxuXHRcdC5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsIClcclxuXHRcdC5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9wRmlsdGVyKCBwcm9wcywgc3BlY2lhbEVhc2luZyApIHtcclxuXHR2YXIgaW5kZXgsIG5hbWUsIGVhc2luZywgdmFsdWUsIGhvb2tzO1xyXG5cclxuXHQvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3NcclxuXHRmb3IgKCBpbmRleCBpbiBwcm9wcyApIHtcclxuXHRcdG5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBpbmRleCApO1xyXG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xyXG5cdFx0dmFsdWUgPSBwcm9wc1sgaW5kZXggXTtcclxuXHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbHVlICkgKSB7XHJcblx0XHRcdGVhc2luZyA9IHZhbHVlWyAxIF07XHJcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XHJcblx0XHRcdHByb3BzWyBuYW1lIF0gPSB2YWx1ZTtcclxuXHRcdFx0ZGVsZXRlIHByb3BzWyBpbmRleCBdO1xyXG5cdFx0fVxyXG5cclxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07XHJcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XHJcblx0XHRcdHZhbHVlID0gaG9va3MuZXhwYW5kKCB2YWx1ZSApO1xyXG5cdFx0XHRkZWxldGUgcHJvcHNbIG5hbWUgXTtcclxuXHJcblx0XHRcdC8vIG5vdCBxdWl0ZSAkLmV4dGVuZCwgdGhpcyB3b250IG92ZXJ3cml0ZSBrZXlzIGFscmVhZHkgcHJlc2VudC5cclxuXHRcdFx0Ly8gYWxzbyAtIHJldXNpbmcgJ2luZGV4JyBmcm9tIGFib3ZlIGJlY2F1c2Ugd2UgaGF2ZSB0aGUgY29ycmVjdCBcIm5hbWVcIlxyXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcclxuXHRcdFx0XHRpZiAoICEoIGluZGV4IGluIHByb3BzICkgKSB7XHJcblx0XHRcdFx0XHRwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyBpbmRleCBdO1xyXG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHNwZWNpYWxFYXNpbmdbIG5hbWUgXSA9IGVhc2luZztcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuXHJcbmpRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHtcclxuXHJcblx0dHdlZW5lcjogZnVuY3Rpb24oIHByb3BzLCBjYWxsYmFjayApIHtcclxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHByb3BzICkgKSB7XHJcblx0XHRcdGNhbGxiYWNrID0gcHJvcHM7XHJcblx0XHRcdHByb3BzID0gWyBcIipcIiBdO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cHJvcHMgPSBwcm9wcy5zcGxpdChcIiBcIik7XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIHByb3AsXHJcblx0XHRcdGluZGV4ID0gMCxcclxuXHRcdFx0bGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xyXG5cclxuXHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGggOyBpbmRleCsrICkge1xyXG5cdFx0XHRwcm9wID0gcHJvcHNbIGluZGV4IF07XHJcblx0XHRcdHR3ZWVuZXJzWyBwcm9wIF0gPSB0d2VlbmVyc1sgcHJvcCBdIHx8IFtdO1xyXG5cdFx0XHR0d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0cHJlZmlsdGVyOiBmdW5jdGlvbiggY2FsbGJhY2ssIHByZXBlbmQgKSB7XHJcblx0XHRpZiAoIHByZXBlbmQgKSB7XHJcblx0XHRcdGFuaW1hdGlvblByZWZpbHRlcnMudW5zaGlmdCggY2FsbGJhY2sgKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGFuaW1hdGlvblByZWZpbHRlcnMucHVzaCggY2FsbGJhY2sgKTtcclxuXHRcdH1cclxuXHR9XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7XHJcblx0dmFyIGluZGV4LCBwcm9wLCB2YWx1ZSwgbGVuZ3RoLCBkYXRhU2hvdywgdHdlZW4sIGhvb2tzLCBvbGRmaXJlLFxyXG5cdFx0YW5pbSA9IHRoaXMsXHJcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGUsXHJcblx0XHRvcmlnID0ge30sXHJcblx0XHRoYW5kbGVkID0gW10sXHJcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuKCBlbGVtICk7XHJcblxyXG5cdC8vIGhhbmRsZSBxdWV1ZTogZmFsc2UgcHJvbWlzZXNcclxuXHRpZiAoICFvcHRzLnF1ZXVlICkge1xyXG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xyXG5cdFx0aWYgKCBob29rcy51bnF1ZXVlZCA9PSBudWxsICkge1xyXG5cdFx0XHRob29rcy51bnF1ZXVlZCA9IDA7XHJcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xyXG5cdFx0XHRob29rcy5lbXB0eS5maXJlID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0aWYgKCAhaG9va3MudW5xdWV1ZWQgKSB7XHJcblx0XHRcdFx0XHRvbGRmaXJlKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdFx0aG9va3MudW5xdWV1ZWQrKztcclxuXHJcblx0XHRhbmltLmFsd2F5cyhmdW5jdGlvbigpIHtcclxuXHRcdFx0Ly8gZG9pbmcgdGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIGNvbXBsZXRlIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWRcclxuXHRcdFx0Ly8gYmVmb3JlIHRoaXMgY29tcGxldGVzXHJcblx0XHRcdGFuaW0uYWx3YXlzKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XHJcblx0XHRcdFx0aWYgKCAhalF1ZXJ5LnF1ZXVlKCBlbGVtLCBcImZ4XCIgKS5sZW5ndGggKSB7XHJcblx0XHRcdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0Ly8gaGVpZ2h0L3dpZHRoIG92ZXJmbG93IHBhc3NcclxuXHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBcImhlaWdodFwiIGluIHByb3BzIHx8IFwid2lkdGhcIiBpbiBwcm9wcyApICkge1xyXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0XHJcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90XHJcblx0XHQvLyBjaGFuZ2UgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB3aGVuIG92ZXJmbG93WCBhbmRcclxuXHRcdC8vIG92ZXJmbG93WSBhcmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlXHJcblx0XHRvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTtcclxuXHJcblx0XHQvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBpbmxpbmUtYmxvY2sgZm9yIGhlaWdodC93aWR0aFxyXG5cdFx0Ly8gYW5pbWF0aW9ucyBvbiBpbmxpbmUgZWxlbWVudHMgdGhhdCBhcmUgaGF2aW5nIHdpZHRoL2hlaWdodCBhbmltYXRlZFxyXG5cdFx0aWYgKCBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApID09PSBcImlubGluZVwiICYmXHJcblx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJmbG9hdFwiICkgPT09IFwibm9uZVwiICkge1xyXG5cclxuXHRcdFx0Ly8gaW5saW5lLWxldmVsIGVsZW1lbnRzIGFjY2VwdCBpbmxpbmUtYmxvY2s7XHJcblx0XHRcdC8vIGJsb2NrLWxldmVsIGVsZW1lbnRzIG5lZWQgdG8gYmUgaW5saW5lIHdpdGggbGF5b3V0XHJcblx0XHRcdGlmICggIWpRdWVyeS5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQgfHwgY3NzX2RlZmF1bHREaXNwbGF5KCBlbGVtLm5vZGVOYW1lICkgPT09IFwiaW5saW5lXCIgKSB7XHJcblx0XHRcdFx0c3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHN0eWxlLnpvb20gPSAxO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRpZiAoIG9wdHMub3ZlcmZsb3cgKSB7XHJcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XHJcblx0XHRpZiAoICFqUXVlcnkuc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzICkge1xyXG5cdFx0XHRhbmltLmRvbmUoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XHJcblx0XHRcdFx0c3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdO1xyXG5cdFx0XHRcdHN0eWxlLm92ZXJmbG93WSA9IG9wdHMub3ZlcmZsb3dbIDIgXTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0Ly8gc2hvdy9oaWRlIHBhc3NcclxuXHRmb3IgKCBpbmRleCBpbiBwcm9wcyApIHtcclxuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XHJcblx0XHRpZiAoIHJmeHR5cGVzLmV4ZWMoIHZhbHVlICkgKSB7XHJcblx0XHRcdGRlbGV0ZSBwcm9wc1sgaW5kZXggXTtcclxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gKCBoaWRkZW4gPyBcImhpZGVcIiA6IFwic2hvd1wiICkgKSB7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHRcdFx0aGFuZGxlZC5wdXNoKCBpbmRleCApO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0bGVuZ3RoID0gaGFuZGxlZC5sZW5ndGg7XHJcblx0aWYgKCBsZW5ndGggKSB7XHJcblx0XHRkYXRhU2hvdyA9IGpRdWVyeS5fZGF0YSggZWxlbSwgXCJmeHNob3dcIiApIHx8IGpRdWVyeS5fZGF0YSggZWxlbSwgXCJmeHNob3dcIiwge30gKTtcclxuXHRcdGlmICggaGlkZGVuICkge1xyXG5cdFx0XHRqUXVlcnkoIGVsZW0gKS5zaG93KCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRhbmltLmRvbmUoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0alF1ZXJ5KCBlbGVtICkuaGlkZSgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHRcdGFuaW0uZG9uZShmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIHByb3A7XHJcblx0XHRcdGpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCBcImZ4c2hvd1wiLCB0cnVlICk7XHJcblx0XHRcdGZvciAoIHByb3AgaW4gb3JpZyApIHtcclxuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIG9yaWdbIHByb3AgXSApO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHRcdGZvciAoIGluZGV4ID0gMCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcclxuXHRcdFx0cHJvcCA9IGhhbmRsZWRbIGluZGV4IF07XHJcblx0XHRcdHR3ZWVuID0gYW5pbS5jcmVhdGVUd2VlbiggcHJvcCwgaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAgKTtcclxuXHRcdFx0b3JpZ1sgcHJvcCBdID0gZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTtcclxuXHJcblx0XHRcdGlmICggISggcHJvcCBpbiBkYXRhU2hvdyApICkge1xyXG5cdFx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSB0d2Vlbi5zdGFydDtcclxuXHRcdFx0XHRpZiAoIGhpZGRlbiApIHtcclxuXHRcdFx0XHRcdHR3ZWVuLmVuZCA9IHR3ZWVuLnN0YXJ0O1xyXG5cdFx0XHRcdFx0dHdlZW4uc3RhcnQgPSBwcm9wID09PSBcIndpZHRoXCIgfHwgcHJvcCA9PT0gXCJoZWlnaHRcIiA/IDEgOiAwO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gVHdlZW4oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICkge1xyXG5cdHJldHVybiBuZXcgVHdlZW4ucHJvdG90eXBlLmluaXQoIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7XHJcbn1cclxualF1ZXJ5LlR3ZWVuID0gVHdlZW47XHJcblxyXG5Ud2Vlbi5wcm90b3R5cGUgPSB7XHJcblx0Y29uc3RydWN0b3I6IFR3ZWVuLFxyXG5cdGluaXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZywgdW5pdCApIHtcclxuXHRcdHRoaXMuZWxlbSA9IGVsZW07XHJcblx0XHR0aGlzLnByb3AgPSBwcm9wO1xyXG5cdFx0dGhpcy5lYXNpbmcgPSBlYXNpbmcgfHwgXCJzd2luZ1wiO1xyXG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuXHRcdHRoaXMuc3RhcnQgPSB0aGlzLm5vdyA9IHRoaXMuY3VyKCk7XHJcblx0XHR0aGlzLmVuZCA9IGVuZDtcclxuXHRcdHRoaXMudW5pdCA9IHVuaXQgfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICk7XHJcblx0fSxcclxuXHRjdXI6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIGhvb2tzID0gVHdlZW4ucHJvcEhvb2tzWyB0aGlzLnByb3AgXTtcclxuXHJcblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cclxuXHRcdFx0aG9va3MuZ2V0KCB0aGlzICkgOlxyXG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7XHJcblx0fSxcclxuXHRydW46IGZ1bmN0aW9uKCBwZXJjZW50ICkge1xyXG5cdFx0dmFyIGVhc2VkLFxyXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XHJcblxyXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7XHJcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxyXG5cdFx0XHRcdHBlcmNlbnQsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiAqIHBlcmNlbnQsIDAsIDEsIHRoaXMub3B0aW9ucy5kdXJhdGlvblxyXG5cdFx0XHQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5wb3MgPSBlYXNlZCA9IHBlcmNlbnQ7XHJcblx0XHR9XHJcblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XHJcblxyXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHtcclxuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xyXG5cdFx0XHRob29rcy5zZXQoIHRoaXMgKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxufTtcclxuXHJcblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcclxuXHJcblR3ZWVuLnByb3BIb29rcyA9IHtcclxuXHRfZGVmYXVsdDoge1xyXG5cdFx0Z2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XHJcblx0XHRcdHZhciByZXN1bHQ7XHJcblxyXG5cdFx0XHRpZiAoIHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSAhPSBudWxsICYmXHJcblx0XHRcdFx0KCF0d2Vlbi5lbGVtLnN0eWxlIHx8IHR3ZWVuLmVsZW0uc3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBudWxsKSApIHtcclxuXHRcdFx0XHRyZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBwYXNzaW5nIGFueSB2YWx1ZSBhcyBhIDR0aCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9tYXRpY2FsbHlcclxuXHRcdFx0Ly8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlsc1xyXG5cdFx0XHQvLyBzbywgc2ltcGxlIHZhbHVlcyBzdWNoIGFzIFwiMTBweFwiIGFyZSBwYXJzZWQgdG8gRmxvYXQuXHJcblx0XHRcdC8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgXCJyb3RhdGUoMXJhZClcIiBhcmUgcmV0dXJuZWQgYXMgaXMuXHJcblx0XHRcdHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIGZhbHNlLCBcIlwiICk7XHJcblx0XHRcdC8vIEVtcHR5IHN0cmluZ3MsIG51bGwsIHVuZGVmaW5lZCBhbmQgXCJhdXRvXCIgYXJlIGNvbnZlcnRlZCB0byAwLlxyXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcclxuXHRcdH0sXHJcblx0XHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcclxuXHRcdFx0Ly8gdXNlIHN0ZXAgaG9vayBmb3IgYmFjayBjb21wYXQgLSB1c2UgY3NzSG9vayBpZiBpdHMgdGhlcmUgLSB1c2UgLnN0eWxlIGlmIGl0c1xyXG5cdFx0XHQvLyBhdmFpbGFibGUgYW5kIHVzZSBwbGFpbiBwcm9wZXJ0aWVzIHdoZXJlIGF2YWlsYWJsZVxyXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XHJcblx0XHRcdFx0alF1ZXJ5LmZ4LnN0ZXBbIHR3ZWVuLnByb3AgXSggdHdlZW4gKTtcclxuXHRcdFx0fSBlbHNlIGlmICggdHdlZW4uZWxlbS5zdHlsZSAmJiAoIHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fCBqUXVlcnkuY3NzSG9va3NbIHR3ZWVuLnByb3AgXSApICkge1xyXG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcbi8vIFJlbW92ZSBpbiAyLjAgLSB0aGlzIHN1cHBvcnRzIElFOCdzIHBhbmljIGJhc2VkIGFwcHJvYWNoXHJcbi8vIHRvIHNldHRpbmcgdGhpbmdzIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xyXG5cclxuVHdlZW4ucHJvcEhvb2tzLnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0ge1xyXG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xyXG5cdFx0aWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICYmIHR3ZWVuLmVsZW0ucGFyZW50Tm9kZSApIHtcclxuXHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcbmpRdWVyeS5lYWNoKFsgXCJ0b2dnbGVcIiwgXCJzaG93XCIsIFwiaGlkZVwiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xyXG5cdHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdO1xyXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xyXG5cdFx0cmV0dXJuIHNwZWVkID09IG51bGwgfHwgdHlwZW9mIHNwZWVkID09PSBcImJvb2xlYW5cIiB8fFxyXG5cdFx0XHQvLyBzcGVjaWFsIGNoZWNrIGZvciAudG9nZ2xlKCBoYW5kbGVyLCBoYW5kbGVyLCAuLi4gKVxyXG5cdFx0XHQoICFpICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBzcGVlZCApICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBlYXNpbmcgKSApID9cclxuXHRcdFx0Y3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDpcclxuXHRcdFx0dGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xyXG5cdH07XHJcbn0pO1xyXG5cclxualF1ZXJ5LmZuLmV4dGVuZCh7XHJcblx0ZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkge1xyXG5cclxuXHRcdC8vIHNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxyXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBpc0hpZGRlbiApLmNzcyggXCJvcGFjaXR5XCIsIDAgKS5zaG93KClcclxuXHJcblx0XHRcdC8vIGFuaW1hdGUgdG8gdGhlIHZhbHVlIHNwZWNpZmllZFxyXG5cdFx0XHQuZW5kKCkuYW5pbWF0ZSh7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XHJcblx0fSxcclxuXHRhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XHJcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxyXG5cdFx0XHRvcHRhbGwgPSBqUXVlcnkuc3BlZWQoIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICksXHJcblx0XHRcdGRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0Ly8gT3BlcmF0ZSBvbiBhIGNvcHkgb2YgcHJvcCBzbyBwZXItcHJvcGVydHkgZWFzaW5nIHdvbid0IGJlIGxvc3RcclxuXHRcdFx0XHR2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7XHJcblxyXG5cdFx0XHRcdC8vIEVtcHR5IGFuaW1hdGlvbnMgcmVzb2x2ZSBpbW1lZGlhdGVseVxyXG5cdFx0XHRcdGlmICggZW1wdHkgKSB7XHJcblx0XHRcdFx0XHRhbmltLnN0b3AoIHRydWUgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH07XHJcblxyXG5cdFx0cmV0dXJuIGVtcHR5IHx8IG9wdGFsbC5xdWV1ZSA9PT0gZmFsc2UgP1xyXG5cdFx0XHR0aGlzLmVhY2goIGRvQW5pbWF0aW9uICkgOlxyXG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XHJcblx0fSxcclxuXHRzdG9wOiBmdW5jdGlvbiggdHlwZSwgY2xlYXJRdWV1ZSwgZ290b0VuZCApIHtcclxuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XHJcblx0XHRcdHZhciBzdG9wID0gaG9va3Muc3RvcDtcclxuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XHJcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcclxuXHRcdH07XHJcblxyXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcclxuXHRcdFx0Z290b0VuZCA9IGNsZWFyUXVldWU7XHJcblx0XHRcdGNsZWFyUXVldWUgPSB0eXBlO1xyXG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCBjbGVhclF1ZXVlICYmIHR5cGUgIT09IGZhbHNlICkge1xyXG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgZGVxdWV1ZSA9IHRydWUsXHJcblx0XHRcdFx0aW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArIFwicXVldWVIb29rc1wiLFxyXG5cdFx0XHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnMsXHJcblx0XHRcdFx0ZGF0YSA9IGpRdWVyeS5fZGF0YSggdGhpcyApO1xyXG5cclxuXHRcdFx0aWYgKCBpbmRleCApIHtcclxuXHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkge1xyXG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XHJcblx0XHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICYmIHJydW4udGVzdCggaW5kZXggKSApIHtcclxuXHRcdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xyXG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiYgKHR5cGUgPT0gbnVsbCB8fCB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUpICkge1xyXG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xyXG5cdFx0XHRcdFx0ZGVxdWV1ZSA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIHN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWRcclxuXHRcdFx0Ly8gdGltZXJzIGN1cnJlbnRseSB3aWxsIGNhbGwgdGhlaXIgY29tcGxldGUgY2FsbGJhY2tzLCB3aGljaCB3aWxsIGRlcXVldWVcclxuXHRcdFx0Ly8gYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmRcclxuXHRcdFx0aWYgKCBkZXF1ZXVlIHx8ICFnb3RvRW5kICkge1xyXG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxufSk7XHJcblxyXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxyXG5mdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkge1xyXG5cdHZhciB3aGljaCxcclxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfSxcclxuXHRcdGkgPSAwO1xyXG5cclxuXHQvLyBpZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXHJcblx0Ly8gaWYgd2UgZG9uJ3QgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodFxyXG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aD8gMSA6IDA7XHJcblx0Zm9yKCA7IGkgPCA0IDsgaSArPSAyIC0gaW5jbHVkZVdpZHRoICkge1xyXG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcclxuXHRcdGF0dHJzWyBcIm1hcmdpblwiICsgd2hpY2ggXSA9IGF0dHJzWyBcInBhZGRpbmdcIiArIHdoaWNoIF0gPSB0eXBlO1xyXG5cdH1cclxuXHJcblx0aWYgKCBpbmNsdWRlV2lkdGggKSB7XHJcblx0XHRhdHRycy5vcGFjaXR5ID0gYXR0cnMud2lkdGggPSB0eXBlO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIGF0dHJzO1xyXG59XHJcblxyXG4vLyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25zXHJcbmpRdWVyeS5lYWNoKHtcclxuXHRzbGlkZURvd246IGdlbkZ4KFwic2hvd1wiKSxcclxuXHRzbGlkZVVwOiBnZW5GeChcImhpZGVcIiksXHJcblx0c2xpZGVUb2dnbGU6IGdlbkZ4KFwidG9nZ2xlXCIpLFxyXG5cdGZhZGVJbjogeyBvcGFjaXR5OiBcInNob3dcIiB9LFxyXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcclxuXHRmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6IFwidG9nZ2xlXCIgfVxyXG59LCBmdW5jdGlvbiggbmFtZSwgcHJvcHMgKSB7XHJcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcclxuXHR9O1xyXG59KTtcclxuXHJcbmpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHtcclxuXHR2YXIgb3B0ID0gc3BlZWQgJiYgdHlwZW9mIHNwZWVkID09PSBcIm9iamVjdFwiID8galF1ZXJ5LmV4dGVuZCgge30sIHNwZWVkICkgOiB7XHJcblx0XHRjb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fFxyXG5cdFx0XHRqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCxcclxuXHRcdGR1cmF0aW9uOiBzcGVlZCxcclxuXHRcdGVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZ1xyXG5cdH07XHJcblxyXG5cdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5kdXJhdGlvbiA9PT0gXCJudW1iZXJcIiA/IG9wdC5kdXJhdGlvbiA6XHJcblx0XHRvcHQuZHVyYXRpb24gaW4galF1ZXJ5LmZ4LnNwZWVkcyA/IGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdIDogalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDtcclxuXHJcblx0Ly8gbm9ybWFsaXplIG9wdC5xdWV1ZSAtIHRydWUvdW5kZWZpbmVkL251bGwgLT4gXCJmeFwiXHJcblx0aWYgKCBvcHQucXVldWUgPT0gbnVsbCB8fCBvcHQucXVldWUgPT09IHRydWUgKSB7XHJcblx0XHRvcHQucXVldWUgPSBcImZ4XCI7XHJcblx0fVxyXG5cclxuXHQvLyBRdWV1ZWluZ1xyXG5cdG9wdC5vbGQgPSBvcHQuY29tcGxldGU7XHJcblxyXG5cdG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xyXG5cdFx0XHRvcHQub2xkLmNhbGwoIHRoaXMgKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIG9wdC5xdWV1ZSApIHtcclxuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIG9wdC5xdWV1ZSApO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdHJldHVybiBvcHQ7XHJcbn07XHJcblxyXG5qUXVlcnkuZWFzaW5nID0ge1xyXG5cdGxpbmVhcjogZnVuY3Rpb24oIHAgKSB7XHJcblx0XHRyZXR1cm4gcDtcclxuXHR9LFxyXG5cdHN3aW5nOiBmdW5jdGlvbiggcCApIHtcclxuXHRcdHJldHVybiAwLjUgLSBNYXRoLmNvcyggcCpNYXRoLlBJICkgLyAyO1xyXG5cdH1cclxufTtcclxuXHJcbmpRdWVyeS50aW1lcnMgPSBbXTtcclxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XHJcbmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7XHJcblx0dmFyIHRpbWVyLFxyXG5cdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcclxuXHRcdGkgPSAwO1xyXG5cclxuXHRmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7XHJcblx0XHR0aW1lciA9IHRpbWVyc1sgaSBdO1xyXG5cdFx0Ly8gQ2hlY2tzIHRoZSB0aW1lciBoYXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkXHJcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcclxuXHRcdFx0dGltZXJzLnNwbGljZSggaS0tLCAxICk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRpZiAoICF0aW1lcnMubGVuZ3RoICkge1xyXG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcclxuXHR9XHJcbn07XHJcblxyXG5qUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7XHJcblx0aWYgKCB0aW1lcigpICYmIGpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKSAmJiAhdGltZXJJZCApIHtcclxuXHRcdHRpbWVySWQgPSBzZXRJbnRlcnZhbCggalF1ZXJ5LmZ4LnRpY2ssIGpRdWVyeS5meC5pbnRlcnZhbCApO1xyXG5cdH1cclxufTtcclxuXHJcbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xyXG5cclxualF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHtcclxuXHRjbGVhckludGVydmFsKCB0aW1lcklkICk7XHJcblx0dGltZXJJZCA9IG51bGw7XHJcbn07XHJcblxyXG5qUXVlcnkuZnguc3BlZWRzID0ge1xyXG5cdHNsb3c6IDYwMCxcclxuXHRmYXN0OiAyMDAsXHJcblx0Ly8gRGVmYXVsdCBzcGVlZFxyXG5cdF9kZWZhdWx0OiA0MDBcclxufTtcclxuXHJcbi8vIEJhY2sgQ29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XHJcbmpRdWVyeS5meC5zdGVwID0ge307XHJcblxyXG5pZiAoIGpRdWVyeS5leHByICYmIGpRdWVyeS5leHByLmZpbHRlcnMgKSB7XHJcblx0alF1ZXJ5LmV4cHIuZmlsdGVycy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHtcclxuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGZuLmVsZW07XHJcblx0XHR9KS5sZW5ndGg7XHJcblx0fTtcclxufVxyXG52YXIgcnJvb3QgPSAvXig/OmJvZHl8aHRtbCkkL2k7XHJcblxyXG5qUXVlcnkuZm4ub2Zmc2V0ID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7XHJcblx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xyXG5cdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XHJcblx0XHRcdHRoaXMgOlxyXG5cdFx0XHR0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7XHJcblx0XHRcdFx0alF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTtcclxuXHRcdFx0fSk7XHJcblx0fVxyXG5cclxuXHR2YXIgYm94LCBkb2NFbGVtLCBib2R5LCB3aW4sIGNsaWVudFRvcCwgY2xpZW50TGVmdCwgc2Nyb2xsVG9wLCBzY3JvbGxMZWZ0LCB0b3AsIGxlZnQsXHJcblx0XHRlbGVtID0gdGhpc1sgMCBdLFxyXG5cdFx0ZG9jID0gZWxlbSAmJiBlbGVtLm93bmVyRG9jdW1lbnQ7XHJcblxyXG5cdGlmICggIWRvYyApIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdGlmICggKGJvZHkgPSBkb2MuYm9keSkgPT09IGVsZW0gKSB7XHJcblx0XHRyZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCBlbGVtICk7XHJcblx0fVxyXG5cclxuXHRkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudDtcclxuXHJcblx0Ly8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGVcclxuXHRpZiAoICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHtcclxuXHRcdHJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9O1xyXG5cdH1cclxuXHJcblx0Ym94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHR3aW4gPSBnZXRXaW5kb3coIGRvYyApO1xyXG5cdGNsaWVudFRvcCAgPSBkb2NFbGVtLmNsaWVudFRvcCAgfHwgYm9keS5jbGllbnRUb3AgIHx8IDA7XHJcblx0Y2xpZW50TGVmdCA9IGRvY0VsZW0uY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMDtcclxuXHRzY3JvbGxUb3AgID0gd2luLnBhZ2VZT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsVG9wO1xyXG5cdHNjcm9sbExlZnQgPSB3aW4ucGFnZVhPZmZzZXQgfHwgZG9jRWxlbS5zY3JvbGxMZWZ0O1xyXG5cdHRvcCAgPSBib3gudG9wICArIHNjcm9sbFRvcCAgLSBjbGllbnRUb3A7XHJcblx0bGVmdCA9IGJveC5sZWZ0ICsgc2Nyb2xsTGVmdCAtIGNsaWVudExlZnQ7XHJcblxyXG5cdHJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07XHJcbn07XHJcblxyXG5qUXVlcnkub2Zmc2V0ID0ge1xyXG5cclxuXHRib2R5T2Zmc2V0OiBmdW5jdGlvbiggYm9keSApIHtcclxuXHRcdHZhciB0b3AgPSBib2R5Lm9mZnNldFRvcCxcclxuXHRcdFx0bGVmdCA9IGJvZHkub2Zmc2V0TGVmdDtcclxuXHJcblx0XHRpZiAoIGpRdWVyeS5zdXBwb3J0LmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0ICkge1xyXG5cdFx0XHR0b3AgICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoYm9keSwgXCJtYXJnaW5Ub3BcIikgKSB8fCAwO1xyXG5cdFx0XHRsZWZ0ICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoYm9keSwgXCJtYXJnaW5MZWZ0XCIpICkgfHwgMDtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9O1xyXG5cdH0sXHJcblxyXG5cdHNldE9mZnNldDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGkgKSB7XHJcblx0XHR2YXIgcG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKTtcclxuXHJcblx0XHQvLyBzZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXHJcblx0XHRpZiAoIHBvc2l0aW9uID09PSBcInN0YXRpY1wiICkge1xyXG5cdFx0XHRlbGVtLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBjdXJFbGVtID0galF1ZXJ5KCBlbGVtICksXHJcblx0XHRcdGN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCksXHJcblx0XHRcdGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwidG9wXCIgKSxcclxuXHRcdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICksXHJcblx0XHRcdGNhbGN1bGF0ZVBvc2l0aW9uID0gKCBwb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiIHx8IHBvc2l0aW9uID09PSBcImZpeGVkXCIgKSAmJiBqUXVlcnkuaW5BcnJheShcImF1dG9cIiwgW2N1ckNTU1RvcCwgY3VyQ1NTTGVmdF0pID4gLTEsXHJcblx0XHRcdHByb3BzID0ge30sIGN1clBvc2l0aW9uID0ge30sIGN1clRvcCwgY3VyTGVmdDtcclxuXHJcblx0XHQvLyBuZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlciB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWRcclxuXHRcdGlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7XHJcblx0XHRcdGN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpO1xyXG5cdFx0XHRjdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7XHJcblx0XHRcdGN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0O1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDtcclxuXHRcdFx0Y3VyTGVmdCA9IHBhcnNlRmxvYXQoIGN1ckNTU0xlZnQgKSB8fCAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHtcclxuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgY3VyT2Zmc2V0ICk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xyXG5cdFx0XHRwcm9wcy50b3AgPSAoIG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCApICsgY3VyVG9wO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcclxuXHRcdFx0cHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCBcInVzaW5nXCIgaW4gb3B0aW9ucyApIHtcclxuXHRcdFx0b3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XHJcblx0XHR9XHJcblx0fVxyXG59O1xyXG5cclxuXHJcbmpRdWVyeS5mbi5leHRlbmQoe1xyXG5cclxuXHRwb3NpdGlvbjogZnVuY3Rpb24oKSB7XHJcblx0XHRpZiAoICF0aGlzWzBdICkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGVsZW0gPSB0aGlzWzBdLFxyXG5cclxuXHRcdC8vIEdldCAqcmVhbCogb2Zmc2V0UGFyZW50XHJcblx0XHRvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpLFxyXG5cclxuXHRcdC8vIEdldCBjb3JyZWN0IG9mZnNldHNcclxuXHRcdG9mZnNldCAgICAgICA9IHRoaXMub2Zmc2V0KCksXHJcblx0XHRwYXJlbnRPZmZzZXQgPSBycm9vdC50ZXN0KG9mZnNldFBhcmVudFswXS5ub2RlTmFtZSkgPyB7IHRvcDogMCwgbGVmdDogMCB9IDogb2Zmc2V0UGFyZW50Lm9mZnNldCgpO1xyXG5cclxuXHRcdC8vIFN1YnRyYWN0IGVsZW1lbnQgbWFyZ2luc1xyXG5cdFx0Ly8gbm90ZTogd2hlbiBhbiBlbGVtZW50IGhhcyBtYXJnaW46IGF1dG8gdGhlIG9mZnNldExlZnQgYW5kIG1hcmdpbkxlZnRcclxuXHRcdC8vIGFyZSB0aGUgc2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZzZXQubGVmdCB0byBpbmNvcnJlY3RseSBiZSAwXHJcblx0XHRvZmZzZXQudG9wICAtPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGVsZW0sIFwibWFyZ2luVG9wXCIpICkgfHwgMDtcclxuXHRcdG9mZnNldC5sZWZ0IC09IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoZWxlbSwgXCJtYXJnaW5MZWZ0XCIpICkgfHwgMDtcclxuXHJcblx0XHQvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnNcclxuXHRcdHBhcmVudE9mZnNldC50b3AgICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50WzBdLCBcImJvcmRlclRvcFdpZHRoXCIpICkgfHwgMDtcclxuXHRcdHBhcmVudE9mZnNldC5sZWZ0ICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50WzBdLCBcImJvcmRlckxlZnRXaWR0aFwiKSApIHx8IDA7XHJcblxyXG5cdFx0Ly8gU3VidHJhY3QgdGhlIHR3byBvZmZzZXRzXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR0b3A6ICBvZmZzZXQudG9wICAtIHBhcmVudE9mZnNldC50b3AsXHJcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnRcclxuXHRcdH07XHJcblx0fSxcclxuXHJcblx0b2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50LmJvZHk7XHJcblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmICghcnJvb3QudGVzdChvZmZzZXRQYXJlbnQubm9kZU5hbWUpICYmIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50LCBcInBvc2l0aW9uXCIpID09PSBcInN0YXRpY1wiKSApIHtcclxuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnQuYm9keTtcclxuXHRcdH0pO1xyXG5cdH1cclxufSk7XHJcblxyXG5cclxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXHJcbmpRdWVyeS5lYWNoKCB7c2Nyb2xsTGVmdDogXCJwYWdlWE9mZnNldFwiLCBzY3JvbGxUb3A6IFwicGFnZVlPZmZzZXRcIn0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XHJcblx0dmFyIHRvcCA9IC9ZLy50ZXN0KCBwcm9wICk7XHJcblxyXG5cdGpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdmFsICkge1xyXG5cdFx0cmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBtZXRob2QsIHZhbCApIHtcclxuXHRcdFx0dmFyIHdpbiA9IGdldFdpbmRvdyggZWxlbSApO1xyXG5cclxuXHRcdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcclxuXHRcdFx0XHRyZXR1cm4gd2luID8gKHByb3AgaW4gd2luKSA/IHdpblsgcHJvcCBdIDpcclxuXHRcdFx0XHRcdHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIG1ldGhvZCBdIDpcclxuXHRcdFx0XHRcdGVsZW1bIG1ldGhvZCBdO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoIHdpbiApIHtcclxuXHRcdFx0XHR3aW4uc2Nyb2xsVG8oXHJcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogalF1ZXJ5KCB3aW4gKS5zY3JvbGxMZWZ0KCksXHJcblx0XHRcdFx0XHQgdG9wID8gdmFsIDogalF1ZXJ5KCB3aW4gKS5zY3JvbGxUb3AoKVxyXG5cdFx0XHRcdCk7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGVsZW1bIG1ldGhvZCBdID0gdmFsO1xyXG5cdFx0XHR9XHJcblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCwgbnVsbCApO1xyXG5cdH07XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gZ2V0V2luZG93KCBlbGVtICkge1xyXG5cdHJldHVybiBqUXVlcnkuaXNXaW5kb3coIGVsZW0gKSA/XHJcblx0XHRlbGVtIDpcclxuXHRcdGVsZW0ubm9kZVR5cGUgPT09IDkgP1xyXG5cdFx0XHRlbGVtLmRlZmF1bHRWaWV3IHx8IGVsZW0ucGFyZW50V2luZG93IDpcclxuXHRcdFx0ZmFsc2U7XHJcbn1cclxuLy8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBoZWlnaHQsIHdpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aCBtZXRob2RzXHJcbmpRdWVyeS5lYWNoKCB7IEhlaWdodDogXCJoZWlnaHRcIiwgV2lkdGg6IFwid2lkdGhcIiB9LCBmdW5jdGlvbiggbmFtZSwgdHlwZSApIHtcclxuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sIGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkge1xyXG5cdFx0Ly8gbWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoXHJcblx0XHRqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHtcclxuXHRcdFx0dmFyIGNoYWluYWJsZSA9IGFyZ3VtZW50cy5sZW5ndGggJiYgKCBkZWZhdWx0RXh0cmEgfHwgdHlwZW9mIG1hcmdpbiAhPT0gXCJib29sZWFuXCIgKSxcclxuXHRcdFx0XHRleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/IFwibWFyZ2luXCIgOiBcImJvcmRlclwiICk7XHJcblxyXG5cdFx0XHRyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkge1xyXG5cdFx0XHRcdHZhciBkb2M7XHJcblxyXG5cdFx0XHRcdGlmICggalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XHJcblx0XHRcdFx0XHQvLyBBcyBvZiA1LzgvMjAxMiB0aGlzIHdpbGwgeWllbGQgaW5jb3JyZWN0IHJlc3VsdHMgZm9yIE1vYmlsZSBTYWZhcmksIGJ1dCB0aGVyZVxyXG5cdFx0XHRcdFx0Ly8gaXNuJ3QgYSB3aG9sZSBsb3Qgd2UgY2FuIGRvLiBTZWUgcHVsbCByZXF1ZXN0IGF0IHRoaXMgVVJMIGZvciBkaXNjdXNzaW9uOlxyXG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC83NjRcclxuXHRcdFx0XHRcdHJldHVybiBlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcclxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7XHJcblx0XHRcdFx0XHRkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDtcclxuXHJcblx0XHRcdFx0XHQvLyBFaXRoZXIgc2Nyb2xsW1dpZHRoL0hlaWdodF0gb3Igb2Zmc2V0W1dpZHRoL0hlaWdodF0gb3IgY2xpZW50W1dpZHRoL0hlaWdodF0sIHdoaWNoZXZlciBpcyBncmVhdGVzdFxyXG5cdFx0XHRcdFx0Ly8gdW5mb3J0dW5hdGVseSwgdGhpcyBjYXVzZXMgYnVnICMzODM4IGluIElFNi84IG9ubHksIGJ1dCB0aGVyZSBpcyBjdXJyZW50bHkgbm8gZ29vZCwgc21hbGwgd2F5IHRvIGZpeCBpdC5cclxuXHRcdFx0XHRcdHJldHVybiBNYXRoLm1heChcclxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcInNjcm9sbFwiICsgbmFtZSBdLCBkb2NbIFwic2Nyb2xsXCIgKyBuYW1lIF0sXHJcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJvZmZzZXRcIiArIG5hbWUgXSwgZG9jWyBcIm9mZnNldFwiICsgbmFtZSBdLFxyXG5cdFx0XHRcdFx0XHRkb2NbIFwiY2xpZW50XCIgKyBuYW1lIF1cclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/XHJcblx0XHRcdFx0XHQvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50LCByZXF1ZXN0aW5nIGJ1dCBub3QgZm9yY2luZyBwYXJzZUZsb2F0XHJcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCB2YWx1ZSwgZXh0cmEgKSA6XHJcblxyXG5cdFx0XHRcdFx0Ly8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudFxyXG5cdFx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCB0eXBlLCB2YWx1ZSwgZXh0cmEgKTtcclxuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUsIG51bGwgKTtcclxuXHRcdH07XHJcblx0fSk7XHJcbn0pO1xyXG4vLyBFeHBvc2UgalF1ZXJ5IHRvIHRoZSBnbG9iYWwgb2JqZWN0XHJcbndpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTtcclxuXHJcbi8vIEV4cG9zZSBqUXVlcnkgYXMgYW4gQU1EIG1vZHVsZSwgYnV0IG9ubHkgZm9yIEFNRCBsb2FkZXJzIHRoYXRcclxuLy8gdW5kZXJzdGFuZCB0aGUgaXNzdWVzIHdpdGggbG9hZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBqUXVlcnlcclxuLy8gaW4gYSBwYWdlIHRoYXQgYWxsIG1pZ2h0IGNhbGwgZGVmaW5lKCkuIFRoZSBsb2FkZXIgd2lsbCBpbmRpY2F0ZVxyXG4vLyB0aGV5IGhhdmUgc3BlY2lhbCBhbGxvd2FuY2VzIGZvciBtdWx0aXBsZSBqUXVlcnkgdmVyc2lvbnMgYnlcclxuLy8gc3BlY2lmeWluZyBkZWZpbmUuYW1kLmpRdWVyeSA9IHRydWUuIFJlZ2lzdGVyIGFzIGEgbmFtZWQgbW9kdWxlLFxyXG4vLyBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyIGZpbGVzIHRoYXQgbWF5IHVzZSBkZWZpbmUsXHJcbi8vIGJ1dCBub3QgdXNlIGEgcHJvcGVyIGNvbmNhdGVuYXRpb24gc2NyaXB0IHRoYXQgdW5kZXJzdGFuZHMgYW5vbnltb3VzXHJcbi8vIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0IHdheSB0byByZWdpc3Rlci5cclxuLy8gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmUgZGVyaXZlZCBmcm9tXHJcbi8vIGZpbGUgbmFtZXMsIGFuZCBqUXVlcnkgaXMgbm9ybWFsbHkgZGVsaXZlcmVkIGluIGEgbG93ZXJjYXNlIGZpbGUgbmFtZS5cclxuLy8gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50cyB0byBjYWxsXHJcbi8vIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuXHJcbmlmICggdHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQgJiYgZGVmaW5lLmFtZC5qUXVlcnkgKSB7XHJcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4galF1ZXJ5OyB9ICk7XHJcbn1cclxuXHJcbn0pKCB3aW5kb3cgKTtcclxuIl19